mqt-core 3.1.0__tar.gz → 3.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mqt-core might be problematic. Click here for more details.

Files changed (289) hide show
  1. {mqt_core-3.1.0 → mqt_core-3.2.0}/.clang-format +1 -0
  2. {mqt_core-3.1.0 → mqt_core-3.2.0}/.clang-tidy +1 -0
  3. {mqt_core-3.1.0 → mqt_core-3.2.0}/.pre-commit-config.yaml +4 -4
  4. {mqt_core-3.1.0 → mqt_core-3.2.0}/CHANGELOG.md +28 -7
  5. {mqt_core-3.1.0 → mqt_core-3.2.0}/PKG-INFO +5 -4
  6. {mqt_core-3.1.0 → mqt_core-3.2.0}/README.md +3 -3
  7. {mqt_core-3.1.0 → mqt_core-3.2.0}/UPGRADING.md +16 -2
  8. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/dd/register_dd.cpp +0 -1
  9. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/dd/register_dd_package.cpp +5 -2
  10. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/dd/register_matrix_dds.cpp +3 -3
  11. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/dd/register_vector_dds.cpp +1 -1
  12. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/operations/register_classic_controlled_operation.cpp +5 -5
  13. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/operations/register_compound_operation.cpp +1 -1
  14. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/operations/register_control.cpp +7 -20
  15. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/operations/register_optype.cpp +4 -10
  16. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/register_quantum_computation.cpp +2 -1
  17. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/CompilerOptions.cmake +1 -1
  18. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/ExternalDependencies.cmake +1 -1
  19. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +4 -4
  20. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/datastructures/DirectedGraph.hpp +7 -7
  21. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/datastructures/UndirectedGraph.hpp +8 -8
  22. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/Node.hpp +1 -1
  23. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/Package.hpp +3 -3
  24. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/operations/Expression.hpp +1 -1
  25. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/CMakeLists.txt +6 -1
  26. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/CMakeLists.txt +1 -0
  27. mqt_core-3.2.0/mlir/include/mlir/Conversion/CMakeLists.txt +10 -0
  28. mqt_core-3.2.0/mlir/include/mlir/Conversion/MQTDynToMQTOpt/CMakeLists.txt +13 -0
  29. mqt_core-3.2.0/mlir/include/mlir/Conversion/MQTDynToMQTOpt/MQTDynToMQTOpt.h +23 -0
  30. mqt_core-3.2.0/mlir/include/mlir/Conversion/MQTDynToMQTOpt/MQTDynToMQTOpt.td +28 -0
  31. mqt_core-3.2.0/mlir/include/mlir/Conversion/MQTOptToMQTDyn/CMakeLists.txt +13 -0
  32. mqt_core-3.2.0/mlir/include/mlir/Conversion/MQTOptToMQTDyn/MQTOptToMQTDyn.h +23 -0
  33. mqt_core-3.2.0/mlir/include/mlir/Conversion/MQTOptToMQTDyn/MQTOptToMQTDyn.td +28 -0
  34. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptDialect.h +13 -0
  35. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptOps.td +2 -2
  36. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/tools/quantum-opt/CMakeLists.txt +3 -1
  37. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/tools/quantum-opt/quantum-opt.cpp +8 -4
  38. {mqt_core-3.1.0 → mqt_core-3.2.0}/noxfile.py +2 -0
  39. {mqt_core-3.1.0 → mqt_core-3.2.0}/pyproject.toml +7 -3
  40. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/_version.py +2 -2
  41. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/dd.pyi +9 -22
  42. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/ir/operations.pyi +58 -86
  43. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/algorithms/BernsteinVazirani.cpp +2 -2
  44. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/algorithms/Grover.cpp +4 -3
  45. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/circuit_optimizer/CircuitOptimizer.cpp +15 -18
  46. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/Approximation.cpp +5 -3
  47. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/ComplexNumbers.cpp +5 -4
  48. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/ComplexValue.cpp +2 -3
  49. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/Edge.cpp +1 -1
  50. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/Export.cpp +4 -4
  51. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/NoiseFunctionality.cpp +3 -3
  52. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/Package.cpp +20 -20
  53. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/Simulation.cpp +1 -2
  54. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/StateGeneration.cpp +13 -12
  55. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/UniqueTable.cpp +3 -4
  56. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/CMakeLists.txt +1 -1
  57. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/Permutation.cpp +2 -2
  58. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/QuantumComputation.cpp +37 -37
  59. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/operations/AodOperation.cpp +1 -1
  60. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/operations/CompoundOperation.cpp +23 -25
  61. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/operations/NonUnitaryOperation.cpp +2 -3
  62. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/operations/Operation.cpp +2 -4
  63. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/operations/StandardOperation.cpp +5 -6
  64. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/operations/SymbolicOperation.cpp +4 -5
  65. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/na/NAComputation.cpp +8 -11
  66. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/qasm3/Importer.cpp +10 -11
  67. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/qasm3/Scanner.cpp +4 -6
  68. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/zx/FunctionalityConstruction.cpp +8 -9
  69. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/zx/Rules.cpp +12 -12
  70. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/zx/ZXDiagram.cpp +21 -19
  71. {mqt_core-3.1.0 → mqt_core-3.2.0}/uv.lock +506 -346
  72. {mqt_core-3.1.0 → mqt_core-3.2.0}/.cmake-format.yaml +0 -0
  73. {mqt_core-3.1.0 → mqt_core-3.2.0}/.editorconfig +0 -0
  74. {mqt_core-3.1.0 → mqt_core-3.2.0}/.git_archival.txt +0 -0
  75. {mqt_core-3.1.0 → mqt_core-3.2.0}/.gitattributes +0 -0
  76. {mqt_core-3.1.0 → mqt_core-3.2.0}/.gitignore +0 -0
  77. {mqt_core-3.1.0 → mqt_core-3.2.0}/.license-tools-config.json +0 -0
  78. {mqt_core-3.1.0 → mqt_core-3.2.0}/.python_version +0 -0
  79. {mqt_core-3.1.0 → mqt_core-3.2.0}/.readthedocs.yaml +0 -0
  80. {mqt_core-3.1.0 → mqt_core-3.2.0}/CITATION.cff +0 -0
  81. {mqt_core-3.1.0 → mqt_core-3.2.0}/CMakeLists.txt +0 -0
  82. {mqt_core-3.1.0 → mqt_core-3.2.0}/LICENSE.md +0 -0
  83. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/CMakeLists.txt +0 -0
  84. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/dd/CMakeLists.txt +0 -0
  85. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/CMakeLists.txt +0 -0
  86. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/operations/register_non_unitary_operation.cpp +0 -0
  87. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/operations/register_operation.cpp +0 -0
  88. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/operations/register_standard_operation.cpp +0 -0
  89. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/operations/register_symbolic_operation.cpp +0 -0
  90. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/register_ir.cpp +0 -0
  91. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/register_operations.cpp +0 -0
  92. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/register_permutation.cpp +0 -0
  93. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/register_registers.cpp +0 -0
  94. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/register_symbolic.cpp +0 -0
  95. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/symbolic/register_expression.cpp +0 -0
  96. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/symbolic/register_term.cpp +0 -0
  97. {mqt_core-3.1.0 → mqt_core-3.2.0}/bindings/ir/symbolic/register_variable.cpp +0 -0
  98. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/AddMQTCoreLibrary.cmake +0 -0
  99. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/AddMQTPythonBinding.cmake +0 -0
  100. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/Cache.cmake +0 -0
  101. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/CompilerWarnings.cmake +0 -0
  102. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/FindGMP.cmake +0 -0
  103. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/GetVersion.cmake +0 -0
  104. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/PackageAddTest.cmake +0 -0
  105. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/PreventInSourceBuilds.cmake +0 -0
  106. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/Sanitizers.cmake +0 -0
  107. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/SetupMLIR.cmake +0 -0
  108. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/StandardProjectSettings.cmake +0 -0
  109. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/cmake_uninstall.cmake.in +0 -0
  110. {mqt_core-3.1.0 → mqt_core-3.2.0}/cmake/mqt-core-config.cmake.in +0 -0
  111. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/algorithms/BernsteinVazirani.hpp +0 -0
  112. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/algorithms/GHZState.hpp +0 -0
  113. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/algorithms/Grover.hpp +0 -0
  114. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/algorithms/QFT.hpp +0 -0
  115. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/algorithms/QPE.hpp +0 -0
  116. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +0 -0
  117. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/algorithms/StatePreparation.hpp +0 -0
  118. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/algorithms/WState.hpp +0 -0
  119. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +0 -0
  120. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/datastructures/DisjointSet.hpp +0 -0
  121. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/datastructures/Layer.hpp +0 -0
  122. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/datastructures/SymmetricMatrix.hpp +0 -0
  123. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/Approximation.hpp +0 -0
  124. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/CachedEdge.hpp +0 -0
  125. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/Complex.hpp +0 -0
  126. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/ComplexNumbers.hpp +0 -0
  127. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/ComplexValue.hpp +0 -0
  128. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/ComputeTable.hpp +0 -0
  129. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/DDDefinitions.hpp +0 -0
  130. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/DDpackageConfig.hpp +0 -0
  131. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/DensityNoiseTable.hpp +0 -0
  132. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/Edge.hpp +0 -0
  133. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/Export.hpp +0 -0
  134. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/FunctionalityConstruction.hpp +0 -0
  135. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/GateMatrixDefinitions.hpp +0 -0
  136. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/LinkedListBase.hpp +0 -0
  137. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/MemoryManager.hpp +0 -0
  138. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/NoiseFunctionality.hpp +0 -0
  139. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/Operations.hpp +0 -0
  140. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/Package_fwd.hpp +0 -0
  141. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/RealNumber.hpp +0 -0
  142. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/RealNumberUniqueTable.hpp +0 -0
  143. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/Simulation.hpp +0 -0
  144. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/StateGeneration.hpp +0 -0
  145. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +0 -0
  146. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/UnaryComputeTable.hpp +0 -0
  147. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/UniqueTable.hpp +0 -0
  148. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +0 -0
  149. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/statistics/PackageStatistics.hpp +0 -0
  150. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/statistics/Statistics.hpp +0 -0
  151. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/statistics/TableStatistics.hpp +0 -0
  152. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +0 -0
  153. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/Definitions.hpp +0 -0
  154. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/Permutation.hpp +0 -0
  155. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/QuantumComputation.hpp +0 -0
  156. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/Register.hpp +0 -0
  157. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/operations/AodOperation.hpp +0 -0
  158. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/operations/ClassicControlledOperation.hpp +0 -0
  159. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/operations/CompoundOperation.hpp +0 -0
  160. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/operations/Control.hpp +0 -0
  161. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +0 -0
  162. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/operations/OpType.hpp +0 -0
  163. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/operations/OpType.inc +0 -0
  164. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/operations/Operation.hpp +0 -0
  165. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/operations/StandardOperation.hpp +0 -0
  166. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/ir/operations/SymbolicOperation.hpp +0 -0
  167. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/NAComputation.hpp +0 -0
  168. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/entities/Atom.hpp +0 -0
  169. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/entities/Location.hpp +0 -0
  170. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/entities/Zone.hpp +0 -0
  171. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/operations/GlobalCZOp.hpp +0 -0
  172. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/operations/GlobalOp.hpp +0 -0
  173. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/operations/GlobalRYOp.hpp +0 -0
  174. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/operations/LoadOp.hpp +0 -0
  175. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/operations/LocalOp.hpp +0 -0
  176. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/operations/LocalRZOp.hpp +0 -0
  177. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/operations/LocalUOp.hpp +0 -0
  178. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/operations/MoveOp.hpp +0 -0
  179. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/operations/Op.hpp +0 -0
  180. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/operations/ShuttlingOp.hpp +0 -0
  181. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/na/operations/StoreOp.hpp +0 -0
  182. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/Exception.hpp +0 -0
  183. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/Gate.hpp +0 -0
  184. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/Importer.hpp +0 -0
  185. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/InstVisitor.hpp +0 -0
  186. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/NestedEnvironment.hpp +0 -0
  187. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/Parser.hpp +0 -0
  188. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/Scanner.hpp +0 -0
  189. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/Statement.hpp +0 -0
  190. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/Statement_fwd.hpp +0 -0
  191. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/StdGates.hpp +0 -0
  192. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/Token.hpp +0 -0
  193. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/Types.hpp +0 -0
  194. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/Types_fwd.hpp +0 -0
  195. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/passes/CompilerPass.hpp +0 -0
  196. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +0 -0
  197. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +0 -0
  198. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/zx/FunctionalityConstruction.hpp +0 -0
  199. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/zx/Rational.hpp +0 -0
  200. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/zx/Rules.hpp +0 -0
  201. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/zx/Simplify.hpp +0 -0
  202. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/zx/Utils.hpp +0 -0
  203. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/zx/ZXDefinitions.hpp +0 -0
  204. {mqt_core-3.1.0 → mqt_core-3.2.0}/include/mqt-core/zx/ZXDiagram.hpp +0 -0
  205. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/.gitignore +0 -0
  206. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/CMakeLists.txt +0 -0
  207. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/CMakeLists.txt +0 -0
  208. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/Common/Compat.h +0 -0
  209. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h +0 -0
  210. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td +0 -0
  211. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc +0 -0
  212. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTDyn/CMakeLists.txt +0 -0
  213. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTDyn/IR/CMakeLists.txt +0 -0
  214. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTDyn/IR/MQTDynDialect.h +0 -0
  215. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTDyn/IR/MQTDynInterfaces.td +0 -0
  216. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTDyn/IR/MQTDynOps.td +0 -0
  217. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTDyn/Transforms/CMakeLists.txt +0 -0
  218. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTDyn/Transforms/Passes.h +0 -0
  219. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTDyn/Transforms/Passes.td +0 -0
  220. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTOpt/CMakeLists.txt +0 -0
  221. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTOpt/IR/CMakeLists.txt +0 -0
  222. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptInterfaces.td +0 -0
  223. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTOpt/Transforms/CMakeLists.txt +0 -0
  224. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTOpt/Transforms/Passes.h +0 -0
  225. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/include/mlir/Dialect/MQTOpt/Transforms/Passes.td +0 -0
  226. {mqt_core-3.1.0 → mqt_core-3.2.0}/mlir/tools/CMakeLists.txt +0 -0
  227. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/__init__.py +0 -0
  228. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/__main__.py +0 -0
  229. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/_commands.py +0 -0
  230. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/_compat/__init__.py +0 -0
  231. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/_compat/typing.py +0 -0
  232. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/_version.pyi +0 -0
  233. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/dd_evaluation.py +0 -0
  234. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/ir/__init__.pyi +0 -0
  235. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/ir/registers.pyi +0 -0
  236. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/ir/symbolic.pyi +0 -0
  237. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/plugins/__init__.py +0 -0
  238. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/plugins/qiskit/__init__.py +0 -0
  239. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/plugins/qiskit/mqt_to_qiskit.py +0 -0
  240. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/plugins/qiskit/qiskit_to_mqt.py +0 -0
  241. {mqt_core-3.1.0 → mqt_core-3.2.0}/python/mqt/core/py.typed +0 -0
  242. {mqt_core-3.1.0 → mqt_core-3.2.0}/sitecustomize.py +0 -0
  243. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/CMakeLists.txt +0 -0
  244. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/algorithms/CMakeLists.txt +0 -0
  245. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/algorithms/GHZState.cpp +0 -0
  246. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/algorithms/QFT.cpp +0 -0
  247. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/algorithms/QPE.cpp +0 -0
  248. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/algorithms/RandomCliffordCircuit.cpp +0 -0
  249. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/algorithms/StatePreparation.cpp +0 -0
  250. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/algorithms/WState.cpp +0 -0
  251. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/circuit_optimizer/CMakeLists.txt +0 -0
  252. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/datastructures/CMakeLists.txt +0 -0
  253. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/datastructures/Layer.cpp +0 -0
  254. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/CMakeLists.txt +0 -0
  255. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/CachedEdge.cpp +0 -0
  256. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/Complex.cpp +0 -0
  257. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/FunctionalityConstruction.cpp +0 -0
  258. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/GateMatrixDefinitions.cpp +0 -0
  259. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/MemoryManager.cpp +0 -0
  260. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/Node.cpp +0 -0
  261. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/Operations.cpp +0 -0
  262. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/RealNumber.cpp +0 -0
  263. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/RealNumberUniqueTable.cpp +0 -0
  264. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/statistics/MemoryManagerStatistics.cpp +0 -0
  265. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/statistics/PackageStatistics.cpp +0 -0
  266. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/statistics/Statistics.cpp +0 -0
  267. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/statistics/TableStatistics.cpp +0 -0
  268. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/dd/statistics/UniqueTableStatistics.cpp +0 -0
  269. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/operations/ClassicControlledOperation.cpp +0 -0
  270. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/operations/Expression.cpp +0 -0
  271. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/ir/operations/OpType.cpp +0 -0
  272. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/na/CMakeLists.txt +0 -0
  273. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/na/entities/Zone.cpp +0 -0
  274. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/na/operations/GlobalOp.cpp +0 -0
  275. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/na/operations/LoadOp.cpp +0 -0
  276. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/na/operations/LocalOp.cpp +0 -0
  277. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/na/operations/MoveOp.cpp +0 -0
  278. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/na/operations/StoreOp.cpp +0 -0
  279. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/qasm3/CMakeLists.txt +0 -0
  280. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/qasm3/Parser.cpp +0 -0
  281. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/qasm3/Statement.cpp +0 -0
  282. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/qasm3/Token.cpp +0 -0
  283. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/qasm3/Types.cpp +0 -0
  284. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/qasm3/passes/ConstEvalPass.cpp +0 -0
  285. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/qasm3/passes/TypeCheckPass.cpp +0 -0
  286. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/zx/CMakeLists.txt +0 -0
  287. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/zx/Rational.cpp +0 -0
  288. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/zx/Simplify.cpp +0 -0
  289. {mqt_core-3.1.0 → mqt_core-3.2.0}/src/zx/Utils.cpp +0 -0
