bloqade-circuit 0.4.5__tar.gz → 0.5.1__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 (375) hide show
  1. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/.github/workflows/release.yml +1 -1
  2. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/.pre-commit-config.yaml +2 -2
  3. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/PKG-INFO +4 -2
  4. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/pyproject.toml +10 -2
  5. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/analysis/address/impls.py +21 -68
  6. bloqade_circuit-0.5.1/src/bloqade/analysis/measure_id/__init__.py +2 -0
  7. bloqade_circuit-0.5.1/src/bloqade/analysis/measure_id/analysis.py +45 -0
  8. bloqade_circuit-0.5.1/src/bloqade/analysis/measure_id/impls.py +155 -0
  9. bloqade_circuit-0.5.1/src/bloqade/analysis/measure_id/lattice.py +82 -0
  10. bloqade_circuit-0.5.1/src/bloqade/cirq_utils/__init__.py +7 -0
  11. bloqade_circuit-0.5.1/src/bloqade/cirq_utils/lineprog.py +295 -0
  12. bloqade_circuit-0.5.1/src/bloqade/cirq_utils/parallelize.py +400 -0
  13. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/squin/op.py +7 -2
  14. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/squin/runtime.py +4 -2
  15. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/expr/stmts.py +2 -20
  16. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/parse/lowering.py +1 -0
  17. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/passes/parallel.py +18 -0
  18. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/passes/unroll_if.py +9 -2
  19. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/rewrite/__init__.py +1 -0
  20. bloqade_circuit-0.5.1/src/bloqade/qasm2/rewrite/parallel_to_glob.py +82 -0
  21. bloqade_circuit-0.5.1/src/bloqade/rewrite/passes/__init__.py +1 -0
  22. bloqade_circuit-0.5.1/src/bloqade/rewrite/passes/canonicalize_ilist.py +28 -0
  23. bloqade_circuit-0.5.1/src/bloqade/rewrite/rules/__init__.py +1 -0
  24. bloqade_circuit-0.5.1/src/bloqade/rewrite/rules/flatten_ilist.py +51 -0
  25. bloqade_circuit-0.5.1/src/bloqade/rewrite/rules/inline_getitem_ilist.py +31 -0
  26. {bloqade_circuit-0.4.5/src/bloqade/qasm2/rewrite → bloqade_circuit-0.5.1/src/bloqade/rewrite/rules}/split_ifs.py +15 -8
  27. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/__init__.py +2 -0
  28. bloqade_circuit-0.5.1/src/bloqade/squin/_typeinfer.py +20 -0
  29. bloqade_circuit-0.5.1/src/bloqade/squin/analysis/__init__.py +1 -0
  30. bloqade_circuit-0.5.1/src/bloqade/squin/analysis/address_impl.py +71 -0
  31. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/analysis/nsites/impls.py +6 -1
  32. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/cirq/lowering.py +19 -6
  33. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/noise/stmts.py +1 -1
  34. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/op/__init__.py +1 -0
  35. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/op/_wrapper.py +4 -0
  36. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/op/stmts.py +20 -2
  37. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/qubit.py +8 -5
  38. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/rewrite/__init__.py +1 -0
  39. bloqade_circuit-0.5.1/src/bloqade/squin/rewrite/canonicalize.py +60 -0
  40. bloqade_circuit-0.5.1/src/bloqade/squin/rewrite/desugar.py +112 -0
  41. bloqade_circuit-0.5.1/src/bloqade/squin/types.py +8 -0
  42. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/wire.py +91 -5
  43. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/__init__.py +1 -0
  44. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/_wrappers.py +4 -0
  45. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/auxiliary/interp.py +0 -10
  46. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/auxiliary/stmts/annotate.py +1 -1
  47. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/noise/emit.py +1 -0
  48. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/noise/stmts.py +5 -0
  49. bloqade_circuit-0.5.1/src/bloqade/stim/passes/__init__.py +1 -0
  50. bloqade_circuit-0.5.1/src/bloqade/stim/passes/simplify_ifs.py +32 -0
  51. bloqade_circuit-0.5.1/src/bloqade/stim/passes/squin_to_stim.py +169 -0
  52. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/rewrite/__init__.py +1 -0
  53. bloqade_circuit-0.5.1/src/bloqade/stim/rewrite/ifs_to_stim.py +203 -0
  54. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/rewrite/qubit_to_stim.py +13 -6
  55. bloqade_circuit-0.5.1/src/bloqade/stim/rewrite/squin_measure.py +136 -0
  56. bloqade_circuit-0.5.1/src/bloqade/stim/rewrite/squin_noise.py +120 -0
  57. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/rewrite/util.py +40 -9
  58. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/rewrite/wire_to_stim.py +8 -3
  59. bloqade_circuit-0.5.1/src/bloqade/stim/upstream/__init__.py +1 -0
  60. bloqade_circuit-0.5.1/src/bloqade/stim/upstream/from_squin.py +10 -0
  61. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/analysis/address/test_analysis.py +33 -0
  62. bloqade_circuit-0.5.1/test/analysis/address/test_qubit_analysis.py +128 -0
  63. bloqade_circuit-0.5.1/test/analysis/address/test_wire_analysis.py +253 -0
  64. bloqade_circuit-0.5.1/test/analysis/address/util.py +11 -0
  65. bloqade_circuit-0.5.1/test/analysis/measure_id/test_measure_id.py +31 -0
  66. bloqade_circuit-0.5.1/test/cirq_utils/test_lpsolvers.py +35 -0
  67. bloqade_circuit-0.5.1/test/cirq_utils/test_parallelize.py +77 -0
  68. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/pyqrack/squin/test_kernel.py +16 -1
  69. bloqade_circuit-0.5.1/test/qasm2/passes/test_parallel_to_global.py +137 -0
  70. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/squin/analysis/test_nsites_analysis.py +68 -74
  71. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/squin/cirq/test_cirq_to_squin.py +1 -1
  72. bloqade_circuit-0.5.1/test/squin/rewrite/test_canonicalize.py +54 -0
  73. bloqade_circuit-0.5.1/test/squin/rewrite/test_desugar.py +68 -0
  74. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/squin/test_sugar.py +19 -0
  75. bloqade_circuit-0.5.1/test/squin/test_typeinfer.py +71 -0
  76. bloqade_circuit-0.5.1/test/squin/wire/test_check.py +28 -0
  77. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/test_stim_circuits.py +7 -0
  78. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/test_stim_const.py +0 -15
  79. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/parse/test_parse_custom.py +12 -0
  80. bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/pure_squin_rewrite.txt +8 -0
  81. bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/qubit/qubit_loss.stim +5 -0
  82. bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/qubit/u3_to_clifford.stim +3 -0
  83. bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/simple_if_rewrite.txt +8 -0
  84. bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/wire/wire_qubit_loss.stim +8 -0
  85. bloqade_circuit-0.5.1/test/stim/passes/test_squin_meas_to_stim.py +49 -0
  86. bloqade_circuit-0.5.1/test/stim/passes/test_squin_noise_to_stim.py +151 -0
  87. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/passes/test_squin_qubit_to_stim.py +73 -7
  88. bloqade_circuit-0.5.1/test/stim/passes/test_squin_to_stim_cases.py +22 -0
  89. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/passes/test_squin_wire_to_stim.py +59 -10
  90. bloqade_circuit-0.5.1/test/stim/test_measure_id_analysis.py +43 -0
  91. bloqade_circuit-0.5.1/test/stim/wrapper/__init__.py +0 -0
  92. bloqade_circuit-0.5.1/test/visual/__init__.py +0 -0
  93. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/uv.lock +132 -9
  94. bloqade_circuit-0.4.5/src/bloqade/squin/rewrite/desugar.py +0 -65
  95. bloqade_circuit-0.4.5/src/bloqade/stim/passes/__init__.py +0 -1
  96. bloqade_circuit-0.4.5/src/bloqade/stim/passes/squin_to_stim.py +0 -86
  97. bloqade_circuit-0.4.5/src/bloqade/stim/rewrite/squin_measure.py +0 -73
  98. bloqade_circuit-0.4.5/test/analysis/address/test_lattice.py +0 -17
  99. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/.github/dependabot.yml +0 -0
  100. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/.github/workflows/ci.yml +0 -0
  101. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/.github/workflows/isort.yml +0 -0
  102. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/.github/workflows/lint.yml +0 -0
  103. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/.gitignore +0 -0
  104. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/LICENSE +0 -0
  105. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/README.md +0 -0
  106. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/_typos.toml +0 -0
  107. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/justfile +0 -0
  108. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/analysis/__init__.py +0 -0
  109. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/analysis/address/__init__.py +0 -0
  110. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/analysis/address/analysis.py +0 -0
  111. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/analysis/address/lattice.py +0 -0
  112. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/analysis/fidelity/__init__.py +0 -0
  113. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/analysis/fidelity/analysis.py +0 -0
  114. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/device.py +0 -0
  115. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/__init__.py +0 -0
  116. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/base.py +0 -0
  117. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/device.py +0 -0
  118. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/noise/__init__.py +0 -0
  119. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/noise/native.py +0 -0
  120. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/qasm2/__init__.py +0 -0
  121. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/qasm2/core.py +0 -0
  122. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/qasm2/glob.py +0 -0
  123. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/qasm2/parallel.py +0 -0
  124. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/qasm2/uop.py +0 -0
  125. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/reg.py +0 -0
  126. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/squin/__init__.py +0 -0
  127. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/squin/noise/__init__.py +0 -0
  128. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/squin/noise/native.py +0 -0
  129. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/squin/qubit.py +0 -0
  130. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/squin/wire.py +0 -0
  131. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/target.py +0 -0
  132. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/pyqrack/task.py +0 -0
  133. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/__init__.py +0 -0
  134. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/_qasm_loading.py +0 -0
  135. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/_wrappers.py +0 -0
  136. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/__init__.py +0 -0
  137. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/core/__init__.py +0 -0
  138. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/core/_dialect.py +0 -0
  139. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/core/_emit.py +0 -0
  140. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/core/_typeinfer.py +0 -0
  141. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/core/address.py +0 -0
  142. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/core/stmts.py +0 -0
  143. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/expr/__init__.py +0 -0
  144. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/expr/_dialect.py +0 -0
  145. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/expr/_emit.py +0 -0
  146. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/expr/_from_python.py +0 -0
  147. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/expr/_interp.py +0 -0
  148. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/glob.py +0 -0
  149. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/indexing.py +0 -0
  150. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/inline.py +0 -0
  151. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/noise/__init__.py +0 -0
  152. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/noise/_dialect.py +0 -0
  153. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/noise/fidelity.py +0 -0
  154. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/noise/model.py +0 -0
  155. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/noise/stmts.py +0 -0
  156. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/parallel.py +0 -0
  157. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/uop/__init__.py +0 -0
  158. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/uop/_dialect.py +0 -0
  159. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/uop/_emit.py +0 -0
  160. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/uop/schedule.py +0 -0
  161. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/dialects/uop/stmts.py +0 -0
  162. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/emit/__init__.py +0 -0
  163. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/emit/base.py +0 -0
  164. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/emit/gate.py +0 -0
  165. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/emit/impls/__init__.py +0 -0
  166. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/emit/impls/noise.py +0 -0
  167. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/emit/main.py +0 -0
  168. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/emit/target.py +0 -0
  169. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/glob.py +0 -0
  170. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/groups.py +0 -0
  171. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/noise.py +0 -0
  172. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/parallel.py +0 -0
  173. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/parse/__init__.py +0 -0
  174. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/parse/ast.py +0 -0
  175. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/parse/build.py +0 -0
  176. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/parse/parser.py +0 -0
  177. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/parse/print.py +0 -0
  178. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/parse/qasm2.lark +0 -0
  179. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/parse/visitor.py +0 -0
  180. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/parse/visitor.pyi +0 -0
  181. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/passes/__init__.py +0 -0
  182. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/passes/fold.py +0 -0
  183. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/passes/glob.py +0 -0
  184. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/passes/lift_qubits.py +0 -0
  185. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/passes/noise.py +0 -0
  186. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/passes/py2qasm.py +0 -0
  187. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/passes/qasm2py.py +0 -0
  188. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/rewrite/desugar.py +0 -0
  189. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/rewrite/glob.py +0 -0
  190. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/rewrite/insert_qubits.py +0 -0
  191. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/rewrite/native_gates.py +0 -0
  192. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/rewrite/noise/__init__.py +0 -0
  193. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/rewrite/noise/heuristic_noise.py +0 -0
  194. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/rewrite/noise/remove_noise.py +0 -0
  195. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/rewrite/parallel_to_uop.py +0 -0
  196. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/rewrite/register.py +0 -0
  197. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/rewrite/uop_to_parallel.py +0 -0
  198. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qasm2/types.py +0 -0
  199. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qbraid/__init__.py +0 -0
  200. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qbraid/lowering.py +0 -0
  201. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qbraid/schema.py +0 -0
  202. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qbraid/simulation_result.py +0 -0
  203. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/qbraid/target.py +0 -0
  204. {bloqade_circuit-0.4.5/src/bloqade/squin/analysis → bloqade_circuit-0.5.1/src/bloqade/rewrite}/__init__.py +0 -0
  205. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/analysis/nsites/__init__.py +0 -0
  206. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/analysis/nsites/analysis.py +0 -0
  207. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/analysis/nsites/lattice.py +0 -0
  208. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/analysis/schedule.py +0 -0
  209. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/cirq/__init__.py +0 -0
  210. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/cirq/emit/emit_circuit.py +0 -0
  211. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/cirq/emit/noise.py +0 -0
  212. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/cirq/emit/op.py +0 -0
  213. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/cirq/emit/qubit.py +0 -0
  214. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/cirq/emit/runtime.py +0 -0
  215. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/groups.py +0 -0
  216. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/lowering.py +0 -0
  217. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/noise/__init__.py +0 -0
  218. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/noise/_dialect.py +0 -0
  219. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/noise/_wrapper.py +0 -0
  220. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/noise/rewrite.py +0 -0
  221. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/op/_dialect.py +0 -0
  222. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/op/number.py +0 -0
  223. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/op/rewrite.py +0 -0
  224. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/op/stdlib.py +0 -0
  225. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/op/traits.py +0 -0
  226. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/op/types.py +0 -0
  227. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/rewrite/U3_to_clifford.py +0 -0
  228. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/rewrite/remove_dangling_qubits.py +0 -0
  229. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/squin/rewrite/wrap_analysis.py +0 -0
  230. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/__init__.py +0 -0
  231. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/auxiliary/__init__.py +0 -0
  232. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/auxiliary/_dialect.py +0 -0
  233. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/auxiliary/emit.py +0 -0
  234. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/auxiliary/lowering.py +0 -0
  235. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/auxiliary/stmts/__init__.py +0 -0
  236. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/auxiliary/stmts/const.py +0 -0
  237. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/auxiliary/types.py +0 -0
  238. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/collapse/__init__.py +0 -0
  239. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/collapse/_dialect.py +0 -0
  240. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/collapse/emit_str.py +0 -0
  241. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/collapse/stmts/__init__.py +0 -0
  242. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/collapse/stmts/measure.py +0 -0
  243. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/collapse/stmts/pp_measure.py +0 -0
  244. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/collapse/stmts/reset.py +0 -0
  245. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/gate/__init__.py +0 -0
  246. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/gate/_dialect.py +0 -0
  247. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/gate/emit.py +0 -0
  248. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/gate/stmts/__init__.py +0 -0
  249. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/gate/stmts/base.py +0 -0
  250. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/gate/stmts/clifford_1q.py +0 -0
  251. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/gate/stmts/clifford_2q.py +0 -0
  252. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/gate/stmts/control_2q.py +0 -0
  253. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/gate/stmts/pp.py +0 -0
  254. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/noise/__init__.py +0 -0
  255. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/dialects/noise/_dialect.py +0 -0
  256. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/emit/__init__.py +0 -0
  257. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/emit/stim_str.py +0 -0
  258. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/groups.py +0 -0
  259. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/parse/__init__.py +0 -0
  260. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/parse/lowering.py +0 -0
  261. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/rewrite/py_constant_to_stim.py +0 -0
  262. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/stim/rewrite/wire_identity_elimination.py +0 -0
  263. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/task.py +0 -0
  264. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/test_utils.py +0 -0
  265. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/types.py +0 -0
  266. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/visual/__init__.py +0 -0
  267. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/visual/animation/__init__.py +0 -0
  268. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/visual/animation/animate.py +0 -0
  269. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/visual/animation/base.py +0 -0
  270. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/visual/animation/gate_event.py +0 -0
  271. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/visual/animation/runtime/__init__.py +0 -0
  272. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/visual/animation/runtime/aod.py +0 -0
  273. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/visual/animation/runtime/atoms.py +0 -0
  274. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/visual/animation/runtime/ppoly.py +0 -0
  275. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/visual/animation/runtime/qpustate.py +0 -0
  276. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/src/bloqade/visual/animation/runtime/utils.py +0 -0
  277. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/__init__.py +0 -0
  278. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/analysis/fidelity/test_fidelity.py +0 -0
  279. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/pyqrack/__init__.py +0 -0
  280. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/pyqrack/runtime/__init__.py +0 -0
  281. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/pyqrack/runtime/noise/__init__.py +0 -0
  282. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/pyqrack/runtime/noise/qasm2/test_loss.py +0 -0
  283. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/pyqrack/runtime/noise/qasm2/test_pauli.py +0 -0
  284. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/pyqrack/runtime/test_dyn_memory.py +0 -0
  285. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/pyqrack/runtime/test_qrack.py +0 -0
  286. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/pyqrack/squin/test_noise.py +0 -0
  287. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/pyqrack/test_target.py +0 -0
  288. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/__init__.py +0 -0
  289. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/analysis/test_dag.py +0 -0
  290. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/emit/test_extended.py +0 -0
  291. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/emit/test_extended_noise.py +0 -0
  292. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/emit/test_qasm2.py +0 -0
  293. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/emit/test_qasm2_emit.py +0 -0
  294. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/__init__.py +0 -0
  295. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/invalid_programs/invalid_if.qasm +0 -0
  296. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/README.md +0 -0
  297. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/global.qasm +0 -0
  298. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/iqft1.qasm +0 -0
  299. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/main.qasm +0 -0
  300. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/noise.qasm +0 -0
  301. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/para.qasm +0 -0
  302. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/process_tomo.qasm +0 -0
  303. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/qelib1.inc +0 -0
  304. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/qft.qasm +0 -0
  305. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/qft2.qasm +0 -0
  306. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/rb.qasm +0 -0
  307. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/rep_code.qasm +0 -0
  308. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/ripple_carry_adder.qasm +0 -0
  309. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/tele.qasm +0 -0
  310. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/programs/valid_if.qasm +0 -0
  311. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/test_ast.py +0 -0
  312. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/parse/test_roundtrip.py +0 -0
  313. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/passes/__init__.py +0 -0
  314. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/passes/test_global_to_parallel.py +0 -0
  315. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/passes/test_global_to_uop.py +0 -0
  316. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/passes/test_heuristic_noise.py +0 -0
  317. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/passes/test_parallel_to_uop.py +0 -0
  318. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/passes/test_qasm2py.py +0 -0
  319. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/passes/test_unroll_if.py +0 -0
  320. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/passes/test_uop_to_parallel.py +0 -0
  321. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/test_count.py +0 -0
  322. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/test_inline.py +0 -0
  323. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/test_lowering.py +0 -0
  324. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/test_native.py +0 -0
  325. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qasm2/test_two2one.py +0 -0
  326. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qbraid/__init__.py +0 -0
  327. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qbraid/test_clean_circuit.py +0 -0
  328. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qbraid/test_lowering.py +0 -0
  329. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/qbraid/test_target.py +0 -0
  330. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/sample/__init__.py +0 -0
  331. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/sample/test_noise_model.py +0 -0
  332. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/squin/cirq/test_squin_noise_to_cirq.py +0 -0
  333. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/squin/cirq/test_squin_to_cirq.py +0 -0
  334. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/squin/op/test_reset.py +0 -0
  335. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/squin/rewrite/test_U3_to_clifford.py +0 -0
  336. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/squin/rewrite/test_mult_rewrite.py +0 -0
  337. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/squin/test_constprop.py +0 -0
  338. {bloqade_circuit-0.4.5/test/stim → bloqade_circuit-0.5.1/test/squin/wire}/__init__.py +0 -0
  339. {bloqade_circuit-0.4.5/test/stim/dialects → bloqade_circuit-0.5.1/test/stim}/__init__.py +0 -0
  340. {bloqade_circuit-0.4.5/test/stim/dialects/stim → bloqade_circuit-0.5.1/test/stim/dialects}/__init__.py +0 -0
  341. {bloqade_circuit-0.4.5/test/stim/dialects/stim/emit → bloqade_circuit-0.5.1/test/stim/dialects/stim}/__init__.py +0 -0
  342. {bloqade_circuit-0.4.5/test/stim/parse → bloqade_circuit-0.5.1/test/stim/dialects/stim/emit}/__init__.py +0 -0
  343. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/emit/base.py +0 -0
  344. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/emit/test_stim_1q.py +0 -0
  345. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/emit/test_stim_ctrl.py +0 -0
  346. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/emit/test_stim_detector.py +0 -0
  347. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/emit/test_stim_meas.py +0 -0
  348. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/emit/test_stim_noise.py +0 -0
  349. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/emit/test_stim_obs_inc.py +0 -0
  350. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/emit/test_stim_ppmeas.py +0 -0
  351. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/emit/test_stim_qubit_coords.py +0 -0
  352. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/dialects/stim/emit/test_stim_spp.py +0 -0
  353. {bloqade_circuit-0.4.5/test/stim/wrapper → bloqade_circuit-0.5.1/test/stim/parse}/__init__.py +0 -0
  354. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/parse/base.py +0 -0
  355. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/parse/test_parse.py +0 -0
  356. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/parse/test_parse_clifford.py +0 -0
  357. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/parse/test_parse_control.py +0 -0
  358. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/parse/test_parse_noise.py +0 -0
  359. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/parse/test_parse_spp.py +0 -0
  360. {bloqade_circuit-0.4.5/test/visual → bloqade_circuit-0.5.1/test/stim/passes}/__init__.py +0 -0
  361. /bloqade_circuit-0.4.5/test/stim/passes/stim_reference_programs/qubit/qubit.txt → /bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/qubit/qubit.stim +0 -0
  362. /bloqade_circuit-0.4.5/test/stim/passes/stim_reference_programs/qubit/qubit_broadcast.txt → /bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/qubit/qubit_broadcast.stim +0 -0
  363. /bloqade_circuit-0.4.5/test/stim/passes/stim_reference_programs/qubit/qubit_reset.txt → /bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/qubit/qubit_reset.stim +0 -0
  364. /bloqade_circuit-0.4.5/test/stim/passes/stim_reference_programs/wire/wire.txt → /bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/wire/wire.stim +0 -0
  365. /bloqade_circuit-0.4.5/test/stim/passes/stim_reference_programs/wire/wire_apply.txt → /bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/wire/wire_apply.stim +0 -0
  366. /bloqade_circuit-0.4.5/test/stim/passes/stim_reference_programs/wire/wire_apply_control.txt → /bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/wire/wire_apply_control.stim +0 -0
  367. /bloqade_circuit-0.4.5/test/stim/passes/stim_reference_programs/wire/wire_broadcast.txt → /bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/wire/wire_broadcast.stim +0 -0
  368. /bloqade_circuit-0.4.5/test/stim/passes/stim_reference_programs/wire/wire_broadcast_control.txt → /bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/wire/wire_broadcast_control.stim +0 -0
  369. /bloqade_circuit-0.4.5/test/stim/passes/stim_reference_programs/wire/wire_measure.txt → /bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/wire/wire_measure.stim +0 -0
  370. /bloqade_circuit-0.4.5/test/stim/passes/stim_reference_programs/wire/wire_multiple_apply.txt → /bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/wire/wire_multiple_apply.stim +0 -0
  371. /bloqade_circuit-0.4.5/test/stim/passes/stim_reference_programs/wire/wire_reset.txt → /bloqade_circuit-0.5.1/test/stim/passes/stim_reference_programs/wire/wire_reset.stim +0 -0
  372. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/stim/wrapper/test_wrapper.py +0 -0
  373. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/test_serialization.py +0 -0
  374. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/test_zone_model.py +0 -0
  375. {bloqade_circuit-0.4.5 → bloqade_circuit-0.5.1}/test/visual/test_utils.py +0 -0
