bloqade-circuit 0.6.1__tar.gz → 0.6.2__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.

Potentially problematic release.


This version of bloqade-circuit might be problematic. Click here for more details.

Files changed (391) hide show
  1. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/PKG-INFO +1 -1
  2. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/pyproject.toml +1 -1
  3. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/cirq_utils/__init__.py +2 -0
  4. bloqade_circuit-0.6.2/src/bloqade/cirq_utils/noise/__init__.py +11 -0
  5. bloqade_circuit-0.6.2/src/bloqade/cirq_utils/noise/_two_zone_utils.py +531 -0
  6. bloqade_circuit-0.6.2/src/bloqade/cirq_utils/noise/conflict_graph.py +166 -0
  7. bloqade_circuit-0.6.2/src/bloqade/cirq_utils/noise/model.py +544 -0
  8. bloqade_circuit-0.6.2/src/bloqade/cirq_utils/noise/transform.py +57 -0
  9. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/cirq_utils/parallelize.py +4 -2
  10. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/cirq/lowering.py +53 -5
  11. bloqade_circuit-0.6.2/test/cirq_utils/noise/test_noise_models.py +88 -0
  12. bloqade_circuit-0.6.2/test/cirq_utils/noise/test_noisy_ghz.py +109 -0
  13. bloqade_circuit-0.6.2/test/cirq_utils/noise/test_one_zone_correlated_noise.py +73 -0
  14. bloqade_circuit-0.6.2/test/cirq_utils/test_transpile.py +22 -0
  15. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/cirq/test_cirq_to_squin.py +22 -0
  16. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/uv.lock +1 -1
  17. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/.github/dependabot.yml +0 -0
  18. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/.github/workflows/ci.yml +0 -0
  19. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/.github/workflows/isort.yml +0 -0
  20. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/.github/workflows/lint.yml +0 -0
  21. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/.github/workflows/release.yml +0 -0
  22. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/.gitignore +0 -0
  23. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/.pre-commit-config.yaml +0 -0
  24. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/LICENSE +0 -0
  25. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/README.md +0 -0
  26. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/_typos.toml +0 -0
  27. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/justfile +0 -0
  28. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/analysis/__init__.py +0 -0
  29. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/analysis/address/__init__.py +0 -0
  30. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/analysis/address/analysis.py +0 -0
  31. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/analysis/address/impls.py +0 -0
  32. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/analysis/address/lattice.py +0 -0
  33. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/analysis/fidelity/__init__.py +0 -0
  34. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/analysis/fidelity/analysis.py +0 -0
  35. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/analysis/measure_id/__init__.py +0 -0
  36. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/analysis/measure_id/analysis.py +0 -0
  37. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/analysis/measure_id/impls.py +0 -0
  38. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/analysis/measure_id/lattice.py +0 -0
  39. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/cirq_utils/lineprog.py +0 -0
  40. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/device.py +0 -0
  41. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/__init__.py +0 -0
  42. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/base.py +0 -0
  43. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/device.py +0 -0
  44. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/noise/__init__.py +0 -0
  45. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/noise/native.py +0 -0
  46. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/qasm2/__init__.py +0 -0
  47. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/qasm2/core.py +0 -0
  48. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/qasm2/glob.py +0 -0
  49. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/qasm2/parallel.py +0 -0
  50. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/qasm2/uop.py +0 -0
  51. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/reg.py +0 -0
  52. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/squin/__init__.py +0 -0
  53. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/squin/noise/__init__.py +0 -0
  54. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/squin/noise/native.py +0 -0
  55. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/squin/op.py +0 -0
  56. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/squin/qubit.py +0 -0
  57. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/squin/runtime.py +0 -0
  58. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/squin/wire.py +0 -0
  59. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/target.py +0 -0
  60. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/pyqrack/task.py +0 -0
  61. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/__init__.py +0 -0
  62. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/_qasm_loading.py +0 -0
  63. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/_wrappers.py +0 -0
  64. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/__init__.py +0 -0
  65. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/core/__init__.py +0 -0
  66. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/core/_dialect.py +0 -0
  67. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/core/_emit.py +0 -0
  68. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/core/_typeinfer.py +0 -0
  69. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/core/address.py +0 -0
  70. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/core/stmts.py +0 -0
  71. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/expr/__init__.py +0 -0
  72. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/expr/_dialect.py +0 -0
  73. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/expr/_emit.py +0 -0
  74. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/expr/_from_python.py +0 -0
  75. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/expr/_interp.py +0 -0
  76. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/expr/stmts.py +0 -0
  77. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/glob.py +0 -0
  78. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/indexing.py +0 -0
  79. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/inline.py +0 -0
  80. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/noise/__init__.py +0 -0
  81. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/noise/_dialect.py +0 -0
  82. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/noise/fidelity.py +0 -0
  83. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/noise/model.py +0 -0
  84. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/noise/stmts.py +0 -0
  85. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/parallel.py +0 -0
  86. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/uop/__init__.py +0 -0
  87. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/uop/_dialect.py +0 -0
  88. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/uop/_emit.py +0 -0
  89. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/uop/schedule.py +0 -0
  90. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/dialects/uop/stmts.py +0 -0
  91. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/emit/__init__.py +0 -0
  92. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/emit/base.py +0 -0
  93. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/emit/gate.py +0 -0
  94. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/emit/impls/__init__.py +0 -0
  95. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/emit/impls/noise.py +0 -0
  96. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/emit/main.py +0 -0
  97. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/emit/target.py +0 -0
  98. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/glob.py +0 -0
  99. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/groups.py +0 -0
  100. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/noise.py +0 -0
  101. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/parallel.py +0 -0
  102. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/parse/__init__.py +0 -0
  103. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/parse/ast.py +0 -0
  104. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/parse/build.py +0 -0
  105. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/parse/lowering.py +0 -0
  106. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/parse/parser.py +0 -0
  107. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/parse/print.py +0 -0
  108. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/parse/qasm2.lark +0 -0
  109. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/parse/visitor.py +0 -0
  110. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/parse/visitor.pyi +0 -0
  111. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/passes/__init__.py +0 -0
  112. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/passes/fold.py +0 -0
  113. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/passes/glob.py +0 -0
  114. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/passes/lift_qubits.py +0 -0
  115. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/passes/noise.py +0 -0
  116. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/passes/parallel.py +0 -0
  117. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/passes/py2qasm.py +0 -0
  118. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/passes/qasm2py.py +0 -0
  119. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/passes/unroll_if.py +0 -0
  120. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/__init__.py +0 -0
  121. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/desugar.py +0 -0
  122. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/glob.py +0 -0
  123. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/insert_qubits.py +0 -0
  124. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/native_gates.py +0 -0
  125. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/noise/__init__.py +0 -0
  126. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/noise/heuristic_noise.py +0 -0
  127. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/noise/remove_noise.py +0 -0
  128. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/parallel_to_glob.py +0 -0
  129. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/parallel_to_uop.py +0 -0
  130. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/register.py +0 -0
  131. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/rewrite/uop_to_parallel.py +0 -0
  132. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qasm2/types.py +0 -0
  133. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qbraid/__init__.py +0 -0
  134. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qbraid/lowering.py +0 -0
  135. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qbraid/schema.py +0 -0
  136. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qbraid/simulation_result.py +0 -0
  137. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/qbraid/target.py +0 -0
  138. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/rewrite/__init__.py +0 -0
  139. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/rewrite/passes/__init__.py +0 -0
  140. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/rewrite/passes/canonicalize_ilist.py +0 -0
  141. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/rewrite/rules/__init__.py +0 -0
  142. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/rewrite/rules/flatten_ilist.py +0 -0
  143. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/rewrite/rules/inline_getitem_ilist.py +0 -0
  144. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/rewrite/rules/split_ifs.py +0 -0
  145. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/__init__.py +0 -0
  146. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/_typeinfer.py +0 -0
  147. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/analysis/__init__.py +0 -0
  148. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/analysis/address_impl.py +0 -0
  149. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/analysis/nsites/__init__.py +0 -0
  150. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/analysis/nsites/analysis.py +0 -0
  151. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/analysis/nsites/impls.py +0 -0
  152. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/analysis/nsites/lattice.py +0 -0
  153. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/analysis/schedule.py +0 -0
  154. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/cirq/__init__.py +0 -0
  155. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/cirq/emit/emit_circuit.py +0 -0
  156. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/cirq/emit/noise.py +0 -0
  157. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/cirq/emit/op.py +0 -0
  158. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/cirq/emit/qubit.py +0 -0
  159. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/cirq/emit/runtime.py +0 -0
  160. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/groups.py +0 -0
  161. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/lowering.py +0 -0
  162. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/noise/__init__.py +0 -0
  163. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/noise/_dialect.py +0 -0
  164. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/noise/_wrapper.py +0 -0
  165. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/noise/rewrite.py +0 -0
  166. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/noise/stmts.py +0 -0
  167. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/op/__init__.py +0 -0
  168. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/op/_dialect.py +0 -0
  169. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/op/_wrapper.py +0 -0
  170. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/op/number.py +0 -0
  171. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/op/rewrite.py +0 -0
  172. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/op/stdlib.py +0 -0
  173. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/op/stmts.py +0 -0
  174. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/op/traits.py +0 -0
  175. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/op/types.py +0 -0
  176. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/qubit.py +0 -0
  177. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/rewrite/U3_to_clifford.py +0 -0
  178. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/rewrite/__init__.py +0 -0
  179. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/rewrite/canonicalize.py +0 -0
  180. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/rewrite/desugar.py +0 -0
  181. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/rewrite/remove_dangling_qubits.py +0 -0
  182. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/rewrite/wrap_analysis.py +0 -0
  183. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/types.py +0 -0
  184. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/squin/wire.py +0 -0
  185. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/__init__.py +0 -0
  186. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/_wrappers.py +0 -0
  187. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/__init__.py +0 -0
  188. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/auxiliary/__init__.py +0 -0
  189. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/auxiliary/_dialect.py +0 -0
  190. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/auxiliary/emit.py +0 -0
  191. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/auxiliary/interp.py +0 -0
  192. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/auxiliary/lowering.py +0 -0
  193. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/auxiliary/stmts/__init__.py +0 -0
  194. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/auxiliary/stmts/annotate.py +0 -0
  195. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/auxiliary/stmts/const.py +0 -0
  196. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/auxiliary/types.py +0 -0
  197. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/collapse/__init__.py +0 -0
  198. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/collapse/_dialect.py +0 -0
  199. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/collapse/emit_str.py +0 -0
  200. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/collapse/stmts/__init__.py +0 -0
  201. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/collapse/stmts/measure.py +0 -0
  202. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/collapse/stmts/pp_measure.py +0 -0
  203. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/collapse/stmts/reset.py +0 -0
  204. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/gate/__init__.py +0 -0
  205. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/gate/_dialect.py +0 -0
  206. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/gate/emit.py +0 -0
  207. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/gate/stmts/__init__.py +0 -0
  208. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/gate/stmts/base.py +0 -0
  209. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/gate/stmts/clifford_1q.py +0 -0
  210. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/gate/stmts/clifford_2q.py +0 -0
  211. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/gate/stmts/control_2q.py +0 -0
  212. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/gate/stmts/pp.py +0 -0
  213. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/noise/__init__.py +0 -0
  214. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/noise/_dialect.py +0 -0
  215. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/noise/emit.py +0 -0
  216. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/dialects/noise/stmts.py +0 -0
  217. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/emit/__init__.py +0 -0
  218. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/emit/stim_str.py +0 -0
  219. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/groups.py +0 -0
  220. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/parse/__init__.py +0 -0
  221. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/parse/lowering.py +0 -0
  222. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/passes/__init__.py +0 -0
  223. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/passes/simplify_ifs.py +0 -0
  224. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/passes/squin_to_stim.py +0 -0
  225. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/rewrite/__init__.py +0 -0
  226. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/rewrite/ifs_to_stim.py +0 -0
  227. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/rewrite/py_constant_to_stim.py +0 -0
  228. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/rewrite/qubit_to_stim.py +0 -0
  229. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/rewrite/squin_measure.py +0 -0
  230. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/rewrite/squin_noise.py +0 -0
  231. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/rewrite/util.py +0 -0
  232. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/rewrite/wire_identity_elimination.py +0 -0
  233. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/rewrite/wire_to_stim.py +0 -0
  234. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/upstream/__init__.py +0 -0
  235. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/stim/upstream/from_squin.py +0 -0
  236. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/task.py +0 -0
  237. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/test_utils.py +0 -0
  238. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/types.py +0 -0
  239. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/visual/__init__.py +0 -0
  240. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/visual/animation/__init__.py +0 -0
  241. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/visual/animation/animate.py +0 -0
  242. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/visual/animation/base.py +0 -0
  243. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/visual/animation/gate_event.py +0 -0
  244. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/visual/animation/runtime/__init__.py +0 -0
  245. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/visual/animation/runtime/aod.py +0 -0
  246. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/visual/animation/runtime/atoms.py +0 -0
  247. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/visual/animation/runtime/ppoly.py +0 -0
  248. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/visual/animation/runtime/qpustate.py +0 -0
  249. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/src/bloqade/visual/animation/runtime/utils.py +0 -0
  250. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/__init__.py +0 -0
  251. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/analysis/address/test_qubit_analysis.py +0 -0
  252. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/analysis/address/test_wire_analysis.py +0 -0
  253. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/analysis/address/util.py +0 -0
  254. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/analysis/fidelity/test_fidelity.py +0 -0
  255. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/analysis/measure_id/test_measure_id.py +0 -0
  256. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/cirq_utils/test_lpsolvers.py +0 -0
  257. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/cirq_utils/test_parallelize.py +0 -0
  258. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/pyqrack/__init__.py +0 -0
  259. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/pyqrack/runtime/__init__.py +0 -0
  260. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/pyqrack/runtime/noise/__init__.py +0 -0
  261. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/pyqrack/runtime/noise/qasm2/test_loss.py +0 -0
  262. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/pyqrack/runtime/noise/qasm2/test_pauli.py +0 -0
  263. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/pyqrack/runtime/test_dyn_memory.py +0 -0
  264. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/pyqrack/runtime/test_qrack.py +0 -0
  265. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/pyqrack/squin/test_kernel.py +0 -0
  266. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/pyqrack/squin/test_noise.py +0 -0
  267. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/pyqrack/test_target.py +0 -0
  268. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/__init__.py +0 -0
  269. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/analysis/test_dag.py +0 -0
  270. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/emit/test_extended.py +0 -0
  271. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/emit/test_extended_noise.py +0 -0
  272. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/emit/test_qasm2.py +0 -0
  273. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/emit/test_qasm2_emit.py +0 -0
  274. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/__init__.py +0 -0
  275. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/invalid_programs/invalid_if.qasm +0 -0
  276. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/README.md +0 -0
  277. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/global.qasm +0 -0
  278. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/iqft1.qasm +0 -0
  279. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/main.qasm +0 -0
  280. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/noise.qasm +0 -0
  281. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/para.qasm +0 -0
  282. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/process_tomo.qasm +0 -0
  283. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/qelib1.inc +0 -0
  284. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/qft.qasm +0 -0
  285. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/qft2.qasm +0 -0
  286. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/rb.qasm +0 -0
  287. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/rep_code.qasm +0 -0
  288. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/ripple_carry_adder.qasm +0 -0
  289. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/tele.qasm +0 -0
  290. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/programs/valid_if.qasm +0 -0
  291. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/test_ast.py +0 -0
  292. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/parse/test_roundtrip.py +0 -0
  293. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/passes/__init__.py +0 -0
  294. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/passes/test_global_to_parallel.py +0 -0
  295. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/passes/test_global_to_uop.py +0 -0
  296. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/passes/test_heuristic_noise.py +0 -0
  297. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/passes/test_parallel_to_global.py +0 -0
  298. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/passes/test_parallel_to_uop.py +0 -0
  299. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/passes/test_qasm2py.py +0 -0
  300. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/passes/test_unroll_if.py +0 -0
  301. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/passes/test_uop_to_parallel.py +0 -0
  302. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/test_count.py +0 -0
  303. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/test_inline.py +0 -0
  304. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/test_lowering.py +0 -0
  305. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/test_native.py +0 -0
  306. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qasm2/test_two2one.py +0 -0
  307. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qbraid/__init__.py +0 -0
  308. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qbraid/test_clean_circuit.py +0 -0
  309. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qbraid/test_lowering.py +0 -0
  310. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/qbraid/test_target.py +0 -0
  311. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/sample/__init__.py +0 -0
  312. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/sample/test_noise_model.py +0 -0
  313. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/analysis/test_nsites_analysis.py +0 -0
  314. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/cirq/test_squin_noise_to_cirq.py +0 -0
  315. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/cirq/test_squin_to_cirq.py +0 -0
  316. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/op/test_reset.py +0 -0
  317. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/rewrite/test_U3_to_clifford.py +0 -0
  318. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/rewrite/test_canonicalize.py +0 -0
  319. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/rewrite/test_desugar.py +0 -0
  320. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/rewrite/test_mult_rewrite.py +0 -0
  321. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/test_constprop.py +0 -0
  322. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/test_sugar.py +0 -0
  323. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/test_typeinfer.py +0 -0
  324. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/wire/__init__.py +0 -0
  325. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/squin/wire/test_check.py +0 -0
  326. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/__init__.py +0 -0
  327. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/__init__.py +0 -0
  328. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/__init__.py +0 -0
  329. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/emit/__init__.py +0 -0
  330. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/emit/base.py +0 -0
  331. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/emit/test_stim_1q.py +0 -0
  332. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/emit/test_stim_ctrl.py +0 -0
  333. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/emit/test_stim_detector.py +0 -0
  334. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/emit/test_stim_meas.py +0 -0
  335. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/emit/test_stim_noise.py +0 -0
  336. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/emit/test_stim_obs_inc.py +0 -0
  337. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/emit/test_stim_ppmeas.py +0 -0
  338. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/emit/test_stim_qubit_coords.py +0 -0
  339. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/emit/test_stim_spp.py +0 -0
  340. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/test_stim_circuits.py +0 -0
  341. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/dialects/stim/test_stim_const.py +0 -0
  342. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/parse/__init__.py +0 -0
  343. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/parse/base.py +0 -0
  344. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/parse/test_parse.py +0 -0
  345. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/parse/test_parse_clifford.py +0 -0
  346. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/parse/test_parse_control.py +0 -0
  347. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/parse/test_parse_custom.py +0 -0
  348. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/parse/test_parse_noise.py +0 -0
  349. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/parse/test_parse_spp.py +0 -0
  350. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/__init__.py +0 -0
  351. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/apply_depolarize1.stim +0 -0
  352. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/apply_pauli_channel_1.stim +0 -0
  353. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/broadcast_depolarize1.stim +0 -0
  354. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/broadcast_depolarize2.stim +0 -0
  355. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/broadcast_iid_bit_flip_channel.stim +0 -0
  356. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/broadcast_iid_phase_flip_channel.stim +0 -0
  357. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/broadcast_iid_y_flip_channel.stim +0 -0
  358. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_1.stim +0 -0
  359. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_1_many_qubits.stim +0 -0
  360. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_1_reuse.stim +0 -0
  361. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_2.stim +0 -0
  362. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_2_reuse_on_4_qubits.stim +0 -0
  363. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/pure_squin_rewrite.txt +0 -0
  364. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/qubit/for_loop.stim +0 -0
  365. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/qubit/qubit.stim +0 -0
  366. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/qubit/qubit_broadcast.stim +0 -0
  367. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/qubit/qubit_loss.stim +0 -0
  368. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/qubit/qubit_reset.stim +0 -0
  369. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/qubit/u3_to_clifford.stim +0 -0
  370. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/simple_if_rewrite.txt +0 -0
  371. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/wire/wire.stim +0 -0
  372. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/wire/wire_apply.stim +0 -0
  373. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/wire/wire_apply_control.stim +0 -0
  374. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/wire/wire_broadcast.stim +0 -0
  375. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/wire/wire_broadcast_control.stim +0 -0
  376. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/wire/wire_measure.stim +0 -0
  377. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/wire/wire_multiple_apply.stim +0 -0
  378. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/wire/wire_qubit_loss.stim +0 -0
  379. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/stim_reference_programs/wire/wire_reset.stim +0 -0
  380. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/test_squin_meas_to_stim.py +0 -0
  381. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/test_squin_noise_to_stim.py +0 -0
  382. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/test_squin_qubit_to_stim.py +0 -0
  383. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/test_squin_to_stim_cases.py +0 -0
  384. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/passes/test_squin_wire_to_stim.py +0 -0
  385. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/test_measure_id_analysis.py +0 -0
  386. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/wrapper/__init__.py +0 -0
  387. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/stim/wrapper/test_wrapper.py +0 -0
  388. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/test_serialization.py +0 -0
  389. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/test_zone_model.py +0 -0
  390. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/visual/__init__.py +0 -0
  391. {bloqade_circuit-0.6.1 → bloqade_circuit-0.6.2}/test/visual/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bloqade-circuit
