waveforms 1.8.5__tar.gz → 1.8.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. {waveforms-1.8.5/waveforms.egg-info → waveforms-1.8.7}/PKG-INFO +1 -1
  2. waveforms-1.8.7/tests/test_SUN.py +15 -0
  3. waveforms-1.8.7/tests/test_clifford.py +135 -0
  4. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_group.py +20 -94
  5. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/group/_SU_n_.py +5 -4
  6. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/group/__init__.py +1 -0
  7. waveforms-1.8.7/waveforms/math/group/clifford/__init__.py +4 -0
  8. waveforms-1.8.7/waveforms/math/group/clifford/funtions.py +232 -0
  9. waveforms-1.8.7/waveforms/math/group/clifford/group.py +134 -0
  10. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/group/permutation_group.py +57 -93
  11. waveforms-1.8.5/waveforms/qlisp/simulator/mat.py → waveforms-1.8.7/waveforms/math/matricies.py +48 -0
  12. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/simulator/__init__.py +25 -34
  13. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/simulator/simple.py +64 -39
  14. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/clifford/clifford.py +73 -23
  15. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/clifford/mat.py +2 -15
  16. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/clifford/seq2mat.py +4 -3
  17. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/math.py +5 -10
  18. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/rb.py +2 -1
  19. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/tomo.py +16 -38
  20. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/chat.py +9 -7
  21. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/version.py +1 -1
  22. {waveforms-1.8.5 → waveforms-1.8.7/waveforms.egg-info}/PKG-INFO +1 -1
  23. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms.egg-info/SOURCES.txt +4 -18
  24. waveforms-1.8.5/tests/test_clifford.py +0 -8
  25. waveforms-1.8.5/waveforms/math/group/clifford/__init__.py +0 -2
  26. waveforms-1.8.5/waveforms/math/group/clifford/funtions.py +0 -14
  27. waveforms-1.8.5/waveforms/math/group/clifford/group.py +0 -103
  28. waveforms-1.8.5/waveforms/quantum/circuit/__init__.py +0 -7
  29. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/__init__.py +0 -15
  30. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/arch/__init__.py +0 -12
  31. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/arch/base.py +0 -10
  32. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/assembly_left.py +0 -1
  33. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/assembly_right.py +0 -1
  34. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/compiler.py +0 -1
  35. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/config.py +0 -6
  36. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/library.py +0 -1
  37. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/macro.py +0 -4
  38. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/qasm.py +0 -1
  39. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/qlisp.py +0 -7
  40. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/stdlib.py +0 -3
  41. waveforms-1.8.5/waveforms/quantum/circuit/qlisp/utils.py +0 -2
  42. waveforms-1.8.5/waveforms/quantum/circuit/simulator/__init__.py +0 -13
  43. {waveforms-1.8.5 → waveforms-1.8.7}/LICENSE +0 -0
  44. {waveforms-1.8.5 → waveforms-1.8.7}/MANIFEST.in +0 -0
  45. {waveforms-1.8.5 → waveforms-1.8.7}/README.md +0 -0
  46. {waveforms-1.8.5 → waveforms-1.8.7}/pyproject.toml +0 -0
  47. {waveforms-1.8.5 → waveforms-1.8.7}/setup.cfg +0 -0
  48. {waveforms-1.8.5 → waveforms-1.8.7}/setup.py +0 -0
  49. {waveforms-1.8.5 → waveforms-1.8.7}/src/ikcp.c +0 -0
  50. {waveforms-1.8.5 → waveforms-1.8.7}/src/ikcp.h +0 -0
  51. {waveforms-1.8.5 → waveforms-1.8.7}/src/kcp.c +0 -0
  52. {waveforms-1.8.5 → waveforms-1.8.7}/src/prime.c +0 -0
  53. {waveforms-1.8.5 → waveforms-1.8.7}/src/waveform.c +0 -0
  54. {waveforms-1.8.5 → waveforms-1.8.7}/src/waveform.h +0 -0
  55. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_bayes.py +0 -0
  56. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_compile.py +0 -0
  57. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_config.py +0 -0
  58. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_cycles.py +0 -0
  59. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_dicttree.py +0 -0
  60. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_distortion.py +0 -0
  61. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_interval.py +0 -0
  62. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_kad.py +0 -0
  63. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_lisp.py +0 -0
  64. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_msgpack.py +0 -0
  65. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_multi_drag.py +0 -0
  66. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_namespace.py +0 -0
  67. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_registry.py +0 -0
  68. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_scan_iter.py +0 -0
  69. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_tomo.py +0 -0
  70. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_vm.py +0 -0
  71. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_waveform.py +0 -0
  72. {waveforms-1.8.5 → waveforms-1.8.7}/tests/test_wavevstack.py +0 -0
  73. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/__init__.py +0 -0
  74. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/__main__.py +0 -0
  75. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/autoreload.py +0 -0
  76. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/baseconfig.py +0 -0
  77. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/cache.py +0 -0
  78. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/dicttree.py +0 -0
  79. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/loader.py +0 -0
  80. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/__init__.py +0 -0
  81. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/bayes.py +0 -0
  82. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fibheap.py +0 -0
  83. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fit/__init__.py +0 -0
  84. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fit/_fit.py +0 -0
  85. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fit/delay.py +0 -0
  86. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fit/geo.py +0 -0
  87. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fit/peak.py +0 -0
  88. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fit/qubit_dynamics.py +0 -0
  89. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fit/readout.py +0 -0
  90. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fit/resonator.py +0 -0
  91. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fit/simple.py +0 -0
  92. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fit/spectrum.py +0 -0
  93. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/fit/symmetry.py +0 -0
  94. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/func.py +0 -0
  95. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/graph.py +0 -0
  96. {waveforms-1.8.5/waveforms/quantum → waveforms-1.8.7/waveforms/math/group}/clifford/chp.py +0 -0
  97. {waveforms-1.8.5/waveforms/quantum → waveforms-1.8.7/waveforms/math/group}/clifford/chp_numpy.py +0 -0
  98. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/interval.py +0 -0
  99. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/paulis.py +0 -0
  100. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/prime.py +0 -0
  101. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/signal/__init__.py +0 -0
  102. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/signal/demodulate.py +0 -0
  103. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/signal/distortion.py +0 -0
  104. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/signal/func.py +0 -0
  105. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/math/transmon.py +0 -0
  106. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/multy_drag.py +0 -0
  107. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/namespace.py +0 -0
  108. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/__init__.py +0 -0
  109. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/arch/__init__.py +0 -0
  110. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/assembly.py +0 -0
  111. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/base.py +0 -0
  112. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/commands.py +0 -0
  113. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/compiler.py +0 -0
  114. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/config.py +0 -0
  115. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/interpreter.py +0 -0
  116. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/library.py +0 -0
  117. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/libs/__init__.py +0 -0
  118. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/macro.py +0 -0
  119. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/parse.py +0 -0
  120. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/prog.py +0 -0
  121. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/__init__.py +0 -0
  122. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/eval.py +0 -0
  123. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/exceptions.py +0 -0
  124. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/libs/__init__.py +0 -0
  125. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/libs/qelib1.inc +0 -0
  126. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/__init__.py +0 -0
  127. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/barrier.py +0 -0
  128. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/binaryop.py +0 -0
  129. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/binaryoperator.py +0 -0
  130. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/creg.py +0 -0
  131. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/customunitary.py +0 -0
  132. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/expressionlist.py +0 -0
  133. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/external.py +0 -0
  134. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/format.py +0 -0
  135. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/gate.py +0 -0
  136. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/gatebody.py +0 -0
  137. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/id.py +0 -0
  138. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/idlist.py +0 -0
  139. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/if_.py +0 -0
  140. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/indexedid.py +0 -0
  141. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/intnode.py +0 -0
  142. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/measure.py +0 -0
  143. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/node.py +0 -0
  144. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/nodeexception.py +0 -0
  145. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/opaque.py +0 -0
  146. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/prefix.py +0 -0
  147. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/primarylist.py +0 -0
  148. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/program.py +0 -0
  149. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/qreg.py +0 -0
  150. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/real.py +0 -0
  151. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/reset.py +0 -0
  152. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/node/unaryoperator.py +0 -0
  153. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/qasm.py +0 -0
  154. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/qasmlexer.py +0 -0
  155. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/qasm/qasmparser.py +0 -0
  156. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/tokenize.py +0 -0
  157. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/qlisp/utils.py +0 -0
  158. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/__init__.py +0 -0
  159. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/analyze/__init__.py +0 -0
  160. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/analyze/coupling.py +0 -0
  161. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/analyze/decoherence.py +0 -0
  162. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/analyze/gate_error.py +0 -0
  163. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/clifford/__init__.py +0 -0
  164. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/clifford/db.py +0 -0
  165. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/fourier_grid.py +0 -0
  166. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/transmon.py +0 -0
  167. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/quantum/xeb.py +0 -0
  168. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/registry.py +0 -0
  169. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/scan/__init__.py +0 -0
  170. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/scan/base.py +0 -0
  171. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/scan/dataset.py +0 -0
  172. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/scan/expression.py +0 -0
  173. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/scan/scanner.py +0 -0
  174. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/scan/transforms.py +0 -0
  175. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/scan_iter.py +0 -0
  176. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/security/__init__.py +0 -0
  177. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/security/verify.py +0 -0
  178. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/server/__init__.py +0 -0
  179. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/server/__main__.py +0 -0
  180. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/server/echo.py +0 -0
  181. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/__init__.py +0 -0
  182. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/backend/__init__.py +0 -0
  183. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/backend/redis.py +0 -0
  184. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/base_dataset.py +0 -0
  185. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/chunk.py +0 -0
  186. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/dataset.py +0 -0
  187. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/file.py +0 -0
  188. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/models/__init__.py +0 -0
  189. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/models/base.py +0 -0
  190. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/models/config.py +0 -0
  191. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/models/file.py +0 -0
  192. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/models/ipy.py +0 -0
  193. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/models/record.py +0 -0
  194. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/models/report.py +0 -0
  195. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/models/tag.py +0 -0
  196. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/storage/storage.py +0 -0
  197. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/__init__.py +0 -0
  198. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/device/__init__.py +0 -0
  199. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/device/basedevice.py +0 -0
  200. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/device/loader.py +0 -0
  201. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/device/utils.py +0 -0
  202. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/drivers/FakeInstrument.py +0 -0
  203. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/drivers/__init__.py +0 -0
  204. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/ipy_events.py +0 -0
  205. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/net/__init__.py +0 -0
  206. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/net/bencoder.py +0 -0
  207. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/net/cli.py +0 -0
  208. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/net/dhcp.py +0 -0
  209. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/net/dhcpd.py +0 -0
  210. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/net/kad.py +0 -0
  211. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/net/kcp.py +0 -0
  212. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/progress.py +0 -0
  213. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/rpc/__init__.py +0 -0
  214. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/rpc/msgpack.py +0 -0
  215. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/storage/__init__.py +0 -0
  216. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/storage/crud.py +0 -0
  217. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/sys/storage/models.py +0 -0
  218. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/units/__init__.py +0 -0
  219. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/utils.py +0 -0
  220. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/visualization/__init__.py +0 -0
  221. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/visualization/__main__.py +0 -0
  222. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/visualization/_autoplot.py +0 -0
  223. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/visualization/plot_layout.py +0 -0
  224. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/visualization/plot_seq.py +0 -0
  225. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/visualization/qdat.py +0 -0
  226. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/visualization/widgets.py +0 -0
  227. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/waveform.py +0 -0
  228. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms/waveform_parser.py +0 -0
  229. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms.egg-info/dependency_links.txt +0 -0
  230. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms.egg-info/entry_points.txt +0 -0
  231. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms.egg-info/requires.txt +0 -0
  232. {waveforms-1.8.5 → waveforms-1.8.7}/waveforms.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: waveforms
