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,104 @@
|
|
|
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/operations/OpType.hpp"
|
|
14
|
+
|
|
15
|
+
#include <cstddef>
|
|
16
|
+
|
|
17
|
+
namespace dd {
|
|
18
|
+
struct DDPackageConfig {
|
|
19
|
+
std::size_t utVecNumBucket = 32768U;
|
|
20
|
+
std::size_t utVecInitialAllocationSize = 2048U;
|
|
21
|
+
std::size_t utMatNumBucket = 32768U;
|
|
22
|
+
std::size_t utMatInitialAllocationSize = 2048U;
|
|
23
|
+
std::size_t ctVecAddNumBucket = 16384U;
|
|
24
|
+
std::size_t ctMatAddNumBucket = 16384U;
|
|
25
|
+
std::size_t ctVecAddMagNumBucket = 16384U;
|
|
26
|
+
std::size_t ctMatAddMagNumBucket = 16384U;
|
|
27
|
+
std::size_t ctVecConjNumBucket = 4096U;
|
|
28
|
+
std::size_t ctMatConjTransNumBucket = 4096U;
|
|
29
|
+
std::size_t ctMatVecMultNumBucket = 16384U;
|
|
30
|
+
std::size_t ctMatMatMultNumBucket = 16384U;
|
|
31
|
+
std::size_t ctVecKronNumBucket = 4096U;
|
|
32
|
+
std::size_t ctMatKronNumBucket = 4096U;
|
|
33
|
+
std::size_t ctDmTraceNumBucket = 1U;
|
|
34
|
+
std::size_t ctMatTraceNumBucket = 4096U;
|
|
35
|
+
std::size_t ctVecInnerProdNumBucket = 4096U;
|
|
36
|
+
std::size_t ctDmNoiseNumBucket = 1U;
|
|
37
|
+
std::size_t utDmNumBucket = 1U;
|
|
38
|
+
std::size_t utDmInitialAllocationSize = 1U;
|
|
39
|
+
std::size_t ctDmDmMultNumBucket = 1U;
|
|
40
|
+
std::size_t ctDmAddNumBucket = 1U;
|
|
41
|
+
|
|
42
|
+
// The number of different quantum operations. i.e., the number of operations
|
|
43
|
+
// defined in OpType.hpp. This parameter is required to initialize the
|
|
44
|
+
// StochasticNoiseOperationTable.hpp
|
|
45
|
+
std::size_t stochasticCacheOps = 1;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
constexpr auto STOCHASTIC_NOISE_SIMULATOR_DD_PACKAGE_CONFIG = []() {
|
|
49
|
+
DDPackageConfig config{};
|
|
50
|
+
config.stochasticCacheOps = qc::OpType::OpTypeEnd;
|
|
51
|
+
config.ctVecAddMagNumBucket = 1U;
|
|
52
|
+
config.ctMatAddMagNumBucket = 1U;
|
|
53
|
+
config.ctVecConjNumBucket = 1U;
|
|
54
|
+
return config;
|
|
55
|
+
}();
|
|
56
|
+
|
|
57
|
+
constexpr auto DENSITY_MATRIX_SIMULATOR_DD_PACKAGE_CONFIG = []() {
|
|
58
|
+
DDPackageConfig config{};
|
|
59
|
+
config.utDmNumBucket = 65536U;
|
|
60
|
+
config.utDmInitialAllocationSize = 4096U;
|
|
61
|
+
config.ctDmDmMultNumBucket = 16384U;
|
|
62
|
+
config.ctDmAddNumBucket = 16384U;
|
|
63
|
+
config.ctDmNoiseNumBucket = 4096U;
|
|
64
|
+
config.utMatNumBucket = 16384U;
|
|
65
|
+
config.ctMatAddNumBucket = 4096U;
|
|
66
|
+
config.ctVecAddNumBucket = 4096U;
|
|
67
|
+
config.ctMatConjTransNumBucket = 4096U;
|
|
68
|
+
config.ctMatMatMultNumBucket = 1U;
|
|
69
|
+
config.ctMatVecMultNumBucket = 1U;
|
|
70
|
+
config.utVecNumBucket = 1U;
|
|
71
|
+
config.utVecInitialAllocationSize = 1U;
|
|
72
|
+
config.utMatInitialAllocationSize = 1U;
|
|
73
|
+
config.ctVecKronNumBucket = 1U;
|
|
74
|
+
config.ctMatKronNumBucket = 1U;
|
|
75
|
+
config.ctDmTraceNumBucket = 4096U;
|
|
76
|
+
config.ctMatTraceNumBucket = 1U;
|
|
77
|
+
config.ctVecInnerProdNumBucket = 1U;
|
|
78
|
+
config.stochasticCacheOps = 1U;
|
|
79
|
+
config.ctVecAddMagNumBucket = 1U;
|
|
80
|
+
config.ctMatAddMagNumBucket = 1U;
|
|
81
|
+
config.ctVecConjNumBucket = 1U;
|
|
82
|
+
return config;
|
|
83
|
+
}();
|
|
84
|
+
|
|
85
|
+
constexpr auto UNITARY_SIMULATOR_DD_PACKAGE_CONFIG = []() {
|
|
86
|
+
DDPackageConfig config{};
|
|
87
|
+
config.utMatNumBucket = 65'536U;
|
|
88
|
+
config.ctMatAddNumBucket = 65'536U;
|
|
89
|
+
config.ctMatMatMultNumBucket = 65'536U;
|
|
90
|
+
config.utVecNumBucket = 1U;
|
|
91
|
+
config.utVecInitialAllocationSize = 1U;
|
|
92
|
+
config.ctVecAddNumBucket = 1U;
|
|
93
|
+
config.ctVecAddMagNumBucket = 1U;
|
|
94
|
+
config.ctMatAddMagNumBucket = 1U;
|
|
95
|
+
config.ctVecConjNumBucket = 1U;
|
|
96
|
+
config.ctMatConjTransNumBucket = 1U;
|
|
97
|
+
config.ctMatVecMultNumBucket = 1U;
|
|
98
|
+
config.ctVecKronNumBucket = 1U;
|
|
99
|
+
config.ctMatKronNumBucket = 1U;
|
|
100
|
+
config.ctMatTraceNumBucket = 1U;
|
|
101
|
+
config.ctVecInnerProdNumBucket = 1U;
|
|
102
|
+
return config;
|
|
103
|
+
}();
|
|
104
|
+
} // namespace dd
|
|
@@ -0,0 +1,114 @@
|
|
|
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 DensityNoiseTable.hpp
|
|
13
|
+
* @brief Data structure for caching computed results of noise operations
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
#pragma once
|
|
17
|
+
|
|
18
|
+
#include "dd/DDDefinitions.hpp"
|
|
19
|
+
#include "dd/statistics/TableStatistics.hpp"
|
|
20
|
+
|
|
21
|
+
#include <cstddef>
|
|
22
|
+
#include <functional>
|
|
23
|
+
#include <stdexcept>
|
|
24
|
+
#include <vector>
|
|
25
|
+
|
|
26
|
+
namespace dd {
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @brief Data structure for caching computed results of noise operations
|
|
30
|
+
* @tparam OperandType type of the operation's operand
|
|
31
|
+
* @tparam ResultType type of the operation's result
|
|
32
|
+
*/
|
|
33
|
+
template <class OperandType, class ResultType>
|
|
34
|
+
class DensityNoiseTable { // todo: Inherit from UnaryComputerTable
|
|
35
|
+
public:
|
|
36
|
+
/**
|
|
37
|
+
* Default constructor
|
|
38
|
+
* @param numBuckets Number of hash table buckets. Must be a power of two.
|
|
39
|
+
*/
|
|
40
|
+
explicit DensityNoiseTable(const size_t numBuckets = 32768U) {
|
|
41
|
+
// numBuckets must be a power of two
|
|
42
|
+
if ((numBuckets & (numBuckets - 1)) != 0) {
|
|
43
|
+
throw std::invalid_argument("Number of buckets must be a power of two.");
|
|
44
|
+
}
|
|
45
|
+
stats.entrySize = sizeof(Entry);
|
|
46
|
+
stats.numBuckets = numBuckets;
|
|
47
|
+
valid = std::vector(numBuckets, false);
|
|
48
|
+
table = std::vector<Entry>(numBuckets);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
struct Entry {
|
|
52
|
+
OperandType operand;
|
|
53
|
+
ResultType result;
|
|
54
|
+
std::vector<Qubit> usedQubits;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/// Get a reference to the table
|
|
58
|
+
[[nodiscard]] const auto& getTable() const { return table; }
|
|
59
|
+
|
|
60
|
+
/// Get a reference to the statistics
|
|
61
|
+
[[nodiscard]] const auto& getStats() const noexcept { return stats; }
|
|
62
|
+
|
|
63
|
+
[[nodiscard]] std::size_t hash(const OperandType& a,
|
|
64
|
+
const std::vector<Qubit>& usedQubits) const {
|
|
65
|
+
std::size_t i = 0;
|
|
66
|
+
for (const auto qubit : usedQubits) {
|
|
67
|
+
i = (i << 3U) + i * static_cast<std::size_t>(qubit) +
|
|
68
|
+
static_cast<std::size_t>(qubit);
|
|
69
|
+
}
|
|
70
|
+
const size_t mask = stats.numBuckets - 1;
|
|
71
|
+
return (std::hash<OperandType>{}(a) + i) & mask;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
void insert(const OperandType& operand, const ResultType& result,
|
|
75
|
+
const std::vector<Qubit>& usedQubits) {
|
|
76
|
+
const auto key = hash(operand, usedQubits);
|
|
77
|
+
if (valid[key]) {
|
|
78
|
+
++stats.collisions;
|
|
79
|
+
} else {
|
|
80
|
+
stats.trackInsert();
|
|
81
|
+
valid[key] = true;
|
|
82
|
+
}
|
|
83
|
+
table[key] = {operand, result, usedQubits};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
ResultType lookup(const OperandType& operand,
|
|
87
|
+
const std::vector<Qubit>& usedQubits) {
|
|
88
|
+
ResultType result{};
|
|
89
|
+
++stats.lookups;
|
|
90
|
+
const auto key = hash(operand, usedQubits);
|
|
91
|
+
|
|
92
|
+
if (!valid[key]) {
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
auto& entry = table[key];
|
|
97
|
+
if (entry.operand != operand) {
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
if (entry.usedQubits != usedQubits) {
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
++stats.hits;
|
|
104
|
+
return entry.result;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
void clear() { valid = std::vector(stats.numBuckets, false); }
|
|
108
|
+
|
|
109
|
+
private:
|
|
110
|
+
std::vector<Entry> table;
|
|
111
|
+
std::vector<bool> valid;
|
|
112
|
+
TableStatistics stats{};
|
|
113
|
+
};
|
|
114
|
+
} // namespace dd
|
|
@@ -0,0 +1,416 @@
|
|
|
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/Complex.hpp"
|
|
14
|
+
#include "dd/DDDefinitions.hpp"
|
|
15
|
+
|
|
16
|
+
#include <array>
|
|
17
|
+
#include <complex>
|
|
18
|
+
#include <cstddef>
|
|
19
|
+
#include <functional>
|
|
20
|
+
#include <string>
|
|
21
|
+
#include <type_traits>
|
|
22
|
+
#include <unordered_set>
|
|
23
|
+
|
|
24
|
+
namespace dd {
|
|
25
|
+
|
|
26
|
+
struct vNode;
|
|
27
|
+
struct mNode;
|
|
28
|
+
struct dNode;
|
|
29
|
+
class ComplexNumbers;
|
|
30
|
+
class MemoryManager;
|
|
31
|
+
|
|
32
|
+
template <typename T>
|
|
33
|
+
using isVector = std::enable_if_t<std::is_same_v<T, vNode>, bool>;
|
|
34
|
+
template <typename T>
|
|
35
|
+
using isMatrix = std::enable_if_t<std::is_same_v<T, mNode>, bool>;
|
|
36
|
+
template <typename T>
|
|
37
|
+
using isDensityMatrix = std::enable_if_t<std::is_same_v<T, dNode>, bool>;
|
|
38
|
+
template <typename T>
|
|
39
|
+
using isMatrixVariant =
|
|
40
|
+
std::enable_if_t<std::is_same_v<T, mNode> || std::is_same_v<T, dNode>,
|
|
41
|
+
bool>;
|
|
42
|
+
|
|
43
|
+
using AmplitudeFunc = std::function<void(std::size_t, const std::complex<fp>&)>;
|
|
44
|
+
using ProbabilityFunc = std::function<void(std::size_t, const fp&)>;
|
|
45
|
+
using MatrixEntryFunc =
|
|
46
|
+
std::function<void(std::size_t, std::size_t, const std::complex<fp>&)>;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @brief A weighted edge pointing to a DD node
|
|
50
|
+
* @details This struct is used to represent the core data structure of the DD
|
|
51
|
+
* package. It is a wrapper around a pointer to a DD node and a complex edge
|
|
52
|
+
* weight.
|
|
53
|
+
* @tparam Node Type of the DD node
|
|
54
|
+
*/
|
|
55
|
+
template <class Node> struct Edge {
|
|
56
|
+
Node* p;
|
|
57
|
+
Complex w;
|
|
58
|
+
|
|
59
|
+
/// Comparing two DD edges with another involves comparing the respective
|
|
60
|
+
/// pointers and checking whether the corresponding weights are "close enough"
|
|
61
|
+
/// according to a given tolerance this notion of equivalence is chosen to
|
|
62
|
+
/// counter floating point inaccuracies
|
|
63
|
+
constexpr bool operator==(const Edge& other) const {
|
|
64
|
+
return p == other.p && w.approximatelyEquals(other.w);
|
|
65
|
+
}
|
|
66
|
+
constexpr bool operator!=(const Edge& other) const {
|
|
67
|
+
return !operator==(other);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @brief Get the static zero terminal
|
|
72
|
+
* @return the zero terminal
|
|
73
|
+
*/
|
|
74
|
+
static constexpr Edge zero() { return terminal(Complex::zero()); }
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @brief Get the static one terminal
|
|
78
|
+
* @return the one terminal
|
|
79
|
+
*/
|
|
80
|
+
static constexpr Edge one() { return terminal(Complex::one()); }
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @brief Get a terminal DD with a given edge weight
|
|
84
|
+
* @param w the edge weight
|
|
85
|
+
* @return the terminal DD representing (w)
|
|
86
|
+
*/
|
|
87
|
+
[[nodiscard]] static constexpr Edge terminal(const Complex& w) {
|
|
88
|
+
return Edge{Node::getTerminal(), w};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @brief Check whether an edge requires tracking.
|
|
93
|
+
* @param e The edge to check.
|
|
94
|
+
* @return Whether the edge requires tracking.
|
|
95
|
+
*/
|
|
96
|
+
[[nodiscard]] static constexpr bool trackingRequired(const Edge& e) {
|
|
97
|
+
return !e.isTerminal() || !constants::isStaticNumber(e.w.r) ||
|
|
98
|
+
!constants::isStaticNumber(e.w.i);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @brief Check whether this is a terminal
|
|
103
|
+
* @return whether this is a terminal
|
|
104
|
+
*/
|
|
105
|
+
[[nodiscard]] constexpr bool isTerminal() const {
|
|
106
|
+
return Node::isTerminal(p);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @brief Check whether this is a zero terminal
|
|
111
|
+
* @return whether this is a zero terminal
|
|
112
|
+
*/
|
|
113
|
+
[[nodiscard]] constexpr bool isZeroTerminal() const {
|
|
114
|
+
return isTerminal() && w.exactlyZero();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @brief Check whether this is a one terminal
|
|
119
|
+
* @return whether this is a one terminal
|
|
120
|
+
*/
|
|
121
|
+
[[nodiscard]] constexpr bool isOneTerminal() const {
|
|
122
|
+
return isTerminal() && w.exactlyOne();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* @brief Get a single element of the vector or matrix represented by the DD
|
|
127
|
+
* @param numQubits number of qubits in the considered DD
|
|
128
|
+
* @param decisions string {0, 1, 2, 3}^n describing which outgoing edge
|
|
129
|
+
* should be followed (for vectors entries are limited to 0 and 1) If string
|
|
130
|
+
* is longer than required, the additional characters are ignored.
|
|
131
|
+
* @return the complex amplitude of the specified element
|
|
132
|
+
*/
|
|
133
|
+
[[nodiscard]] std::complex<fp>
|
|
134
|
+
getValueByPath(std::size_t numQubits, const std::string& decisions) const;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* @brief Get the size of the DD
|
|
138
|
+
* @details The size of a DD is defined as the number of nodes (including the
|
|
139
|
+
* terminal node) in the DD.
|
|
140
|
+
* @return the size of the DD
|
|
141
|
+
*/
|
|
142
|
+
[[nodiscard]] std::size_t size() const;
|
|
143
|
+
|
|
144
|
+
/// @brief Mark the edge as used.
|
|
145
|
+
void mark() const noexcept;
|
|
146
|
+
|
|
147
|
+
/// @brief Unmark the edge.
|
|
148
|
+
void unmark() const noexcept;
|
|
149
|
+
|
|
150
|
+
private:
|
|
151
|
+
/**
|
|
152
|
+
* @brief Recursively traverse the DD and count the number of nodes
|
|
153
|
+
* @param visited set of visited nodes
|
|
154
|
+
* @return the size of the DD
|
|
155
|
+
*/
|
|
156
|
+
[[nodiscard]] std::size_t
|
|
157
|
+
size(std::unordered_set<const Node*>& visited) const;
|
|
158
|
+
|
|
159
|
+
public:
|
|
160
|
+
/**
|
|
161
|
+
* @brief Get a normalized vector DD from a fresh node and a list of edges
|
|
162
|
+
* @tparam T template parameter to enable this function only for vNode
|
|
163
|
+
* @param p the fresh node
|
|
164
|
+
* @param e the list of edges that form the successor nodes
|
|
165
|
+
* @param mm a reference to the memory manager (for returning unused nodes)
|
|
166
|
+
* @param cn a reference to the complex number manager (for adding new
|
|
167
|
+
* complex numbers)
|
|
168
|
+
* @return the normalized vector DD
|
|
169
|
+
*/
|
|
170
|
+
template <typename T = Node, isVector<T> = true>
|
|
171
|
+
static auto normalize(Node* p, const std::array<Edge, RADIX>& e,
|
|
172
|
+
MemoryManager& mm, ComplexNumbers& cn) -> Edge;
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* @brief Get a single element of the vector represented by the DD
|
|
176
|
+
* @tparam T template parameter to enable this function only for vNode
|
|
177
|
+
* @param i index of the element
|
|
178
|
+
* @return the complex value of the amplitude
|
|
179
|
+
*/
|
|
180
|
+
template <typename T = Node, isVector<T> = true>
|
|
181
|
+
[[nodiscard]] std::complex<fp> getValueByIndex(std::size_t i) const;
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* @brief Get the vector represented by the DD
|
|
185
|
+
* @tparam T template parameter to enable this function only for vNode
|
|
186
|
+
* @param threshold amplitudes with a magnitude below this threshold will be
|
|
187
|
+
* ignored
|
|
188
|
+
* @return the vector
|
|
189
|
+
*/
|
|
190
|
+
template <typename T = Node, isVector<T> = true>
|
|
191
|
+
[[nodiscard]] CVec getVector(fp threshold = 0.) const;
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* @brief Get the sparse vector represented by the DD
|
|
195
|
+
* @tparam T template parameter to enable this function only for vNode
|
|
196
|
+
* @param threshold amplitudes with a magnitude below this threshold will be
|
|
197
|
+
* ignored
|
|
198
|
+
* @return the sparse vector
|
|
199
|
+
*/
|
|
200
|
+
template <typename T = Node, isVector<T> = true>
|
|
201
|
+
[[nodiscard]] SparseCVec getSparseVector(fp threshold = 0.) const;
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* @brief Print the vector represented by the DD
|
|
205
|
+
* @tparam T template parameter to enable this function only for vNode
|
|
206
|
+
* @note This function scales exponentially with the number of qubits.
|
|
207
|
+
*/
|
|
208
|
+
template <typename T = Node, isVector<T> = true> void printVector() const;
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* @brief Add the amplitudes of a vector DD to a vector
|
|
212
|
+
* @tparam T template parameter to enable this function only for vNode
|
|
213
|
+
* @param amplitudes the vector to add to
|
|
214
|
+
*/
|
|
215
|
+
template <typename T = Node, isVector<T> = true>
|
|
216
|
+
void addToVector(CVec& amplitudes) const;
|
|
217
|
+
|
|
218
|
+
private:
|
|
219
|
+
/**
|
|
220
|
+
* @brief Recursively traverse the DD and call a function for each non-zero
|
|
221
|
+
* amplitude.
|
|
222
|
+
* @details Scales with the number of non-zero amplitudes.
|
|
223
|
+
* @tparam T template parameter to enable this function only for vNode
|
|
224
|
+
* @param amp the accumulated amplitude from previous traversals
|
|
225
|
+
* @param i the current index in the vector
|
|
226
|
+
* @param f This function is called for each non-zero amplitude with the
|
|
227
|
+
* index and the amplitude as arguments.
|
|
228
|
+
* @param threshold amplitude with a magnitude below this threshold will be
|
|
229
|
+
* ignored
|
|
230
|
+
*/
|
|
231
|
+
template <typename T = Node, isVector<T> = true>
|
|
232
|
+
void traverseVector(const std::complex<fp>& amp, std::size_t i,
|
|
233
|
+
AmplitudeFunc f, fp threshold = 0.) const;
|
|
234
|
+
|
|
235
|
+
public:
|
|
236
|
+
/**
|
|
237
|
+
* @brief Get a normalized (density) matrix DD from a fresh node and a list
|
|
238
|
+
* of edges
|
|
239
|
+
* @tparam T template parameter to enable this function only for matrix nodes
|
|
240
|
+
* @param p the fresh node
|
|
241
|
+
* @param e the list of edges that form the successor nodes
|
|
242
|
+
* @param mm a reference to the memory manager (for returning unused nodes)
|
|
243
|
+
* @param cn a reference to the complex number manager (for adding new
|
|
244
|
+
* complex numbers)
|
|
245
|
+
* @return the normalized (density) matrix DD
|
|
246
|
+
*/
|
|
247
|
+
template <typename T = Node, isMatrixVariant<T> = true>
|
|
248
|
+
static auto normalize(Node* p, const std::array<Edge, NEDGE>& e,
|
|
249
|
+
MemoryManager& mm, ComplexNumbers& cn) -> Edge;
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* @brief Check whether the matrix represented by the DD is the identity
|
|
253
|
+
* @tparam T template parameter to enable this function only for matrix nodes
|
|
254
|
+
* @return whether the matrix is the identity
|
|
255
|
+
*/
|
|
256
|
+
template <typename T = Node, isMatrixVariant<T> = true>
|
|
257
|
+
[[nodiscard]] bool isIdentity(const bool upToGlobalPhase = true) const {
|
|
258
|
+
if (!isTerminal()) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
if (upToGlobalPhase) {
|
|
262
|
+
return !w.exactlyZero();
|
|
263
|
+
}
|
|
264
|
+
return w.exactlyOne();
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* @brief Get a single element of the matrix represented by the DD
|
|
269
|
+
* @tparam T template parameter to enable this function only for matrix nodes
|
|
270
|
+
* @param numQubits number of qubits in the considered DD
|
|
271
|
+
* @param i row index of the element
|
|
272
|
+
* @param j column index of the element
|
|
273
|
+
* @return the complex value of the entry
|
|
274
|
+
*/
|
|
275
|
+
template <typename T = Node, isMatrixVariant<T> = true>
|
|
276
|
+
[[nodiscard]] std::complex<fp>
|
|
277
|
+
getValueByIndex(std::size_t numQubits, std::size_t i, std::size_t j) const;
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* @brief Get the matrix represented by the DD
|
|
281
|
+
* @tparam T template parameter to enable this function only for matrix nodes
|
|
282
|
+
* @param numQubits number of qubits in the considered DD
|
|
283
|
+
* @param threshold entries with a magnitude below this threshold will be
|
|
284
|
+
* ignored
|
|
285
|
+
* @return the matrix
|
|
286
|
+
*/
|
|
287
|
+
template <typename T = Node, isMatrixVariant<T> = true>
|
|
288
|
+
[[nodiscard]] CMat getMatrix(std::size_t numQubits, fp threshold = 0.) const;
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* @brief Get the sparse matrix represented by the DD
|
|
292
|
+
* @tparam T template parameter to enable this function only for matrix nodes
|
|
293
|
+
* @param numQubits number of qubits in the considered DD
|
|
294
|
+
* @param threshold entries with a magnitude below this threshold will be
|
|
295
|
+
* ignored
|
|
296
|
+
* @return the sparse matrix
|
|
297
|
+
*/
|
|
298
|
+
template <typename T = Node, isMatrixVariant<T> = true>
|
|
299
|
+
[[nodiscard]] SparseCMat getSparseMatrix(std::size_t numQubits,
|
|
300
|
+
fp threshold = 0.) const;
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* @brief Print the matrix represented by the DD
|
|
304
|
+
* @tparam T template parameter to enable this function only for matrix nodes
|
|
305
|
+
* @param numQubits number of qubits in the considered DD
|
|
306
|
+
* @note This function scales exponentially with the number of qubits.
|
|
307
|
+
*/
|
|
308
|
+
template <typename T = Node, isMatrixVariant<T> = true>
|
|
309
|
+
void printMatrix(std::size_t numQubits) const;
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* @brief Recursively traverse the DD and call a function for each non-zero
|
|
313
|
+
* matrix entry.
|
|
314
|
+
* @tparam T template parameter to enable this function only for matrix nodes
|
|
315
|
+
* @param amp the accumulated amplitude from previous traversals
|
|
316
|
+
* @param i the current row index in the matrix
|
|
317
|
+
* @param j the current column index in the matrix
|
|
318
|
+
* @param f This function is called for each non-zero matrix entry with the
|
|
319
|
+
* row index, the column index and the amplitude as arguments.
|
|
320
|
+
* @param level the current level in the DD (ranges from 1 to n for regular
|
|
321
|
+
* nodes and is 0 for the terminal node)
|
|
322
|
+
* @param threshold entries with a magnitude below this threshold will be
|
|
323
|
+
* ignored
|
|
324
|
+
*/
|
|
325
|
+
template <typename T = Node, isMatrixVariant<T> = true>
|
|
326
|
+
void traverseMatrix(const std::complex<fp>& amp, std::size_t i, std::size_t j,
|
|
327
|
+
MatrixEntryFunc f, std::size_t level,
|
|
328
|
+
fp threshold = 0.) const;
|
|
329
|
+
|
|
330
|
+
template <typename T = Node, isDensityMatrix<T> = true>
|
|
331
|
+
[[maybe_unused]] static void setDensityConjugateTrue(Edge& e) {
|
|
332
|
+
Node::setConjugateTempFlagTrue(e.p);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
template <typename T = Node, isDensityMatrix<T> = true>
|
|
336
|
+
[[maybe_unused]] static void setFirstEdgeDensityPathTrue(Edge& e) {
|
|
337
|
+
Node::setNonReduceTempFlagTrue(e.p);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
template <typename T = Node, isDensityMatrix<T> = true>
|
|
341
|
+
static void setDensityMatrixTrue(Edge& e) {
|
|
342
|
+
Node::setDensityMatTempFlagTrue(e.p);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
template <typename T = Node, isDensityMatrix<T> = true>
|
|
346
|
+
static void alignDensityEdge(Edge& e) {
|
|
347
|
+
Node::alignDensityNode(e.p);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
template <typename T = Node, isDensityMatrix<T> = true>
|
|
351
|
+
static void revertDmChangesToEdges(Edge& x, Edge& y) {
|
|
352
|
+
revertDmChangesToEdge(x);
|
|
353
|
+
revertDmChangesToEdge(y);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
template <typename T = Node, isDensityMatrix<T> = true>
|
|
357
|
+
static void revertDmChangesToEdge(Edge& x) {
|
|
358
|
+
Node::revertDmChangesToNode(x.p);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
template <typename T = Node, isDensityMatrix<T> = true>
|
|
362
|
+
static void applyDmChangesToEdges(Edge& x, Edge& y) {
|
|
363
|
+
applyDmChangesToEdge(x);
|
|
364
|
+
applyDmChangesToEdge(y);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
template <typename T = Node, isDensityMatrix<T> = true>
|
|
368
|
+
static void applyDmChangesToEdge(Edge& x) {
|
|
369
|
+
Node::applyDmChangesToNode(x.p);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* @brief Get the sparse probability vector for the underlying density matrix
|
|
374
|
+
* @tparam T template parameter to enable this function only for dNode
|
|
375
|
+
* @param numQubits number of qubits in the considered DD
|
|
376
|
+
* @param threshold probabilities below this threshold will be ignored
|
|
377
|
+
* @return the sparse probability vector
|
|
378
|
+
*/
|
|
379
|
+
template <typename T = Node, isDensityMatrix<T> = true>
|
|
380
|
+
[[nodiscard]] SparsePVec getSparseProbabilityVector(std::size_t numQubits,
|
|
381
|
+
fp threshold = 0.) const;
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* @brief Get the sparse probability vector for the underlying density matrix
|
|
385
|
+
* @tparam T template parameter to enable this function only for dNode
|
|
386
|
+
* @param numQubits number of qubits in the considered DD
|
|
387
|
+
* @param threshold probabilities below this threshold will be ignored
|
|
388
|
+
* @return the sparse probability vector (using strings as keys)
|
|
389
|
+
*/
|
|
390
|
+
template <typename T = Node, isDensityMatrix<T> = true>
|
|
391
|
+
[[nodiscard]] SparsePVecStrKeys
|
|
392
|
+
getSparseProbabilityVectorStrKeys(std::size_t numQubits,
|
|
393
|
+
fp threshold = 0.) const;
|
|
394
|
+
|
|
395
|
+
private:
|
|
396
|
+
/**
|
|
397
|
+
* @brief Recursively traverse diagonal of the DD and call a function for each
|
|
398
|
+
* non-zero entry.
|
|
399
|
+
* @tparam T template parameter to enable this function only for dNode
|
|
400
|
+
* @param prob the accumulated probability from previous traversals
|
|
401
|
+
* @param i the current diagonal index in the matrix
|
|
402
|
+
* @param f This function is called for each non-zero entry with the
|
|
403
|
+
* diagonal index and the probability as arguments.
|
|
404
|
+
* @param level the current level in the DD (ranges from 1 to n for regular
|
|
405
|
+
* nodes and is 0 for the terminal node)
|
|
406
|
+
* @param threshold probabilities below this threshold will be ignored
|
|
407
|
+
*/
|
|
408
|
+
template <typename T = Node, isDensityMatrix<T> = true>
|
|
409
|
+
void traverseDiagonal(const fp& prob, std::size_t i, ProbabilityFunc f,
|
|
410
|
+
std::size_t level, fp threshold = 0.) const;
|
|
411
|
+
};
|
|
412
|
+
} // namespace dd
|
|
413
|
+
|
|
414
|
+
template <class Node> struct std::hash<dd::Edge<Node>> {
|
|
415
|
+
std::size_t operator()(dd::Edge<Node> const& e) const noexcept;
|
|
416
|
+
};
|