bloqade-circuit 0.6.7__tar.gz → 0.7.0__tar.gz

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.
Files changed (407) hide show
  1. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/.github/workflows/ci.yml +3 -3
  2. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/.github/workflows/isort.yml +1 -1
  3. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/.github/workflows/lint.yml +2 -2
  4. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/.github/workflows/release.yml +3 -3
  5. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/PKG-INFO +1 -1
  6. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/pyproject.toml +1 -1
  7. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/analysis/measure_id/analysis.py +10 -11
  8. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/analysis/measure_id/impls.py +15 -2
  9. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/cirq_utils/noise/__init__.py +0 -2
  10. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/cirq_utils/noise/_two_zone_utils.py +7 -15
  11. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/cirq_utils/noise/model.py +141 -188
  12. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/cirq_utils/noise/transform.py +2 -2
  13. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/device.py +96 -1
  14. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/squin/qubit.py +4 -2
  15. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/squin/runtime.py +14 -6
  16. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/task.py +15 -0
  17. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/rewrite/rules/split_ifs.py +18 -1
  18. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/cirq/emit/op.py +52 -1
  19. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/cirq/emit/qubit.py +4 -4
  20. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/cirq/lowering.py +3 -9
  21. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/gate.py +7 -0
  22. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/lowering.py +26 -0
  23. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/noise/__init__.py +0 -1
  24. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/noise/_wrapper.py +2 -6
  25. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/noise/rewrite.py +0 -11
  26. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/noise/stmts.py +2 -14
  27. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/op/_wrapper.py +4 -4
  28. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/op/stmts.py +33 -9
  29. bloqade_circuit-0.7.0/src/bloqade/squin/op/types.py +128 -0
  30. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/qubit.py +27 -40
  31. bloqade_circuit-0.7.0/src/bloqade/squin/rewrite/desugar.py +102 -0
  32. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/passes/squin_to_stim.py +21 -4
  33. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/rewrite/ifs_to_stim.py +6 -1
  34. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/rewrite/qubit_to_stim.py +1 -1
  35. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/rewrite/squin_noise.py +9 -7
  36. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/rewrite/util.py +15 -3
  37. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/analysis/address/test_qubit_analysis.py +4 -4
  38. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/analysis/measure_id/test_measure_id.py +76 -0
  39. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/cirq_utils/noise/test_noise_models.py +5 -2
  40. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/cirq_utils/noise/test_noisy_ghz.py +2 -3
  41. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/cirq_utils/noise/test_one_zone_correlated_noise.py +2 -2
  42. bloqade_circuit-0.7.0/test/pyqrack/runtime/test_qrack.py +368 -0
  43. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/pyqrack/squin/test_kernel.py +6 -6
  44. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/pyqrack/squin/test_noise.py +0 -29
  45. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/passes/test_unroll_if.py +26 -0
  46. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/cirq/test_cirq_to_squin.py +1 -0
  47. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/cirq/test_squin_noise_to_cirq.py +2 -2
  48. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/cirq/test_squin_to_cirq.py +92 -2
  49. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/rewrite/test_U3_to_clifford.py +169 -105
  50. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/rewrite/test_desugar.py +2 -17
  51. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/test_sugar.py +45 -2
  52. bloqade_circuit-0.7.0/test/squin/test_typeinfer.py +175 -0
  53. bloqade_circuit-0.7.0/test/stim/passes/stim_reference_programs/noise/wire_apply_pauli_channel_1.stim +1 -0
  54. bloqade_circuit-0.7.0/test/stim/passes/stim_reference_programs/qubit/measure_desugar.stim +6 -0
  55. bloqade_circuit-0.7.0/test/stim/passes/stim_reference_programs/qubit/pick_if_else.stim +2 -0
  56. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/test_squin_meas_to_stim.py +22 -0
  57. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/test_squin_noise_to_stim.py +151 -3
  58. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/test_squin_qubit_to_stim.py +20 -0
  59. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/uv.lock +1 -1
  60. bloqade_circuit-0.6.7/src/bloqade/squin/op/types.py +0 -26
  61. bloqade_circuit-0.6.7/src/bloqade/squin/rewrite/desugar.py +0 -124
  62. bloqade_circuit-0.6.7/test/pyqrack/runtime/test_qrack.py +0 -164
  63. bloqade_circuit-0.6.7/test/squin/test_typeinfer.py +0 -71
  64. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/.github/dependabot.yml +0 -0
  65. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/.gitignore +0 -0
  66. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/.pre-commit-config.yaml +0 -0
  67. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/LICENSE +0 -0
  68. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/README.md +0 -0
  69. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/_typos.toml +0 -0
  70. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/justfile +0 -0
  71. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/analysis/__init__.py +0 -0
  72. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/analysis/address/__init__.py +0 -0
  73. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/analysis/address/analysis.py +0 -0
  74. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/analysis/address/impls.py +0 -0
  75. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/analysis/address/lattice.py +0 -0
  76. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/analysis/fidelity/__init__.py +0 -0
  77. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/analysis/fidelity/analysis.py +0 -0
  78. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/analysis/measure_id/__init__.py +0 -0
  79. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/analysis/measure_id/lattice.py +0 -0
  80. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/cirq_utils/__init__.py +0 -0
  81. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/cirq_utils/lineprog.py +0 -0
  82. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/cirq_utils/noise/conflict_graph.py +0 -0
  83. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/cirq_utils/parallelize.py +0 -0
  84. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/device.py +0 -0
  85. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/__init__.py +0 -0
  86. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/base.py +0 -0
  87. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/noise/__init__.py +0 -0
  88. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/noise/native.py +0 -0
  89. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/qasm2/__init__.py +0 -0
  90. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/qasm2/core.py +0 -0
  91. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/qasm2/glob.py +0 -0
  92. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/qasm2/parallel.py +0 -0
  93. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/qasm2/uop.py +0 -0
  94. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/reg.py +0 -0
  95. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/squin/__init__.py +0 -0
  96. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/squin/noise/__init__.py +0 -0
  97. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/squin/noise/native.py +0 -0
  98. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/squin/op.py +0 -0
  99. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/squin/wire.py +0 -0
  100. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/pyqrack/target.py +0 -0
  101. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/__init__.py +0 -0
  102. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/_qasm_loading.py +0 -0
  103. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/_wrappers.py +0 -0
  104. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/__init__.py +0 -0
  105. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/core/__init__.py +0 -0
  106. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/core/_dialect.py +0 -0
  107. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/core/_emit.py +0 -0
  108. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/core/_typeinfer.py +0 -0
  109. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/core/address.py +0 -0
  110. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/core/stmts.py +0 -0
  111. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/expr/__init__.py +0 -0
  112. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/expr/_dialect.py +0 -0
  113. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/expr/_emit.py +0 -0
  114. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/expr/_from_python.py +0 -0
  115. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/expr/_interp.py +0 -0
  116. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/expr/stmts.py +0 -0
  117. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/glob.py +0 -0
  118. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/indexing.py +0 -0
  119. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/inline.py +0 -0
  120. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/noise/__init__.py +0 -0
  121. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/noise/_dialect.py +0 -0
  122. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/noise/fidelity.py +0 -0
  123. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/noise/model.py +0 -0
  124. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/noise/stmts.py +0 -0
  125. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/parallel.py +0 -0
  126. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/uop/__init__.py +0 -0
  127. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/uop/_dialect.py +0 -0
  128. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/uop/_emit.py +0 -0
  129. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/uop/schedule.py +0 -0
  130. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/dialects/uop/stmts.py +0 -0
  131. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/emit/__init__.py +0 -0
  132. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/emit/base.py +0 -0
  133. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/emit/gate.py +0 -0
  134. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/emit/impls/__init__.py +0 -0
  135. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/emit/impls/noise.py +0 -0
  136. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/emit/main.py +0 -0
  137. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/emit/target.py +0 -0
  138. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/glob.py +0 -0
  139. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/groups.py +0 -0
  140. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/noise.py +0 -0
  141. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/parallel.py +0 -0
  142. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/parse/__init__.py +0 -0
  143. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/parse/ast.py +0 -0
  144. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/parse/build.py +0 -0
  145. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/parse/lowering.py +0 -0
  146. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/parse/parser.py +0 -0
  147. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/parse/print.py +0 -0
  148. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/parse/qasm2.lark +0 -0
  149. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/parse/visitor.py +0 -0
  150. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/parse/visitor.pyi +0 -0
  151. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/passes/__init__.py +0 -0
  152. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/passes/fold.py +0 -0
  153. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/passes/glob.py +0 -0
  154. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/passes/lift_qubits.py +0 -0
  155. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/passes/noise.py +0 -0
  156. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/passes/parallel.py +0 -0
  157. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/passes/py2qasm.py +0 -0
  158. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/passes/qasm2py.py +0 -0
  159. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/passes/unroll_if.py +0 -0
  160. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/__init__.py +0 -0
  161. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/desugar.py +0 -0
  162. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/glob.py +0 -0
  163. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/insert_qubits.py +0 -0
  164. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/native_gates.py +0 -0
  165. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/noise/__init__.py +0 -0
  166. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/noise/heuristic_noise.py +0 -0
  167. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/noise/remove_noise.py +0 -0
  168. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/parallel_to_glob.py +0 -0
  169. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/parallel_to_uop.py +0 -0
  170. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/register.py +0 -0
  171. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/rewrite/uop_to_parallel.py +0 -0
  172. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qasm2/types.py +0 -0
  173. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qbraid/__init__.py +0 -0
  174. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qbraid/lowering.py +0 -0
  175. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qbraid/schema.py +0 -0
  176. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qbraid/simulation_result.py +0 -0
  177. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/qbraid/target.py +0 -0
  178. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/rewrite/__init__.py +0 -0
  179. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/rewrite/passes/__init__.py +0 -0
  180. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/rewrite/passes/canonicalize_ilist.py +0 -0
  181. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/rewrite/rules/__init__.py +0 -0
  182. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/rewrite/rules/flatten_ilist.py +0 -0
  183. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/rewrite/rules/inline_getitem_ilist.py +0 -0
  184. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/__init__.py +0 -0
  185. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/_typeinfer.py +0 -0
  186. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/analysis/__init__.py +0 -0
  187. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/analysis/address_impl.py +0 -0
  188. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/analysis/nsites/__init__.py +0 -0
  189. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/analysis/nsites/analysis.py +0 -0
  190. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/analysis/nsites/impls.py +0 -0
  191. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/analysis/nsites/lattice.py +0 -0
  192. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/analysis/schedule.py +0 -0
  193. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/cirq/__init__.py +0 -0
  194. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/cirq/emit/emit_circuit.py +0 -0
  195. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/cirq/emit/noise.py +0 -0
  196. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/cirq/emit/runtime.py +0 -0
  197. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/groups.py +0 -0
  198. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/noise/_dialect.py +0 -0
  199. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/op/__init__.py +0 -0
  200. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/op/_dialect.py +0 -0
  201. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/op/number.py +0 -0
  202. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/op/rewrite.py +0 -0
  203. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/op/stdlib.py +0 -0
  204. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/op/traits.py +0 -0
  205. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/parallel.py +0 -0
  206. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/rewrite/U3_to_clifford.py +0 -0
  207. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/rewrite/__init__.py +0 -0
  208. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/rewrite/canonicalize.py +0 -0
  209. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/rewrite/remove_dangling_qubits.py +0 -0
  210. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/rewrite/wrap_analysis.py +0 -0
  211. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/types.py +0 -0
  212. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/squin/wire.py +0 -0
  213. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/__init__.py +0 -0
  214. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/_wrappers.py +0 -0
  215. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/__init__.py +0 -0
  216. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/auxiliary/__init__.py +0 -0
  217. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/auxiliary/_dialect.py +0 -0
  218. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/auxiliary/emit.py +0 -0
  219. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/auxiliary/interp.py +0 -0
  220. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/auxiliary/lowering.py +0 -0
  221. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/auxiliary/stmts/__init__.py +0 -0
  222. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/auxiliary/stmts/annotate.py +0 -0
  223. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/auxiliary/stmts/const.py +0 -0
  224. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/auxiliary/types.py +0 -0
  225. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/collapse/__init__.py +0 -0
  226. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/collapse/_dialect.py +0 -0
  227. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/collapse/emit_str.py +0 -0
  228. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/collapse/stmts/__init__.py +0 -0
  229. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/collapse/stmts/measure.py +0 -0
  230. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/collapse/stmts/pp_measure.py +0 -0
  231. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/collapse/stmts/reset.py +0 -0
  232. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/gate/__init__.py +0 -0
  233. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/gate/_dialect.py +0 -0
  234. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/gate/emit.py +0 -0
  235. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/gate/stmts/__init__.py +0 -0
  236. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/gate/stmts/base.py +0 -0
  237. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/gate/stmts/clifford_1q.py +0 -0
  238. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/gate/stmts/clifford_2q.py +0 -0
  239. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/gate/stmts/control_2q.py +0 -0
  240. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/gate/stmts/pp.py +0 -0
  241. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/noise/__init__.py +0 -0
  242. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/noise/_dialect.py +0 -0
  243. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/noise/emit.py +0 -0
  244. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/dialects/noise/stmts.py +0 -0
  245. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/emit/__init__.py +0 -0
  246. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/emit/stim_str.py +0 -0
  247. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/groups.py +0 -0
  248. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/parse/__init__.py +0 -0
  249. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/parse/lowering.py +0 -0
  250. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/passes/__init__.py +0 -0
  251. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/passes/simplify_ifs.py +0 -0
  252. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/rewrite/__init__.py +0 -0
  253. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/rewrite/py_constant_to_stim.py +0 -0
  254. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/rewrite/squin_measure.py +0 -0
  255. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/rewrite/wire_identity_elimination.py +0 -0
  256. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/rewrite/wire_to_stim.py +0 -0
  257. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/upstream/__init__.py +0 -0
  258. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/stim/upstream/from_squin.py +0 -0
  259. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/task.py +0 -0
  260. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/test_utils.py +0 -0
  261. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/types.py +0 -0
  262. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/visual/__init__.py +0 -0
  263. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/visual/animation/__init__.py +0 -0
  264. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/visual/animation/animate.py +0 -0
  265. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/visual/animation/base.py +0 -0
  266. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/visual/animation/gate_event.py +0 -0
  267. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/visual/animation/runtime/__init__.py +0 -0
  268. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/visual/animation/runtime/aod.py +0 -0
  269. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/visual/animation/runtime/atoms.py +0 -0
  270. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/visual/animation/runtime/ppoly.py +0 -0
  271. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/visual/animation/runtime/qpustate.py +0 -0
  272. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/src/bloqade/visual/animation/runtime/utils.py +0 -0
  273. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/__init__.py +0 -0
  274. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/analysis/address/test_wire_analysis.py +0 -0
  275. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/analysis/address/util.py +0 -0
  276. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/analysis/fidelity/test_fidelity.py +0 -0
  277. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/cirq_utils/test_lpsolvers.py +0 -0
  278. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/cirq_utils/test_parallelize.py +0 -0
  279. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/cirq_utils/test_transpile.py +0 -0
  280. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/pyqrack/__init__.py +0 -0
  281. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/pyqrack/runtime/__init__.py +0 -0
  282. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/pyqrack/runtime/noise/__init__.py +0 -0
  283. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/pyqrack/runtime/noise/qasm2/test_loss.py +0 -0
  284. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/pyqrack/runtime/noise/qasm2/test_pauli.py +0 -0
  285. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/pyqrack/runtime/test_dyn_memory.py +0 -0
  286. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/pyqrack/test_target.py +0 -0
  287. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/__init__.py +0 -0
  288. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/analysis/test_dag.py +0 -0
  289. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/emit/test_extended.py +0 -0
  290. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/emit/test_extended_noise.py +0 -0
  291. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/emit/test_qasm2.py +0 -0
  292. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/emit/test_qasm2_emit.py +0 -0
  293. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/__init__.py +0 -0
  294. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/invalid_programs/invalid_if.qasm +0 -0
  295. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/README.md +0 -0
  296. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/global.qasm +0 -0
  297. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/iqft1.qasm +0 -0
  298. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/main.qasm +0 -0
  299. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/noise.qasm +0 -0
  300. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/para.qasm +0 -0
  301. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/process_tomo.qasm +0 -0
  302. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/qelib1.inc +0 -0
  303. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/qft.qasm +0 -0
  304. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/qft2.qasm +0 -0
  305. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/rb.qasm +0 -0
  306. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/rep_code.qasm +0 -0
  307. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/ripple_carry_adder.qasm +0 -0
  308. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/tele.qasm +0 -0
  309. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/programs/valid_if.qasm +0 -0
  310. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/test_ast.py +0 -0
  311. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/parse/test_roundtrip.py +0 -0
  312. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/passes/__init__.py +0 -0
  313. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/passes/test_global_to_parallel.py +0 -0
  314. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/passes/test_global_to_uop.py +0 -0
  315. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/passes/test_heuristic_noise.py +0 -0
  316. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/passes/test_parallel_to_global.py +0 -0
  317. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/passes/test_parallel_to_uop.py +0 -0
  318. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/passes/test_qasm2py.py +0 -0
  319. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/passes/test_uop_to_parallel.py +0 -0
  320. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/test_count.py +0 -0
  321. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/test_inline.py +0 -0
  322. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/test_lowering.py +0 -0
  323. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/test_native.py +0 -0
  324. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qasm2/test_two2one.py +0 -0
  325. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qbraid/__init__.py +0 -0
  326. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qbraid/test_clean_circuit.py +0 -0
  327. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qbraid/test_lowering.py +0 -0
  328. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/qbraid/test_target.py +0 -0
  329. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/sample/__init__.py +0 -0
  330. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/sample/test_noise_model.py +0 -0
  331. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/analysis/test_nsites_analysis.py +0 -0
  332. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/op/test_reset.py +0 -0
  333. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/rewrite/test_canonicalize.py +0 -0
  334. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/rewrite/test_mult_rewrite.py +0 -0
  335. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/test_constprop.py +0 -0
  336. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/test_stdlib_shorthands.py +0 -0
  337. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/wire/__init__.py +0 -0
  338. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/squin/wire/test_check.py +0 -0
  339. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/__init__.py +0 -0
  340. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/__init__.py +0 -0
  341. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/__init__.py +0 -0
  342. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/emit/__init__.py +0 -0
  343. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/emit/base.py +0 -0
  344. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/emit/test_stim_1q.py +0 -0
  345. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/emit/test_stim_ctrl.py +0 -0
  346. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/emit/test_stim_detector.py +0 -0
  347. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/emit/test_stim_meas.py +0 -0
  348. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/emit/test_stim_noise.py +0 -0
  349. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/emit/test_stim_obs_inc.py +0 -0
  350. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/emit/test_stim_ppmeas.py +0 -0
  351. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/emit/test_stim_qubit_coords.py +0 -0
  352. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/emit/test_stim_spp.py +0 -0
  353. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/test_stim_circuits.py +0 -0
  354. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/dialects/stim/test_stim_const.py +0 -0
  355. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/parse/__init__.py +0 -0
  356. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/parse/base.py +0 -0
  357. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/parse/test_parse.py +0 -0
  358. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/parse/test_parse_clifford.py +0 -0
  359. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/parse/test_parse_control.py +0 -0
  360. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/parse/test_parse_custom.py +0 -0
  361. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/parse/test_parse_noise.py +0 -0
  362. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/parse/test_parse_spp.py +0 -0
  363. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/__init__.py +0 -0
  364. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/apply_depolarize1.stim +0 -0
  365. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/apply_loss.stim +0 -0
  366. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/apply_pauli_channel_1.stim +0 -0
  367. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/broadcast_depolarize1.stim +0 -0
  368. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/broadcast_depolarize2.stim +0 -0
  369. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/broadcast_iid_bit_flip_channel.stim +0 -0
  370. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/broadcast_iid_phase_flip_channel.stim +0 -0
  371. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/broadcast_iid_y_flip_channel.stim +0 -0
  372. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_1.stim +0 -0
  373. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_1_many_qubits.stim +0 -0
  374. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_1_reuse.stim +0 -0
  375. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_2.stim +0 -0
  376. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_2_reuse_on_4_qubits.stim +0 -0
  377. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/pure_squin_rewrite.txt +0 -0
  378. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/addition_assignment_measure.stim +0 -0
  379. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/alias_with_measure_list.stim +0 -0
  380. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/complex_storage_index_order.stim +0 -0
  381. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/for_loop_nontrivial_index.stim +0 -0
  382. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/nested_for_loop.stim +0 -0
  383. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/nested_list.stim +0 -0
  384. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/qubit.stim +0 -0
  385. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/qubit_broadcast.stim +0 -0
  386. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/qubit_loss.stim +0 -0
  387. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/qubit_reset.stim +0 -0
  388. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/record_index_order.stim +0 -0
  389. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/simple_if_rewrite.stim +0 -0
  390. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/qubit/u3_to_clifford.stim +0 -0
  391. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/wire/wire.stim +0 -0
  392. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/wire/wire_apply.stim +0 -0
  393. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/wire/wire_apply_control.stim +0 -0
  394. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/wire/wire_broadcast.stim +0 -0
  395. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/wire/wire_broadcast_control.stim +0 -0
  396. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/wire/wire_measure.stim +0 -0
  397. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/wire/wire_multiple_apply.stim +0 -0
  398. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/wire/wire_qubit_loss.stim +0 -0
  399. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/stim_reference_programs/wire/wire_reset.stim +0 -0
  400. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/passes/test_squin_wire_to_stim.py +0 -0
  401. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/test_measure_id_analysis.py +0 -0
  402. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/wrapper/__init__.py +0 -0
  403. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/stim/wrapper/test_wrapper.py +0 -0
  404. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/test_serialization.py +0 -0
  405. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/test_zone_model.py +0 -0
  406. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/visual/__init__.py +0 -0
  407. {bloqade_circuit-0.6.7 → bloqade_circuit-0.7.0}/test/visual/test_utils.py +0 -0