3
- Version: 1.8.5
3
+ Version: 1.8.7
4
4
  Summary: Edit waveforms used in experiment
5
5
  Author-email: feihoo87 <feihoo87@gmail.com>
6
6
  Maintainer-email: feihoo87 <feihoo87@gmail.com>
@@ -0,0 +1,15 @@
1
+ import numpy as np
2
+
3
+ from waveforms.math.group import SU
4
+
5
+
6
+ def test_SU():
7
+ for N in range(2, 6):
8
+ for i in range(N**2):
9
+ mat = SU(N)[i]
10
+ assert mat.shape == (N, N)
11
+ if i == 0:
12
+ assert np.allclose(mat, np.eye(N))
13
+ else:
14
+ assert abs(np.trace(mat)) < 1e-9
15
+ assert np.allclose(mat, mat.T.conj())
@@ -0,0 +1,135 @@
1
+ import functools
2
+ import itertools
3
+ import operator
4
+ import random
5
+
6
+ import numpy as np
7
+
8
+ from waveforms.math.group import CliffordGroup, PermutationGroup
9
+ from waveforms.math.group.clifford import (cliffordOrder,
10
+ find_permutation_for_Unitary)
11
+ from waveforms.math.group.clifford.funtions import (
12
+ one_qubit_clifford_matricies, one_qubit_clifford_mul_table,
13
+ one_qubit_clifford_seq, one_qubit_clifford_seq2)
14
+ from waveforms.math.group.clifford.group import make_clifford_generators
15
+ from waveforms.math.matricies import synchronize_global_phase
16
+ from waveforms.qlisp.simulator.simple import applySeq, seq2mat
17
+
18
+
19
+ def make_circuit(gate, N):
20
+ rest_qubits = set(range(N)) - set(gate[1:])
21
+ circ = [gate]
22
+ for qubit in rest_qubits:
23
+ circ.append(('I', qubit))
24
+ return circ
25
+
26
+
27
+ def random_circuit(N, depth, single_qubit_gate_set, two_qubit_gate_set):
28
+ circ = []
29
+ qubits = list(range(N))
30
+ for i in range(depth):
31
+ for q in range(N):
32
+ circ.append((random.choice(single_qubit_gate_set), q))
33
+ random.shuffle(qubits)
34
+ for i in range(0, N - 1, 2):
35
+ circ.append(
36
+ (random.choice(two_qubit_gate_set), qubits[i], qubits[i + 1]))
37
+ return circ
38
+
39
+
40
+ def test_cliffordOrder():
41
+ assert cliffordOrder(0) == 1
42
+ assert cliffordOrder(1) == 24
43
+ assert cliffordOrder(2) == 11520
44
+ assert cliffordOrder(3) == 92897280
45
+
46
+ for N in [1, 2, 3]:
47
+ clifford = PermutationGroup(list(make_clifford_generators(N).values()))
48
+ assert clifford.order() == cliffordOrder(N)
49
+
50
+
51
+ def test_mul_table():
52
+ group = CliffordGroup(1)
53
+ lst = [
54
+ group.circuit_to_permutation([(g, 0)]) for g in one_qubit_clifford_seq
55
+ ]
56
+ for i, j in itertools.product(range(24), repeat=2):
57
+ assert lst[i] * lst[j] == lst[one_qubit_clifford_mul_table[i, j]]
58
+
59
+
60
+ def test_mul_table2():
61
+ for i, j in itertools.product(range(24), repeat=2):
62
+ assert np.allclose(
63
+ synchronize_global_phase(one_qubit_clifford_matricies[j]
64
+ @ one_qubit_clifford_matricies[i]),
65
+ synchronize_global_phase(
66
+ one_qubit_clifford_matricies[one_qubit_clifford_mul_table[i,
67
+ j]]))
68
+
69
+
70
+ def test_seq2():
71
+ for mat, seq in zip(one_qubit_clifford_matricies, one_qubit_clifford_seq2):
72
+ assert np.allclose(
73
+ synchronize_global_phase(mat),
74
+ synchronize_global_phase(seq2mat([(g, 0) for g in seq])))
75
+
76
+
77
+ def test_elements():
78
+ group = CliffordGroup(1)
79
+ lst = [
80
+ group.circuit_to_permutation([(g, 0)]) for g in one_qubit_clifford_seq
81
+ ]
82
+ assert len(group.elements) == 24
83
+ assert set(group.elements) == set(lst)
84
+
85
+
86
+ def test_rb():
87
+ group = CliffordGroup(2)
88
+
89
+ circ = []
90
+ for i in range(500):
91
+ circ.extend(group.permutation_to_circuit(group.random()))
92
+
93
+ circ2 = group.circuit_simplify(circ)
94
+ circ3 = group.circuit_fullsimplify(circ)
95
+ assert len(circ3) < len(circ)
96
+
97
+ circ.extend(group.circuit_inv(circ3))
98
+ circ2.extend(group.circuit_inv(circ3))
99
+ circ3.extend(group.circuit_inv(circ3))
100
+
101
+ psi = applySeq(circ)
102
+ assert abs((psi * psi.conj()).real[0] - 1) < 1e-6
103
+
104
+ psi = applySeq(circ2)
105
+ assert abs((psi * psi.conj()).real[0] - 1) < 1e-6
106
+
107
+ psi = applySeq(circ3)
108
+ assert abs((psi * psi.conj()).real[0] - 1) < 1e-6
109
+
110
+
111
+ def test_express():
112
+ N = 2
113
+ DEPTH = 1000
114
+
115
+ generators = make_clifford_generators(N)
116
+
117
+ clifford = PermutationGroup(list(generators.values()))
118
+
119
+ circuit = random_circuit(
120
+ N, DEPTH, ['X/2', 'Y/2', 'X', 'Y', '-X/2', '-Y/2', 'Z', 'S', '-S'],
121
+ ['CZ', 'iSWAP', 'Cnot'])
122
+ U = seq2mat(circuit)
123
+
124
+ circ_perm = find_permutation_for_Unitary(U, N)
125
+ inv_circ = clifford.express(circ_perm.inv())
126
+
127
+ assert (circ_perm *
128
+ functools.reduce(operator.mul, inv_circ.expand())).is_identity()
129
+
130
+ reversed_map = {v: k for k, v in generators.items()}
131
+ inv_circuit = [reversed_map[c] for c in inv_circ.expand()]
132
+
133
+ U = seq2mat(circuit + inv_circuit)
134
+
135
+ assert np.allclose(synchronize_global_phase(U), np.eye(U.shape[0]))
@@ -1,77 +1,7 @@
1
1
  import functools
