mqt-core 3.1.0__cp313-cp313-win_arm64.whl
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.
- mqt/core/__init__.py +89 -0
- mqt/core/__main__.py +55 -0
- mqt/core/_commands.py +52 -0
- mqt/core/_compat/__init__.py +11 -0
- mqt/core/_compat/typing.py +29 -0
- mqt/core/_version.py +21 -0
- mqt/core/_version.pyi +12 -0
- mqt/core/bin/mqt-core-algorithms.dll +0 -0
- mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
- mqt/core/bin/mqt-core-dd.dll +0 -0
- mqt/core/bin/mqt-core-ds.dll +0 -0
- mqt/core/bin/mqt-core-ir.dll +0 -0
- mqt/core/bin/mqt-core-na.dll +0 -0
- mqt/core/bin/mqt-core-qasm.dll +0 -0
- mqt/core/bin/mqt-core-zx.dll +0 -0
- mqt/core/dd.cp313-win_arm64.pyd +0 -0
- mqt/core/dd.pyi +1031 -0
- mqt/core/dd_evaluation.py +368 -0
- mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
- mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
- mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
- mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
- mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
- mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
- mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
- mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
- mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
- mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
- mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
- mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
- mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
- mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
- mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
- mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
- mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
- mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
- mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
- mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
- mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
- mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
- mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
- mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
- mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
- mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
- mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
- mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
- mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
- mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
- mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
- mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
- mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
- mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
- mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
- mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
- mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
- mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
- mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
- mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
- mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
- mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
- mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
- mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
- mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
- mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
- mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
- mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
- mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
- mqt/core/include/mqt-core/boost/config.hpp +67 -0
- mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
- mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
- mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
- mqt/core/include/mqt-core/boost/limits.hpp +146 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
- mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
- mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
- mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
- mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
- mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
- mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
- mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
- mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
- mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
- mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
- mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
- mqt/core/include/mqt-core/boost/version.hpp +32 -0
- mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +106 -0
- mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
- mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
- mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
- mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
- mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
- mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
- mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
- mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
- mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
- mqt/core/include/mqt-core/dd/CachedEdge.hpp +167 -0
- mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
- mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
- mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
- mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
- mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
- mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
- mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
- mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
- mqt/core/include/mqt-core/dd/Export.hpp +438 -0
- mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
- mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
- mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
- mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
- mqt/core/include/mqt-core/dd/Node.hpp +223 -0
- mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
- mqt/core/include/mqt-core/dd/Operations.hpp +308 -0
- mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
- mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
- mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
- mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
- mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
- mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
- mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
- mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
- mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
- mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
- mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
- mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
- mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
- mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
- mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
- mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
- mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
- mqt/core/include/mqt-core/ir/QuantumComputation.hpp +594 -0
- mqt/core/include/mqt-core/ir/Register.hpp +125 -0
- mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
- mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
- mqt/core/include/mqt-core/ir/operations/ClassicControlledOperation.hpp +156 -0
- mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +210 -0
- mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
- mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
- mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
- mqt/core/include/mqt-core/ir/operations/OpType.hpp +115 -0
- mqt/core/include/mqt-core/ir/operations/OpType.inc +75 -0
- mqt/core/include/mqt-core/ir/operations/Operation.hpp +245 -0
- mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +138 -0
- mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
- mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
- mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
- mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
- mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
- mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
- mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
- mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
- mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
- mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
- mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
- mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
- mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
- mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
- mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
- mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
- mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
- mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
- mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
- mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
- mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
- mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
- mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
- mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
- mqt/core/include/mqt-core/qasm3/StdGates.hpp +123 -0
- mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
- mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
- mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
- mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
- mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
- mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
- mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
- mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
- mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
- mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
- mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
- mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
- mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
- mqt/core/ir/__init__.pyi +1998 -0
- mqt/core/ir/operations.pyi +1019 -0
- mqt/core/ir/registers.pyi +91 -0
- mqt/core/ir/symbolic.pyi +177 -0
- mqt/core/ir.cp313-win_arm64.pyd +0 -0
- mqt/core/lib/mqt-core-algorithms.lib +0 -0
- mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
- mqt/core/lib/mqt-core-dd.lib +0 -0
- mqt/core/lib/mqt-core-ds.lib +0 -0
- mqt/core/lib/mqt-core-ir.lib +0 -0
- mqt/core/lib/mqt-core-na.lib +0 -0
- mqt/core/lib/mqt-core-qasm.lib +0 -0
- mqt/core/lib/mqt-core-zx.lib +0 -0
- mqt/core/plugins/__init__.py +9 -0
- mqt/core/plugins/qiskit/__init__.py +19 -0
- mqt/core/plugins/qiskit/mqt_to_qiskit.py +354 -0
- mqt/core/plugins/qiskit/qiskit_to_mqt.py +455 -0
- mqt/core/py.typed +2 -0
- mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +52 -0
- mqt/core/share/cmake/mqt-core/Cache.cmake +32 -0
- mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
- mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +40 -0
- mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
- mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +49 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +90 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +324 -0
- mqt_core-3.1.0.dist-info/DELVEWHEEL +2 -0
- mqt_core-3.1.0.dist-info/METADATA +168 -0
- mqt_core-3.1.0.dist-info/RECORD +343 -0
- mqt_core-3.1.0.dist-info/WHEEL +5 -0
- mqt_core-3.1.0.dist-info/entry_points.txt +4 -0
- mqt_core-3.1.0.dist-info/licenses/LICENSE.md +22 -0
- mqt_core.libs/msvcp140.dll +0 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023 - 2025 Chair for Design Automation, TUM
|
|
3
|
+
* Copyright (c) 2025 Munich Quantum Software Company GmbH
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* SPDX-License-Identifier: MIT
|
|
7
|
+
*
|
|
8
|
+
* Licensed under the MIT License
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#pragma once
|
|
12
|
+
|
|
13
|
+
#include "dd/CachedEdge.hpp"
|
|
14
|
+
#include "dd/Complex.hpp"
|
|
15
|
+
#include "dd/DDDefinitions.hpp"
|
|
16
|
+
#include "dd/Edge.hpp"
|
|
17
|
+
#include "dd/RealNumberUniqueTable.hpp"
|
|
18
|
+
|
|
19
|
+
#include <complex>
|
|
20
|
+
#include <cstddef>
|
|
21
|
+
|
|
22
|
+
namespace dd {
|
|
23
|
+
|
|
24
|
+
struct ComplexValue;
|
|
25
|
+
|
|
26
|
+
/// A class for managing complex numbers in the DD package.
|
|
27
|
+
class ComplexNumbers {
|
|
28
|
+
|
|
29
|
+
public:
|
|
30
|
+
/// Default constructor.
|
|
31
|
+
explicit ComplexNumbers(RealNumberUniqueTable& table)
|
|
32
|
+
: uniqueTable(&table) {};
|
|
33
|
+
/// Default destructor.
|
|
34
|
+
~ComplexNumbers() = default;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @brief Set the numerical tolerance for comparisons of floats.
|
|
38
|
+
* @param tol The new tolerance.
|
|
39
|
+
*/
|
|
40
|
+
static void setTolerance(fp tol) noexcept;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @brief Compute the squared magnitude of a complex number.
|
|
44
|
+
* @param a The complex number.
|
|
45
|
+
* @returns The squared magnitude.
|
|
46
|
+
*/
|
|
47
|
+
[[nodiscard]] static fp mag2(const Complex& a) noexcept;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @brief Compute the magnitude of a complex number.
|
|
51
|
+
* @param a The complex number.
|
|
52
|
+
* @returns The magnitude.
|
|
53
|
+
*/
|
|
54
|
+
[[nodiscard]] static fp mag(const Complex& a) noexcept;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @brief Compute the argument of a complex number.
|
|
58
|
+
* @param a The complex number.
|
|
59
|
+
* @returns The argument.
|
|
60
|
+
*/
|
|
61
|
+
[[nodiscard]] static fp arg(const Complex& a) noexcept;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @brief Compute the complex conjugate of a complex number.
|
|
65
|
+
* @param a The complex number.
|
|
66
|
+
* @returns The complex conjugate.
|
|
67
|
+
* @note Conjugation is efficiently handled by just flipping the sign of the
|
|
68
|
+
* imaginary pointer.
|
|
69
|
+
*/
|
|
70
|
+
[[nodiscard]] static Complex conj(const Complex& a) noexcept;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* @brief Compute the negation of a complex number.
|
|
74
|
+
* @param a The complex number.
|
|
75
|
+
* @returns The negation.
|
|
76
|
+
* @note Negation is efficiently handled by just flipping the sign of both
|
|
77
|
+
* pointers.
|
|
78
|
+
*/
|
|
79
|
+
[[nodiscard]] static Complex neg(const Complex& a) noexcept;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @brief Lookup a complex value in the complex table; if not found add it.
|
|
83
|
+
* @param c The complex number.
|
|
84
|
+
* @return The found or added complex number.
|
|
85
|
+
*/
|
|
86
|
+
[[nodiscard]] Complex lookup(const Complex& c);
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @see lookup(fp r, fp i)
|
|
90
|
+
*/
|
|
91
|
+
[[nodiscard]] Complex lookup(const std::complex<fp>& c);
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @see lookup(fp r, fp i)
|
|
95
|
+
*/
|
|
96
|
+
[[nodiscard]] Complex lookup(const ComplexValue& c);
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @brief Lookup a real value in the complex table; if not found add it.
|
|
100
|
+
* @param r The real number.
|
|
101
|
+
* @return The found or added complex number with real part r and imaginary
|
|
102
|
+
* part zero.
|
|
103
|
+
*/
|
|
104
|
+
[[nodiscard]] Complex lookup(fp r);
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* @brief Lookup a complex value in the complex table; if not found add it.
|
|
108
|
+
* @param r The real part.
|
|
109
|
+
* @param i The imaginary part.
|
|
110
|
+
* @return The found or added complex number.
|
|
111
|
+
* @see ComplexTable::lookup
|
|
112
|
+
*/
|
|
113
|
+
[[nodiscard]] Complex lookup(fp r, fp i);
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @brief Turn CachedEdge into Edge via lookup.
|
|
117
|
+
* @tparam Node The type of the node.
|
|
118
|
+
* @param ce The cached edge.
|
|
119
|
+
* @return The edge with looked-up weight. The zero terminal if the new weight
|
|
120
|
+
* is exactly zero.
|
|
121
|
+
*/
|
|
122
|
+
template <class Node>
|
|
123
|
+
[[nodiscard]] Edge<Node> lookup(const CachedEdge<Node>& ce) {
|
|
124
|
+
auto e = Edge<Node>{ce.p, lookup(ce.w)};
|
|
125
|
+
if (e.w.exactlyZero()) {
|
|
126
|
+
e.p = Node::getTerminal();
|
|
127
|
+
}
|
|
128
|
+
return e;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* @brief Check whether a complex number is one of the static ones.
|
|
133
|
+
* @param c The complex number.
|
|
134
|
+
* @return Whether the complex number is one of the static ones.
|
|
135
|
+
*/
|
|
136
|
+
[[nodiscard]] static constexpr bool isStaticComplex(const Complex& c) {
|
|
137
|
+
return c.exactlyZero() || c.exactlyOne();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @brief Get the number of stored real numbers.
|
|
142
|
+
* @return The number of stored real numbers.
|
|
143
|
+
*/
|
|
144
|
+
[[nodiscard]] std::size_t realCount() const noexcept;
|
|
145
|
+
|
|
146
|
+
private:
|
|
147
|
+
/// A pointer to the unique table to use for calculations
|
|
148
|
+
RealNumberUniqueTable* uniqueTable;
|
|
149
|
+
};
|
|
150
|
+
} // namespace dd
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023 - 2025 Chair for Design Automation, TUM
|
|
3
|
+
* Copyright (c) 2025 Munich Quantum Software Company GmbH
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* SPDX-License-Identifier: MIT
|
|
7
|
+
*
|
|
8
|
+
* Licensed under the MIT License
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#pragma once
|
|
12
|
+
|
|
13
|
+
#include "dd/DDDefinitions.hpp"
|
|
14
|
+
|
|
15
|
+
#include <cmath>
|
|
16
|
+
#include <complex>
|
|
17
|
+
#include <cstddef>
|
|
18
|
+
#include <cstdint>
|
|
19
|
+
#include <functional>
|
|
20
|
+
#include <iostream>
|
|
21
|
+
#include <string>
|
|
22
|
+
#include <utility>
|
|
23
|
+
|
|
24
|
+
namespace dd {
|
|
25
|
+
/// A complex number represented by two floating point values.
|
|
26
|
+
struct ComplexValue {
|
|
27
|
+
/// real part
|
|
28
|
+
fp r{};
|
|
29
|
+
/// imaginary part
|
|
30
|
+
fp i{};
|
|
31
|
+
|
|
32
|
+
ComplexValue() = default;
|
|
33
|
+
// NOLINTNEXTLINE(google-explicit-constructor) We want impl. conv. from reals
|
|
34
|
+
ComplexValue(const fp real) noexcept : r{real} {}
|
|
35
|
+
explicit ComplexValue(const std::complex<fp>& c) noexcept
|
|
36
|
+
: r{c.real()}, i{c.imag()} {}
|
|
37
|
+
ComplexValue(const fp real, const fp imag) noexcept : r{real}, i{imag} {}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @brief Check for exact equality.
|
|
41
|
+
* @param other The other complex number to compare to.
|
|
42
|
+
* @returns True if the complex numbers are exactly equal, false otherwise.
|
|
43
|
+
*/
|
|
44
|
+
[[nodiscard]] bool operator==(const ComplexValue& other) const noexcept;
|
|
45
|
+
|
|
46
|
+
/// @see operator==
|
|
47
|
+
[[nodiscard]] bool operator!=(const ComplexValue& other) const noexcept;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @brief Check whether the complex number is exactly equal to zero.
|
|
51
|
+
* @return True if the complex number is exactly equal to zero, false
|
|
52
|
+
* otherwise.
|
|
53
|
+
*/
|
|
54
|
+
[[nodiscard]] bool exactlyZero() const noexcept { return r == 0. && i == 0.; }
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @brief Check whether the complex number is exactly equal to one.
|
|
58
|
+
* @return True if the complex number is exactly equal to one, false
|
|
59
|
+
* otherwise.
|
|
60
|
+
*/
|
|
61
|
+
[[nodiscard]] bool exactlyOne() const noexcept { return r == 1. && i == 0.; }
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @brief Check whether the complex number is approximately equal to the
|
|
65
|
+
* given complex number.
|
|
66
|
+
* @param c The complex number to compare to.
|
|
67
|
+
* @returns True if the complex number is approximately equal to the given
|
|
68
|
+
* complex number, false otherwise.
|
|
69
|
+
* @see RealNumber::approximatelyEquals
|
|
70
|
+
*/
|
|
71
|
+
[[nodiscard]] bool approximatelyEquals(const ComplexValue& c) const noexcept;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @brief Check whether the complex number is approximately equal to zero.
|
|
75
|
+
* @returns True if the complex number is approximately equal to zero, false
|
|
76
|
+
* otherwise.
|
|
77
|
+
* @see RealNumber::approximatelyZero
|
|
78
|
+
*/
|
|
79
|
+
[[nodiscard]] bool approximatelyZero() const noexcept;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @brief Write a binary representation of the complex number to the given
|
|
83
|
+
* output stream.
|
|
84
|
+
* @param os The output stream to write to.
|
|
85
|
+
*/
|
|
86
|
+
void writeBinary(std::ostream& os) const;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @brief Read a binary representation of the complex number from the given
|
|
90
|
+
* input stream.
|
|
91
|
+
* @param is The input stream to read from.
|
|
92
|
+
*/
|
|
93
|
+
void readBinary(std::istream& is);
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @brief Construct a complex number from a string.
|
|
97
|
+
* @param realStr The string representation of the real part.
|
|
98
|
+
* @param imagStr The string representation of the imaginary part.
|
|
99
|
+
*/
|
|
100
|
+
void fromString(const std::string& realStr, std::string imagStr);
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* @brief Get the closest fraction to the given number.
|
|
104
|
+
* @param x The number to approximate.
|
|
105
|
+
* @param maxDenominator The maximum denominator to use.
|
|
106
|
+
* @returns The closest fraction to the given number as a pair of numerator
|
|
107
|
+
* and denominator.
|
|
108
|
+
*/
|
|
109
|
+
static std::pair<std::uint64_t, std::uint64_t>
|
|
110
|
+
getLowestFraction(fp x, std::uint64_t maxDenominator = 1U << 10);
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @brief Pretty print the given real number to the given output stream.
|
|
114
|
+
* @param os The output stream to write to.
|
|
115
|
+
* @param num The number to print.
|
|
116
|
+
* @param imaginary Whether the number is imaginary.
|
|
117
|
+
*/
|
|
118
|
+
static void printFormatted(std::ostream& os, fp num, bool imaginary = false);
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @brief Print the given complex number to the given output stream.
|
|
122
|
+
* @param real The real part of the complex number.
|
|
123
|
+
* @param imag The imaginary part of the complex number.
|
|
124
|
+
* @param formatted Whether to pretty print the number.
|
|
125
|
+
* @param precision The precision to use for printing numbers..
|
|
126
|
+
* @returns The string representation of the complex number.
|
|
127
|
+
*/
|
|
128
|
+
static std::string toString(const fp& real, const fp& imag,
|
|
129
|
+
bool formatted = true, int precision = -1);
|
|
130
|
+
|
|
131
|
+
/// Automatically convert to std::complex<fp>
|
|
132
|
+
explicit operator auto() const noexcept { return std::complex<fp>{r, i}; }
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* @brief Compute the squared magnitude of the complex number.
|
|
136
|
+
* @return The squared magnitude of the complex number.
|
|
137
|
+
*/
|
|
138
|
+
[[nodiscard]] fp mag2() const noexcept { return (r * r) + (i * i); }
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @brief Compute the magnitude of the complex number.
|
|
142
|
+
* @return The magnitude of the complex number.
|
|
143
|
+
*/
|
|
144
|
+
[[nodiscard]] fp mag() const noexcept { return std::hypot(r, i); }
|
|
145
|
+
|
|
146
|
+
/// In-place addition of two complex numbers
|
|
147
|
+
ComplexValue& operator+=(const ComplexValue& rhs) noexcept;
|
|
148
|
+
|
|
149
|
+
ComplexValue& operator*=(const fp& real) noexcept;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
ComplexValue operator+(const ComplexValue& c1, const ComplexValue& c2);
|
|
153
|
+
ComplexValue operator*(const ComplexValue& c1, fp r);
|
|
154
|
+
ComplexValue operator*(fp r, const ComplexValue& c1);
|
|
155
|
+
ComplexValue operator*(const ComplexValue& c1, const ComplexValue& c2);
|
|
156
|
+
ComplexValue operator/(const ComplexValue& c1, fp r);
|
|
157
|
+
ComplexValue operator/(const ComplexValue& c1, const ComplexValue& c2);
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* @brief Print a complex value to the given output stream.
|
|
161
|
+
* @param os The output stream to write to.
|
|
162
|
+
* @param c The complex value to print.
|
|
163
|
+
* @returns The output stream.
|
|
164
|
+
*/
|
|
165
|
+
std::ostream& operator<<(std::ostream& os, const ComplexValue& c);
|
|
166
|
+
} // namespace dd
|
|
167
|
+
|
|
168
|
+
/// Hash function for complex values
|
|
169
|
+
template <> struct std::hash<dd::ComplexValue> {
|
|
170
|
+
/**
|
|
171
|
+
* @brief Compute the hash value for the given complex value.
|
|
172
|
+
* @details The hash value is computed by scaling the real and imaginary part
|
|
173
|
+
* by the tolerance of the complex table, rounding the result to the nearest
|
|
174
|
+
* integer and computing the hash value of the resulting pair of integers.
|
|
175
|
+
* @param c The complex value to compute the hash value for.
|
|
176
|
+
* @returns The hash value for the given complex value.
|
|
177
|
+
* @note It is rather hard to define good hash functions for floating point
|
|
178
|
+
* numbers. This hash function is not perfect, but it is fast and should
|
|
179
|
+
* provide a good distribution of hash values. Furthermore, two floating point
|
|
180
|
+
* numbers that are within the tolerance of the complex table will always
|
|
181
|
+
* produce the same hash value.
|
|
182
|
+
*/
|
|
183
|
+
std::size_t operator()(dd::ComplexValue const& c) const noexcept;
|
|
184
|
+
};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023 - 2025 Chair for Design Automation, TUM
|
|
3
|
+
* Copyright (c) 2025 Munich Quantum Software Company GmbH
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* SPDX-License-Identifier: MIT
|
|
7
|
+
*
|
|
8
|
+
* Licensed under the MIT License
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @file ComputeTable.hpp
|
|
13
|
+
* @brief Data structure for caching computed results of binary operations
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
#pragma once
|
|
17
|
+
|
|
18
|
+
#include "dd/Node.hpp"
|
|
19
|
+
#include "dd/statistics/TableStatistics.hpp"
|
|
20
|
+
#include "ir/Definitions.hpp"
|
|
21
|
+
|
|
22
|
+
#include <cstddef>
|
|
23
|
+
#include <functional>
|
|
24
|
+
#include <iostream>
|
|
25
|
+
#include <stdexcept>
|
|
26
|
+
#include <vector>
|
|
27
|
+
|
|
28
|
+
namespace dd {
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @brief Data structure for caching computed results of binary operations
|
|
32
|
+
* @tparam LeftOperandType type of the operation's left operand
|
|
33
|
+
* @tparam RightOperandType type of the operation's right operand
|
|
34
|
+
* @tparam ResultType type of the operation's result
|
|
35
|
+
*/
|
|
36
|
+
template <class LeftOperandType, class RightOperandType, class ResultType>
|
|
37
|
+
class ComputeTable {
|
|
38
|
+
public:
|
|
39
|
+
/// Default number of buckets for the compute table
|
|
40
|
+
static constexpr std::size_t DEFAULT_NUM_BUCKETS = 16384U;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Default constructor
|
|
44
|
+
* @param numBuckets Number of hash table buckets. Must be a power of two.
|
|
45
|
+
*/
|
|
46
|
+
explicit ComputeTable(const size_t numBuckets = DEFAULT_NUM_BUCKETS) {
|
|
47
|
+
// numBuckets must be a power of two
|
|
48
|
+
if ((numBuckets & (numBuckets - 1)) != 0) {
|
|
49
|
+
throw std::invalid_argument("Number of buckets must be a power of two.");
|
|
50
|
+
}
|
|
51
|
+
stats.entrySize = sizeof(Entry);
|
|
52
|
+
stats.numBuckets = numBuckets;
|
|
53
|
+
valid = std::vector(numBuckets, false);
|
|
54
|
+
table = std::vector<Entry>(numBuckets);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @brief An entry in the compute table
|
|
59
|
+
* @details A triple consisting of the left operand, the right operand, and
|
|
60
|
+
* the result of a binary operation.
|
|
61
|
+
*/
|
|
62
|
+
struct Entry {
|
|
63
|
+
LeftOperandType leftOperand;
|
|
64
|
+
RightOperandType rightOperand;
|
|
65
|
+
ResultType result;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @brief Compute the hash value for a given pair of operands
|
|
70
|
+
* @param leftOperand The left operand
|
|
71
|
+
* @param rightOperand The right operand
|
|
72
|
+
* @return The hash value
|
|
73
|
+
*/
|
|
74
|
+
[[nodiscard]] std::size_t hash(const LeftOperandType& leftOperand,
|
|
75
|
+
const RightOperandType& rightOperand) const {
|
|
76
|
+
auto h1 = std::hash<LeftOperandType>{}(leftOperand);
|
|
77
|
+
if constexpr (std::is_same_v<LeftOperandType, dNode*>) {
|
|
78
|
+
if (!dNode::isTerminal(leftOperand)) {
|
|
79
|
+
h1 = qc::combineHash(
|
|
80
|
+
h1, dd::dNode::getDensityMatrixTempFlags(leftOperand->flags));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
auto h2 = std::hash<RightOperandType>{}(rightOperand);
|
|
84
|
+
if constexpr (std::is_same_v<RightOperandType, dNode*>) {
|
|
85
|
+
if (!dNode::isTerminal(rightOperand)) {
|
|
86
|
+
h2 = qc::combineHash(
|
|
87
|
+
h2, dd::dNode::getDensityMatrixTempFlags(rightOperand->flags));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const auto hash = qc::combineHash(h1, h2);
|
|
91
|
+
const auto mask = stats.numBuckets - 1;
|
|
92
|
+
return hash & mask;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/// Get a reference to the underlying table
|
|
96
|
+
[[nodiscard]] const auto& getTable() const { return table; }
|
|
97
|
+
|
|
98
|
+
/// Get a reference to the statistics
|
|
99
|
+
[[nodiscard]] const auto& getStats() const noexcept { return stats; }
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @brief Insert a new entry into the compute table
|
|
103
|
+
* @details Any existing entry for the resulting hash value will be replaced.
|
|
104
|
+
* @param leftOperand The left operand
|
|
105
|
+
* @param rightOperand The right operand
|
|
106
|
+
* @param result The result of the operation
|
|
107
|
+
*/
|
|
108
|
+
void insert(const LeftOperandType& leftOperand,
|
|
109
|
+
const RightOperandType& rightOperand, const ResultType& result) {
|
|
110
|
+
const auto key = hash(leftOperand, rightOperand);
|
|
111
|
+
if (valid[key]) {
|
|
112
|
+
++stats.collisions;
|
|
113
|
+
} else {
|
|
114
|
+
stats.trackInsert();
|
|
115
|
+
valid[key] = true;
|
|
116
|
+
}
|
|
117
|
+
table[key] = {leftOperand, rightOperand, result};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @brief Look up a result in the compute table
|
|
122
|
+
* @param leftOperand The left operand
|
|
123
|
+
* @param rightOperand The right operand
|
|
124
|
+
* @param useDensityMatrix Whether a density matrix is expected
|
|
125
|
+
* @return A pointer to the result if it is found, otherwise nullptr.
|
|
126
|
+
*/
|
|
127
|
+
ResultType* lookup(const LeftOperandType& leftOperand,
|
|
128
|
+
const RightOperandType& rightOperand,
|
|
129
|
+
[[maybe_unused]] const bool useDensityMatrix = false) {
|
|
130
|
+
ResultType* result = nullptr;
|
|
131
|
+
++stats.lookups;
|
|
132
|
+
const auto key = hash(leftOperand, rightOperand);
|
|
133
|
+
if (!valid[key]) {
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
auto& entry = table[key];
|
|
138
|
+
if (entry.leftOperand != leftOperand) {
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
if (entry.rightOperand != rightOperand) {
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if constexpr (std::is_same_v<RightOperandType, dNode*> ||
|
|
146
|
+
std::is_same_v<RightOperandType, dCachedEdge>) {
|
|
147
|
+
// Since density matrices are reduced representations of matrices, a
|
|
148
|
+
// density matrix may not be returned when a matrix is required and vice
|
|
149
|
+
// versa
|
|
150
|
+
if (!dNode::isTerminal(entry.result.p) &&
|
|
151
|
+
dNode::isDensityMatrixNode(entry.result.p->flags) !=
|
|
152
|
+
useDensityMatrix) {
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
++stats.hits;
|
|
157
|
+
return &entry.result;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* @brief Clear the compute table
|
|
162
|
+
* @details Sets all entries to invalid.
|
|
163
|
+
*/
|
|
164
|
+
void clear() { valid = std::vector(stats.numBuckets, false); }
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* @brief Print the statistics of the compute table
|
|
168
|
+
* @param os The output stream to print to
|
|
169
|
+
* @return The output stream
|
|
170
|
+
*/
|
|
171
|
+
std::ostream& printStatistics(std::ostream& os = std::cout) const {
|
|
172
|
+
return os << stats;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private:
|
|
176
|
+
/// The actual table storing the entries
|
|
177
|
+
std::vector<Entry> table;
|
|
178
|
+
/// Dynamic bitset to mark valid entries
|
|
179
|
+
std::vector<bool> valid;
|
|
180
|
+
/// Statistics of the compute table
|
|
181
|
+
TableStatistics stats{};
|
|
182
|
+
};
|
|
183
|
+
} // namespace dd
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023 - 2025 Chair for Design Automation, TUM
|
|
3
|
+
* Copyright (c) 2025 Munich Quantum Software Company GmbH
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* SPDX-License-Identifier: MIT
|
|
7
|
+
*
|
|
8
|
+
* Licensed under the MIT License
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#pragma once
|
|
12
|
+
|
|
13
|
+
#include "ir/Definitions.hpp"
|
|
14
|
+
|
|
15
|
+
#include <array>
|
|
16
|
+
#include <cmath>
|
|
17
|
+
#include <complex>
|
|
18
|
+
#include <cstddef>
|
|
19
|
+
#include <cstdint>
|
|
20
|
+
#include <string>
|
|
21
|
+
#include <type_traits>
|
|
22
|
+
#include <unordered_map>
|
|
23
|
+
#include <utility>
|
|
24
|
+
#include <vector>
|
|
25
|
+
|
|
26
|
+
namespace dd {
|
|
27
|
+
/**
|
|
28
|
+
* @brief Integer type used for indexing qubits
|
|
29
|
+
* @details `std::uint16_t` can address up to 65536 qubits as [0, ..., 65535].
|
|
30
|
+
* @note If you need even more qubits, this can be increased to `std::uint32_t`.
|
|
31
|
+
* Beware of the increased memory footprint of matrix nodes.
|
|
32
|
+
*/
|
|
33
|
+
using Qubit = std::uint16_t;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @brief Floating point type to use for computations
|
|
37
|
+
* @note Adjusting the precision might lead to unexpected results.
|
|
38
|
+
*/
|
|
39
|
+
using fp = double;
|
|
40
|
+
static_assert(
|
|
41
|
+
std::is_floating_point_v<fp>,
|
|
42
|
+
"fp should be a floating point type (float, *double*, long double)");
|
|
43
|
+
|
|
44
|
+
// logic radix
|
|
45
|
+
static constexpr std::uint8_t RADIX = 2;
|
|
46
|
+
// max no. of edges = RADIX^2
|
|
47
|
+
static constexpr std::uint8_t NEDGE = RADIX * RADIX;
|
|
48
|
+
|
|
49
|
+
enum class BasisStates : std::uint8_t {
|
|
50
|
+
zero, // NOLINT(readability-identifier-naming)
|
|
51
|
+
one, // NOLINT(readability-identifier-naming)
|
|
52
|
+
plus, // NOLINT(readability-identifier-naming)
|
|
53
|
+
minus, // NOLINT(readability-identifier-naming)
|
|
54
|
+
right, // NOLINT(readability-identifier-naming)
|
|
55
|
+
left // NOLINT(readability-identifier-naming)
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
static constexpr fp SQRT2_2 = static_cast<fp>(
|
|
59
|
+
0.707106781186547524400844362104849039284835937688474036588L);
|
|
60
|
+
static constexpr fp PI = static_cast<fp>(
|
|
61
|
+
3.141592653589793238462643383279502884197169399375105820974L);
|
|
62
|
+
static constexpr fp PI_2 = static_cast<fp>(
|
|
63
|
+
1.570796326794896619231321691639751442098584699687552910487L);
|
|
64
|
+
static constexpr fp PI_4 = static_cast<fp>(
|
|
65
|
+
0.785398163397448309615660845819875721049292349843776455243L);
|
|
66
|
+
|
|
67
|
+
static constexpr std::uint64_t SERIALIZATION_VERSION = 1;
|
|
68
|
+
|
|
69
|
+
struct PairHash {
|
|
70
|
+
std::size_t
|
|
71
|
+
operator()(const std::pair<std::size_t, std::size_t>& p) const noexcept {
|
|
72
|
+
return qc::combineHash(p.first, p.second);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
using CVec = std::vector<std::complex<fp>>;
|
|
77
|
+
using SparseCVec = std::unordered_map<std::size_t, std::complex<fp>>;
|
|
78
|
+
using SparsePVec = std::unordered_map<std::size_t, fp>;
|
|
79
|
+
using SparsePVecStrKeys = std::unordered_map<std::string, fp>;
|
|
80
|
+
using CMat = std::vector<CVec>;
|
|
81
|
+
using SparseCMat = std::unordered_map<std::pair<std::size_t, std::size_t>,
|
|
82
|
+
std::complex<fp>, PairHash>;
|
|
83
|
+
|
|
84
|
+
using GateMatrix = std::array<std::complex<fp>, NEDGE>;
|
|
85
|
+
using TwoQubitGateMatrix =
|
|
86
|
+
std::array<std::array<std::complex<fp>, NEDGE>, NEDGE>;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @brief Converts a decimal number to a binary string (big endian)
|
|
90
|
+
* @param value The decimal number to convert
|
|
91
|
+
* @param nbits The number of bits to use for the binary representation
|
|
92
|
+
* @return The binary representation of the decimal number
|
|
93
|
+
*/
|
|
94
|
+
[[nodiscard]] static inline std::string
|
|
95
|
+
intToBinaryString(const std::size_t value, const std::size_t nbits) {
|
|
96
|
+
std::string binary(nbits, '0');
|
|
97
|
+
for (std::size_t j = 0; j < nbits; ++j) {
|
|
98
|
+
if ((value & (1ULL << j)) != 0U) {
|
|
99
|
+
binary[nbits - 1 - j] = '1';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return binary;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// calculates the Units in Last Place (ULP) distance of two floating point
|
|
106
|
+
// numbers
|
|
107
|
+
[[maybe_unused]] static std::size_t ulpDistance(fp a, fp b) {
|
|
108
|
+
// NOLINTNEXTLINE(clang-diagnostic-float-equal)
|
|
109
|
+
if (a == b) {
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
std::size_t ulps = 1;
|
|
114
|
+
fp nextFP = std::nextafter(a, b);
|
|
115
|
+
// NOLINTNEXTLINE(clang-diagnostic-float-equal)
|
|
116
|
+
while (nextFP != b) {
|
|
117
|
+
ulps++;
|
|
118
|
+
nextFP = std::nextafter(nextFP, b);
|
|
119
|
+
}
|
|
120
|
+
return ulps;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @brief 64bit mixing hash (from MurmurHash3)
|
|
125
|
+
* @details Hash function for 64bit integers adapted from MurmurHash3
|
|
126
|
+
* @param k the number to hash
|
|
127
|
+
* @returns the hash value
|
|
128
|
+
* @see https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
|
|
129
|
+
*/
|
|
130
|
+
[[nodiscard]] constexpr std::size_t murmur64(std::size_t k) noexcept {
|
|
131
|
+
k ^= k >> 33;
|
|
132
|
+
k *= 0xff51afd7ed558ccdULL;
|
|
133
|
+
k ^= k >> 33;
|
|
134
|
+
k *= 0xc4ceb9fe1a85ec53ULL;
|
|
135
|
+
k ^= k >> 33;
|
|
136
|
+
return k;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
} // namespace dd
|