stim-parser-0.1.0.0: src/StimParser/Expr.hs
{-# LANGUAGE InstanceSigs #-}
module StimParser.Expr where
type Ind = Int
type Ph = Float
newtype Rec = Rec Int
deriving (Show)
newtype Sweep = Sweep Int
deriving (Show)
-- example:
-- CY sweep[5] 7 sweep[5] 8
-- CY rec[-1] 6
-- CY 2 5 4 2
-- MXX !1 2
data Q = Q Int | QRec Rec | QSweep Sweep | Not Int
deriving (Show)
data Pauli = PX | PY | PZ
deriving (Show)
data PauliInd = PauliInd Pauli Ind
deriving (Show)
data PauliChain = P [PauliInd]
| N [PauliInd]
deriving (Show)
data GateTy =
-- Pauli
I | X | Y | Z
-- Single Qubit Clifford Gates
| C_NXYZ | C_NZYX | C_XNYZ | C_XYNZ | C_XYZ | C_ZNYX | C_ZYNX | C_ZYX | H | H_NXY | H_NXZ | H_NYZ | H_XY | H_XZ | H_YZ | S | SQRT_X | SQRT_X_DAG | SQRT_Y | SQRT_Y_DAG | SQRT_Z | SQRT_Z_DAG | S_DAG
-- Two Qubit Clifford Gates
| CNOT | CX | CXSWAP | CY | CZ | CZSWAP | II | ISWAP | ISWAP_DAG | SQRT_XX | SQRT_XX_DAG | SQRT_YY | SQRT_YY_DAG | SQRT_ZZ | SQRT_ZZ_DAG | SWAP | SWAPCX | SWAPCZ | XCX | XCY | XCZ | YCX | YCY | YCZ | ZCX | ZCY | ZCZ
-- Collapsing Gates
| RX | RY | RZ
| R
deriving (Show, Eq, Ord, Bounded, Enum)
-- property of dataclass Enum from GHC.Enum
gateTyList :: [GateTy]
gateTyList = [I ..]
-- Gate examples:
-- CY sweep[5] 7 sweep[5] 8
-- CY rec[-1] 6
-- CY 2 5 4 2
-- H[custom] 0
data Gate = Gate GateTy (Maybe Tag) [Q]
deriving (Show)
-- Collapsing Gates and Pair Measurement Gates
data MeasureTy =
M
| MXX | MYY | MZZ -- Pair Measurement Gates
| MRX | MRY | MRZ
| MX | MY | MZ
| MR
deriving (Show, Eq, Ord, Bounded, Enum)
measureTyList :: [MeasureTy]
measureTyList = [M ..]
-- Collapsing Gates examples:
-- M 5
-- MZ !5
-- only single ph
-- MZ(0.02) 2 3 5
-- M[custom] 0
-- Pair Measurement Gates examples:
-- MXX 1 2
-- MXX !1 2
-- MXX(0.01) 2 3
data Measure = Measure MeasureTy (Maybe Tag) (Maybe Ph) [Q]
deriving (Show)
-- Generalized Pauli Product Gates
data GppTy =
MPP
| SPP_DAG
| SPP
deriving (Show, Eq, Ord, Bounded, Enum)
gppTyList :: [GppTy]
gppTyList = [MPP ..]
-- Generalized Pauli Product Gates examples:
-- MPP X2*X3*X5*X7
-- MPP !Z5
-- MPP X1*Y2 !Z3*Z4*Z5
-- MPP(0.001) Z1*Z2 X1*X2
-- SPP !X1*Y2*Z3
-- MPP[custom] X1*X2
data Gpp = Gpp GppTy (Maybe Tag) (Maybe Ph) [PauliChain]
deriving (Show)
-- Noise Channels
data NoiseTy =
E
| CORRELATED_ERROR | DEPOLARIZE1 | DEPOLARIZE2
| ELSE_CORRELATED_ERROR | HERALDED_ERASE | HERALDED_PAULI_CHANNEL_1 | II_ERROR | I_ERROR | PAULI_CHANNEL_1 | PAULI_CHANNEL_2 | X_ERROR | Y_ERROR | Z_ERROR
deriving (Show, Eq, Ord, Bounded, Enum)
noiseTyList :: [NoiseTy]
noiseTyList = [E ..]
-- Noise Channels examples:
-- normal type:
-- DEPOLARIZE1(0.01) 2 3 5
-- DEPOLARIZE2(0.01) 2 3 5 7
-- HERALDED_ERASE(0.01) 2 3 5 7
-- HERALDED_PAULI_CHANNEL_1(0.01, 0.02, 0.03, 0.04) 0 1
-- PAULI_CHANNEL_1(0.1, 0.15, 0.2) 1 2 4
-- PAULI_CHANNEL_2(0,0,0, 0.1,0,0,0, 0,0,0,0.2, 0,0,0,0) 1 2 5 6 8 3
-- X_ERROR(0.001) 5 42
-- Z_ERROR(0.001) 5 42
-- Y_ERROR(0.001) 5 42
-- II_ERROR(0.1) 0 1
-- I_ERROR(0.1) 0
-- E type:
-- CORRELATED_ERROR(0.2) X1 Y2
-- ELSE_CORRELATED_ERROR(0.25) Z2 Z3
-- xx_ERROR type
-- II_ERROR 0 1
-- II_ERROR[TWO_QUBIT_LEAKAGE_NOISE_FOR_AN_ADVANCED_SIMULATOR:0.1] 0 2 4 6
-- II_ERROR[MULTIPLE_TWO_QUBIT_NOISE_MECHANISMS](0.1, 0.2) 0 2 4 6
-- I_ERROR 0
-- I_ERROR[LEAKAGE_NOISE_FOR_AN_ADVANCED_SIMULATOR:0.1] 0 2 4
-- I_ERROR[MULTIPLE_NOISE_MECHANISMS](0.1, 0.2) 0 2 4
data ErrorTagTy = TWO_QUBIT_LEAKAGE_NOISE_FOR_AN_ADVANCED_SIMULATOR
| LEAKAGE_NOISE_FOR_AN_ADVANCED_SIMULATOR
| MULTIPLE_TWO_QUBIT_NOISE_MECHANISMS
| MULTIPLE_NOISE_MECHANISMS
deriving (Show, Eq, Ord, Bounded, Enum)
errorTagTyList :: [ErrorTagTy]
errorTagTyList = [TWO_QUBIT_LEAKAGE_NOISE_FOR_AN_ADVANCED_SIMULATOR ..]
data ErrorTag = ErrorTag ErrorTagTy
| ErrorTagCoef ErrorTagTy Float
deriving (Show)
data Noise =
NoiseNormal NoiseTy (Maybe Tag) (Maybe ErrorTag) [Ph] [Q]
| NoiseE NoiseTy (Maybe Tag) Float [PauliInd]
deriving (Show)
-- General Instruction Tag (v1.15+)
-- Examples: TICK[100ns], X_ERROR[custom](0.1) 0
newtype Tag = Tag String
deriving (Show)
-- Annotations
data AnnTy =
DETECTOR | MPAD | OBSERVABLE_INCLUDE | QUBIT_COORDS | SHIFT_COORDS | TICK
deriving (Show, Eq, Ord, Bounded, Enum)
annTyList :: [AnnTy]
annTyList = [DETECTOR ..]
-- Annotations examples:
-- DETECTOR(1, 0) rec[-3] rec[-6]
-- DETECTOR(2, 0, 0) rec[-8]
-- DETECTOR rec[-3] rec[-4] rec[-7]
-- OBSERVABLE_INCLUDE(0) rec[-1] rec[-2]
-- QUBIT_COORDS(0, 0) 0
-- MPAD 0 0 1 0 1
-- SHIFT_COORDS(500.5)
-- SHIFT_COORDS(0, 1) # Advance 2nd coordinate to track loop iterations.
-- TICK
-- TICK[100ns]
-- seperate Integer and Float cases
data FInd = In Ind | Fl Float
deriving (Show)
instance Num FInd where
(+) (In i1) (In i2) = In (i1 + i2)
(+) (Fl i1) (Fl i2) = Fl (i1 + i2)
(+) (In i1) (Fl i2) = Fl (fromIntegral i1 + i2)
(+) (Fl i1) (In i2) = Fl (i1 + fromIntegral i2)
(*) = undefined
negate = undefined
abs = undefined
signum = undefined
fromInteger :: Integer -> FInd
fromInteger = In . fromInteger
newtype Coords = Coords [FInd]
data Ann = Ann AnnTy (Maybe Tag) [FInd] [Q]
deriving (Show)
-- repeat example:
-- REPEAT 0 {
-- M 0
-- OBSERVABLE_INCLUDE(0) rec[-1]
-- }
data Stim =
StimG Gate
| StimM Measure
| StimGpp Gpp
| StimNoise Noise
| StimAnn Ann
| StimList [Stim]
| StimRepeat Int Stim
deriving (Show)