@@ -1,3 +1,4 @@
1
1
  BasedOnStyle: LLVM
2
2
  IncludeBlocks: Regroup
3
3
  PointerAlignment: Left
4
+ Standard: c++20
@@ -3,6 +3,7 @@ FormatStyle: file
3
3
  Checks: |
4
4
  bugprone-*,
5
5
  -bugprone-easily-swappable-parameters,
6
+ -bugprone-unchecked-optional-access,
6
7
  clang-analyzer-*,
7
8
  -clang-analyzer-core.NullDereference,
8
9
  clang-diagnostic-*,
@@ -51,7 +51,7 @@ repos:
51
51
 
52
52
  # Handling unwanted unicode characters
53
53
  - repo: https://github.com/sirosen/texthooks
54
- rev: 0.6.8
54
+ rev: 0.7.1
55
55
  hooks:
56
56
  - id: fix-ligatures
57
57
  - id: fix-smartquotes
@@ -66,7 +66,7 @@ repos:
66
66
 
67
67
  # Python linting using ruff
68
68
  - repo: https://github.com/astral-sh/ruff-pre-commit
69
- rev: v0.12.2
69
+ rev: v0.12.5
70
70
  hooks:
71
71
  - id: ruff
72
72
  args: ["--fix", "--show-fixes"]
