1
- Quasar. qubit_count (o:: String ) = length (o)
2
- Quasar. qubit_count (o:: Matrix ) = Int (log2 (size (o, 1 )))
1
+ qubit_count (o:: String ) = length (o)
3
2
4
3
function _observable_targets_error (observable:: Matrix{ComplexF64} , targets)
5
4
mat = Vector {Vector{Vector{Float64}}} (undef, size (observable, 1 ))
14
13
_observable_targets_error (:: String , targets) = throw (Quasar. QasmVisitorError (" Standard observable target must be exactly 1 qubit." , " ValueError" ))
15
14
16
15
function _check_observable_targets (observable:: Union{Matrix{ComplexF64}, String} , targets)
17
- qc = Quasar . qubit_count (observable)
16
+ qc = qubit_count (observable)
18
17
qc == 1 && (isempty (targets) || length (targets) == 1 ) && return
19
18
qc == length (targets) && return
20
19
_observable_targets_error (observable, targets)
@@ -42,7 +41,7 @@ function visit_observable(v, expr)
42
41
end
43
42
end
44
43
45
- function Quasar . visit_pragma (v, program_expr)
44
+ function visit_pragma (v, program_expr)
46
45
pragma_type:: Symbol = program_expr. args[1 ]
47
46
if pragma_type == :result
48
47
result_type = program_expr. args[2 ]
@@ -95,12 +94,12 @@ function Quasar.visit_pragma(v, program_expr)
95
94
end
96
95
97
96
function parse_matrix (tokens:: Vector{Tuple{Int64, Int32, Quasar.Token}} , stack, start, qasm)
98
- inner = Quasar. extract_braced_block (tokens, stack, start, qasm)
97
+ inner = Quasar. extract_expression (tokens, Quasar . lbracket, Quasar . rbracket , stack, start, qasm)
99
98
n_rows = count (triplet-> triplet[end ] == Quasar. lbracket, inner)
100
99
matrix = Matrix {Quasar.QasmExpression} (undef, n_rows, n_rows)
101
100
row = 1
102
101
while ! isempty (inner)
103
- row_tokens = Quasar. extract_braced_block (inner, stack, start, qasm)
102
+ row_tokens = Quasar. extract_expression (inner, Quasar . lbracket, Quasar . rbracket , stack, start, qasm)
104
103
push! (row_tokens, (- 1 , Int32 (- 1 ), Quasar. semicolon))
105
104
col = 1
106
105
while ! isempty (row_tokens)
@@ -126,7 +125,7 @@ function parse_pragma_observables(tokens::Vector{Tuple{Int64, Int32, Quasar.Toke
126
125
observable_token = popfirst! (tokens)
127
126
observable_id = Quasar. parse_identifier (observable_token, qasm)
128
127
if observable_id. args[1 ] == " hermitian"
129
- matrix_tokens = Quasar. extract_parensed (tokens, stack, start, qasm)
128
+ matrix_tokens = Quasar. extract_expression (tokens, Quasar . lparen, Quasar . rparen , stack, start, qasm)
130
129
# next token is targets
131
130
h_mat = parse_matrix (matrix_tokens, stack, start, qasm)
132
131
# next token is targets
@@ -146,7 +145,7 @@ function parse_pragma_observables(tokens::Vector{Tuple{Int64, Int32, Quasar.Toke
146
145
break
147
146
else
148
147
if ! isempty (tokens) && first (tokens)[end ] == Quasar. lparen
149
- arg_tokens = Quasar. extract_parensed (tokens, stack, start, qasm)
148
+ arg_tokens = Quasar. extract_expression (tokens, Quasar . lparen, Quasar . rparen , stack, start, qasm)
150
149
push! (arg_tokens, (- 1 , Int32 (- 1 ), Quasar. semicolon))
151
150
target_expr = Quasar. parse_expression (arg_tokens, stack, start, qasm)
152
151
push! (obs_targets, target_expr)
@@ -175,7 +174,7 @@ function parse_pragma_targets(tokens::Vector{Tuple{Int64, Int32, Quasar.Token}},
175
174
end
176
175
177
176
178
- function Quasar . parse_pragma (tokens, stack, start, qasm)
177
+ function parse_pragma (tokens, stack, start, qasm)
179
178
prefix = popfirst! (tokens)
180
179
prefix_id = Quasar. parse_identifier (prefix, qasm)
181
180
prefix_id. args[1 ] == " braket" || throw (Quasar. QasmParseError (" pragma expression must begin with `#pragma braket`" , stack, start, qasm))
@@ -204,7 +203,7 @@ function Quasar.parse_pragma(tokens, stack, start, qasm)
204
203
end
205
204
elseif pragma_type == " unitary"
206
205
push! (expr, :unitary )
207
- matrix_tokens = Quasar. extract_parensed (tokens, stack, start, qasm)
206
+ matrix_tokens = Quasar. extract_expression (tokens, Quasar . lparen, Quasar . rparen , stack, start, qasm)
208
207
unitary_matrix = parse_matrix (matrix_tokens, stack, start, qasm)
209
208
push! (expr, unitary_matrix)
210
209
target_expr = parse_pragma_targets (tokens, stack, start, qasm)
@@ -213,8 +212,8 @@ function Quasar.parse_pragma(tokens, stack, start, qasm)
213
212
push! (expr, :noise )
214
213
noise_type = Quasar. parse_identifier (popfirst! (tokens), qasm):: Quasar.QasmExpression
215
214
if noise_type. args[1 ] == " kraus"
216
- matrix_tokens = Quasar. extract_parensed (tokens, stack, start, qasm)
217
- all (triplet-> triplet[end ] == Quasar. lbracket, matrix_tokens[1 : 3 ]) && (matrix_tokens = Quasar. extract_braced_block (matrix_tokens, stack, start, qasm))
215
+ matrix_tokens = Quasar. extract_expression (tokens, Quasar . lparen, Quasar . rparen , stack, start, qasm)
216
+ all (triplet-> triplet[end ] == Quasar. lbracket, matrix_tokens[1 : 3 ]) && (matrix_tokens = Quasar. extract_expression (matrix_tokens, Quasar . lbracket, Quasar . rbracket , stack, start, qasm))
218
217
mats = Matrix{Quasar. QasmExpression}[]
219
218
while ! isempty (matrix_tokens)
220
219
push! (mats, parse_matrix (matrix_tokens, stack, start, qasm))
0 commit comments