@@ -19,7 +19,7 @@ jobs:
19
19
  python-version: ["3.10", "3.11", "3.12"]
20
20
 
21
21
  steps:
22
- - uses: actions/checkout@v4
22
+ - uses: actions/checkout@v5
23
23
  - name: Install uv
24
24
  uses: astral-sh/setup-uv@v6
25
25
  with:
@@ -53,9 +53,9 @@ jobs:
53
53
  needs: build
54
54
  if: github.event.pull_request
55
55
  steps:
56
- - uses: actions/checkout@v4
56
+ - uses: actions/checkout@v5
57
57
  - name: download covearge
58
- uses: actions/download-artifact@v4
58
+ uses: actions/download-artifact@v5
59
59
  with:
60
60
  name: code-coverage-report
61
61
  - name: check coverage
@@ -12,7 +12,7 @@ jobs:
12
12
  build:
13
13
  runs-on: ubuntu-latest
14
14
  steps:
15
- - uses: actions/checkout@v4
15
+ - uses: actions/checkout@v5
16
16
  - uses: isort/isort-action@v1
17
17
  with:
18
18
  sortPaths: "src" # only sort files in the src directory
@@ -12,10 +12,10 @@ jobs:
12
12
  ruff:
13
13
  runs-on: ubuntu-latest
