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 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) == 1:
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):
@@ -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)]
@@ -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
- stochastic_unitary = StochasticUnitaryChannel(
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=[node.p for _ in range(3)])).insert_before(node)
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.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=40vduanEgA26GAW3buHoRpyqPA0xUt2tONY3w5JeH5s,7524
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=ydVso4wZQ1iIzgSBG0lDxClPTLcsZfkbnZk_1qFV95o,991
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=Nm4lpEUHZcnCeewIld0tt7UuGO69LiBGl7Uybuwissw,2119
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=bVqO4E2hDzfYWwSG0pfj2j8oT1m0C3b42LdSHr4HQlo,2874
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=z54NP5KqMxffXeFGWamEzvunpTNrxmYuluurk4j2-ps,4000
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=dH7JSMt2mALPhVFjmZETQzvnTUQ3BFY5poe0YZpM5vQ,6819
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=-IqFfDGnhuaFI-9b6PXjhSuiXFM1C5Qu0ibL5GvZldI,3917
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.6.dist-info/METADATA,sha256=uDJH5m1IwfBujpFvXFYjP89i0aHRbwSMEc6vhx9xwXw,3849
234
- bloqade_circuit-0.6.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
235
- bloqade_circuit-0.6.6.dist-info/licenses/LICENSE,sha256=S5GIJwR6QCixPA9wryYb44ZEek0Nz4rt_zLUqP05UbU,13160
236
- bloqade_circuit-0.6.6.dist-info/RECORD,,
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,,