@@ -74,7 +74,7 @@ repos:
74
74
 
75
75
  # Static type checking using mypy
76
76
  - repo: https://github.com/pre-commit/mirrors-mypy
77
- rev: v1.16.1
77
+ rev: v1.17.0
78
78
  hooks:
79
79
  - id: mypy
80
80
  files: ^(python/mqt|test/python|noxfile.py)
@@ -99,7 +99,7 @@ repos:
99
99
 
100
100
  # Clang-format the C++ part of the code base automatically
101
101
  - repo: https://github.com/pre-commit/mirrors-clang-format
102
- rev: v20.1.7
102
+ rev: v20.1.8
103
103
  hooks:
104
104
  - id: clang-format
105
105
  types_or: [c++, c, cuda]
@@ -9,7 +9,19 @@ This project adheres to [Semantic Versioning], with the exception that minor rel
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
- ## [3.1.0]
12
+ ## [3.2.0] - 2025-07-31
13
+
14
+ ### Added
15
+
16
+ - 🐍 Build Python 3.14 wheels ([#1076]) ([**@denialhaag**])
17
+ - ✨ Add MQT-internal MLIR dialect conversions ([#1001]) ([**@li-mingbao**])
18
+
19
+ ### Changed
20
+
21
+ - ✨ Expose enums to Python via `pybind11`'s new (`enum.Enum`-compatible) `py::native_enum` ([#1075]) ([**@denialhaag**])
22
+ - ⬆️ Require C++20 ([#897]) ([**@burgholzer**], [**@denialhaag**])
23
+
24
+ ## [3.1.0] - 2025-07-11
13
25
 
14
26
  _If you are upgrading: please see [`UPGRADING.md`](UPGRADING.md#310)._
15
27
 
@@ -28,10 +40,11 @@ _If you are upgrading: please see [`UPGRADING.md`](UPGRADING.md#310)._
28
40
  - 🐛 Add missing support for `sxdg` gates in Qiskit circuit import ([#930]) ([**@burgholzer**])
29
41
  - 🐛 Fix bug related to initialization of operations with duplicate operands ([#964]) ([**@ystade**])
30
42
  - 🐛 Open issue for Qiskit upstream test only when the test is actually failing not when it was cancelled ([#973]) ([**@ystade**])
43
+ - 🐛 Fix parsing of `GPhase` in the `MQTOpt` MLIR dialect ([#1042]) ([**@ystade**], [**@DRovara**])
31
44
 
32
45
  ### Changed
33
46
 
34
- - ⬆️ Bump shared library ABI version from `3.0` to `3.1`.
47
+ - ⬆️ Bump shared library ABI version from `3.0` to `3.1` ([#1047]) ([**@denialhaag**])
35
48
  - ♻️ Switch from reference counting to mark-and-sweep garbage collection in decision diagram package ([#1020]) ([**@MatthiasReumann**], [**burgholzer**], [**q-inho**])
36
49
  - ♻️ Move the C++ code for the Python bindings to the top-level `bindings` directory ([#982]) ([**@denialhaag**])
37
50
  - ♻️ Move all Python code (no tests) to the top-level `python` directory ([#982]) ([**@denialhaag**])
@@ -116,17 +129,23 @@ _📚 Refer to the [GitHub Release Notes](https://github.com/munich-quantum-tool
116
129
 
117
130
  <!-- Version links -->
118
131
 
119
- [unreleased]: https://github.com/munich-quantum-toolkit/core/compare/v3.1.0...HEAD
120
- [3.1.0]: https://github.com/munich-quantum-toolkit/core/compare/v3.0.2...v3.1.0
121
- [3.0.2]: https://github.com/munich-quantum-toolkit/core/compare/v3.0.1...v3.0.2
122
- [3.0.1]: https://github.com/munich-quantum-toolkit/core/compare/v3.0.0...v3.0.1
123
- [3.0.0]: https://github.com/munich-quantum-toolkit/core/compare/v2.7.0...v3.0.0
132
+ [unreleased]: https://github.com/munich-quantum-toolkit/core/compare/v3.2.0...HEAD
133
+ [3.2.0]: https://github.com/munich-quantum-toolkit/core/releases/tag/v3.2.0
134
+ [3.1.0]: https://github.com/munich-quantum-toolkit/core/releases/tag/v3.1.0
135
+ [3.0.2]: https://github.com/munich-quantum-toolkit/core/releases/tag/v3.0.2
136
+ [3.0.1]: https://github.com/munich-quantum-toolkit/core/releases/tag/v3.0.1
137
+ [3.0.0]: https://github.com/munich-quantum-toolkit/core/releases/tag/v3.0.0
124
138
  [2.7.0]: https://github.com/munich-quantum-toolkit/core/releases/tag/v2.7.0
125
139
 
126
140
  <!-- PR links -->
127
141
 
142
+ [#1075]: https://github.com/munich-quantum-toolkit/core/pull/1076
143
+ [#1075]: https://github.com/munich-quantum-toolkit/core/pull/1075
144
+ [#1047]: https://github.com/munich-quantum-toolkit/core/pull/1047
145
+ [#1042]: https://github.com/munich-quantum-toolkit/core/pull/1042
128
146
  [#1020]: https://github.com/munich-quantum-toolkit/core/pull/1020
129
147
  [#1019]: https://github.com/munich-quantum-toolkit/core/pull/1019
148
+ [#1001]: https://github.com/munich-quantum-toolkit/core/pull/1001
130
149
  [#984]: https://github.com/munich-quantum-toolkit/core/pull/984
131
150
  [#982]: https://github.com/munich-quantum-toolkit/core/pull/982
132
151
  [#975]: https://github.com/munich-quantum-toolkit/core/pull/975
@@ -145,6 +164,7 @@ _📚 Refer to the [GitHub Release Notes](https://github.com/munich-quantum-tool
145
164
  [#911]: https://github.com/munich-quantum-toolkit/core/pull/911
146
165
  [#908]: https://github.com/munich-quantum-toolkit/core/pull/908
147
166
  [#900]: https://github.com/munich-quantum-toolkit/core/pull/900
167
+ [#897]: https://github.com/munich-quantum-toolkit/core/pull/897
148
168
  [#895]: https://github.com/munich-quantum-toolkit/core/pull/895
149
169
  [#893]: https://github.com/munich-quantum-toolkit/core/pull/893
150
170
  [#892]: https://github.com/munich-quantum-toolkit/core/pull/892
@@ -195,6 +215,7 @@ _📚 Refer to the [GitHub Release Notes](https://github.com/munich-quantum-tool
195
215
  [**@MatthiasReumann**]: https://github.com/MatthiasReumann
196
216
  [**@denialhaag**]: https://github.com/denialhaag
197
217
  [**q-inho**]: https://github.com/q-inho
218
+ [**@li-mingbao**]: https://github.com/li-mingbao
198
219
 
199
220
  <!-- General links -->
200
221
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mqt-core
3
- Version: 3.1.0
3
+ Version: 3.2.0
4
4
  Summary: The Backbone of the Munich Quantum Toolkit
5
5
  Keywords: MQT,quantum-computing,design-automation,decision-diagrams,zx-calculus
6
6
  Author-Email: Lukas Burgholzer <burgholzer@me.com>
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.10
20
20
  Classifier: Programming Language :: Python :: 3.11
21
21
  Classifier: Programming Language :: Python :: 3.12
22
22
  Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: 3.14
23
24
  Classifier: Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
24
25
  Classifier: Typing :: Typed
25
26
  Project-URL: Homepage, https://github.com/munich-quantum-toolkit/core
@@ -55,7 +56,7 @@ Description-Content-Type: text/markdown
55
56
 
56
57
  # MQT Core - The Backbone of the Munich Quantum Toolkit (MQT)
57
58
 
58
- MQT Core is an open-source C++17 and Python library for quantum computing that forms the backbone of the quantum software tools developed as part of the [_Munich Quantum Toolkit (MQT)_](https://mqt.readthedocs.io).
59
+ MQT Core is an open-source C++20 and Python library for quantum computing that forms the backbone of the quantum software tools developed as part of the [_Munich Quantum Toolkit (MQT)_](https://mqt.readthedocs.io).
59
60
 
60
61
  <p align="center">
61
62
  <a href="https://mqt.readthedocs.io/projects/core">
@@ -93,7 +94,7 @@ Thank you to all the contributors who have helped make MQT Core a reality!
93
94
 
94
95
  ## Getting Started
95
96
 
96
- `mqt.core` is available via [PyPI](https://pypi.org/project/mqt.core/) for all major operating systems and supports Python 3.9 to 3.13.
97
+ `mqt.core` is available via [PyPI](https://pypi.org/project/mqt.core/) for all major operating systems and supports Python 3.9 to 3.14.
97
98
 
98
99
  ```console
99
100
  (.venv) $ pip install mqt.core
@@ -117,7 +118,7 @@ print(qc)
117
118
  ## System Requirements
118
119
 
119
120
  Building (and running) is continuously tested under Linux, MacOS, and Windows using the [latest available system versions for GitHub Actions](https://github.com/actions/runner-images).
120
- However, the implementation should be compatible with any current C++ compiler supporting C++17 and a minimum CMake version of 3.24.
121
+ However, the implementation should be compatible with any current C++ compiler supporting C++20 and a minimum CMake version of 3.24.
121
122
 
122
123
  MQT Core relies on some external dependencies:
123
124
 
@@ -18,7 +18,7 @@
18
18
 
19
19
  # MQT Core - The Backbone of the Munich Quantum Toolkit (MQT)
20
20
 
21
- MQT Core is an open-source C++17 and Python library for quantum computing that forms the backbone of the quantum software tools developed as part of the [_Munich Quantum Toolkit (MQT)_](https://mqt.readthedocs.io).
21
+ MQT Core is an open-source C++20 and Python library for quantum computing that forms the backbone of the quantum software tools developed as part of the [_Munich Quantum Toolkit (MQT)_](https://mqt.readthedocs.io).
22
22
 
23
23
  <p align="center">
24
24
  <a href="https://mqt.readthedocs.io/projects/core">
@@ -56,7 +56,7 @@ Thank you to all the contributors who have helped make MQT Core a reality!
56
56
 
57
57
  ## Getting Started
58
58
 
59
- `mqt.core` is available via [PyPI](https://pypi.org/project/mqt.core/) for all major operating systems and supports Python 3.9 to 3.13.
59
+ `mqt.core` is available via [PyPI](https://pypi.org/project/mqt.core/) for all major operating systems and supports Python 3.9 to 3.14.
60
60
 
61
61
  ```console
62
62
  (.venv) $ pip install mqt.core
@@ -80,7 +80,7 @@ print(qc)
80
80
  ## System Requirements
81
81
 
82
82
  Building (and running) is continuously tested under Linux, MacOS, and Windows using the [latest available system versions for GitHub Actions](https://github.com/actions/runner-images).
83
- However, the implementation should be compatible with any current C++ compiler supporting C++17 and a minimum CMake version of 3.24.
83
+ However, the implementation should be compatible with any current C++ compiler supporting C++20 and a minimum CMake version of 3.24.
84
84
 
85
85
  MQT Core relies on some external dependencies:
86
86
 
@@ -4,10 +4,23 @@ This document describes breaking changes and how to upgrade. For a complete list
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [3.2.0]
8
+
9
+ The shared library ABI version (`SOVERSION`) is increased from `3.1` to `3.2`.
10
+ Thus, consuming libraries need to update their wheel repair configuration for `cibuildwheel` to ensure the `mqt-core` libraries are properly skipped in the wheel repair step.
11
+
12
+ With this release, the minimum required C++ version has been raised from C++17 to C++20.
13
+ The default compilers of our test systems support all relevant features of the standard.
14
+ Some frameworks we plan to integrate with even require C++20 by now.
15
+
16
+ The `dd.BasisStates`, `ir.operations.ComparisonKind`, `ir.operations.Control.Type`, and `ir.operations.OpType` enums are now exposed via `pybind11`'s new `py::native_enum`, which makes them compatible with Python's `enum.Enum` class (PEP 435).
17
+ As a result, the enums can no longer be initialized using a string.
18
+ Instead of `OpType("x")`, use `OpType.x`.
19
+
7
20
  ## [3.1.0]
8
21
 
9
22
  The shared library ABI version (`SOVERSION`) is increased from `3.0` to `3.1`.
10
- Thus, consuming libraries need to update their wheel repair configuration for cibuildwheel to ensure the mqt-core libraries are properly skipped in the wheel repair step.
23
+ Thus, consuming libraries need to update their wheel repair configuration for `cibuildwheel` to ensure the `mqt-core` libraries are properly skipped in the wheel repair step.
11
24
 
12
25
  Even tough this is not a breaking change, it is worth mentioning to developers of MQT Core that all Python code (except tests) has been moved to the top-level `python` directory.
13
26
  Furthermore, the C++ code for the Python bindings has been moved to the top-level `bindings` directory.
@@ -70,7 +83,8 @@ It also requires the `uv` library version 0.5.20 or higher.
70
83
 
71
84
  <!-- Version links -->
72
85
 
73
- [unreleased]: https://github.com/munich-quantum-toolkit/core/compare/v3.1.0...HEAD
86
+ [unreleased]: https://github.com/munich-quantum-toolkit/core/compare/v3.2.0...HEAD
87
+ [3.2.0]: https://github.com/munich-quantum-toolkit/core/compare/v3.1.0...v3.2.0
74
88
  [3.1.0]: https://github.com/munich-quantum-toolkit/core/compare/v3.0.0...v3.1.0
75
89
  [3.0.0]: https://github.com/munich-quantum-toolkit/core/compare/v2.7.0...v3.0.0
76
90
 
@@ -22,7 +22,6 @@
22
22
  #include <pybind11/stl.h> // NOLINT(misc-include-cleaner)
23
23
 
24
24
  #include <pybind11/cast.h>
25
- #include <pybind11/numpy.h>
26
25
  // clang-format on
27
26
 
28
27
  #include <complex>
@@ -27,6 +27,7 @@
27
27
 
28
28
  #include <pybind11/attr.h>
29
29
  #include <pybind11/cast.h>
30
+ #include <pybind11/native_enum.h>
30
31
  #include <pybind11/numpy.h>
31
32
  // clang-format on
32
33
 
@@ -131,13 +132,15 @@ void registerDDPackage(const py::module& mod) {
131
132
  // keep the DD package alive while the returned vector DD is alive.
132
133
  py::keep_alive<0, 1>());
133
134
 
134
- py::enum_<dd::BasisStates>(mod, "BasisStates")
135
+ py::native_enum<dd::BasisStates>(mod, "BasisStates", "enum.Enum",
136
+ "Enumeration of basis states.")
135
137
  .value("zero", dd::BasisStates::zero)
136
138
  .value("one", dd::BasisStates::one)
137
139
  .value("plus", dd::BasisStates::plus)
138
140
  .value("minus", dd::BasisStates::minus)
139
141
  .value("right", dd::BasisStates::right)
140
- .value("left", dd::BasisStates::left);
142
+ .value("left", dd::BasisStates::left)
143
+ .finalize();
141
144
 
142
145
  dd.def(
143
146
  "basis_state",
@@ -20,7 +20,7 @@
20
20
 
21
21
  #include <pybind11/buffer_info.h>
22
22
  #include <pybind11/cast.h>
23
- #include <pybind11/numpy.h>
23
+ #include <pybind11/numpy.h> // NOLINT(misc-include-cleaner)
24
24
  // clang-format on
25
25
 
26
26
  #include <cmath>
@@ -44,7 +44,7 @@ struct Matrix {
44
44
  Matrix getMatrix(const dd::mEdge& m, const size_t numQubits,
45
45
  const dd::fp threshold = 0.) {
46
46
  if (numQubits == 0U) {
47
- return Matrix{{static_cast<std::complex<dd::fp>>(m.w)}, 1};
47
+ return Matrix{.data = {static_cast<std::complex<dd::fp>>(m.w)}, .n = 1};
48
48
  }
49
49
  const size_t dim = 1ULL << numQubits;
50
50
  auto data = std::vector<std::complex<dd::fp>>(dim * dim);
@@ -53,7 +53,7 @@ Matrix getMatrix(const dd::mEdge& m, const size_t numQubits,
53
53
  [&data, dim](const std::size_t i, const std::size_t j,
54
54
  const std::complex<dd::fp>& c) { data[(i * dim) + j] = c; },
55
55
  numQubits, threshold);
56
- return Matrix{data, dim};
56
+ return Matrix{.data = data, .n = dim};
57
57
  }
58
58
 
59
59
  // NOLINTNEXTLINE(misc-use-internal-linkage)
@@ -20,7 +20,7 @@
20
20
 
21
21
  #include <pybind11/buffer_info.h>
22
22
  #include <pybind11/cast.h>
23
- #include <pybind11/numpy.h>
23
+ #include <pybind11/numpy.h> // NOLINT(misc-include-cleaner)
24
24
  // clang-format on
25
25
 
26
26
  #include <cmath>
@@ -19,6 +19,7 @@
19
19
  #include <pybind11/stl.h> // NOLINT(misc-include-cleaner)
20
20
 
21
21
  #include <pybind11/cast.h>
22
+ #include <pybind11/native_enum.h>
22
23
  // clang-format on
23
24
 
24
25
  #include <cstdint>
@@ -32,7 +33,9 @@ using namespace pybind11::literals;
32
33
 
33
34
  // NOLINTNEXTLINE(misc-use-internal-linkage)
34
35
  void registerClassicControlledOperation(const py::module& m) {
35
- py::enum_<qc::ComparisonKind>(m, "ComparisonKind")
36
+ py::native_enum<qc::ComparisonKind>(
37
+ m, "ComparisonKind", "enum.Enum",
38
+ "Enumeration of comparison types for classic-controlled operations.")
36
39
  .value("eq", qc::ComparisonKind::Eq)
37
40
  .value("neq", qc::ComparisonKind::Neq)
38
41
  .value("lt", qc::ComparisonKind::Lt)
@@ -40,10 +43,7 @@ void registerClassicControlledOperation(const py::module& m) {
40
43
  .value("gt", qc::ComparisonKind::Gt)
41
44
  .value("geq", qc::ComparisonKind::Geq)
42
45
  .export_values()
43
- .def("__str__",
44
- [](const qc::ComparisonKind& cmp) { return qc::toString(cmp); })
45
- .def("__repr__",
46
- [](const qc::ComparisonKind& cmp) { return qc::toString(cmp); });
46
+ .finalize();
47
47
 
48
48
  auto ccop = py::class_<qc::ClassicControlledOperation, qc::Operation>(
49
49
  m, "ClassicControlledOperation");
@@ -42,7 +42,7 @@ void registerCompoundOperation(const py::module& m) {
42
42
  if (i < 0) {
43
43
  i += static_cast<DiffType>(size);
44
44
  }
45
- if (i < 0 || static_cast<SizeType>(i) >= size) {
45
+ if (i < 0 || std::cmp_greater_equal(i, size)) {
46
46
  throw py::index_error();
47
47
  }
48
48
  return i;
@@ -17,6 +17,7 @@
17
17
  #include <pybind11/stl.h> // NOLINT(misc-include-cleaner)
18
18
 
19
19
  #include <pybind11/cast.h>
20
+ #include <pybind11/native_enum.h>
20
21
  #include <pybind11/operators.h>
21
22
  #include <pybind11/pytypes.h>
22
23
  // clang-format on
@@ -30,26 +31,12 @@ using namespace pybind11::literals;
30
31
  void registerControl(const py::module& m) {
31
32
 
32
33
  auto control = py::class_<qc::Control>(m, "Control");
33
- auto controlType = py::enum_<qc::Control::Type>(control, "Type");
34
- controlType.value("Pos", qc::Control::Type::Pos);
35
- controlType.value("Neg", qc::Control::Type::Neg);
36
- controlType.def(
37
- "__str__",
38
- [](const qc::Control::Type& type) {
39
- return type == qc::Control::Type::Pos ? "Pos" : "Neg";
40
- },
41
- py::prepend());
42
- controlType.def(
43
- "__repr__",
44
- [](const qc::Control::Type& type) {
45
- return type == qc::Control::Type::Pos ? "Pos" : "Neg";
46
- },
47
- py::prepend());
48
- controlType.def("__bool__", [](const qc::Control::Type& type) {
49
- return type == qc::Control::Type::Pos;
50
- });
51
- py::implicitly_convertible<py::bool_, qc::Control::Type>();
52
- py::implicitly_convertible<py::str, qc::Control::Type>();
34
+
35
+ py::native_enum<qc::Control::Type>(control, "Type", "enum.Enum",
36
+ "Enumeration of control types.")
37
+ .value("Pos", qc::Control::Type::Pos)
38
+ .value("Neg", qc::Control::Type::Neg)
39
+ .finalize();
53
40
 
54
41
  control.def(py::init<qc::Qubit, qc::Control::Type>(), "qubit"_a,
55
42
  "type_"_a = qc::Control::Type::Pos);
@@ -15,11 +15,9 @@
15
15
  #include <pybind11/pybind11.h>
16
16
  #include <pybind11/stl.h> // NOLINT(misc-include-cleaner)
17
17
 
18
- #include <pybind11/pytypes.h>
18
+ #include <pybind11/native_enum.h>
19
19
  // clang-format on
20
20
 
21
- #include <string>
22
-
23
21
  namespace mqt {
24
22
 
25
23
  namespace py = pybind11;
@@ -27,7 +25,8 @@ using namespace pybind11::literals;
27
25
 
28
26
  // NOLINTNEXTLINE(misc-use-internal-linkage)
29
27
  void registerOptype(const py::module& m) {
30
- py::enum_<qc::OpType>(m, "OpType")
28
+ py::native_enum<qc::OpType>(m, "OpType", "enum.Enum",
29
+ "Enumeration of operation types.")
31
30
  .value("none", qc::OpType::None)
32
31
  .value("gphase", qc::OpType::GPhase)
33
32
  .value("i", qc::OpType::I)
@@ -68,12 +67,7 @@ void registerOptype(const py::module& m) {
68
67
  .value("barrier", qc::OpType::Barrier)
69
68
  .value("classic_controlled", qc::OpType::ClassicControlled)
70
69
  .export_values()
71
- .def("__str__", [](const qc::OpType& op) { return qc::toString(op); })
72
- .def("__repr__", [](const qc::OpType& op) { return qc::toString(op); })
73
- .def(py::init([](const std::string& str) -> qc::OpType {
74
- return qc::opTypeFromString(str);
75
- }));
76
- py::implicitly_convertible<py::str, qc::OpType>();
70
+ .finalize();
77
71
  }
78
72
 
79
73
  } // namespace mqt
@@ -31,6 +31,7 @@
31
31
  #include <memory>
32
32
  #include <stdexcept>
33
33
  #include <string>
34
+ #include <utility>
34
35
  #include <vector>
35
36
 
36
37
  namespace mqt {
@@ -47,7 +48,7 @@ void registerQuantumComputation(py::module& m) {
47
48
  if (i < 0) {
48
49
  i += static_cast<DiffType>(size);
49
50
  }
50
- if (i < 0 || static_cast<SizeType>(i) >= size) {
51
+ if (i < 0 || std::cmp_greater_equal(i, size)) {
51
52
  throw py::index_error();
52
53
  }
53
54
  return i;
@@ -29,7 +29,7 @@ function(enable_project_options target_name)
29
29
  option(ENABLE_COVERAGE "Enable coverage reporting for gcc/clang" FALSE)
30
30
  if(ENABLE_COVERAGE)
31
31
  target_compile_options(${target_name} INTERFACE --coverage -fprofile-arcs -ftest-coverage -O0)
32
- target_link_libraries(${target_name} INTERFACE gcov --coverage)
32
+ target_link_libraries(${target_name} INTERFACE --coverage)
33
33
  endif()
34
34
 
35
35
  if(NOT DEPLOY)
@@ -25,7 +25,7 @@ if(BUILD_MQT_CORE_BINDINGS)
25
25
  message(STATUS "Python executable: ${Python_EXECUTABLE}")
26
26
 
27
27
  # add pybind11 library
28
- find_package(pybind11 2.13.6 CONFIG REQUIRED)
28
+ find_package(pybind11 3.0.0 CONFIG REQUIRED)
29
29
  endif()
30
30
 
31
31
  set(JSON_VERSION
@@ -38,10 +38,10 @@ public:
38
38
  closureMatrix[i][i] = true;
39
39
  }
40
40
  auto addEdge(const V& u, const V& v) -> void override {
41
- if (this->mapping.find(u) == this->mapping.end()) {
41
+ if (!this->mapping.contains(u)) {
42
42
  addVertex(u);
43
43
  }
44
- if (this->mapping.find(v) == this->mapping.end()) {
44
+ if (!this->mapping.contains(v)) {
45
45
  addVertex(v);
46
46
  }
47
47
  std::size_t const i = this->mapping.at(u);
@@ -62,10 +62,10 @@ public:
62
62
  }
63
63
  }
64
64
  [[nodiscard]] auto isReachable(const V& u, const V& v) const -> bool {
65
- if (this->mapping.find(u) == this->mapping.end()) {
65
+ if (!this->mapping.contains(u)) {
66
66
  throw std::invalid_argument("Vertex u not in graph.");
67
67
  }
68
- if (this->mapping.find(v) == this->mapping.end()) {
68
+ if (!this->mapping.contains(v)) {
69
69
  throw std::invalid_argument("Vertex v not in graph.");
70
70
  }
71
71
  return closureMatrix[this->mapping.at(u)][this->mapping.at(v)];
@@ -59,7 +59,7 @@ public:
59
59
  virtual ~DirectedGraph() = default;
60
60
  virtual auto addVertex(const V& v) -> void {
61
61
  // check whether the vertex is already in the graph, if so do nothing
62
- if (mapping.find(v) != mapping.end()) {
62
+ if (mapping.contains(v)) {
63
63
  std::stringstream ss;
64
64
  ss << "The vertex " << v << " is already in the graph.";
65
65
  throw std::invalid_argument(ss.str());
@@ -75,10 +75,10 @@ public:
75
75
  outDegrees.emplace_back(0);
76
76
  }
77
77
  virtual auto addEdge(const V& u, const V& v) -> void {
78
- if (mapping.find(u) == mapping.end()) {
78
+ if (!mapping.contains(u)) {
79
79
  addVertex(u);
80
80
  }
81
- if (mapping.find(v) == mapping.end()) {
81
+ if (!mapping.contains(v)) {
82
82
  addVertex(v);
83
83
  }
84
84
  const auto i = mapping.at(u);
@@ -93,7 +93,7 @@ public:
93
93
  [[nodiscard]] auto getNVertices() const -> std::size_t { return nVertices; }
94
94
  [[nodiscard]] auto getNEdges() const -> std::size_t { return nEdges; }
95
95
  [[nodiscard]] auto getInDegree(const V& v) const -> std::size_t {
96
- if (mapping.find(v) == mapping.end()) {
96
+ if (!mapping.contains(v)) {
97
97
  std::stringstream ss;
98
98
  ss << "The vertex " << v << " is not in the graph.";
99
99
  throw std::invalid_argument(ss.str());
@@ -102,7 +102,7 @@ public:
102
102
  return inDegrees[i];
103
103
  }
104
104
  [[nodiscard]] auto getOutDegree(const V& v) const -> std::size_t {
105
- if (mapping.find(v) == mapping.end()) {
105
+ if (!mapping.contains(v)) {
106
106
  std::stringstream ss;
107
107
  ss << "The vertex " << v << " is not in the graph.";
108
108
  throw std::invalid_argument(ss.str());
@@ -119,12 +119,12 @@ public:
119
119
  });
120
120
  }
121
121
  [[nodiscard]] auto isEdge(const V& u, const V& v) const -> bool {
122
- if (mapping.find(u) == mapping.end()) {
122
+ if (!mapping.contains(u)) {
123
123
  std::stringstream ss;
124
124
  ss << "The vertex " << u << " is not in the graph.";
125
125
  throw std::invalid_argument(ss.str());
126
126
  }
127
- if (mapping.find(v) == mapping.end()) {
127
+ if (!mapping.contains(v)) {
128
128
  std::stringstream ss;
129
129
  ss << "The vertex " << v << " is not in the graph.";
130
130
  throw std::invalid_argument(ss.str());
@@ -62,7 +62,7 @@ protected:
62
62
  public:
63
63
  auto addVertex(const V& v) -> void {
64
64
  // check whether the vertex is already in the graph, if so do nothing
65
- if (mapping.find(v) == mapping.end()) {
65
+ if (!mapping.contains(v)) {
66
66
  mapping[v] = nVertices;
67
67
  invMapping.emplace_back(v);
68
68
  ++nVertices;
@@ -80,10 +80,10 @@ public:
80
80
  }
81
81
  }
82
82
  auto addEdge(const V& u, const V& v, const E& e) -> void {
83
- if (mapping.find(u) == mapping.end()) {
83
+ if (!mapping.contains(u)) {
84
84
  addVertex(u);
85
85
  }
86
- if (mapping.find(v) == mapping.end()) {
86
+ if (!mapping.contains(v)) {
87
87
  addVertex(v);
88
88
  }
89
89
  const auto i = mapping.at(u);
@@ -132,7 +132,7 @@ public:
132
132
  }
133
133
  [[nodiscard]] auto getAdjacentEdges(const V& v) const
134
134
  -> std::unordered_set<std::pair<V, V>, PairHash<V, V>> {
135
- if (mapping.find(v) == mapping.end()) {
135
+ if (!mapping.contains(v)) {
136
136
  std::stringstream ss;
137
137
  ss << "The vertex " << v << " is not in the graph.";
138
138
  throw std::invalid_argument(ss.str());
@@ -149,7 +149,7 @@ public:
149
149
  return result;
150
150
  }
151
151
  [[nodiscard]] auto getNeighbours(const V& v) const -> std::unordered_set<V> {
152
- if (mapping.find(v) == mapping.end()) {
152
+ if (!mapping.contains(v)) {
153
153
  std::stringstream ss;
154
154
  ss << "The vertex " << v << " is not in the graph.";
155
155
  throw std::invalid_argument(ss.str());
@@ -165,7 +165,7 @@ public:
165
165
  return result;
166
166
  }
167
167
  [[nodiscard]] auto getDegree(const V& v) const -> std::size_t {
168
- if (mapping.find(v) == mapping.end()) {
168
+ if (!mapping.contains(v)) {
169
169
  std::stringstream ss;
170
170
  ss << "The vertex " << v << " is not in the graph.";
171
171
  throw std::invalid_argument(ss.str());
@@ -182,12 +182,12 @@ public:
182
182
  });
183
183
  }
184
184
  [[nodiscard]] auto isAdjacent(const V& u, const V& v) const -> bool {
185
- if (mapping.find(u) == mapping.end()) {
185
+ if (!mapping.contains(u)) {
186
186
  std::stringstream ss;
187
187
  ss << "The vertex " << u << " is not in the graph.";
188
188
  throw std::invalid_argument(ss.str());
189
189
  }
190
- if (mapping.find(v) == mapping.end()) {
190
+ if (!mapping.contains(v)) {
191
191
  std::stringstream ss;
192
192
  ss << "The vertex " << v << " is not in the graph.";
193
193
  throw std::invalid_argument(ss.str());
@@ -57,7 +57,7 @@ struct NodeBase : LLBase {
57
57
  void mark() noexcept { flags |= MARK_FLAG; }
58
58
 
59
59
  /// @brief Unmark the node.
60
- void unmark() noexcept { flags &= ~MARK_FLAG; }
60
+ void unmark() noexcept { flags &= static_cast<uint16_t>(~MARK_FLAG); }
61
61
 
62
62
  /// Getter for the next object.
63
63
  [[nodiscard]] NodeBase* next() const noexcept {
@@ -1821,7 +1821,7 @@ public:
1821
1821
  if (edge.w.approximatelyZero()) {
1822
1822
  continue;
1823
1823
  }
1824
- if (mappedNode.find(edge.p) != mappedNode.end()) {
1824
+ if (mappedNode.contains(edge.p)) {
1825
1825
  continue;
1826
1826
  }
1827
1827
 
@@ -1840,7 +1840,7 @@ public:
1840
1840
  if (edge.w.approximatelyZero()) {
1841
1841
  continue;
1842
1842
  }
1843
- if (mappedNode.find(edge.p) != mappedNode.end()) {
1843
+ if (mappedNode.contains(edge.p)) {
1844
1844
  continue;
1845
1845
  }
1846
1846
  hasChild = edge.p == stack.top()->p;
@@ -1852,7 +1852,7 @@ public:
1852
1852
  stack.push(currentEdge);
1853
1853
  currentEdge = temp;
1854
1854
  } else {
1855
- if (mappedNode.find(currentEdge->p) != mappedNode.end()) {
1855
+ if (!mappedNode.contains(currentEdge->p)) {
1856
1856
  currentEdge = nullptr;
1857
1857
  continue;
1858
1858
  }