mqt-core 3.3.2__cp314-cp314t-win_amd64.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.
- 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 +34 -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-fomac.dll +0 -0
- mqt/core/bin/mqt-core-ir.dll +0 -0
- mqt/core/bin/mqt-core-na-fomac.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-qdmi-driver.dll +0 -0
- mqt/core/bin/mqt-core-qdmi-na-device.dll +0 -0
- mqt/core/bin/mqt-core-zx.dll +0 -0
- mqt/core/dd.cp314t-win_amd64.pyd +0 -0
- mqt/core/dd.pyi +1016 -0
- mqt/core/dd_evaluation.py +368 -0
- mqt/core/fomac.cp314t-win_amd64.pyd +0 -0
- mqt/core/fomac.pyi +125 -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 +119 -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 +174 -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 +306 -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/fomac/FoMaC.hpp +568 -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 +596 -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/CompoundOperation.hpp +212 -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/IfElseOperation.hpp +169 -0
- mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
- mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
- mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
- mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
- mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
- mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
- mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
- mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
- mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
- mqt/core/include/mqt-core/na/device/Generator.hpp +447 -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/fomac/Device.hpp +169 -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 +232 -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/qdmi/Driver.hpp +431 -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/include/nlohmann/adl_serializer.hpp +55 -0
- mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
- mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
- mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
- mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
- mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
- mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
- mqt/core/include/nlohmann/detail/hash.hpp +129 -0
- mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
- mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
- mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
- mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
- mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
- mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
- mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
- mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
- mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
- mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
- mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
- mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
- mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
- mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
- mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
- mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
- mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
- mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
- mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
- mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
- mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
- mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
- mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
- mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
- mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
- mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
- mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
- mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
- mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
- mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
- mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
- mqt/core/include/nlohmann/json.hpp +5306 -0
- mqt/core/include/nlohmann/json_fwd.hpp +75 -0
- mqt/core/include/nlohmann/ordered_map.hpp +359 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
- mqt/core/include/qdmi/qdmi/client.h +990 -0
- mqt/core/include/qdmi/qdmi/constants.h +1139 -0
- mqt/core/include/qdmi/qdmi/device.h +602 -0
- mqt/core/include/qdmi/qdmi/types.h +78 -0
- mqt/core/include/spdlog/async.h +99 -0
- mqt/core/include/spdlog/async_logger-inl.h +84 -0
- mqt/core/include/spdlog/async_logger.h +74 -0
- mqt/core/include/spdlog/cfg/argv.h +40 -0
- mqt/core/include/spdlog/cfg/env.h +36 -0
- mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
- mqt/core/include/spdlog/cfg/helpers.h +29 -0
- mqt/core/include/spdlog/common-inl.h +68 -0
- mqt/core/include/spdlog/common.h +406 -0
- mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
- mqt/core/include/spdlog/details/backtracer.h +45 -0
- mqt/core/include/spdlog/details/circular_q.h +115 -0
- mqt/core/include/spdlog/details/console_globals.h +28 -0
- mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
- mqt/core/include/spdlog/details/file_helper.h +61 -0
- mqt/core/include/spdlog/details/fmt_helper.h +141 -0
- mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
- mqt/core/include/spdlog/details/log_msg.h +40 -0
- mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
- mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
- mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
- mqt/core/include/spdlog/details/null_mutex.h +35 -0
- mqt/core/include/spdlog/details/os-inl.h +606 -0
- mqt/core/include/spdlog/details/os.h +127 -0
- mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
- mqt/core/include/spdlog/details/periodic_worker.h +58 -0
- mqt/core/include/spdlog/details/registry-inl.h +270 -0
- mqt/core/include/spdlog/details/registry.h +131 -0
- mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
- mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
- mqt/core/include/spdlog/details/tcp_client.h +127 -0
- mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
- mqt/core/include/spdlog/details/thread_pool.h +117 -0
- mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
- mqt/core/include/spdlog/details/udp_client.h +81 -0
- mqt/core/include/spdlog/details/windows_include.h +11 -0
- mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
- mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
- mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
- mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
- mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
- mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
- mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
- mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
- mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
- mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
- mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
- mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
- mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
- mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
- mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
- mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
- mqt/core/include/spdlog/fmt/chrono.h +23 -0
- mqt/core/include/spdlog/fmt/compile.h +23 -0
- mqt/core/include/spdlog/fmt/fmt.h +30 -0
- mqt/core/include/spdlog/fmt/ostr.h +23 -0
- mqt/core/include/spdlog/fmt/ranges.h +23 -0
- mqt/core/include/spdlog/fmt/std.h +24 -0
- mqt/core/include/spdlog/fmt/xchar.h +23 -0
- mqt/core/include/spdlog/formatter.h +17 -0
- mqt/core/include/spdlog/fwd.h +18 -0
- mqt/core/include/spdlog/logger-inl.h +198 -0
- mqt/core/include/spdlog/logger.h +379 -0
- mqt/core/include/spdlog/mdc.h +52 -0
- mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
- mqt/core/include/spdlog/pattern_formatter.h +118 -0
- mqt/core/include/spdlog/sinks/android_sink.h +137 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
- mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
- mqt/core/include/spdlog/sinks/base_sink.h +51 -0
- mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
- mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
- mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
- mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
- mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
- mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
- mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
- mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
- mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
- mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
- mqt/core/include/spdlog/sinks/null_sink.h +41 -0
- mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
- mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
- mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
- mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
- mqt/core/include/spdlog/sinks/sink.h +34 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
- mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
- mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
- mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
- mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
- mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
- mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
- mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
- mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
- mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
- mqt/core/include/spdlog/spdlog-inl.h +96 -0
- mqt/core/include/spdlog/spdlog.h +357 -0
- mqt/core/include/spdlog/stopwatch.h +66 -0
- mqt/core/include/spdlog/tweakme.h +148 -0
- mqt/core/include/spdlog/version.h +11 -0
- mqt/core/ir/__init__.pyi +2078 -0
- mqt/core/ir/operations.pyi +1011 -0
- mqt/core/ir/registers.pyi +91 -0
- mqt/core/ir/symbolic.pyi +177 -0
- mqt/core/ir.cp314t-win_amd64.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-fomac.lib +0 -0
- mqt/core/lib/mqt-core-ir.lib +0 -0
- mqt/core/lib/mqt-core-na-fomac.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-qdmi-driver.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-na-device-gen.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-na-device.lib +0 -0
- mqt/core/lib/mqt-core-zx.lib +0 -0
- mqt/core/lib/pkgconfig/spdlog.pc +13 -0
- mqt/core/lib/spdlog.lib +0 -0
- mqt/core/na/__init__.py +12 -0
- mqt/core/na/fomac.cp314t-win_amd64.pyd +0 -0
- mqt/core/na/fomac.pyi +117 -0
- mqt/core/nlohmann_json.natvis +278 -0
- mqt/core/plugins/__init__.py +9 -0
- mqt/core/plugins/qiskit/__init__.py +19 -0
- mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
- mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
- mqt/core/py.typed +2 -0
- mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
- mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
- mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
- mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -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 +52 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +445 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +110 -0
- mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
- mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
- mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
- mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
- mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
- mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
- mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +121 -0
- mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
- mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
- mqt_core-3.3.2.dist-info/DELVEWHEEL +2 -0
- mqt_core-3.3.2.dist-info/METADATA +210 -0
- mqt_core-3.3.2.dist-info/RECORD +537 -0
- mqt_core-3.3.2.dist-info/WHEEL +5 -0
- mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
- mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -0
- mqt_core.libs/msvcp140.dll +0 -0
|
@@ -0,0 +1,165 @@
|
|
|
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
|
+
#include "dd/RealNumber.hpp"
|
|
15
|
+
#include "ir/Definitions.hpp"
|
|
16
|
+
|
|
17
|
+
#include <complex>
|
|
18
|
+
#include <cstddef>
|
|
19
|
+
#include <functional>
|
|
20
|
+
#include <iostream>
|
|
21
|
+
#include <string>
|
|
22
|
+
|
|
23
|
+
namespace dd {
|
|
24
|
+
|
|
25
|
+
struct RealNumber;
|
|
26
|
+
struct ComplexValue;
|
|
27
|
+
|
|
28
|
+
/// A complex number represented by two pointers to compute table entries.
|
|
29
|
+
struct Complex {
|
|
30
|
+
/// Compute table entry for the real part.
|
|
31
|
+
RealNumber* r;
|
|
32
|
+
/// Compute table entry for the imaginary part.
|
|
33
|
+
RealNumber* i;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @brief The static constant for the complex number zero.
|
|
37
|
+
* @return A complex number with real and imaginary part equal to zero.
|
|
38
|
+
*/
|
|
39
|
+
static constexpr Complex zero() noexcept {
|
|
40
|
+
return {&constants::zero, &constants::zero};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @brief The static constant for the complex number one.
|
|
45
|
+
* @return A complex number with real part equal to one and imaginary part
|
|
46
|
+
* equal to zero.
|
|
47
|
+
*/
|
|
48
|
+
static constexpr Complex one() noexcept {
|
|
49
|
+
return {&constants::one, &constants::zero};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @brief Check whether the complex number is exactly equal to zero.
|
|
54
|
+
* @returns True if the complex number is exactly equal to zero, false
|
|
55
|
+
* otherwise.
|
|
56
|
+
* @see RealNumber::exactlyZero
|
|
57
|
+
*/
|
|
58
|
+
[[nodiscard]] constexpr bool exactlyZero() const noexcept {
|
|
59
|
+
return RealNumber::exactlyZero(r) && RealNumber::exactlyZero(i);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @brief Check whether the complex number is exactly equal to one.
|
|
64
|
+
* @returns True if the complex number is exactly equal to one, false
|
|
65
|
+
* otherwise.
|
|
66
|
+
* @see RealNumber::exactlyOne
|
|
67
|
+
* @see RealNumber::exactlyZero
|
|
68
|
+
*/
|
|
69
|
+
[[nodiscard]] constexpr bool exactlyOne() const noexcept {
|
|
70
|
+
return RealNumber::exactlyOne(r) && RealNumber::exactlyZero(i);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @brief Check whether the complex number is approximately equal to the
|
|
75
|
+
* given complex number.
|
|
76
|
+
* @param c The complex number to compare to.
|
|
77
|
+
* @returns True if the complex number is approximately equal to the given
|
|
78
|
+
* complex number, false otherwise.
|
|
79
|
+
* @see RealNumber::approximatelyEquals
|
|
80
|
+
*/
|
|
81
|
+
[[nodiscard]] bool approximatelyEquals(const Complex& c) const noexcept;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @brief Check whether the complex number is approximately equal to zero.
|
|
85
|
+
* @returns True if the complex number is approximately equal to zero, false
|
|
86
|
+
* otherwise.
|
|
87
|
+
* @see RealNumber::approximatelyZero
|
|
88
|
+
*/
|
|
89
|
+
[[nodiscard]] bool approximatelyZero() const noexcept;
|
|
90
|
+
|
|
91
|
+
/// @brief Mark the complex number as used.
|
|
92
|
+
void mark() const noexcept;
|
|
93
|
+
|
|
94
|
+
/// @brief Unmark the complex number.
|
|
95
|
+
void unmark() const noexcept;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @brief Convert the complex number to a string.
|
|
99
|
+
* @param formatted Whether to apply special formatting to the numbers.
|
|
100
|
+
* @param precision The precision to use for the numbers.
|
|
101
|
+
* @returns The string representation of the complex number.
|
|
102
|
+
* @see ComplexValue::toString
|
|
103
|
+
*/
|
|
104
|
+
[[nodiscard]] std::string toString(bool formatted = true,
|
|
105
|
+
int precision = -1) const;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @brief Write the complex number to a binary stream.
|
|
109
|
+
* @param os The output stream to write to.
|
|
110
|
+
* @see RealNumber::writeBinary
|
|
111
|
+
*/
|
|
112
|
+
void writeBinary(std::ostream& os) const;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @brief Convert the Complex number to an std::complex<fp>.
|
|
116
|
+
* @returns The std::complex<fp> representation of the Complex number.
|
|
117
|
+
*/
|
|
118
|
+
[[nodiscard]] explicit operator std::complex<fp>() const noexcept;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @brief Convert the Complex number to a ComplexValue.
|
|
122
|
+
* @returns The ComplexValue representation of the Complex number.
|
|
123
|
+
*/
|
|
124
|
+
[[nodiscard]] explicit operator ComplexValue() const noexcept;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @brief Print a complex number to a stream.
|
|
129
|
+
* @param os The output stream to write to.
|
|
130
|
+
* @param c The complex number to print.
|
|
131
|
+
* @returns The output stream.
|
|
132
|
+
*/
|
|
133
|
+
std::ostream& operator<<(std::ostream& os, const Complex& c);
|
|
134
|
+
|
|
135
|
+
ComplexValue operator*(const Complex& c1, const ComplexValue& c2);
|
|
136
|
+
ComplexValue operator*(const ComplexValue& c1, const Complex& c2);
|
|
137
|
+
ComplexValue operator*(const Complex& c1, const Complex& c2);
|
|
138
|
+
ComplexValue operator*(const Complex& c1, fp real);
|
|
139
|
+
ComplexValue operator*(fp real, const Complex& c1);
|
|
140
|
+
|
|
141
|
+
ComplexValue operator/(const Complex& c1, const ComplexValue& c2);
|
|
142
|
+
ComplexValue operator/(const ComplexValue& c1, const Complex& c2);
|
|
143
|
+
ComplexValue operator/(const Complex& c1, const Complex& c2);
|
|
144
|
+
ComplexValue operator/(const Complex& c1, fp real);
|
|
145
|
+
|
|
146
|
+
} // namespace dd
|
|
147
|
+
|
|
148
|
+
/// Hash function for complex numbers.
|
|
149
|
+
template <> struct std::hash<dd::Complex> {
|
|
150
|
+
/**
|
|
151
|
+
* @brief Compute the hash value for a complex number.
|
|
152
|
+
* @details Reinterprets the pointers to the real and imaginary part as
|
|
153
|
+
* integers and computes the hash value for those. Afterwards, the two hash
|
|
154
|
+
* values are combined.
|
|
155
|
+
* @param c The complex number to compute the hash value for.
|
|
156
|
+
* @returns The hash value.
|
|
157
|
+
* @see dd::murmur64
|
|
158
|
+
* @see dd::combineHash
|
|
159
|
+
*/
|
|
160
|
+
std::size_t operator()(dd::Complex const& c) const noexcept {
|
|
161
|
+
const auto h1 = dd::murmur64(reinterpret_cast<std::size_t>(c.r));
|
|
162
|
+
const auto h2 = dd::murmur64(reinterpret_cast<std::size_t>(c.i));
|
|
163
|
+
return qc::combineHash(h1, h2);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
@@ -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
|