14
14
  steps:
15
- - uses: actions/checkout@v4
15
+ - uses: actions/checkout@v5
16
16
  - uses: chartboost/ruff-action@v1
17
17
  black:
18
18
  runs-on: ubuntu-latest
19
19
  steps:
20
- - uses: actions/checkout@v4
20
+ - uses: actions/checkout@v5
21
21
  - uses: psf/black@stable
@@ -8,7 +8,7 @@ jobs:
8
8
  runs-on: ubuntu-latest
9
9
 
10
10
  steps:
11
- - uses: actions/checkout@v4
11
+ - uses: actions/checkout@v5
12
12
  - name: Install uv
13
13
  uses: astral-sh/setup-uv@v6
14
14
  with:
@@ -39,7 +39,7 @@ jobs:
39
39
 
40
40
  steps:
41
41
  - name: Download all the dists
42
- uses: actions/download-artifact@v4
42
+ uses: actions/download-artifact@v5
43
43
  with:
44
44
  name: python-package-distributions
45
45
  path: dist/
@@ -60,7 +60,7 @@ jobs:
60
60
 
61
61
  steps:
62
62
  - name: Download all the dists
63
- uses: actions/download-artifact@v4
63
+ uses: actions/download-artifact@v5
64
64
  with:
65
65
  name: python-package-distributions