2
- import itertools
3
2
  import operator
4
- import random
5
- from functools import reduce
6
- from itertools import chain, product
7
-
8
- import numpy as np
9
3
 
10
4
  from waveforms.math.group import *
11
- from waveforms.math.group.clifford.funtions import cliffordOrder
12
- from waveforms.qlisp.simulator.simple import seq2mat
13
-
14
-
15
- def make_circuit(gate, N):
16
- rest_qubits = set(range(N)) - set(gate[1:])
17
- circ = [gate]
18
- for qubit in rest_qubits:
19
- circ.append(('I', qubit))
20
- return circ
21
-
22
-
23
- def find_permutation_for_Unitary(U, N):
24
- init = []
25
- final = []
26
- for base in product([
27
- SU(2)[0],
28
- SU(2)[1],
29
- SU(2)[2],
30
- SU(2)[3], -SU(2)[0], -SU(2)[1], -SU(2)[2], -SU(2)[3]
31
- ],
32
- repeat=N):
33
- op = reduce(np.kron, base)
34
- init.append(op)
35
- final.append(U @ op @ U.T.conj())
36
- return find_permutation(init, final)
37
-
38
-
39
- def random_circuit(N, depth, single_qubit_gate_set, two_qubit_gate_set):
40
- circ = []
41
- qubits = list(range(N))
42
- for i in range(depth):
43
- for q in range(N):
44
- circ.append((random.choice(single_qubit_gate_set), q))
45
- random.shuffle(qubits)
46
- for i in range(0, N - 1, 2):
47
- circ.append(
48
- (random.choice(two_qubit_gate_set), qubits[i], qubits[i + 1]))
49
- return circ
50
-
51
-
52
- def expand_expr(perm):
53
- perm.simplify()
54
- expr = perm._expr
55
- return itertools.chain.from_iterable([[c] * n for c, n in expr])
56
-
57
-
58
- def make_clifford_generators(N):
59
- gate_list = []
60
-
61
- for q in range(N):
62
- gate_list.append(('H', q))
63
- gate_list.append(('S', q))
64
-
65
- for q in range(N - 1):
66
- gate_list.append(('CZ', q, q + 1))
67
-
68
- generators = {}
69
-
70
- for gate in gate_list:
71
- U = seq2mat(make_circuit(gate, N))
72
- generators[gate] = find_permutation_for_Unitary(U, N)
73
-
74
- return generators
75
5
 