@@ -65,7 +65,7 @@ jobs:
65
65
  name: python-package-distributions
66
66
  path: dist/
67
67
  - name: Sign the dists with Sigstore
68
- uses: sigstore/gh-action-sigstore-python@v3.0.0
68
+ uses: sigstore/gh-action-sigstore-python@v3.0.1
69
69
  with:
70
70
  inputs: >-
71
71
  ./dist/*.tar.gz
@@ -19,10 +19,10 @@ repos:
19
19
  - id: black
20
20
  - repo: https://github.com/charliermarsh/ruff-pre-commit
21
21
  # Ruff version.
22
- rev: "v0.9.2"
22
+ rev: "v0.12.1"
23
23
  hooks:
24
24
  - id: ruff
25
25
  - repo: https://github.com/crate-ci/typos
26
- rev: v1.29.4
26
+ rev: v1
27
27
  hooks:
28
28
  - id: typos
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bloqade-circuit
3
- Version: 0.4.5
3
+ Version: 0.5.1
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
@@ -16,6 +16,7 @@ Requires-Dist: scipy>=1.13.1
16
16
  Provides-Extra: cirq
17
17
  Requires-Dist: cirq-core>=1.4.1; extra == 'cirq'
18
18
  Requires-Dist: cirq-core[contrib]>=1.4.1; extra == 'cirq'
19
+ Requires-Dist: qpsolvers[clarabel]>=4.7.0; extra == 'cirq'
19
20
  Provides-Extra: pyqrack-cuda
20
21
  Requires-Dist: pyqrack-cuda>=1.38.2; extra == 'pyqrack-cuda'
21
22
  Provides-Extra: pyqrack-opencl
@@ -29,7 +30,8 @@ Requires-Dist: stim>=1.15.0; extra == 'stim'
29
30
  Provides-Extra: vis
30
31
  Requires-Dist: ffmpeg>=1.4; extra == 'vis'
31
32
  Requires-Dist: matplotlib>=3.9.2; extra == 'vis'
32
- Requires-Dist: pyqt5>=5.15.11; extra == 'vis'
33
+ Requires-Dist: pyqt5>=5.15.11; (sys_platform == 'darwin') and extra == 'vis'
34
+ Requires-Dist: pyqt5>=5.15.11; (sys_platform == 'linux') and extra == 'vis'
33
35
  Requires-Dist: tqdm>=4.66.5; extra == 'vis'
34
36
  Description-Content-Type: text/markdown
35
37
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "bloqade-circuit"
3
- version = "0.4.5"
3
+ version = "0.5.1"
4
4
  description = "The software development toolkit for neutral atom arrays."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -28,7 +28,8 @@ qasm2 = [
28
28
  vis = [
29
29
  "tqdm>=4.66.5",
30
30
  "matplotlib>=3.9.2",
31
- "pyqt5>=5.15.11",
31
+ "pyqt5>=5.15.11; sys_platform == 'darwin'",
32
+ "pyqt5>=5.15.11; sys_platform == 'linux'",
32
33
  "ffmpeg>=1.4",
33
34
  ]
34
35
  qbraid = [
@@ -37,6 +38,7 @@ qbraid = [
37
38
  cirq = [
38
39
  "cirq-core>=1.4.1",
39
40
  "cirq-core[contrib]>=1.4.1",
41
+ "qpsolvers[clarabel]>=4.7.0",
40
42
  ]
41
43
  pyqrack-opencl = [
42
44
  "pyqrack>=1.38.2 ; sys_platform != 'darwin'",
@@ -83,6 +85,9 @@ dev-linux = [
83
85
  "pyqt5>=5.15.11",
84
86
  "tqdm>=4.67.1",
85
87
  "stim>=1.15.0",
88
+ "cirq-core>=1.4.1",
89
+ "cirq-core[contrib]>=1.4.1",
90
+ "qpsolvers[clarabel]>=4.7.0",
86
91
  ]
87
92
  dev-mac-arm = [
88
93
  "cirq-core[contrib]>=1.4.1",
@@ -94,6 +99,9 @@ dev-mac-arm = [
94
99
  "qbraid>=0.9.5",
95
100
  "tqdm>=4.67.1",
96
101
  "stim>=1.15.0",
102
+ "cirq-core>=1.4.1",
103
+ "cirq-core[contrib]>=1.4.1",
104
+ "qpsolvers[clarabel]>=4.7.0",
97
105
  ]
98
106
 
99
107
  [tool.isort]
@@ -6,13 +6,10 @@ from kirin import interp
6
6
  from kirin.analysis import ForwardFrame, const
7
7
  from kirin.dialects import cf, py, scf, func, ilist
8
8
 
9
- from bloqade import squin
10
-
11
9
  from .lattice import (
12
10
  Address,
13
11
  NotQubit,
14
12
  AddressReg,
15
- AddressWire,
16
13
  AddressQubit,
17
14
  AddressTuple,
18
15
  )
@@ -73,8 +70,19 @@ class PyList(interp.MethodTable):
73
70
  class PyIndexing(interp.MethodTable):
74
71
  @interp.impl(py.GetItem)
75
72
  def getitem(self, interp: AddressAnalysis, frame: interp.Frame, stmt: py.GetItem):
76
- # Integer index into the thing being indexed
77
- idx = interp.get_const_value(int, stmt.index)
73
+
74
+ # determine if the index is an int constant
75
+ # or a slice
76
+ hint = stmt.index.hints.get("const")
77
+ if hint is None:
78
+ return (NotQubit(),)
79
+
80
+ if isinstance(hint, const.Value):
81
+ idx = hint.data
82
+ elif isinstance(hint, slice):
83
+ idx = hint
84
+ else:
85
+ return (NotQubit(),)
78
86
 
79
87
  # The object being indexed into
80
88
  obj = frame.get(stmt.obj)
@@ -82,10 +90,15 @@ class PyIndexing(interp.MethodTable):
82
90
  # so we just extract that here
83
91
  if isinstance(obj, AddressTuple):
84
92
  return (obj.data[idx],)
85
- # an AddressReg is guaranteed to just have some sequence
86
- # of integers which is directly pluggable to AddressQubit
93
+ # If idx is an integer index into an AddressReg,
94
+ # then it's safe to assume a single qubit is being accessed.
95
+ # On the other hand, if it's a slice, we return
96
+ # a new AddressReg to preserve the new sequence.
87
97
  elif isinstance(obj, AddressReg):
88
- return (AddressQubit(obj.data[idx]),)
98
+ if isinstance(idx, slice):
99
+ return (AddressReg(data=obj.data[idx]),)
100
+ if isinstance(idx, int):
101
+ return (AddressQubit(obj.data[idx]),)
89
102
  else:
90
103
  return (NotQubit(),)
91
104
 
@@ -163,63 +176,3 @@ class Scf(scf.absint.Methods):
163
176
  return # if terminate is Return, there is no result
164
177
 
165
178
  return loop_vars
166
-
167
-
168
- # Address lattice elements we can work with:
169
- ## NotQubit (bottom), AnyAddress (top)
170
-
171
- ## AddressTuple -> data: tuple[Address, ...]
172
- ### Recursive type, could contain itself or other variants
173
- ### This pops up in cases where you can have an IList/Tuple
174
- ### That contains elements that could be other Address types
175
-
176
- ## AddressReg -> data: Sequence[int]
177
- ### specific to creation of a register of qubits
178
-
179
- ## AddressQubit -> data: int
180
- ### Base qubit address type
181
-
182
-
183
- @squin.wire.dialect.register(key="qubit.address")
184
- class SquinWireMethodTable(interp.MethodTable):
185
-
186
- @interp.impl(squin.wire.Unwrap)
187
- def unwrap(
188
- self,
189
- interp_: AddressAnalysis,
190
- frame: ForwardFrame[Address],
191
- stmt: squin.wire.Unwrap,
192
- ):
193
-
194
- origin_qubit = frame.get(stmt.qubit)
195
-
196
- if isinstance(origin_qubit, AddressQubit):
197
- return (AddressWire(origin_qubit=origin_qubit),)
198
- else:
199
- return (Address.top(),)
200
-
201
- @interp.impl(squin.wire.Apply)
202
- def apply(
203
- self,
204
- interp_: AddressAnalysis,
205
- frame: ForwardFrame[Address],
206
- stmt: squin.wire.Apply,
207
- ):
208
- return frame.get_values(stmt.inputs)
209
-
210
-
211
- @squin.qubit.dialect.register(key="qubit.address")
212
- class SquinQubitMethodTable(interp.MethodTable):
213
-
214
- # This can be treated like a QRegNew impl
215
- @interp.impl(squin.qubit.New)
216
- def new(
217
- self,
218
- interp_: AddressAnalysis,
219
- frame: ForwardFrame[Address],
220
- stmt: squin.qubit.New,
221
- ):
222
- n_qubits = interp_.get_const_value(int, stmt.n_qubits)
223
- addr = AddressReg(range(interp_.next_address, interp_.next_address + n_qubits))
224
- interp_.next_address += n_qubits
225
- return (addr,)
@@ -0,0 +1,2 @@
1
+ from . import impls as impls
2
+ from .analysis import MeasurementIDAnalysis as MeasurementIDAnalysis
@@ -0,0 +1,45 @@
1
+ from typing import TypeVar
2
+
3
+ from kirin import ir, interp
4
+ from kirin.analysis import Forward, const
5
+ from kirin.analysis.forward import ForwardFrame
6
+
7
+ from .lattice import MeasureId, NotMeasureId
8
+
9
+
10
+ class MeasurementIDAnalysis(Forward[MeasureId]):
11
+
12
+ keys = ["measure_id"]
13
+ lattice = MeasureId
14
+ # for every kind of measurement encountered, increment this
15
+ # then use this to generate the negative values for target rec indices
16
+ measure_count = 0
17
+
18
+ # Still default to bottom,
19
+ # but let constants return the softer "NoMeasureId" type from impl
20
+ def eval_stmt_fallback(
21
+ self, frame: ForwardFrame[MeasureId], stmt: ir.Statement
22
+ ) -> tuple[MeasureId, ...]:
23
+ return tuple(NotMeasureId() for _ in stmt.results)
24
+
25
+ def run_method(self, method: ir.Method, args: tuple[MeasureId, ...]):
26
+ # NOTE: we do not support dynamic calls here, thus no need to propagate method object
27
+ return self.run_callable(method.code, (self.lattice.bottom(),) + args)
28
+
29
+ T = TypeVar("T")
30
+
31
+ # Xiu-zhe (Roger) Luo came up with this in the address analysis,
32
+ # reused here for convenience
33
+ # TODO: Remove this function once upgrade to kirin 0.18 happens,
34
+ # method is built-in to interpreter then
35
+ def get_const_value(self, input_type: type[T], value: ir.SSAValue) -> T:
36
+ if isinstance(hint := value.hints.get("const"), const.Value):
37
+ data = hint.data
38
+ if isinstance(data, input_type):
39
+ return hint.data
40
+ raise interp.InterpreterError(
41
+ f"Expected constant value <type = {input_type}>, got {data}"
42
+ )
43
+ raise interp.InterpreterError(
44
+ f"Expected constant value <type = {input_type}>, got {value}"
45
+ )
@@ -0,0 +1,155 @@
1
+ from kirin import types as kirin_types, interp
2
+ from kirin.dialects import py, scf, func, ilist
3
+
4
+ from bloqade.squin import wire, qubit
5
+
6
+ from .lattice import (
7
+ AnyMeasureId,
8
+ NotMeasureId,
9
+ MeasureIdBool,
10
+ MeasureIdTuple,
11
+ InvalidMeasureId,
12
+ )
13
+ from .analysis import MeasurementIDAnalysis
14
+
15
+ ## Can't do wire right now because of
16
+ ## unresolved RFC on return type
17
+ # from bloqade.squin import wire
18
+
19
+
20
+ @qubit.dialect.register(key="measure_id")
21
+ class SquinQubit(interp.MethodTable):
22
+
23
+ @interp.impl(qubit.MeasureQubit)
24
+ def measure_qubit(
25
+ self,
26
+ interp: MeasurementIDAnalysis,
27
+ frame: interp.Frame,
28
+ stmt: qubit.MeasureQubit,
29
+ ):
30
+ interp.measure_count += 1
31
+ return (MeasureIdBool(interp.measure_count),)
32
+
33
+ @interp.impl(qubit.MeasureQubitList)
34
+ def measure_qubit_list(
35
+ self,
36
+ interp: MeasurementIDAnalysis,
37
+ frame: interp.Frame,
38
+ stmt: qubit.MeasureQubitList,
39
+ ):
40
+
41
+ # try to get the length of the list
42
+ ## "...safely assume the type inference will give you what you need"
43
+ qubits_type = stmt.qubits.type
44
+ # vars[0] is just the type of the elements in the ilist,
45
+ # vars[1] can contain a literal with length information
46
+ num_qubits = qubits_type.vars[1]
47
+ if not isinstance(num_qubits, kirin_types.Literal):
48
+ return (AnyMeasureId(),)
49
+
50
+ measure_id_bools = []
51
+ for _ in range(num_qubits.data):
52
+ interp.measure_count += 1
53
+ measure_id_bools.append(MeasureIdBool(interp.measure_count))
54
+
55
+ return (MeasureIdTuple(data=tuple(measure_id_bools)),)
56
+
57
+
58
+ @wire.dialect.register(key="measure_id")
59
+ class SquinWire(interp.MethodTable):
60
+
61
+ @interp.impl(wire.Measure)
62
+ def measure_qubit(
63
+ self,
64
+ interp: MeasurementIDAnalysis,
65
+ frame: interp.Frame,
66
+ stmt: wire.Measure,
67
+ ):
68
+ interp.measure_count += 1
69
+ return (MeasureIdBool(interp.measure_count),)
70
+
71
+
72
+ @ilist.dialect.register(key="measure_id")
73
+ class IList(interp.MethodTable):
74
+ @interp.impl(ilist.New)
75
+ # Because of the way GetItem works,
76
+ # A user could create an ilist of bools that
77
+ # ends up being a mixture of MeasureIdBool and NotMeasureId
78
+ def new_ilist(
79
+ self,
80
+ interp: MeasurementIDAnalysis,
81
+ frame: interp.Frame,
82
+ stmt: ilist.New,
83
+ ):
84
+
85
+ measure_ids_in_ilist = frame.get_values(stmt.values)
86
+ return (MeasureIdTuple(data=tuple(measure_ids_in_ilist)),)
87
+
88
+
89
+ @py.tuple.dialect.register(key="measure_id")
90
+ class PyTuple(interp.MethodTable):
91
+ @interp.impl(py.tuple.New)
92
+ def new_tuple(
93
+ self, interp: MeasurementIDAnalysis, frame: interp.Frame, stmt: py.tuple.New
94
+ ):
95
+ measure_ids_in_tuple = frame.get_values(stmt.args)
96
+ return (MeasureIdTuple(data=tuple(measure_ids_in_tuple)),)
97
+
98
+
99
+ @py.indexing.dialect.register(key="measure_id")
100
+ class PyIndexing(interp.MethodTable):
101
+ @interp.impl(py.GetItem)
102
+ def getitem(
103
+ self, interp: MeasurementIDAnalysis, frame: interp.Frame, stmt: py.GetItem
104
+ ):
105
+ idx = interp.get_const_value(int, stmt.index)
106
+ obj = frame.get(stmt.obj)
107
+ if isinstance(obj, MeasureIdTuple):
108
+ return (obj.data[idx],)
109
+ # just propagate these down the line
110
+ elif isinstance(obj, (AnyMeasureId, NotMeasureId)):
111
+ return (obj,)
112
+ else:
113
+ return (InvalidMeasureId(),)
114
+
115
+
116
+ @py.binop.dialect.register(key="measure_id")
117
+ class PyBinOp(interp.MethodTable):
118
+ @interp.impl(py.Add)
119
+ def add(self, interp: MeasurementIDAnalysis, frame: interp.Frame, stmt: py.Add):
120
+ lhs = frame.get(stmt.lhs)
121
+ rhs = frame.get(stmt.rhs)
122
+
123
+ if isinstance(lhs, MeasureIdTuple) and isinstance(rhs, MeasureIdTuple):
124
+ return (MeasureIdTuple(data=lhs.data + rhs.data),)
125
+ else:
126
+ return (InvalidMeasureId(),)
127
+
128
+
129
+ @func.dialect.register(key="measure_id")
130
+ class Func(interp.MethodTable):
131
+ @interp.impl(func.Return)
132
+ def return_(self, _: MeasurementIDAnalysis, frame: interp.Frame, stmt: func.Return):
133
+ return interp.ReturnValue(frame.get(stmt.value))
134
+
135
+ # taken from Address Analysis implementation from Xiu-zhe (Roger) Luo
136
+ @interp.impl(
137
+ func.Invoke
138
+ ) # we know the callee already, func.Call would mean we don't know the callee @ compile time
139
+ def invoke(
140
+ self, interp_: MeasurementIDAnalysis, frame: interp.Frame, stmt: func.Invoke
141
+ ):
142
+ _, ret = interp_.run_method(
143
+ stmt.callee,
144
+ interp_.permute_values(
145
+ stmt.callee.arg_names, frame.get_values(stmt.inputs), stmt.kwargs
146
+ ),
147
+ )
148
+ return (ret,)
149
+
150
+
151
+ # Just let analysis propagate through
152
+ # scf, particularly IfElse
153
+ @scf.dialect.register(key="measure_id")
154
+ class Scf(scf.absint.Methods):
155
+ pass
@@ -0,0 +1,82 @@
1
+ from typing import final
2
+ from dataclasses import dataclass
3
+
4
+ from kirin.lattice import (
5
+ SingletonMeta,
6
+ BoundedLattice,
7
+ SimpleJoinMixin,
8
+ SimpleMeetMixin,
9
+ )
10
+
11
+ # Taken directly from Kai-Hsin Wu's implementation
12
+ # with minor changes to names and addition of CanMeasureId type
13
+
14
+
15
+ @dataclass
16
+ class MeasureId(
17
+ SimpleJoinMixin["MeasureId"],
18
+ SimpleMeetMixin["MeasureId"],
19
+ BoundedLattice["MeasureId"],
20
+ ):
21
+
22
+ @classmethod
23
+ def bottom(cls) -> "MeasureId":
24
+ return InvalidMeasureId()
25
+
26
+ @classmethod
27
+ def top(cls) -> "MeasureId":
28
+ return AnyMeasureId()
29
+
30
+
31
+ # Can pop up if user constructs some list containing a mixture
32
+ # of bools from measure results and other places,
33
+ # in which case the whole list is invalid
34
+ @final
35
+ @dataclass
36
+ class InvalidMeasureId(MeasureId, metaclass=SingletonMeta):
37
+
38
+ def is_subseteq(self, other: MeasureId) -> bool:
39
+ return True
40
+
41
+
42
+ @final
43
+ @dataclass
44
+ class AnyMeasureId(MeasureId, metaclass=SingletonMeta):
45
+
46
+ def is_subseteq(self, other: MeasureId) -> bool:
47
+ return isinstance(other, AnyMeasureId)
48
+
49
+
50
+ @final
51
+ @dataclass
52
+ class NotMeasureId(MeasureId, metaclass=SingletonMeta):
53
+
54
+ def is_subseteq(self, other: MeasureId) -> bool:
55
+ return isinstance(other, NotMeasureId)
56
+
57
+
58
+ @final
59
+ @dataclass
60
+ class MeasureIdBool(MeasureId):
61
+ idx: int
62
+
63
+ def is_subseteq(self, other: MeasureId) -> bool:
64
+ if isinstance(other, MeasureIdBool):
65
+ return self.idx == other.idx
66
+ return False
67
+
68
+
69
+ # Might be nice to have some print override
70
+ # here so all the CanMeasureId's/other types are consolidated for
71
+ # readability
72
+
73
+
74
+ @final
75
+ @dataclass
76
+ class MeasureIdTuple(MeasureId):
77
+ data: tuple[MeasureId, ...]
78
+
79
+ def is_subseteq(self, other: MeasureId) -> bool:
80
+ if isinstance(other, MeasureIdTuple):
81
+ return all(a.is_subseteq(b) for a, b in zip(self.data, other.data))
82
+ return False
@@ -0,0 +1,7 @@
1
+ from .parallelize import (
2
+ parallelize as parallelize,
3
+ no_similarity as no_similarity,
4
+ auto_similarity as auto_similarity,
5
+ block_similarity as block_similarity,
6
+ moment_similarity as moment_similarity,
7
+ )