66
66
  path: dist/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bloqade-circuit
3
- Version: 0.6.7
3
+ Version: 0.7.0
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "bloqade-circuit"
3
- version = "0.6.7"
3
+ version = "0.7.0"
4
4
  description = "The software development toolkit for neutral atom arrays."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -1,7 +1,7 @@
1
1
  from typing import TypeVar
2
2
  from dataclasses import field, dataclass
3
3
 
4
- from kirin import ir, interp
4
+ from kirin import ir
5
5
  from kirin.analysis import ForwardExtra, const
6
6
  from kirin.analysis.forward import ForwardFrame
7
7
 
@@ -37,20 +37,19 @@ class MeasurementIDAnalysis(ForwardExtra[MeasureIDFrame, MeasureId]):
37
37
  # NOTE: we do not support dynamic calls here, thus no need to propagate method object
38
38
  return self.run_callable(method.code, (self.lattice.bottom(),) + args)
39
39
 
40
- T = TypeVar("T")
41
-
42
40
  # Xiu-zhe (Roger) Luo came up with this in the address analysis,
43
- # reused here for convenience
41
+ # reused here for convenience (now modified to be a bit more graceful)
44
42
  # TODO: Remove this function once upgrade to kirin 0.18 happens,
45
43
  # method is built-in to interpreter then