76
6
 
77
7
  def test_init():
@@ -93,10 +23,6 @@ def test_order():
93
23
  ])
94
24
  assert G.order() == 88179840
95
25
 
96
- for N in [1, 2, 3]:
97
- clifford = PermutationGroup(list(make_clifford_generators(N).values()))
98
- assert clifford.order() == cliffordOrder(N)
99
-
100
26
 
101
27
  def test_orbit():
102
28
  G = SymmetricGroup(5)
@@ -168,30 +94,30 @@ def test_subgroup():
168
94
  assert not G < SymmetricGroup(5)
169
95
 
170
96
 
171
- def test_express():
172
- N = 2
173
- DEPTH = 1000
174
-
175
- generators = make_clifford_generators(N)
97
+ def test_simplify():
98
+ group = SymmetricGroup(5)
176
99
 
177
- clifford = PermutationGroup(list(generators.values()))
100
+ lst1 = []
101
+ for i in range(100):
102
+ lst1.append(group.random())
178
103
 
179
- circuit = random_circuit(
180
- N, DEPTH, ['X/2', 'Y/2', 'X', 'Y', '-X/2', '-Y/2', 'Z', 'S', '-S'],
181
- ['CZ', 'iSWAP', 'Cnot'])
182
- U = seq2mat(circuit)
104
+ perm = functools.reduce(operator.mul, lst1)
105
+ perm2 = perm.inv()
183
106
 