3
- Version: 0.6.1
3
+ Version: 0.6.2
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.1"
3
+ version = "0.6.2"
4
4
  description = "The software development toolkit for neutral atom arrays."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -1,4 +1,6 @@
1
+ from . import noise as noise
1
2
  from .parallelize import (
3
+ transpile as transpile,
2
4
  parallelize as parallelize,
3
5
  no_similarity as no_similarity,
4
6
  auto_similarity as auto_similarity,
@@ -0,0 +1,11 @@
1
+ # TODO: check if cirq is installed before importing stuff
2
+
3
+ from .model import (
4
+ GeminiOneZoneNoiseModel as GeminiOneZoneNoiseModel,
5
+ GeminiTwoZoneNoiseModel as GeminiTwoZoneNoiseModel,
6
+ GeminiOneZoneNoiseModelABC as GeminiOneZoneNoiseModelABC,
7
+ GeminiOneZoneNoiseModelCorrelated as GeminiOneZoneNoiseModelCorrelated,
8
+ GeminiOneZoneNoiseModelConflictGraphMoves as GeminiOneZoneNoiseModelConflictGraphMoves,
9
+ )
10
+ from .transform import transform_circuit as transform_circuit
11
+ from .conflict_graph import OneZoneConflictGraph as OneZoneConflictGraph
@@ -0,0 +1,531 @@
1
+ import copy
2
+ from typing import List, Tuple, Optional, Sequence, cast
3
+ from collections import deque
4
+
5
+ import cirq
6
+ import numpy as np
7
+ from cirq.circuits.qasm_output import QasmUGate
8
+
9
+ Slot = Tuple[int, int] # (tuple index, position inside tuple)
10
+ Swap = Tuple[Slot, Slot]
11
+
12
+
13
+ ##We make a distinction between gate and move errors. Gate errors intrinsically depend on the gate type (two qubit gates, local single qubit gates, global single qubit gates)
14
+ ##Move errors are independent of the gate type, and depend on the qubit spatial layout. For our purposes, an upper bound for the move error is enough per atom move, for a given layout.
15
+ def get_qargs_from_moment(moment: cirq.Moment):
16
+ """Returns a list of qubit arguments (qargs) from all operations in a Cirq moment.
17
+
18
+ Args:
19
+ moment: A cirq.Moment object.
20
+
21
+ Returns:
22
+ A list of tuples, where each tuple contains the qubits acted on by a gate in the moment.
23
+ """
24
+
25
+ list_qubs = [op.qubits for op in moment.operations]
26
+
27
+ return list_qubs
28
+
29
+
30
+ def flatten_qargs(list_qubs: Sequence[Tuple[cirq.Qid, ...]]) -> List[cirq.Qid]:
31
+ """Flattens a list of lists of qargs
32
+ Args:
33
+ list_qubs: A list of tuples of cirq.Qid objects.
34
+ Returns:
35
+ A flattened list of cirq.Qid objects.
36
+ """
37
+ return [item for tup in list_qubs for item in tup]
38
+
39
+
40
+ def qargs_to_qidxs(qargs: List[Tuple[cirq.LineQubit, ...]]) -> List[Tuple[int, ...]]:
41
+ """
42
+ Transforms list of qargs (tuples of cirq.LineQubit objects) into a list of tuples of integers.
43
+ Each integer corresponds to the index of the qubit in the tuple.
44
+ Args:
45
+ qargs: A list of tuples of cirq.LineQubit objects.
46
+ Returns:
47
+ A list of tuples of integers, where each integer is the index of the qubit in the tuple.
48
+ """
49
+ return [tuple(x.x for x in tup) for tup in qargs]
50
+
51
+
52
+ def get_map_named_to_line_qubits(named_qubits: Sequence[cirq.NamedQubit]) -> dict:
53
+ """
54
+ Maps cirq.NamedQubit('q_i') objects to cirq.LineQubit(i) objects.
55
+
56
+ Args:
57
+ named_qubits: A list of cirq.NamedQubit objects.
58
+
59
+ Returns:
60
+ A dictionary mapping cirq.NamedQubit to cirq.LineQubit.
61
+ """
62
+ mapping = {}
63
+ for named_qubit in named_qubits:
64
+ # Extract the integer index from the NamedQubit name
65
+ index = int(named_qubit.name.split("_")[1]) # Assumes format 'q_i'
66
+ mapping[named_qubit] = cirq.LineQubit(index)
67
+ return mapping
68
+
69
+
70
+ def numpy_complement(subset: np.ndarray, full: np.ndarray) -> np.ndarray:
71
+ """Returns the elements in `full` that are not in `subset`.
72
+ Args:
73
+ subset: A numpy array of elements to exclude.
74
+ full: A numpy array of elements from which to exclude the subset.
75
+ Returns:
76
+ A numpy array containing elements from `full` that are not in `subset`.
77
+ """
78
+ mask = ~np.isin(full, subset)
79
+ return full[mask]
80
+
81
+
82
+ def intersect_by_structure(
83
+ reference: List[Tuple[int, ...]], target: List[Tuple[int, ...]]
84
+ ) -> List[Tuple[int, ...]]:
85
+ target_set = set(val for t in target for val in t)
86
+ result = []
87
+
88
+ for tup in reference:
89
+ filtered = tuple(val for val in tup if val in target_set)
90
+ result.append(filtered)
91
+
92
+ return result
93
+
94
+
95
+ def expand(
96
+ data: Sequence[Tuple[Optional[int], ...]], capacity: int = 2
97
+ ) -> List[List[Optional[int]]]:
98
+ # Pad each tuple to have exactly `capacity` slots, using None
99
+ return [list(t) + [None] * (capacity - len(t)) for t in data]
100
+
101
+
102
+ def flatten_with_slots(
103
+ data: List[List[Optional[int]]],
104
+ ) -> List[Tuple[Optional[int], Slot]]:
105
+ # Create list of (value, (tuple_index, slot_index))
106
+ return [(val, (i, j)) for i, row in enumerate(data) for j, val in enumerate(row)]
107
+
108
+
109
+ def regroup(data: List[List[Optional[int]]]) -> List[Tuple[int, ...]]:
110
+ # Turn 2D structure back into list of sorted tuples, ignoring Nones
111
+ return [tuple(sorted([v for v in row if v is not None])) for row in data]
112
+
113
+
114
+ def canonical_form(tuples: List[Tuple[int, ...]]) -> Tuple[Tuple[int, ...], ...]:
115
+ # Normalize by sorting tuples and sorting the list of tuples
116
+ return tuple(sorted(tuple(sorted(t)) for t in tuples))
117
+
118
+
119
+ def apply_swap(data: List[List[Optional[int]]], swap: Swap):
120
+ # Swap values between two slots
121
+ (i1, j1), (i2, j2) = swap
122
+ data[i1][j1], data[i2][j2] = data[i2][j2], data[i1][j1]
123
+
124
+
125
+ def get_equivalent_swaps(
126
+ source: List[Tuple[int, ...]], target: List[Tuple[int, ...]]
127
+ ) -> List[Swap]:
128
+ src = expand(source)
129
+ tgt = expand(target)
130
+
131
+ target_form = canonical_form(regroup(tgt))
132
+
133
+ def config_key(state):
134
+ return canonical_form(regroup(state))
135
+
136
+ initial_key = config_key(src)
137
+ visited = {initial_key}
138
+ queue = deque([(copy.deepcopy(src), [])]) # (current state, list of swaps made)
139
+
140
+ while queue:
141
+ state, swaps = queue.popleft()
142
+
143
+ if config_key(state) == target_form:
144
+ return swaps
145
+
146
+ flat = flatten_with_slots(state)
147
+
148
+ for i in range(len(flat)):
149
+ for j in range(i + 1, len(flat)):
150
+ (_, slot_i), (_, slot_j) = flat[i], flat[j]
151
+ apply_swap(state, (slot_i, slot_j))
152
+ key = config_key(state)
153
+
154
+ if key not in visited:
155
+ visited.add(key)
156
+ queue.append((copy.deepcopy(state), swaps + [(slot_i, slot_j)]))
157
+
158
+ apply_swap(state, (slot_i, slot_j)) # Undo swap
159
+
160
+ return [] # Should not happen if input is valid
161
+
162
+
163
+ def greedy_unique_packing(data: List[int]) -> List[List[int]]:
164
+
165
+ remaining = deque(data)
166
+ result = []
167
+
168
+ while remaining:
169
+ used = set()
170
+ group = []
171
+ i = 0
172
+ length = len(remaining)
173
+
174
+ while i < length:
175
+ item = remaining.popleft()
176
+ if item not in used:
177
+ group.append(item)
178
+ used.add(item)
179
+ else:
180
+ # Push it to the end for future groups
181
+ remaining.append(item)
182
+ i += 1
183
+
184
+ result.append(group)
185
+
186
+ return result
187
+
188
+
189
+ def get_swap_move_qidxs(
190
+ swaps: List[Swap], init_qidxs: Sequence[Tuple[Optional[int], ...]]
191
+ ) -> List[List[int]]:
192
+ # Convert tuples to mutable lists
193
+ swap_init_qidxs = expand(init_qidxs)
194
+
195
+ moved_qidxs = []
196
+
197
+ for (i1, j1), (i2, j2) in swaps:
198
+ first_idx = swap_init_qidxs[i1][j1]
199
+ sec_idx = swap_init_qidxs[i2][j2]
200
+
201
+ if first_idx is not None:
202
+ moved_qidxs.append(first_idx)
203
+ if sec_idx is not None:
204
+ moved_qidxs.append(sec_idx)
205
+
206
+ # Perform the swap
207
+ swap_init_qidxs[i1][j1], swap_init_qidxs[i2][j2] = sec_idx, first_idx
208
+
209
+ return greedy_unique_packing(moved_qidxs)
210
+
211
+
212
+ def pad_with_empty_tups(
213
+ target: List[Tuple[int, ...]], nqubs: int
214
+ ) -> List[Tuple[int, ...]]:
215
+
216
+ while len(target) < nqubs:
217
+ target.append(())
218
+
219
+ return target
220
+
221
+
222
+ def add_noise_to_swaps(
223
+ swaps: List[Swap],
224
+ init_qidxs: List[Tuple[int, ...]],
225
+ move_noise: cirq.AsymmetricDepolarizingChannel,
226
+ sitter_noise: cirq.AsymmetricDepolarizingChannel,
227
+ nqubs: int,
228
+ ):
229
+ """
230
+ Applies move noise to qubits that need to be swapped to reach a given configuration. This can be seen as the noise added to "pair-up"
231
+ or separate qubits to reach a target configuration before the application of gates
232
+ Args:
233
+ swaps, array of swaps
234
+ init_qidxs, qargs that reach the target configuration once the swaps are applied on it
235
+ move_noise, Pauli noise channel for moves
236
+ sitter_noise, Pauli channel for sitter noise
237
+ nqubs, the circuit width
238
+ """
239
+ built_circuit = cirq.Circuit()
240
+ nqubs_idxs = np.arange(nqubs)
241
+
242
+ batches_move_qidxs = get_swap_move_qidxs(swaps, init_qidxs)
243
+
244
+ for batch in batches_move_qidxs:
245
+ built_moment = cirq.Moment()
246
+ non_mov_qidxs = numpy_complement(np.array(batch), nqubs_idxs)
247
+
248
+ for i in range(len(batch)):
249
+ built_moment += move_noise(cirq.LineQubit(batch[i]))
250
+ for j in range(len(non_mov_qidxs)):
251
+ built_moment += sitter_noise(cirq.LineQubit(non_mov_qidxs[j]))
252
+
253
+ built_circuit.append(built_moment)
254
+
255
+ # built_circuit.append(built_moment)
256
+
257
+ return built_circuit
258
+
259
+
260
+ #############################################
261
+
262
+
263
+ def get_gate_error_channel(
264
+ moment: cirq.Moment,
265
+ sq_loc_rates: np.ndarray,
266
+ sq_glob_rates: np.ndarray,
267
+ cz_rates: np.ndarray,
268
+ unp_cz_rates: np.ndarray,
269
+ ):
270
+ """Applies gate errors to the circuit
271
+
272
+ Args:
273
+ moment: A cirq.Moment object.
274
+ sq_loc_rates: single local qubit rotation Pauli noise channel parameters (px, py, pz)
275
+ 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
+ unp_cz_rates: Pauli noise channel parameters for qubits in the gate zone and outside blockade radius
278
+ Returns:
279
+ A new cirq.Moment object with the gate errors applied.
280
+ """
281
+ # Check for the moment (layer) layout: global single qubit gates, or mixture of single qubit gates and two qubit gates
282
+
283
+ gates_in_layer = extract_u3_and_cz_qargs(moment)
284
+ # new_moment = cirq.Moment()
285
+ new_moments = cirq.Circuit()
286
+
287
+ if gates_in_layer["cz"] == []:
288
+
289
+ if gates_in_layer["u3"] == []:
290
+ print(
291
+ "Warning: Assumed Only single qubit gates in the layer, but there are no single qubit gates"
292
+ )
293
+
294
+ if all(
295
+ np.all(np.isclose(element, gates_in_layer["angles"][0]))
296
+ for element in gates_in_layer["angles"]
297
+ ):
298
+ pauli_channel = cirq.AsymmetricDepolarizingChannel(
299
+ p_x=sq_glob_rates[0], p_y=sq_glob_rates[1], p_z=sq_glob_rates[2]
300
+ )
301
+
302
+ for qub in gates_in_layer["u3"]:
303
+
304
+ # new_moment = new_moment +pauli_channel(qub[0])
305
+ new_moments.append(pauli_channel(qub[0]))
306
+ else:
307
+ pauli_channel = cirq.AsymmetricDepolarizingChannel(
308
+ p_x=sq_loc_rates[0], p_y=sq_loc_rates[1], p_z=sq_loc_rates[2]
309
+ )
310
+ for qub in gates_in_layer["u3"]:
311
+
312
+ # new_moment = new_moment + pauli_channel(qub[0])
313
+ new_moments.append(pauli_channel(qub[0]))
314
+
315
+ else:
316
+ # 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
+ loc_rot_pauli_channel = cirq.AsymmetricDepolarizingChannel(
324
+ p_x=sq_loc_rates[0], p_y=sq_loc_rates[1], p_z=sq_loc_rates[2]
325
+ )
326
+ unp_cz_pauli_channel = cirq.AsymmetricDepolarizingChannel(
327
+ p_x=unp_cz_rates[0], p_y=unp_cz_rates[1], p_z=unp_cz_rates[2]
328
+ )
329
+
330
+ 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])
335
+
336
+ for qub in gates_in_layer["u3"]:
337
+ new_moments.append(
338
+ unp_cz_pauli_channel(qub[0])
339
+ ) ###qubits in the gate zone get unpaired_cz error
340
+ new_moments.append(loc_rot_pauli_channel(qub[0]))
341
+ # new_moment = new_moment + loc_rot_pauli_channel(qub[0])
342
+
343
+ return new_moments
344
+
345
+
346
+ def add_move_and_sitter_channels(
347
+ ref_qargs: Sequence[Tuple[cirq.Qid, ...]] | None,
348
+ tar_qargs: Sequence[Tuple[cirq.Qid, ...]],
349
+ built_moment: cirq.Moment,
350
+ qub_reg: Sequence[cirq.Qid],
351
+ sitter_pauli_channel: cirq.Gate,
352
+ move_pauli_channel: cirq.Gate,
353
+ ):
354
+ """
355
+ Adds move and sitter noise channels according to the following rule: all the qargs in ref_moment that
356
+ are absent in tar_moment get a move error and the rest of qubits in the qub_reg get a sitter error. It also returns a boolean variable
357
+ that determines whether move noise was added
358
+
359
+ Args:
360
+ ref_qargs: reference qargs
361
+ tar_qargs: moment to make the comparison with
362
+ built_moment: the moment to which we append the noise channels
363
+ qub_reg: the qubit register
364
+ sitter_pauli channel: the parameterized sitter channel
365
+ move_pauli_channel: the parameterized move_pauli channel
366
+ """
367
+
368
+ # Faltten ref_qargs and ref_qargs for purposes of identifying how to apply noise:
369
+ flat_tar_qargs = flatten_qargs(tar_qargs)
370
+
371
+ if ref_qargs is None: # we are adding noise to the beginning of circuit...
372
+
373
+ flat_ref_qargs = flatten_qargs(tar_qargs)
374
+
375
+ bool_list = [k not in flat_tar_qargs for k in flat_ref_qargs]
376
+
377
+ else:
378
+ flat_ref_qargs = flatten_qargs(ref_qargs)
379
+
380
+ bool_list = [k in flat_tar_qargs for k in flat_ref_qargs]
381
+
382
+ rem_qubs = []
383
+
384
+ for i in range(len(flat_ref_qargs)):
385
+ if not bool_list[i]:
386
+ rem_qubs.append(flat_ref_qargs[i])
387
+ built_moment += move_pauli_channel(flat_ref_qargs[i])
388
+
389
+ if len(rem_qubs) >= 1:
390
+
391
+ for k in range(len(qub_reg)):
392
+ if qub_reg[k] not in rem_qubs:
393
+ built_moment += sitter_pauli_channel(qub_reg[k])
394
+
395
+ return built_moment, True
396
+ else:
397
+ return built_moment, False
398
+
399
+
400
+ def get_move_error_channel_two_zoned(
401
+ curr_moment: cirq.Moment,
402
+ prev_moment: cirq.Moment | None,
403
+ move_rates: np.ndarray,
404
+ sitter_rates: np.ndarray,
405
+ nqubs: int,
406
+ ):
407
+ """Applies move noise channels to a cirq moment (curr_moment), depending on the qargs of another one (prev_moment)
408
+ returns a circuit that contains the noisy moments
409
+
410
+ Args:
411
+ curr_moment: A cirq.Moment object.
412
+ prev_moment: A cirq.Moment object
413
+ move_rates: Pauli noise channel parameters for atom moves (px,py,pz)
414
+ sitter_rates: probailities of sitter noise (px,py,pz)
415
+ nqubs: total number of qubits (width of the circuit)
416
+ Returns:
417
+ A circuit with atom move channels appended
418
+ """
419
+
420
+ curr_qargs = get_qargs_from_moment(curr_moment)
421
+
422
+ move_pauli_channel = cirq.AsymmetricDepolarizingChannel(
423
+ p_x=move_rates[0], p_y=move_rates[1], p_z=move_rates[2]
424
+ )
425
+ sitter_pauli_channel = cirq.AsymmetricDepolarizingChannel(
426
+ p_x=sitter_rates[0], p_y=sitter_rates[1], p_z=sitter_rates[2]
427
+ )
428
+ qub_reg = [cirq.LineQubit(i) for i in range(nqubs)]
429
+
430
+ if prev_moment is None:
431
+ ###Initial layer of circuit, all qubits in the first layer get move error, rest get sitter
432
+ new_moment = cirq.Moment()
433
+ dumb_circ = cirq.Circuit()
434
+ new_moment, _ = add_move_and_sitter_channels(
435
+ prev_moment,
436
+ curr_qargs,
437
+ new_moment,
438
+ qub_reg,
439
+ sitter_pauli_channel,
440
+ move_pauli_channel,
441
+ )
442
+ dumb_circ.append(new_moment)
443
+
444
+ else:
445
+ prev_qargs = get_qargs_from_moment(prev_moment)
446
+ # We follow this convention: 1) all qargs in previous moment that need to be removed from gate zone
447
+ # get move error, the rest get sitter error. 2) after this, all qargs that need to be brought to
448
+ # gate zone get move error, the rest get sitter error.
449
+ new_moment = cirq.Moment()
450
+ dumb_circ = cirq.Circuit()
451
+ new_moment, first_move_added = add_move_and_sitter_channels(
452
+ prev_qargs,
453
+ curr_qargs,
454
+ new_moment,
455
+ qub_reg,
456
+ sitter_pauli_channel,
457
+ move_pauli_channel,
458
+ )
459
+ dumb_circ.append(new_moment)
460
+
461
+ new_moment = cirq.Moment()
462
+ new_moment, second_move_added = add_move_and_sitter_channels(
463
+ curr_qargs,
464
+ prev_qargs,
465
+ new_moment,
466
+ qub_reg,
467
+ sitter_pauli_channel,
468
+ move_pauli_channel,
469
+ )
470
+ dumb_circ.append(new_moment)
471
+ # Once the noise channels to have the target qargs in the gate zone are added, we include an additional move error
472
+ # to reconfigure
473
+
474
+ # Find the initial and final qarg configuration in the previous and current moments...
475
+ prev_qidxs = qargs_to_qidxs(prev_qargs)
476
+ curr_qidxs = qargs_to_qidxs(curr_qargs)
477
+
478
+ intsc_rev = intersect_by_structure(prev_qidxs, curr_qidxs)
479
+ intsc_fow = intersect_by_structure(curr_qidxs, prev_qidxs)
480
+
481
+ # get swaps that render previous configuration to current...
482
+ swaps = get_equivalent_swaps(
483
+ pad_with_empty_tups(intsc_rev, nqubs), pad_with_empty_tups(intsc_fow, nqubs)
484
+ )
485
+
486
+ # apply noise channels...
487
+
488
+ swap_noise_circ = add_noise_to_swaps(
489
+ swaps, intsc_rev, move_pauli_channel, sitter_pauli_channel, nqubs
490
+ )
491
+ dumb_circ.append(swap_noise_circ)
492
+
493
+ return dumb_circ
494
+
495
+
496
+ def extract_u3_and_cz_qargs(moment: cirq.Moment):
497
+ """
498
+ Extracts the qubit arguments (qargs) for u3 and CZ gates from a Cirq moment,
499
+ and the angle parameters of the u3 gates.
500
+
501
+ Args:
502
+ moment: A cirq.Moment object containing only u3 and CZ gates.
503
+
504
+ Returns:
505
+ A dictionary with keys 'u3', 'cz', and 'angles', where:
506
+ - 'u3' maps to a list of qargs (tuples of qubits) for u3 OR PhXZ gates.
507
+ - 'cz' maps to a list of qargs (tuples of qubits) for CZ gates.
508
+ - 'angles' maps to a list of angle parameters (tuples) for the u3 gates.
509
+ """
510
+ result = {"u3": [], "cz": [], "angles": []}
511
+
512
+ for op in moment.operations:
513
+
514
+ if isinstance(op.gate, QasmUGate): # u3 gate in Cirq
515
+ result["u3"].append(op.qubits)
516
+ # Extract angle parameters (x_exponent, z_exponent, axis_phase_exponent)
517
+ gate = cast(QasmUGate, op.gate)
518
+ angles = (gate.theta, gate.phi, gate.lmda)
519
+ result["angles"].append(angles)
520
+ elif isinstance(op.gate, cirq.PhasedXZGate): # CZ gate in Cirq
521
+ result["u3"].append(op.qubits)
522
+ # Extract angle parameters (x_exponent, z_exponent, axis_phase_exponent)
523
+ gate = cast(cirq.PhasedXZGate, op.gate)
524
+ angles = (gate.x_exponent, gate.z_exponent, gate.axis_phase_exponent)
525
+
526
+ result["angles"].append(angles)
527
+ elif isinstance(op.gate, cirq.CZPowGate): # CZ gate in Cirq
528
+
529
+ result["cz"].append(op.qubits)
530
+
531
+ return result