46
- def get_const_value(self, input_type: type[T], value: ir.SSAValue) -> T:
44
+
45
+ T = TypeVar("T")
46
+
47
+ def get_const_value(
48
+ self, input_type: type[T], value: ir.SSAValue
49
+ ) -> type[T] | None:
47
50
  if isinstance(hint := value.hints.get("const"), const.Value):
48
51
  data = hint.data
49
52
  if isinstance(data, input_type):
50
53
  return hint.data
51
- raise interp.InterpreterError(
52
- f"Expected constant value <type = {input_type}>, got {data}"
53
- )
54
- raise interp.InterpreterError(
55
- f"Expected constant value <type = {input_type}>, got {value}"
56
- )
54
+
55
+ return None
@@ -103,10 +103,23 @@ class PyIndexing(interp.MethodTable):
103
103
  def getitem(
104
104
  self, interp: MeasurementIDAnalysis, frame: interp.Frame, stmt: py.GetItem
105
105
  ):
106
- idx = interp.get_const_value(int, stmt.index)
106
+
107
+ idx_or_slice = interp.get_const_value((int, slice), stmt.index)
108
+ if idx_or_slice is None:
109
+ return (InvalidMeasureId(),)
110
+
111
+ # hint = stmt.index.hints.get("const")
112
+ # if hint is None or not isinstance(hint, const.Value):
113
+ # return (InvalidMeasureId(),)
114
+
107
115
  obj = frame.get(stmt.obj)
108
116
  if isinstance(obj, MeasureIdTuple):
109
- return (obj.data[idx],)
117
+ if isinstance(idx_or_slice, slice):
118
+ return (MeasureIdTuple(data=obj.data[idx_or_slice]),)
119
+ elif isinstance(idx_or_slice, int):
120
+ return (obj.data[idx_or_slice],)
121
+ else:
122
+ return (InvalidMeasureId(),)
110
123
  # just propagate these down the line
111
124
  elif isinstance(obj, (AnyMeasureId, NotMeasureId)):
112
125
  return (obj,)
@@ -3,8 +3,6 @@
3
3
  from .model import (
4
4
  GeminiOneZoneNoiseModel as GeminiOneZoneNoiseModel,
5
5
  GeminiTwoZoneNoiseModel as GeminiTwoZoneNoiseModel,
6
- GeminiOneZoneNoiseModelABC as GeminiOneZoneNoiseModelABC,
7
- GeminiOneZoneNoiseModelCorrelated as GeminiOneZoneNoiseModelCorrelated,
8
6
  GeminiOneZoneNoiseModelConflictGraphMoves as GeminiOneZoneNoiseModelConflictGraphMoves,
9
7
  )
10
8
  from .transform import transform_circuit as transform_circuit
@@ -264,8 +264,9 @@ def get_gate_error_channel(
264
264
  moment: cirq.Moment,
265
265
  sq_loc_rates: np.ndarray,
266
266
  sq_glob_rates: np.ndarray,
267
- cz_rates: np.ndarray,
267
+ two_qubit_pauli: cirq.Gate,
268
268
  unp_cz_rates: np.ndarray,
269
+ nqubs: int,
269
270
  ):
270
271
  """Applies gate errors to the circuit
271
272
 
@@ -273,15 +274,15 @@ def get_gate_error_channel(
273
274
  moment: A cirq.Moment object.
274
275
  sq_loc_rates: single local qubit rotation Pauli noise channel parameters (px, py, pz)
275
276
  sq_glob_rates: single global qubit rotation Pauli noise channel parameters (px,py,pz)
276
- cz_rates: two-qubit rotation Pauli noise channel parameters (ctrl_px, ctrl_py,ctrl_pz,tar_px,tar_py,tar_pz)
277
+ two_qubit_pauli: correlated two-qubit noise channel (ctrl_px, ctrl_py,ctrl_pz,tar_px,tar_py,tar_pz)
277
278
  unp_cz_rates: Pauli noise channel parameters for qubits in the gate zone and outside blockade radius
279
+ nqubs: total number of qubits
278
280
  Returns:
279
281
  A new cirq.Moment object with the gate errors applied.
280
282
  """
281
283
  # Check for the moment (layer) layout: global single qubit gates, or mixture of single qubit gates and two qubit gates
282
284
 
283
285
  gates_in_layer = extract_u3_and_cz_qargs(moment)
284
- # new_moment = cirq.Moment()
285
286
  new_moments = cirq.Circuit()
286
287
 
287
288
  if gates_in_layer["cz"] == []:
@@ -294,7 +295,7 @@ def get_gate_error_channel(
294
295
  if all(
295
296
  np.all(np.isclose(element, gates_in_layer["angles"][0]))
296
297
  for element in gates_in_layer["angles"]
297
- ):
298
+ ) and nqubs == len(gates_in_layer["u3"]):
298
299
  pauli_channel = cirq.AsymmetricDepolarizingChannel(
299
300
  p_x=sq_glob_rates[0], p_y=sq_glob_rates[1], p_z=sq_glob_rates[2]
300
301
  )