184
- circ_perm = find_permutation_for_Unitary(U, N)
185
- inv_circ = clifford.express(circ_perm.inv())
107
+ assert (perm * perm2).is_identity()
186
108
 
187
- assert (
188
- circ_perm *
189
- functools.reduce(operator.mul, expand_expr(inv_circ))).is_identity()
109
+ perm.simplify()
190
110
 
191
- reversed_map = {v: k for k, v in generators.items()}
192
- inv_circuit = [reversed_map[c] for c in expand_expr(inv_circ)]
111
+ lst2 = []
112
+ for g, n in perm._expr:
113
+ for _ in range(n):
114
+ lst2.append(g)
193
115
 
194
- U = seq2mat(circuit + inv_circuit)
195
- U = U * np.exp(-1j * np.angle(U[0, 0]))
116
+ assert functools.reduce(operator.mul, lst2) == perm
196
117
 
197
- assert np.allclose(U, np.eye(U.shape[0]))
118
+ perm2 = group.express(perm2)
119
+ perm2.simplify()
120
+ for g, n in perm2._expr:
121
+ for _ in range(n):
122
+ lst2.append(g)
123
+ assert functools.reduce(operator.mul, lst2) == Cycles()
@@ -1,9 +1,10 @@
1
1
  import math
2
+
2
3
  import numpy as np
3
4
 
4
5
 
5
6
  def _SUn_generator(n, i):
6
- assert n > 1 and 0 <= i < 2**n
7
+ assert n > 1 and 0 <= i < n**2
7
8
 
8
9
  if i == 0:
9
10
  return np.eye(n, dtype=np.int8), 1
