bloqade-circuit 0.6.6__py3-none-any.whl → 0.6.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of bloqade-circuit might be problematic. Click here for more details.
- bloqade/pyqrack/device.py +96 -1
- bloqade/pyqrack/task.py +15 -0
- bloqade/rewrite/rules/split_ifs.py +18 -1
- bloqade/squin/analysis/nsites/impls.py +7 -0
- bloqade/squin/cirq/emit/op.py +19 -0
- bloqade/squin/cirq/emit/runtime.py +15 -0
- bloqade/squin/noise/rewrite.py +37 -8
- {bloqade_circuit-0.6.6.dist-info → bloqade_circuit-0.6.8.dist-info}/METADATA +1 -1
- {bloqade_circuit-0.6.6.dist-info → bloqade_circuit-0.6.8.dist-info}/RECORD +11 -11
- {bloqade_circuit-0.6.6.dist-info → bloqade_circuit-0.6.8.dist-info}/WHEEL +0 -0
- {bloqade_circuit-0.6.6.dist-info → bloqade_circuit-0.6.8.dist-info}/licenses/LICENSE +0 -0
bloqade/pyqrack/device.py
CHANGED
|
@@ -4,6 +4,7 @@ from dataclasses import field, dataclass
|
|
|
4
4
|
import numpy as np
|
|
5
5
|
from kirin import ir
|
|
6
6
|
from kirin.passes import fold
|
|
7
|
+
from kirin.dialects.ilist import IList
|
|
7
8
|
|
|
8
9
|
from bloqade.squin import noise as squin_noise
|
|
9
10
|
from pyqrack.pauli import Pauli
|
|
@@ -18,6 +19,7 @@ from bloqade.pyqrack.base import (
|
|
|
18
19
|
_default_pyqrack_args,
|
|
19
20
|
)
|
|
20
21
|
from bloqade.pyqrack.task import PyQrackSimulatorTask
|
|
22
|
+
from pyqrack.qrack_simulator import QrackSimulator
|
|
21
23
|
from bloqade.squin.noise.rewrite import RewriteNoiseStmts
|
|
22
24
|
from bloqade.analysis.address.lattice import AnyAddress
|
|
23
25
|
from bloqade.analysis.address.analysis import AddressAnalysis
|
|
@@ -26,6 +28,55 @@ RetType = TypeVar("RetType")
|
|
|
26
28
|
Params = ParamSpec("Params")
|
|
27
29
|
|
|
28
30
|
|
|
31
|
+
def _pyqrack_reduced_density_matrix(
|
|
32
|
+
inds: tuple[int, ...], sim_reg: QrackSimulator, tol: float = 1e-12
|
|
33
|
+
) -> "np.linalg._linalg.EighResult":
|
|
34
|
+
"""
|
|
35
|
+
Extract the reduced density matrix representing the state of a list
|
|
36
|
+
of qubits from a PyQRack simulator register.
|
|
37
|
+
|
|
38
|
+
Inputs:
|
|
39
|
+
inds: A list of integers labeling the qubit registers to extract the reduced density matrix for
|
|
40
|
+
sim_reg: The PyQRack simulator register to extract the reduced density matrix from
|
|
41
|
+
tol: The tolerance for density matrix eigenvalues to be considered non-zero.
|
|
42
|
+
Outputs:
|
|
43
|
+
An eigh result containing the eigenvalues and eigenvectors of the reduced density matrix.
|
|
44
|
+
"""
|
|
45
|
+
# Identify the rest of the qubits in the register
|
|
46
|
+
N = sim_reg.num_qubits()
|
|
47
|
+
other = tuple(set(range(N)).difference(inds))
|
|
48
|
+
|
|
49
|
+
if len(set(inds)) != len(inds):
|
|
50
|
+
raise ValueError("Qubits must be unique.")
|
|
51
|
+
|
|
52
|
+
if max(inds) > N - 1:
|
|
53
|
+
raise ValueError(
|
|
54
|
+
f"Qubit indices {inds} exceed the number of qubits in the register {N}."
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
reordering = inds + other
|
|
58
|
+
# Fix pyqrack edannes to be consistent with Cirq.
|
|
59
|
+
reordering = tuple(N - 1 - x for x in reordering)
|
|
60
|
+
# Extract the statevector from the PyQRack qubits
|
|
61
|
+
statevector = np.array(sim_reg.out_ket())
|
|
62
|
+
# Reshape into a (2,2,2, ..., 2) tensor
|
|
63
|
+
vec_f = np.reshape(statevector, (2,) * N)
|
|
64
|
+
# Reorder the indexes to obey the order of the qubits
|
|
65
|
+
vec_p = np.transpose(vec_f, reordering)
|
|
66
|
+
# Rehape into a 2^N by 2^M matrix to compute the singular value decomposition
|
|
67
|
+
vec_svd = np.reshape(vec_p, (2 ** len(inds), 2 ** len(other)))
|
|
68
|
+
# The singular values and vectors are the eigenspace of the reduced density matrix
|
|
69
|
+
s, v, d = np.linalg.svd(vec_svd, full_matrices=False)
|
|
70
|
+
|
|
71
|
+
# Remove the negligable singular values
|
|
72
|
+
nonzero_inds = np.where(np.abs(v) > tol)[0]
|
|
73
|
+
s = s[:, nonzero_inds]
|
|
74
|
+
v = v[nonzero_inds] ** 2
|
|
75
|
+
# Forge into the correct result type
|
|
76
|
+
result = np.linalg._linalg.EighResult(eigenvalues=v, eigenvectors=s)
|
|
77
|
+
return result
|
|
78
|
+
|
|
79
|
+
|
|
29
80
|
@dataclass
|
|
30
81
|
class PyQrackSimulatorBase(AbstractSimulatorDevice[PyQrackSimulatorTask]):
|
|
31
82
|
"""PyQrack simulation device base class."""
|
|
@@ -50,7 +101,6 @@ class PyQrackSimulatorBase(AbstractSimulatorDevice[PyQrackSimulatorTask]):
|
|
|
50
101
|
kwargs: dict[str, Any],
|
|
51
102
|
memory: MemoryType,
|
|
52
103
|
) -> PyQrackSimulatorTask[Params, RetType, MemoryType]:
|
|
53
|
-
|
|
54
104
|
if squin_noise in mt.dialects:
|
|
55
105
|
# NOTE: rewrite noise statements
|
|
56
106
|
mt_ = mt.similar(mt.dialects)
|
|
@@ -112,6 +162,51 @@ class PyQrackSimulatorBase(AbstractSimulatorDevice[PyQrackSimulatorTask]):
|
|
|
112
162
|
|
|
113
163
|
return sim_reg.pauli_expectation(qubit_ids, pauli)
|
|
114
164
|
|
|
165
|
+
@staticmethod
|
|
166
|
+
def quantum_state(
|
|
167
|
+
qubits: list[PyQrackQubit] | IList[PyQrackQubit, Any], tol: float = 1e-12
|
|
168
|
+
) -> "np.linalg._linalg.EighResult":
|
|
169
|
+
"""
|
|
170
|
+
Extract the reduced density matrix representing the state of a list
|
|
171
|
+
of qubits from a PyQRack simulator register.
|
|
172
|
+
|
|
173
|
+
Inputs:
|
|
174
|
+
qubits: A list of PyQRack qubits to extract the reduced density matrix for
|
|
175
|
+
tol: The tolerance for density matrix eigenvalues to be considered non-zero.
|
|
176
|
+
Outputs:
|
|
177
|
+
An eigh result containing the eigenvalues and eigenvectors of the reduced density matrix.
|
|
178
|
+
"""
|
|
179
|
+
if len(qubits) == 0:
|
|
180
|
+
return np.linalg._linalg.EighResult(
|
|
181
|
+
eigenvalues=np.array([]), eigenvectors=np.array([]).reshape(0, 0)
|
|
182
|
+
)
|
|
183
|
+
sim_reg = qubits[0].sim_reg
|
|
184
|
+
|
|
185
|
+
if not all([x.sim_reg is sim_reg for x in qubits]):
|
|
186
|
+
raise ValueError("All qubits must be from the same simulator register.")
|
|
187
|
+
inds: tuple[int, ...] = tuple(qubit.addr for qubit in qubits)
|
|
188
|
+
|
|
189
|
+
return _pyqrack_reduced_density_matrix(inds, sim_reg, tol)
|
|
190
|
+
|
|
191
|
+
@classmethod
|
|
192
|
+
def reduced_density_matrix(
|
|
193
|
+
cls, qubits: list[PyQrackQubit] | IList[PyQrackQubit, Any], tol: float = 1e-12
|
|
194
|
+
) -> np.ndarray:
|
|
195
|
+
"""
|
|
196
|
+
Extract the reduced density matrix representing the state of a list
|
|
197
|
+
of qubits from a PyQRack simulator register.
|
|
198
|
+
|
|
199
|
+
Inputs:
|
|
200
|
+
qubits: A list of PyQRack qubits to extract the reduced density matrix for
|
|
201
|
+
tol: The tolerance for density matrix eigenvalues to be considered non-zero.
|
|
202
|
+
Outputs:
|
|
203
|
+
A dense 2^n x 2^n numpy array representing the reduced density matrix.
|
|
204
|
+
"""
|
|
205
|
+
rdm = cls.quantum_state(qubits, tol)
|
|
206
|
+
return np.einsum(
|
|
207
|
+
"ax,x,bx", rdm.eigenvectors, rdm.eigenvalues, rdm.eigenvectors.conj()
|
|
208
|
+
)
|
|
209
|
+
|
|
115
210
|
|
|
116
211
|
@dataclass
|
|
117
212
|
class StackMemorySimulator(PyQrackSimulatorBase):
|
bloqade/pyqrack/task.py
CHANGED
|
@@ -2,6 +2,7 @@ from typing import TypeVar, ParamSpec, cast
|
|
|
2
2
|
from dataclasses import dataclass
|
|
3
3
|
|
|
4
4
|
from bloqade.task import AbstractSimulatorTask
|
|
5
|
+
from bloqade.pyqrack.reg import QubitState, PyQrackQubit
|
|
5
6
|
from bloqade.pyqrack.base import (
|
|
6
7
|
MemoryABC,
|
|
7
8
|
PyQrackInterpreter,
|
|
@@ -36,3 +37,17 @@ class PyQrackSimulatorTask(AbstractSimulatorTask[Param, RetType, MemoryType]):
|
|
|
36
37
|
"""Returns the state vector of the simulator."""
|
|
37
38
|
self.run()
|
|
38
39
|
return self.state.sim_reg.out_ket()
|
|
40
|
+
|
|
41
|
+
def qubits(self) -> list[PyQrackQubit]:
|
|
42
|
+
"""Returns the qubits in the simulator."""
|
|
43
|
+
try:
|
|
44
|
+
N = self.state.sim_reg.num_qubits()
|
|
45
|
+
return [
|
|
46
|
+
PyQrackQubit(
|
|
47
|
+
addr=i, sim_reg=self.state.sim_reg, state=QubitState.Active
|
|
48
|
+
)
|
|
49
|
+
for i in range(N)
|
|
50
|
+
]
|
|
51
|
+
except AttributeError:
|
|
52
|
+
Warning("Task has not been run, there are no qubits!")
|
|
53
|
+
return []
|
|
@@ -46,9 +46,13 @@ class SplitIfStmts(RewriteRule):
|
|
|
46
46
|
if not isinstance(node, scf.IfElse):
|
|
47
47
|
return RewriteResult()
|
|
48
48
|
|
|
49
|
+
# NOTE: only empty else bodies are allowed in valid QASM2
|
|
50
|
+
if not self._has_empty_else(node):
|
|
51
|
+
return RewriteResult()
|
|
52
|
+
|
|
49
53
|
*stmts, yield_or_return = node.then_body.stmts()
|
|
50
54
|
|
|
51
|
-
if len(stmts)
|
|
55
|
+
if len(stmts) <= 1:
|
|
52
56
|
return RewriteResult()
|
|
53
57
|
|
|
54
58
|
is_yield = isinstance(yield_or_return, scf.Yield)
|
|
@@ -71,3 +75,16 @@ class SplitIfStmts(RewriteRule):
|
|
|
71
75
|
node.delete()
|
|
72
76
|
|
|
73
77
|
return RewriteResult(has_done_something=True)
|
|
78
|
+
|
|
79
|
+
def _has_empty_else(self, node: scf.IfElse) -> bool:
|
|
80
|
+
else_stmts = list(node.else_body.stmts())
|
|
81
|
+
if len(else_stmts) > 1:
|
|
82
|
+
return False
|
|
83
|
+
|
|
84
|
+
if len(else_stmts) == 0:
|
|
85
|
+
return True
|
|
86
|
+
|
|
87
|
+
if not isinstance(else_stmts[0], scf.Yield):
|
|
88
|
+
return False
|
|
89
|
+
|
|
90
|
+
return len(else_stmts[0].values) == 0
|
|
@@ -81,6 +81,13 @@ class SquinOp(interp.MethodTable):
|
|
|
81
81
|
op_sites = frame.get(stmt.op)
|
|
82
82
|
return (op_sites,)
|
|
83
83
|
|
|
84
|
+
@interp.impl(op.stmts.PauliString)
|
|
85
|
+
def pauli_string(
|
|
86
|
+
self, interp: NSitesAnalysis, frame: interp.Frame, stmt: op.stmts.PauliString
|
|
87
|
+
):
|
|
88
|
+
s = stmt.string
|
|
89
|
+
return (NumberSites(sites=len(s)),)
|
|
90
|
+
|
|
84
91
|
|
|
85
92
|
@scf.dialect.register(key="op.nsites")
|
|
86
93
|
class ScfSquinOp(ScfTypeInfer):
|
bloqade/squin/cirq/emit/op.py
CHANGED
|
@@ -9,6 +9,7 @@ from .runtime import (
|
|
|
9
9
|
SnRuntime,
|
|
10
10
|
SpRuntime,
|
|
11
11
|
U3Runtime,
|
|
12
|
+
RotRuntime,
|
|
12
13
|
KronRuntime,
|
|
13
14
|
MultRuntime,
|
|
14
15
|
ScaleRuntime,
|
|
@@ -123,3 +124,21 @@ class EmitCirqOpMethods(MethodTable):
|
|
|
123
124
|
self, emit: EmitCirq, frame: EmitCirqFrame, stmt: op.stmts.PauliString
|
|
124
125
|
):
|
|
125
126
|
return (PauliStringRuntime(stmt.string),)
|
|
127
|
+
|
|
128
|
+
@impl(op.stmts.Rot)
|
|
129
|
+
def rot(self, emit: EmitCirq, frame: EmitCirqFrame, stmt: op.stmts.Rot):
|
|
130
|
+
axis_op: HermitianRuntime = frame.get(stmt.axis)
|
|
131
|
+
angle = frame.get(stmt.angle)
|
|
132
|
+
|
|
133
|
+
axis_name = str(axis_op.gate).lower()
|
|
134
|
+
return (RotRuntime(axis=axis_name, angle=angle),)
|
|
135
|
+
|
|
136
|
+
@impl(op.stmts.SqrtX)
|
|
137
|
+
def sqrt_x(self, emit: EmitCirq, frame: EmitCirqFrame, stmt: op.stmts.SqrtX):
|
|
138
|
+
cirq_op = cirq.XPowGate(exponent=0.5)
|
|
139
|
+
return (UnitaryRuntime(cirq_op),)
|
|
140
|
+
|
|
141
|
+
@impl(op.stmts.SqrtY)
|
|
142
|
+
def sqrt_y(self, emit: EmitCirq, frame: EmitCirqFrame, stmt: op.stmts.SqrtY):
|
|
143
|
+
cirq_op = cirq.YPowGate(exponent=0.5)
|
|
144
|
+
return (UnitaryRuntime(cirq_op),)
|
|
@@ -240,3 +240,18 @@ class PauliStringRuntime(OperatorRuntimeABC):
|
|
|
240
240
|
qbit: pauli_label for (qbit, pauli_label) in zip(qubits, self.string)
|
|
241
241
|
}
|
|
242
242
|
return [cirq.PauliString(pauli_mapping)]
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
@dataclass
|
|
246
|
+
class RotRuntime(OperatorRuntimeABC):
|
|
247
|
+
axis: str
|
|
248
|
+
angle: float
|
|
249
|
+
|
|
250
|
+
def num_qubits(self) -> int:
|
|
251
|
+
return 1
|
|
252
|
+
|
|
253
|
+
def unsafe_apply(
|
|
254
|
+
self, qubits: Sequence[cirq.Qid], adjoint: bool = False
|
|
255
|
+
) -> list[cirq.Operation]:
|
|
256
|
+
rot = getattr(cirq, "R" + self.axis.lower())(rads=self.angle)
|
|
257
|
+
return [rot(*qubits)]
|
bloqade/squin/noise/rewrite.py
CHANGED
|
@@ -3,7 +3,7 @@ import itertools
|
|
|
3
3
|
from kirin import ir
|
|
4
4
|
from kirin.passes import Pass
|
|
5
5
|
from kirin.rewrite import Walk
|
|
6
|
-
from kirin.dialects import ilist
|
|
6
|
+
from kirin.dialects import py, ilist
|
|
7
7
|
from kirin.rewrite.abc import RewriteRule, RewriteResult
|
|
8
8
|
|
|
9
9
|
from .stmts import (
|
|
@@ -11,6 +11,7 @@ from .stmts import (
|
|
|
11
11
|
QubitLoss,
|
|
12
12
|
Depolarize,
|
|
13
13
|
PauliError,
|
|
14
|
+
Depolarize2,
|
|
14
15
|
NoiseChannel,
|
|
15
16
|
TwoQubitPauliChannel,
|
|
16
17
|
SingleQubitPauliChannel,
|
|
@@ -58,6 +59,18 @@ class _RewriteNoiseStmts(RewriteRule):
|
|
|
58
59
|
def rewrite_two_qubit_pauli_channel(
|
|
59
60
|
self, node: TwoQubitPauliChannel
|
|
60
61
|
) -> RewriteResult:
|
|
62
|
+
operator_list = self._insert_two_qubit_paulis_before_node(node)
|
|
63
|
+
stochastic_unitary = StochasticUnitaryChannel(
|
|
64
|
+
operators=operator_list, probabilities=node.params
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
node.replace_by(stochastic_unitary)
|
|
68
|
+
return RewriteResult(has_done_something=True)
|
|
69
|
+
|
|
70
|
+
@staticmethod
|
|
71
|
+
def _insert_two_qubit_paulis_before_node(
|
|
72
|
+
node: TwoQubitPauliChannel | Depolarize2,
|
|
73
|
+
) -> ir.ResultValue:
|
|
61
74
|
paulis = (Identity(sites=1), X(), Y(), Z())
|
|
62
75
|
for op in paulis:
|
|
63
76
|
op.insert_before(node)
|
|
@@ -71,12 +84,7 @@ class _RewriteNoiseStmts(RewriteRule):
|
|
|
71
84
|
operators.append(op.result)
|
|
72
85
|
|
|
73
86
|
(operator_list := ilist.New(values=operators)).insert_before(node)
|
|
74
|
-
|
|
75
|
-
operators=operator_list.result, probabilities=node.params
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
node.replace_by(stochastic_unitary)
|
|
79
|
-
return RewriteResult(has_done_something=True)
|
|
87
|
+
return operator_list.result
|
|
80
88
|
|
|
81
89
|
def rewrite_p_p_error(self, node: PPError) -> RewriteResult:
|
|
82
90
|
(operators := ilist.New(values=(node.op,))).insert_before(node)
|
|
@@ -95,8 +103,14 @@ class _RewriteNoiseStmts(RewriteRule):
|
|
|
95
103
|
op.insert_before(node)
|
|
96
104
|
operators.append(op.result)
|
|
97
105
|
|
|
106
|
+
# NOTE: need to divide the probability by 3 to get the correct total error rate
|
|
107
|
+
(three := py.Constant(3)).insert_before(node)
|
|
108
|
+
(p_over_3 := py.Div(node.p, three.result)).insert_before(node)
|
|
109
|
+
|
|
98
110
|
(operator_list := ilist.New(values=operators)).insert_before(node)
|
|
99
|
-
(ps := ilist.New(values=[
|
|
111
|
+
(ps := ilist.New(values=[p_over_3.result for _ in range(3)])).insert_before(
|
|
112
|
+
node
|
|
113
|
+
)
|
|
100
114
|
|
|
101
115
|
stochastic_unitary = StochasticUnitaryChannel(
|
|
102
116
|
operators=operator_list.result, probabilities=ps.result
|
|
@@ -105,6 +119,21 @@ class _RewriteNoiseStmts(RewriteRule):
|
|
|
105
119
|
|
|
106
120
|
return RewriteResult(has_done_something=True)
|
|
107
121
|
|
|
122
|
+
def rewrite_depolarize2(self, node: Depolarize2) -> RewriteResult:
|
|
123
|
+
operator_list = self._insert_two_qubit_paulis_before_node(node)
|
|
124
|
+
|
|
125
|
+
# NOTE: need to divide the probability by 15 to get the correct total error rate
|
|
126
|
+
(fifteen := py.Constant(15)).insert_before(node)
|
|
127
|
+
(p_over_15 := py.Div(node.p, fifteen.result)).insert_before(node)
|
|
128
|
+
(probs := ilist.New(values=[p_over_15.result] * 15)).insert_before(node)
|
|
129
|
+
|
|
130
|
+
stochastic_unitary = StochasticUnitaryChannel(
|
|
131
|
+
operators=operator_list, probabilities=probs.result
|
|
132
|
+
)
|
|
133
|
+
node.replace_by(stochastic_unitary)
|
|
134
|
+
|
|
135
|
+
return RewriteResult(has_done_something=True)
|
|
136
|
+
|
|
108
137
|
|
|
109
138
|
class RewriteNoiseStmts(Pass):
|
|
110
139
|
def unsafe_run(self, mt: ir.Method):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bloqade-circuit
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.8
|
|
4
4
|
Summary: The software development toolkit for neutral atom arrays.
|
|
5
5
|
Author-email: Roger-luo <rluo@quera.com>, kaihsin <khwu@quera.com>, weinbe58 <pweinberg@quera.com>, johnzl-777 <jlong@quera.com>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -23,10 +23,10 @@ bloqade/cirq_utils/noise/model.py,sha256=06Y_BLChOA-PhhAJcWLSgLVAAJoNjOrAujL1YCw
|
|
|
23
23
|
bloqade/cirq_utils/noise/transform.py,sha256=tvDt4WMLM8dKPME51y0_peSZk2-jKmjq0urOxm0lWuQ,2309
|
|
24
24
|
bloqade/pyqrack/__init__.py,sha256=lonTS-luJkTVujCCtgdZRC12V7FQdoFcozAI-byXwN0,810
|
|
25
25
|
bloqade/pyqrack/base.py,sha256=g0GRlEgyJ_P8z-lR8RK2CAuRTj6KPfglKX0iwrgg4DM,4408
|
|
26
|
-
bloqade/pyqrack/device.py,sha256
|
|
26
|
+
bloqade/pyqrack/device.py,sha256=-zlr1lSzOvcj5l28nnevy1oMYct79DTOdLYyGaT2Yco,11567
|
|
27
27
|
bloqade/pyqrack/reg.py,sha256=uTL07CT1R0xUsInLmwU9YuuNdV6lV0lCs1zhdUz1qIs,1660
|
|
28
28
|
bloqade/pyqrack/target.py,sha256=c78VtLWAiDNp_0sXwvVzhaEoeFsr1fUVsupxWuo6p3s,3661
|
|
29
|
-
bloqade/pyqrack/task.py,sha256=
|
|
29
|
+
bloqade/pyqrack/task.py,sha256=hzMueE03C-MR_-ti_5Z0lqFZcHDVCxmQHFaX9tPNm2o,1522
|
|
30
30
|
bloqade/pyqrack/noise/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
31
|
bloqade/pyqrack/noise/native.py,sha256=BmRlRzqCzvSgfSsDlIjuB8L0gx4uaPqmPyfJ5-Ole6M,2751
|
|
32
32
|
bloqade/pyqrack/qasm2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -124,7 +124,7 @@ bloqade/rewrite/passes/canonicalize_ilist.py,sha256=LmX09aPjagT6NzU-M87V8kZaCGkY
|
|
|
124
124
|
bloqade/rewrite/rules/__init__.py,sha256=3e1Z5T3INqNtP6OU0Vivu_SdMOR_2KDixeA0Yjoddgg,82
|
|
125
125
|
bloqade/rewrite/rules/flatten_ilist.py,sha256=QoIxMaBXSlatpWzi5s_MAPnV3bV3GeoWc31RBw0WQ3s,1465
|
|
126
126
|
bloqade/rewrite/rules/inline_getitem_ilist.py,sha256=uIXQRCsr3_GPMciDT4ghI-ezhQmkDcGcC6pguABPUVw,875
|
|
127
|
-
bloqade/rewrite/rules/split_ifs.py,sha256=
|
|
127
|
+
bloqade/rewrite/rules/split_ifs.py,sha256=KhwvUx-oBrBO2F1j-J5kwNbdnrnEZcZtJflzyQm-UOI,2613
|
|
128
128
|
bloqade/squin/__init__.py,sha256=b7ZD69ql9GriIPxN6JhWxANJVzuIJh_r-gC24wsW1mM,621
|
|
129
129
|
bloqade/squin/_typeinfer.py,sha256=bilWfC6whTMwewFCqDgB6vDHZsgXPr3azNOYqqnvtB4,780
|
|
130
130
|
bloqade/squin/gate.py,sha256=tCnjfrSVsXHX7VxkEulZ2SQS5ydtmON8QlcGibM6c2I,4028
|
|
@@ -139,19 +139,19 @@ bloqade/squin/analysis/address_impl.py,sha256=eMEGlkw88ozj8ZGHcfQ0qW2K_dNxYxnhwz
|
|
|
139
139
|
bloqade/squin/analysis/schedule.py,sha256=buuC4bFuLuaSDK2BZfkRkh8ZdNicz9HkEv3FAnsDViE,7880
|
|
140
140
|
bloqade/squin/analysis/nsites/__init__.py,sha256=RlQg7ivczXCXG5lMeL3ipYKj2oJKC4THu8orYf5PBYs,263
|
|
141
141
|
bloqade/squin/analysis/nsites/analysis.py,sha256=rIe1RU1MZRItcE2aB8DYahLrv73HfD3IHCX3E_EGQ1c,1773
|
|
142
|
-
bloqade/squin/analysis/nsites/impls.py,sha256=
|
|
142
|
+
bloqade/squin/analysis/nsites/impls.py,sha256=wSNWjNmgwCP35FgmreyLKmRYedxlebWi7LhsEq9jPs4,3097
|
|
143
143
|
bloqade/squin/analysis/nsites/lattice.py,sha256=ruh0808SHtj3ecuT-C3AZTsLY2j3DRhtezGiTZvcuVs,942
|
|
144
144
|
bloqade/squin/cirq/__init__.py,sha256=7OYYboSl5lPwdWOKk4AJgm1s1lBX_WAstVqPfaynSv8,10156
|
|
145
145
|
bloqade/squin/cirq/lowering.py,sha256=F0_skv9lORxUFrhbNaN2ZQpqGnhPyslHt5E92uta5BQ,17959
|
|
146
146
|
bloqade/squin/cirq/emit/emit_circuit.py,sha256=JVFXiaSB7A9kamRwCjLqs03Sel4PVCBT-6kRNRWX-jo,4393
|
|
147
147
|
bloqade/squin/cirq/emit/noise.py,sha256=rESjGC_66s2Y4FwwYda4rY3mYHYjbqLlKE_vnqpZDYI,1534
|
|
148
|
-
bloqade/squin/cirq/emit/op.py,sha256=
|
|
148
|
+
bloqade/squin/cirq/emit/op.py,sha256=gWMLghj65yQeAbwy2E0YhRLbzM_DkYBlvXKfsgY26fc,4712
|
|
149
149
|
bloqade/squin/cirq/emit/qubit.py,sha256=IegghRU5E1urd0ddV1X2Fh_aEWAPmUPZLVj9AafN2Cg,1930
|
|
150
|
-
bloqade/squin/cirq/emit/runtime.py,sha256=
|
|
150
|
+
bloqade/squin/cirq/emit/runtime.py,sha256=RA_3C_0qkwQCcztalmfOqJe-c4DZgEqWn2ArNjyycZ4,7170
|
|
151
151
|
bloqade/squin/noise/__init__.py,sha256=xST2qojx6ZApRoiKIXOtifDzSpTZgo-67ja309FFvWw,364
|
|
152
152
|
bloqade/squin/noise/_dialect.py,sha256=2IR98J-lXm5Y3srP9g-FD4JC-qTq2seureM6mKKq1xg,63
|
|
153
153
|
bloqade/squin/noise/_wrapper.py,sha256=P8fkr1_2U47PtvqnQqeTI7VzThNIK17cNh2QX6ABh_w,815
|
|
154
|
-
bloqade/squin/noise/rewrite.py,sha256
|
|
154
|
+
bloqade/squin/noise/rewrite.py,sha256=8v8AAi2G-ZatZ6dTpqc88hCBMMoWz2TK3nwkLkwk7Fo,5099
|
|
155
155
|
bloqade/squin/noise/stmts.py,sha256=F8AsDp2xsLez9vkSamDW985MUCubz3TMRrE0L745GmI,1875
|
|
156
156
|
bloqade/squin/op/__init__.py,sha256=6JOjPdzc6RKO4299ZFz4Jk-wtVyPlGTkakYewHBueXw,841
|
|
157
157
|
bloqade/squin/op/_dialect.py,sha256=66G1IYqmsqUEaCTyUqn2shSHmGYduiTU8GfDXcoMvw4,55
|
|
@@ -230,7 +230,7 @@ bloqade/visual/animation/runtime/atoms.py,sha256=EmjxhujLiHHPS_HtH_B-7TiqeHgvW5u
|
|
|
230
230
|
bloqade/visual/animation/runtime/ppoly.py,sha256=JB9IP53N1w6adBJEue6J5Nmj818Id9JvrlgrmiQTU1I,1385
|
|
231
231
|
bloqade/visual/animation/runtime/qpustate.py,sha256=rlmxQeJSvaohXrTpXQL5y-NJcpvfW33xPaYM1slv7cc,4270
|
|
232
232
|
bloqade/visual/animation/runtime/utils.py,sha256=ju9IzOWX-vKwfpqUjlUKu3Ssr_UFPFFq-tzH_Nqyo_c,1212
|
|
233
|
-
bloqade_circuit-0.6.
|
|
234
|
-
bloqade_circuit-0.6.
|
|
235
|
-
bloqade_circuit-0.6.
|
|
236
|
-
bloqade_circuit-0.6.
|
|
233
|
+
bloqade_circuit-0.6.8.dist-info/METADATA,sha256=8pPrKcmeLw4CJWHLi6DJuYS-xhwkGMOKZLtzzvxFAa4,3849
|
|
234
|
+
bloqade_circuit-0.6.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
235
|
+
bloqade_circuit-0.6.8.dist-info/licenses/LICENSE,sha256=S5GIJwR6QCixPA9wryYb44ZEek0Nz4rt_zLUqP05UbU,13160
|
|
236
|
+
bloqade_circuit-0.6.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|