@@ -314,12 +315,6 @@ def get_gate_error_channel(
314
315
 
315
316
  else:
316
317
  # there is at least one CZ gate...
317
- ctrl_pauli_channel = cirq.AsymmetricDepolarizingChannel(
318
- p_x=cz_rates[0], p_y=cz_rates[1], p_z=cz_rates[2]
319
- )
320
- tar_pauli_channel = cirq.AsymmetricDepolarizingChannel(
321
- p_x=cz_rates[3], p_y=cz_rates[4], p_z=cz_rates[5]
322
- )
323
318
  loc_rot_pauli_channel = cirq.AsymmetricDepolarizingChannel(
324
319
  p_x=sq_loc_rates[0], p_y=sq_loc_rates[1], p_z=sq_loc_rates[2]
325
320
  )
@@ -327,18 +322,15 @@ def get_gate_error_channel(
327
322
  p_x=unp_cz_rates[0], p_y=unp_cz_rates[1], p_z=unp_cz_rates[2]
328
323
  )
329
324
 
325
+ # apply correlated noise to paired qubits
330
326
  for qub in gates_in_layer["cz"]:
331
- new_moments.append(ctrl_pauli_channel(qub[0]))
332
- new_moments.append(tar_pauli_channel(qub[1]))
333
- # new_moment=new_moment+ctrl_pauli_channel(qub[0])
334
- # new_moment=new_moment+tar_pauli_channel(qub[1])
327
+ new_moments.append(two_qubit_pauli.on(qub[0], qub[1]))
335
328
 
336
329
  for qub in gates_in_layer["u3"]:
337
330
  new_moments.append(
338
331
  unp_cz_pauli_channel(qub[0])
339
332
  ) ###qubits in the gate zone get unpaired_cz error
340
333
  new_moments.append(loc_rot_pauli_channel(qub[0]))
341
- # new_moment = new_moment + loc_rot_pauli_channel(qub[0])
342
334
 
343
335
  return new_moments
344
336
 
@@ -1,5 +1,5 @@
1
- from typing import Iterable, Sequence
2
- from dataclasses import field, dataclass
1
+ from typing import Iterable, Sequence, cast
2
+ from dataclasses import dataclass
3
3
 
4
4
  import cirq
5
5
  import numpy as np
@@ -11,6 +11,33 @@ from ..parallelize import parallelize
11
11
  from .conflict_graph import OneZoneConflictGraph
12
12
 
13
13
 
14
+ def _default_cz_paired_correlated_rates() -> dict:
15
+ rates = np.array(
16
+ [
17
+ [9.93492628e-01, 2.27472300e-04, 2.27472300e-04, 1.51277730e-03],
18
+ [2.27472300e-04, 1.42864200e-04, 1.42864200e-04, 1.43082900e-04],
19
+ [2.27472300e-04, 1.42864200e-04, 1.42864200e-04, 1.43082900e-04],
20
+ [1.51277730e-03, 1.43082900e-04, 1.43082900e-04, 1.42813990e-03],
21
+ ]
22
+ )
23
+
24
+ return correlated_noise_array_to_dict(noise_rates=rates)
25
+
26
+
27
+ def correlated_noise_array_to_dict(noise_rates: np.ndarray) -> dict:
28
+ paulis = ("I", "X", "Y", "Z")
29
+ error_probabilities = {}
30
+ for idx1, p1 in enumerate(paulis):
31
+ for idx2, p2 in enumerate(paulis):
32
+ probability = noise_rates[idx1, idx2]
33
+
34
+ if probability > 0:
35
+ key = p1 + p2
36
+ error_probabilities[key] = probability
37
+
38
+ return error_probabilities
39
+
40
+
14
41
  @dataclass(frozen=True)
15
42
  class GeminiNoiseModelABC(cirq.NoiseModel, MoveNoiseModelABC):
16
43
  """Abstract base class for all Gemini noise models."""
@@ -22,6 +49,47 @@ class GeminiNoiseModelABC(cirq.NoiseModel, MoveNoiseModelABC):
22
49
 
23
50
  """
24
51
 
52
+ cz_paired_correlated_rates: np.ndarray | None = None
53
+ """The correlated CZ error rates as a 4x4 array."""
54
+
55
+ cz_paired_error_probabilities: dict | None = None
56
+ """The correlated CZ error rates as a dictionary"""
57
+
58
+ def __post_init__(self):
59
+ if (
60
+ self.cz_paired_correlated_rates is None
61
+ and self.cz_paired_error_probabilities is None
62
+ ):
63
+ # NOTE: no input, set to default value; weird setattr for frozen dataclass
64
+ object.__setattr__(
65
+ self,
66
+ "cz_paired_error_probabilities",
67
+ _default_cz_paired_correlated_rates(),
68
+ )
69
+ elif (
70
+ self.cz_paired_correlated_rates is not None
71
+ and self.cz_paired_correlated_rates is None
72
+ ):
73
+
74
+ if self.cz_paired_correlated_rates.shape != (4, 4):
75
+ raise ValueError(
76
+ "Expected a 4x4 array of probabilities for cz_paired_correlated_rates"
77
+ )
78
+
79
+ # NOTE: convert array to dict
80
+ object.__setattr__(
81
+ self,
82
+ "cz_paired_error_probabilities",
83
+ correlated_noise_array_to_dict(self.cz_paired_correlated_rates),
84
+ )
85
+ elif (
86
+ self.cz_paired_correlated_rates is not None
87
+ and self.cz_paired_correlated_rates is not None
88
+ ):
89
+ raise ValueError(
90
+ "Received both `cz_paired_correlated_rates` and `cz_paired_correlated_rates` as input. This is ambiguous, please only set one."
91
+ )
92
+
25
93
  @staticmethod
26
94
  def validate_moments(moments: Iterable[cirq.Moment]):
27
95
  allowed_target_gates: frozenset[cirq.GateFamily] = cirq.CZTargetGateset().gates
@@ -81,72 +149,33 @@ class GeminiNoiseModelABC(cirq.NoiseModel, MoveNoiseModelABC):
81
149
  self.cz_unpaired_gate_pz,
82
150
  )
83
151
 
152
+ @property
153
+ def two_qubit_pauli(self) -> cirq.AsymmetricDepolarizingChannel:
154
+ # NOTE: if this was None it would error when instantiating self
155
+ # quiet the linter for the copy below
156
+ error_probabilities = cast(dict, self.cz_paired_error_probabilities)
84
157
 
85
- @dataclass(frozen=True)
86
- class GeminiOneZoneNoiseModelABC(GeminiNoiseModelABC):
87
- """Abstract base class for all one-zone Gemini noise models."""
88
-
89
- parallelize_circuit: bool = False
90
-
91
- def noisy_moments(
92
- self, moments: Iterable[cirq.Moment], system_qubits: Sequence[cirq.Qid]
93
- ) -> Sequence[cirq.OP_TREE]:
94
- """Adds possibly stateful noise to a series of moments.
95
-
96
- Args:
97
- moments: The moments to add noise to.
98
- system_qubits: A list of all qubits in the system.
99
-
100
- Returns:
101
- A sequence of OP_TREEEs, with the k'th tree corresponding to the
102
- noisy operations for the k'th moment.
103
- """
104
-
105
- if self.check_input_circuit:
106
- self.validate_moments(moments)
107
-
108
- # Split into moments with only 1Q and 2Q gates
109
- moments_1q = [
110
- cirq.Moment([op for op in moment.operations if len(op.qubits) == 1])
111
- for moment in moments
112
- ]
113
- moments_2q = [
114
- cirq.Moment([op for op in moment.operations if len(op.qubits) == 2])
115
- for moment in moments
116
- ]
117
-
118
- assert len(moments_1q) == len(moments_2q)
119
-
120
- interleaved_moments = []
121
- for idx, moment in enumerate(moments_1q):
122
- interleaved_moments.append(moment)
123
- interleaved_moments.append(moments_2q[idx])
124
-
125
- interleaved_circuit = cirq.Circuit.from_moments(*interleaved_moments)
126
-
127
- # Combine subsequent 1Q gates
128
- compressed_circuit = cirq.merge_single_qubit_moments_to_phxz(
129
- interleaved_circuit
130
- )
131
- if self.parallelize_circuit:
132
- compressed_circuit = parallelize(compressed_circuit)
133
-
134
- return self._noisy_moments_impl_moment(
135
- compressed_circuit.moments, system_qubits
158
+ # NOTE: copy dict since cirq modifies it in-place somewhere
159
+ return cirq.AsymmetricDepolarizingChannel(
160
+ error_probabilities=error_probabilities.copy()
136
161
  )
137
162
 
138
163
 
139
164
  @dataclass(frozen=True)
140
- class GeminiOneZoneNoiseModel(GeminiOneZoneNoiseModelABC):
165
+ class GeminiOneZoneNoiseModel(GeminiNoiseModelABC):
141
166
  """
142
167
  A Cirq-compatible noise model for a one-zone implementation of the Gemini architecture.
143
168
 
144
169
  This model introduces custom asymmetric depolarizing noise for both single- and two-qubit gates
145
170
  depending on whether operations are global, local, or part of a CZ interaction. Since the model assumes all
146
- atoms are in the entangling zone, error are applied that stem from application of Rydberg error, even for
171
+ atoms are in the entangling zone, errors are applied that stem from application of Rydberg error, even for
147
172
  qubits not actively involved in a gate operation.
173
+
174
+ Note, that the noise applied to entangling pairs is correlated.
148
175
  """
149
176
 
177
+ parallelize_circuit: bool = False
178
+
150
179
  def _single_qubit_moment_noise_ops(
151
180
  self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]
152
181
  ) -> tuple[list, list]:
@@ -206,132 +235,6 @@ class GeminiOneZoneNoiseModel(GeminiOneZoneNoiseModelABC):
206
235
 
207
236
  return [gate_noise_op], []
208
237
 
209
- def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]):
210
- """
211
- Applies a structured noise model to a given moment depending on the type of operations it contains.
212
-
213
- For single-qubit moments:
214
- - If all gates are identical and act on all qubits, global noise is applied.
215
- - Otherwise, local depolarizing noise is applied per qubit.
216
-
217
- For two-qubit moments:
218
- - Applies move error to move control qubits to target qubits before the gate and again to move back after
219
- the gate.
220
- - Applies gate error to control and target qubits.
221
- - Adds 1q asymmetric noise to qubits that do not participate in a gate.
222
-
223
- Args:
224
- moment: A cirq.Moment containing the original quantum operations.
225
- system_qubits: All qubits in the system (used to determine idleness and global operations).
226
-
227
- Returns:
228
- A list of cirq.Moment objects:
229
- [pre-gate move noise, original moment, post-gate move noise, gate noise moment]
230
-
231
- Raises:
232
- ValueError: If the moment contains multi-qubit gates involving >2 qubits, which are unsupported.
233
- """
234
- # Moment with original ops
235
- original_moment = moment
236
-
237
- # Check if the moment is empty
238
- if len(moment.operations) == 0:
239
- move_noise_ops = []
240
- gate_noise_ops = []
241
- # Check if the moment contains 1-qubit gates or 2-qubit gates
242
- elif len(moment.operations[0].qubits) == 1:
243
- gate_noise_ops, move_noise_ops = self._single_qubit_moment_noise_ops(
244
- moment, system_qubits
245
- )
246
- elif len(moment.operations[0].qubits) == 2:
247
- # Check if the moment only contains two qubit gates
248
- assert np.all([len(op.qubits) == 2 for op in moment.operations])
249
-
250
- control_qubits = [op.qubits[0] for op in moment.operations]
251
- target_qubits = [op.qubits[1] for op in moment.operations]
252
- gated_qubits = control_qubits + target_qubits
253
- idle_atoms = list(set(system_qubits) - set(gated_qubits))
254
-
255
- move_noise_ops = [
256
- cirq.asymmetric_depolarize(*self.mover_pauli_rates).on_each(
257
- control_qubits
258
- ),
259
- cirq.asymmetric_depolarize(*self.sitter_pauli_rates).on_each(
260
- target_qubits + idle_atoms
261
- ),
262
- ] # In this setting, we assume a 1 zone scheme where the controls move to the targets.
263
-
264
- gate_noise_ops = [
265
- cirq.asymmetric_depolarize(*self.cz_paired_pauli_rates).on_each(
266
- gated_qubits
267
- ),
268
- cirq.asymmetric_depolarize(*self.cz_unpaired_pauli_rates).on_each(
269
- idle_atoms
270
- ),
271
- ] # In this 1 zone scheme, all unpaired atoms are in the entangling zone.
272
- else:
273
- raise ValueError(
274
- "Moment contains operations with more than 2 qubits, which is not supported. "
275
- "Correlated measurements should be added after the noise model is applied."
276
- )
277
-
278
- if move_noise_ops == []:
279
- move_noise_moments = []
280
- else:
281
- move_noise_moments = [cirq.Moment(move_noise_ops)]
282
- gate_noise_moment = cirq.Moment(gate_noise_ops)
283
-
284
- return [
285
- *move_noise_moments,
286
- original_moment,
287
- gate_noise_moment,
288
- *move_noise_moments,
289
- ]
290
-
291
-
292
- def _default_cz_paired_correlated_rates() -> np.ndarray:
293
- return np.array(
294
- [
295
- [0.994000006, 0.000142857, 0.000142857, 0.001428570],
296
- [0.000142857, 0.000142857, 0.000142857, 0.000142857],
297
- [0.000142857, 0.000142857, 0.000142857, 0.000142857],
298
- [0.001428570, 0.000142857, 0.000142857, 0.001428570],
299
- ]
300
- )
301
-
302
-
303
- @dataclass(frozen=True)
304
- class GeminiOneZoneNoiseModelCorrelated(GeminiOneZoneNoiseModel):
305
- """
306
- A Cirq noise model for implementing correlated two-qubit Pauli errors in a one-zone Gemini architecture.
307
- """
308
-
309
- cz_paired_correlated_rates: np.ndarray = field(
310
- default_factory=_default_cz_paired_correlated_rates
311
- )
312
-
313
- def __post_init__(self):
314
- if self.cz_paired_correlated_rates.shape != (4, 4):
315
- raise ValueError(
316
- "Expected a 4x4 array of probabilities for cz_paired_correlated_rates"
317
- )
318
-
319
- @property
320
- def two_qubit_pauli(self) -> cirq.AsymmetricDepolarizingChannel:
321
- paulis = ("I", "X", "Y", "Z")
322
- error_probabilities = {}
323
- for idx1, p1 in enumerate(paulis):
324
- for idx2, p2 in enumerate(paulis):
325
- probability = self.cz_paired_correlated_rates[idx1, idx2]
326
-
327
- if probability > 0:
328
- key = p1 + p2
329
- error_probabilities[key] = probability
330
-
331
- return cirq.AsymmetricDepolarizingChannel(
332
- error_probabilities=error_probabilities
333
- )
334
-
335
238
  def noisy_moment(self, moment, system_qubits):
336
239
  # Moment with original ops
337
240
  original_moment = moment
@@ -391,6 +294,53 @@ class GeminiOneZoneNoiseModelCorrelated(GeminiOneZoneNoiseModel):
391
294
  *move_noise_moments,
392
295
  ]
393
296
 
297
+ def noisy_moments(
298
+ self, moments: Iterable[cirq.Moment], system_qubits: Sequence[cirq.Qid]
299
+ ) -> Sequence[cirq.OP_TREE]:
300
+ """Adds possibly stateful noise to a series of moments.
301
+
302
+ Args:
303
+ moments: The moments to add noise to.
304
+ system_qubits: A list of all qubits in the system.
305
+
306
+ Returns:
307
+ A sequence of OP_TREEEs, with the k'th tree corresponding to the
308
+ noisy operations for the k'th moment.
309
+ """
310
+
311
+ if self.check_input_circuit:
312
+ self.validate_moments(moments)
313
+
314
+ # Split into moments with only 1Q and 2Q gates
315
+ moments_1q = [
316
+ cirq.Moment([op for op in moment.operations if len(op.qubits) == 1])
317
+ for moment in moments
318
+ ]
319
+ moments_2q = [
320
+ cirq.Moment([op for op in moment.operations if len(op.qubits) == 2])
321
+ for moment in moments
322
+ ]
323
+
324
+ assert len(moments_1q) == len(moments_2q)
325
+
326
+ interleaved_moments = []
327
+ for idx, moment in enumerate(moments_1q):
328
+ interleaved_moments.append(moment)
329
+ interleaved_moments.append(moments_2q[idx])
330
+
331
+ interleaved_circuit = cirq.Circuit.from_moments(*interleaved_moments)
332
+
333
+ # Combine subsequent 1Q gates
334
+ compressed_circuit = cirq.merge_single_qubit_moments_to_phxz(
335
+ interleaved_circuit
336
+ )
337
+ if self.parallelize_circuit:
338
+ compressed_circuit = parallelize(compressed_circuit)
339
+
340
+ return self._noisy_moments_impl_moment(
341
+ compressed_circuit.moments, system_qubits
342
+ )
343
+
394
344
 
395
345
  @dataclass(frozen=True)
396
346
  class GeminiOneZoneNoiseModelConflictGraphMoves(GeminiOneZoneNoiseModel):
@@ -452,14 +402,18 @@ class GeminiOneZoneNoiseModelConflictGraphMoves(GeminiOneZoneNoiseModel):
452
402
  gated_qubits = control_qubits + target_qubits
453
403
  idle_atoms = list(set(system_qubits) - set(gated_qubits))
454
404
 
405
+ # Add correlated noise channels for entangling pairs
406
+ two_qubit_pauli = self.two_qubit_pauli
455
407
  gate_noise_ops = [
456
- cirq.asymmetric_depolarize(*self.cz_paired_pauli_rates).on_each(
457
- gated_qubits
458
- ),
408
+ two_qubit_pauli.on(c, t) for c, t in zip(control_qubits, target_qubits)
409
+ ]
410
+
411
+ # In this 1 zone scheme, all unpaired atoms are in the entangling zone.
412
+ gate_noise_ops.append(
459
413
  cirq.asymmetric_depolarize(*self.cz_unpaired_pauli_rates).on_each(
460
414
  idle_atoms
461
415
  ),
462
- ] # In this 1 zone scheme, all unpaired atoms are in the entangling zone.
416
+ )
463
417
  else:
464
418
  raise ValueError(
465
419
  "Moment contains operations with more than 2 qubits, which is not supported."
@@ -530,10 +484,9 @@ class GeminiTwoZoneNoiseModel(GeminiNoiseModelABC):
530
484
  moments[i],
531
485
  np.array(self.local_pauli_rates),
532
486
  np.array(self.global_pauli_rates),
533
- np.array(
534
- self.cz_paired_pauli_rates + self.cz_paired_pauli_rates
535
- ),
487
+ self.two_qubit_pauli,
536
488
  np.array(self.cz_unpaired_pauli_rates),
489
+ nqubs,
537
490
  ).moments
538
491
  if len(moment) > 0
539
492
  ]
@@ -1,6 +1,6 @@
1
1
  import cirq
2
2
 
3
- from .model import GeminiOneZoneNoiseModel, GeminiOneZoneNoiseModelABC
3
+ from .model import GeminiOneZoneNoiseModel
4
4
  from ..parallelize import transpile, parallelize
5
5
 
6
6
 
@@ -36,7 +36,7 @@ def transform_circuit(
36
36
 
37
37
  # only parallelize here if we aren't parallelizing inside a one-zone model
38
38
  parallelize_circuit_here = parallelize_circuit and not isinstance(
39
- model, GeminiOneZoneNoiseModelABC
39
+ model, GeminiOneZoneNoiseModel
40
40
  )
41
41
 
42
42
  system_qubits = sorted(circuit.all_qubits())