@@ -36,8 +37,8 @@ class _SUGroup():
36
37
  self.n = n
37
38
 
38
39
  def __getitem__(self, i: int):
39
- if not 0 <= i < 2**self.n:
40
- raise IndexError(f"i must be in [0, {2**self.n-1}]")
40
+ if not 0 <= i < self.n**2:
41
+ raise IndexError(f"i must be in [0, {self.n**2-1}]")
41
42
  mat, A = _SUn_generator(self.n, i)
42
43
  return A * mat
43
44
 
@@ -46,4 +47,4 @@ class _SUGroup():
46
47
 
47
48
 
48
49
  def SU(n: int):
49
- return _SUGroup(n)
50
+ return _SUGroup(n)
@@ -1,4 +1,5 @@
1
1
  from ._SU_n_ import SU
2
+ from .clifford.funtions import cliffordOrder
2
3
  from .clifford.group import CliffordGroup
3
4
  from .permutation_group import (AlternatingGroup, Cycles, CyclicGroup,
4
5
  DihedralGroup, PermutationGroup,
@@ -0,0 +1,4 @@
1
+ from .funtions import (cliffordOrder, one_qubit_clifford_matricies,
2
+ one_qubit_clifford_mul_table, one_qubit_clifford_seq,
3
+ two_qubit_clifford_matricies, twoQubitCliffordSequence)
4
+ from .group import CliffordGroup, find_permutation_for_Unitary
@@ -0,0 +1,232 @@
1
+ import operator
2
+ from functools import lru_cache, reduce
3
+
4
+ import numpy as np
5
+ from numpy import pi
6
+
7
+ from waveforms.cache import cache
8
+
9
+ from ...matricies import U
10
+
11
+
12
+ def cliffordOrder(n: int) -> int:
13
+ """
14
+ Order of complex Clifford group of degree 2^n arising in quantum coding theory.
15
+
16
+ Sloane, N. J. A. (ed.). "Sequence A003956 (Order of Clifford group)".
17
+ The On-Line Encyclopedia of Integer Sequences. OEIS Foundation.
18
+ https://oeis.org/A003956
19
+ """
20
+ return reduce(operator.mul, (((1 << (2 * j)) - 1) << 2 * j + 1
21
+ for j in range(1, n + 1)), 1)
22
+
23
+
24
+ one_qubit_clifford_seq = [
25
+ # Paulis
26
+ ("u3", 0 , 0 , 0 ), # I
27
+ ("u3", pi , -pi , 0 ), # X
28
+ ("u3", pi , 0 , 0 ), # Y
29
+ ("u3", 0 , pi/2, pi/2), # Z
30
+
31
+ # 2 pi / 3 rotations
32
+ ("u3", pi/2, -pi/2, 0 ),
33
+ ("u3", pi/2, -pi/2, pi ),
34
+ ("u3", pi/2, pi/2, 0 ),
35
+ ("u3", pi/2, pi/2, -pi ),
36
+ ("u3", pi/2, 0 , pi/2),
37
+ ("u3", pi/2, 0 , -pi/2),
38
+ ("u3", pi/2, -pi , pi/2),
39
+ ("u3", pi/2, pi , -pi/2),
40
+
41
+ # pi / 2 rotations
42
+ ("u3", pi/2, -pi/2, pi/2), # X/2
43
+ ("u3", pi/2, pi/2, -pi/2), # -X/2
44
+ ("u3", pi/2, 0 , 0 ), # Y/2
45
+ ("u3", pi/2, pi , -pi ), # -Y/2
46
+ ("u3", 0 , 0 , pi/2), # Z/2
47
+ ("u3", 0 , 0 , -pi/2), # -Z/2
48
+
49
+ # Hadamard-like
50
+ ("u3", pi/2, -pi , 0 ),
51
+ ("u3", pi/2, 0 , pi ), # Hadamard
52
+ ("u3", pi/2, pi/2, pi/2),
53
+ ("u3", pi/2, -pi/2, -pi/2),
54
+ ("u3", pi , -pi/2, 0 ),
55
+ ("u3", pi , pi/2, 0 )
56
+ ] #yapf: disable
57
+
58
+ one_qubit_clifford_seq2 = [
59
+ # Paulis
60
+ [], # I
61
+ ['H', 'S', 'S', 'H'], # X
62
+ ['H', 'S', 'S', 'H', 'S', 'S'], # Y
63
+ ['S', 'S'], # Z
64
+
65
+ # 2 pi / 3 rotations
66
+ ['S', 'S', 'H', 'S', 'S', 'S'],
67
+ ['H', 'S', 'S', 'S'],
68
+ ['S', 'S', 'H', 'S'],
69
+ ['H', 'S'],
70
+ ['S', 'S', 'S', 'H'],
71
+ ['S', 'H'],
72
+ ['S', 'S', 'S', 'H', 'S', 'S'],
73
+ ['S', 'H', 'S', 'S'],
74
+
75
+ # pi / 2 rotations
76
+ ['S', 'S', 'S', 'H', 'S', 'S', 'S'], # X/2
77
+ ['S', 'H', 'S'], # -X/2
78
+ ['S', 'S', 'H'], # Y/2
79
+ ['H', 'S', 'S'], # -Y/2
80
+ ['S'], # Z/2
81
+ ['S', 'S', 'S'], # -Z/2
82
+
83
+ # Hadamard-like
84
+ ['S', 'S', 'H', 'S', 'S'],
85
+ ['H'],
86
+ ['S', 'S', 'S', 'H', 'S'],
87
+ ['S', 'H', 'S', 'S', 'S'],
88
+ ['H', 'S', 'S', 'H', 'S'],
89
+ ['H', 'S', 'S', 'H', 'S', 'S', 'S']
90
+ ] #yapf: disable
91
+
92
+ one_qubit_clifford_seq_inv = {
93
+ g: i
94
+ for i, g in enumerate(one_qubit_clifford_seq)
95
+ }
96
+ one_qubit_clifford_seq_inv['H'] = 19
97
+ one_qubit_clifford_seq_inv['S'] = 16
98
+ one_qubit_clifford_seq_inv['I'] = 0
99
+ one_qubit_clifford_seq_inv['X'] = 1
100
+ one_qubit_clifford_seq_inv['Y'] = 2
101
+ one_qubit_clifford_seq_inv['Z'] = 3
102
+ one_qubit_clifford_seq_inv['X/2'] = 12
103
+ one_qubit_clifford_seq_inv['-X/2'] = 13
104
+ one_qubit_clifford_seq_inv['Y/2'] = 14
105
+ one_qubit_clifford_seq_inv['-Y/2'] = 15
106
+ one_qubit_clifford_seq_inv['-S'] = 17
107
+ one_qubit_clifford_seq_inv.update({f'C1_{i}': i for i in range(24)})
108
+
109
+ one_qubit_clifford_mul_table = np.array([
110
+ [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23],
111
+ [1,0,3,2,6,7,4,5,11,10,9,8,13,12,18,19,22,23,14,15,21,20,16,17],
112
+ [2,3,0,1,7,6,5,4,10,11,8,9,20,21,15,14,23,22,19,18,12,13,17,16],
113
+ [3,2,1,0,5,4,7,6,9,8,11,10,21,20,19,18,17,16,15,14,13,12,23,22],
114
+ [4,7,5,6,11,8,9,10,2,3,1,0,22,17,21,12,14,18,13,20,23,16,15,19],
115
+ [5,6,4,7,10,9,8,11,1,0,2,3,23,16,12,21,19,15,20,13,22,17,18,14],
116
+ [6,5,7,4,8,11,10,9,3,2,0,1,16,23,20,13,18,14,12,21,17,22,19,15],
117
+ [7,4,6,5,9,10,11,8,0,1,3,2,17,22,13,20,15,19,21,12,16,23,14,18],
118
+ [8,9,11,10,1,3,2,0,7,4,5,6,19,14,22,16,20,12,23,17,15,18,13,21],
119
+ [9,8,10,11,2,0,1,3,6,5,4,7,14,19,23,17,13,21,22,16,18,15,20,12],
120
+ [10,11,9,8,3,1,0,2,4,7,6,5,18,15,17,23,12,20,16,22,14,19,21,13],
121
+ [11,10,8,9,0,2,3,1,5,6,7,4,15,18,16,22,21,13,17,23,19,14,12,20],
122
+ [12,13,21,20,18,19,14,15,22,17,23,16,1,0,4,5,8,10,6,7,2,3,11,9],
123
+ [13,12,20,21,14,15,18,19,16,23,17,22,0,1,6,7,11,9,4,5,3,2,8,10],
124
+ [14,19,15,18,22,16,23,17,20,21,12,13,8,9,2,0,6,4,1,3,10,11,7,5],
125
+ [15,18,14,19,17,23,16,22,12,13,20,21,10,11,0,2,5,7,3,1,8,9,4,6],
126
+ [16,23,22,17,12,21,20,13,19,14,15,18,5,6,8,11,3,0,10,9,7,4,1,2],
127
+ [17,22,23,16,21,12,13,20,14,19,18,15,4,7,9,10,0,3,11,8,6,5,2,1],
128
+ [18,15,19,14,16,22,17,23,21,20,13,12,11,10,3,1,4,6,0,2,9,8,5,7],
129
+ [19,14,18,15,23,17,22,16,13,12,21,20,9,8,1,3,7,5,2,0,11,10,6,4],
130
+ [20,21,13,12,19,18,15,14,17,22,16,23,3,2,7,6,10,8,5,4,0,1,9,11],
131
+ [21,20,12,13,15,14,19,18,23,16,22,17,2,3,5,4,9,11,7,6,1,0,10,8],
132
+ [22,17,16,23,13,20,21,12,15,18,19,14,7,4,11,8,2,1,9,10,5,6,0,3],
133
+ [23,16,17,22,20,13,12,21,18,15,14,19,6,5,10,9,1,2,8,11,4,7,3,0],
134
+ ], dtype=np.int8) #yapf: disable
135
+
136
+
137
+ @lru_cache()
138
+ def _one_qubit_clifford_index(gate):
139
+ pass
140
+
141
+
142
+ def one_qubit_clifford_index(gate):
143
+ if gate in one_qubit_clifford_seq_inv:
144
+ return one_qubit_clifford_seq_inv[gate]
145
+ else:
146
+ match gate:
147
+ case ('R', phi):
148
+ return one_qubit_clifford_index(
149
+ ('U', pi / 2, phi - pi / 2, pi / 2 - phi))
150
+ case ('rfUnitary', theta, phi):
151
+ return one_qubit_clifford_index(
152
+ ('U', theta, phi - pi / 2, pi / 2 - phi))
153
+ case ('u3', theta, phi, lam) | ('U', theta, phi, lam):
154
+ theta = np.mod(theta / (2 * pi))
155
+ if theta == np.pi / 2:
156
+ pass
157
+ elif theta == 0:
158
+ phi, lam = phi + lam, 0
159
+ elif theta == np.pi:
160
+ phi, lam = phi - lam, 0
161
+ elif theta == 3 * np.pi / 2:
162
+ theta = np.pi / 2
163
+ phi, lam = phi + pi, lam + pi
164
+ else:
165
+ return -1
166
+ phi = np.mod(phi, 2 * pi)
167
+ lam = np.mod(lam, 2 * pi)
168
+ case ('u2', phi, lam):
169
+ return one_qubit_clifford_index(('U', pi / 2, phi, lam))
170
+ case ('u1', lam) | ('Rz', lam) | ('P', lam):
171
+ return one_qubit_clifford_index(('U', 0, 0, lam))
172
+ case 'P':
173
+ return 16
174
+ case ('Rx', theta):
175
+ return one_qubit_clifford_index(('U', theta, -pi / 2, pi / 2))
176
+ case ('Ry', theta):
177
+ return one_qubit_clifford_index(('U', theta, 0, 0))
178
+ case _:
179
+ return -1
180
+
181
+
182
+ def twoQubitCliffordSequence(n):
183
+ """
184
+ 生成第 n 个群元对应的操作序列
185
+ """
186
+ S1 = [0, 8, 7] # I, Rot(2/3 pi, (1,1,1)), Rot(2/3 pi, (1,-1,-1))
187
+ if n < 576:
188
+ i, j = np.unravel_index(n, (24, 24))
189
+ return ((i, ), (j, ))
190
+ elif n < 5760:
191
+ n -= 576
192
+ i, j, k, l = np.unravel_index(n, (24, 24, 3, 3))
193
+ return ((i, 'CX', S1[k]), (j, 'CX', S1[l]))
194
+ elif n < 10944:
195
+ n -= 5760
196
+ i, j, k, l = np.unravel_index(n, (24, 24, 3, 3))
197
+ return ((i, 'iSWAP', S1[k]), (j, 'iSWAP', S1[l]))
198
+ else:
199
+ n -= 10944
200
+ i, j = np.unravel_index(n, (24, 24))
201
+ return ((i, 'SWAP'), (j, 'SWAP'))
202
+
203
+
204
+ @cache()
205
+ def _matricies():
206
+ one_qubit_clifford_matricies = [U(*g[1:]) for g in one_qubit_clifford_seq]
207
+ two_qubit_clifford_matricies = []
208
+ for n in range(11520):
209
+ seq = twoQubitCliffordSequence(n)
210
+ mat = np.eye(4, dtype=complex)
211
+ for a, b in zip(*seq):
212
+ if isinstance(a, str):
213
+ mat = {
214
+ 'CX':
215
+ np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1],
216
+ [0, 0, 1, 0]]),
217
+ 'iSWAP':
218
+ np.array([[1, 0, 0, 0], [0, 0, 1j, 0], [0, 1j, 0, 0],
219
+ [0, 0, 0, 1]]),
220
+ 'SWAP':
221
+ np.array([[1, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0],
222
+ [0, 0, 0, 1]])
223
+ }[a] @ mat
224
+ else:
225
+ mat = np.kron(one_qubit_clifford_matricies[a],
226
+ one_qubit_clifford_matricies[b]) @ mat
227
+
228
+ two_qubit_clifford_matricies.append(mat)
229
+ return one_qubit_clifford_matricies, two_qubit_clifford_matricies
230
+
231
+
232
+ one_qubit_clifford_matricies, two_qubit_clifford_matricies = _matricies()