mqt-core 3.3.2__cp314-cp314t-macosx_11_0_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.
- mqt/core/__init__.py +77 -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/dd.cpython-314t-darwin.so +0 -0
- mqt/core/dd.pyi +1016 -0
- mqt/core/dd_evaluation.py +368 -0
- mqt/core/fomac.cpython-314t-darwin.so +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.cpython-314t-darwin.so +0 -0
- mqt/core/lib/libmqt-core-algorithms.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-algorithms.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-algorithms.dylib +0 -0
- mqt/core/lib/libmqt-core-circuit-optimizer.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-circuit-optimizer.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-circuit-optimizer.dylib +0 -0
- mqt/core/lib/libmqt-core-dd.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-dd.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-dd.dylib +0 -0
- mqt/core/lib/libmqt-core-ds.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-ds.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-ds.dylib +0 -0
- mqt/core/lib/libmqt-core-fomac.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-fomac.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-fomac.dylib +0 -0
- mqt/core/lib/libmqt-core-ir.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-ir.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-ir.dylib +0 -0
- mqt/core/lib/libmqt-core-na-fomac.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-na-fomac.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-na-fomac.dylib +0 -0
- mqt/core/lib/libmqt-core-na.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-na.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-na.dylib +0 -0
- mqt/core/lib/libmqt-core-qasm.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-qasm.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-qasm.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-driver.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-driver.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-driver.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device-gen.a +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device.dylib +0 -0
- mqt/core/lib/libmqt-core-zx.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-zx.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-zx.dylib +0 -0
- mqt/core/lib/libspdlog.a +0 -0
- mqt/core/lib/pkgconfig/spdlog.pc +13 -0
- mqt/core/na/__init__.py +12 -0
- mqt/core/na/fomac.cpython-314t-darwin.so +0 -0
- mqt/core/na/fomac.pyi +117 -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 +446 -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 +109 -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 +118 -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/METADATA +210 -0
- mqt_core-3.3.2.dist-info/RECORD +546 -0
- mqt_core-3.3.2.dist-info/WHEEL +6 -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
|
@@ -0,0 +1,438 @@
|
|
|
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
|
+
#include "dd/Edge.hpp"
|
|
16
|
+
#include "dd/Node.hpp"
|
|
17
|
+
#include "dd/RealNumber.hpp"
|
|
18
|
+
|
|
19
|
+
#include <cstdint>
|
|
20
|
+
#include <cstdlib>
|
|
21
|
+
#include <fstream>
|
|
22
|
+
#include <iostream>
|
|
23
|
+
#include <queue>
|
|
24
|
+
#include <sstream>
|
|
25
|
+
#include <stdexcept>
|
|
26
|
+
#include <string>
|
|
27
|
+
#include <unordered_map>
|
|
28
|
+
#include <unordered_set>
|
|
29
|
+
#include <vector>
|
|
30
|
+
|
|
31
|
+
namespace dd {
|
|
32
|
+
|
|
33
|
+
std::string colorFromPhase(const Complex& a);
|
|
34
|
+
|
|
35
|
+
fp thicknessFromMagnitude(const Complex& a);
|
|
36
|
+
|
|
37
|
+
void printPhaseFormatted(std::ostream& os, fp r);
|
|
38
|
+
|
|
39
|
+
std::string conditionalFormat(const Complex& a, bool formatAsPolar = true);
|
|
40
|
+
|
|
41
|
+
template <class Node>
|
|
42
|
+
static std::ostream& header(const Edge<Node>& e, std::ostream& os,
|
|
43
|
+
bool edgeLabels, bool formatAsPolar = true) {
|
|
44
|
+
os << "digraph \"DD\" {graph[];node[shape=plain];edge[arrowhead=none]\n";
|
|
45
|
+
os << "root [label=\"\",shape=point,style=invis]\n";
|
|
46
|
+
os << "t [label=<<font "
|
|
47
|
+
"point-size=\"20\">1</"
|
|
48
|
+
"font>>,shape=box,tooltip=\"1\",width=0.3,height=0.3]\n";
|
|
49
|
+
auto toplabel = (reinterpret_cast<std::uintptr_t>(e.p) & 0x001fffffU) >> 1U;
|
|
50
|
+
os << "root->";
|
|
51
|
+
if (e.isTerminal()) {
|
|
52
|
+
os << "t";
|
|
53
|
+
} else {
|
|
54
|
+
os << toplabel;
|
|
55
|
+
}
|
|
56
|
+
os << "[penwidth=\"" << thicknessFromMagnitude(e.w) << "\",tooltip=\""
|
|
57
|
+
<< conditionalFormat(e.w, formatAsPolar) << "\"";
|
|
58
|
+
if (!e.w.exactlyOne()) {
|
|
59
|
+
os << ",style=dashed";
|
|
60
|
+
}
|
|
61
|
+
if (edgeLabels) {
|
|
62
|
+
os << ",label=<<font point-size=\"8\"> "
|
|
63
|
+
<< conditionalFormat(e.w, formatAsPolar) << "</font>>";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
os << "]\n";
|
|
67
|
+
|
|
68
|
+
return os;
|
|
69
|
+
}
|
|
70
|
+
template <class Node>
|
|
71
|
+
static std::ostream& coloredHeader(const Edge<Node>& e, std::ostream& os,
|
|
72
|
+
bool edgeLabels, bool formatAsPolar = true) {
|
|
73
|
+
os << "digraph \"DD\" {graph[];node[shape=plain];edge[arrowhead=none]\n";
|
|
74
|
+
os << "root [label=\"\",shape=point,style=invis]\n";
|
|
75
|
+
os << "t [label=<<font "
|
|
76
|
+
"point-size=\"20\">1</"
|
|
77
|
+
"font>>,shape=box,tooltip=\"1\",width=0.3,height=0.3]\n";
|
|
78
|
+
|
|
79
|
+
auto toplabel = (reinterpret_cast<std::uintptr_t>(e.p) & 0x001fffffU) >> 1U;
|
|
80
|
+
auto mag = thicknessFromMagnitude(e.w);
|
|
81
|
+
auto color = colorFromPhase(e.w);
|
|
82
|
+
os << "root->";
|
|
83
|
+
if (e.isTerminal()) {
|
|
84
|
+
os << "t";
|
|
85
|
+
} else {
|
|
86
|
+
os << toplabel;
|
|
87
|
+
}
|
|
88
|
+
os << "[penwidth=\"" << mag << "\",tooltip=\""
|
|
89
|
+
<< conditionalFormat(e.w, formatAsPolar) << "\",color=\"" << color << "\"";
|
|
90
|
+
if (edgeLabels) {
|
|
91
|
+
os << ",label=<<font point-size=\"8\"> "
|
|
92
|
+
<< conditionalFormat(e.w, formatAsPolar) << "</font>>";
|
|
93
|
+
}
|
|
94
|
+
os << "]\n";
|
|
95
|
+
return os;
|
|
96
|
+
}
|
|
97
|
+
template <class Node>
|
|
98
|
+
static std::ostream& memoryHeader(const Edge<Node>& e, std::ostream& os,
|
|
99
|
+
bool edgeLabels) {
|
|
100
|
+
os << "digraph \"DD\" {graph[];node[shape=plain];edge[arrowhead=none]\n";
|
|
101
|
+
os << "root [label=\"\",shape=point,style=invis]\n";
|
|
102
|
+
os << "t [label=<<font "
|
|
103
|
+
"point-size=\"20\">1</"
|
|
104
|
+
"font>>,shape=box,tooltip=\"1\",width=0.3,height=0.3]\n";
|
|
105
|
+
|
|
106
|
+
auto toplabel = (reinterpret_cast<std::uintptr_t>(e.p) & 0x001fffffU) >> 1U;
|
|
107
|
+
auto mag = thicknessFromMagnitude(e.w);
|
|
108
|
+
auto color = colorFromPhase(e.w);
|
|
109
|
+
os << "root->";
|
|
110
|
+
if (e.isTerminal()) {
|
|
111
|
+
os << "t";
|
|
112
|
+
} else {
|
|
113
|
+
os << toplabel;
|
|
114
|
+
}
|
|
115
|
+
os << "[penwidth=\"" << mag << "\",tooltip=\"" << e.w.toString(false, 4)
|
|
116
|
+
<< "\" color=\"" << color << "\"";
|
|
117
|
+
if (edgeLabels) {
|
|
118
|
+
os << ",label=<<font point-size=\"8\"> [";
|
|
119
|
+
if (e.w.exactlyZero()) {
|
|
120
|
+
os << "0";
|
|
121
|
+
} else if (e.w.exactlyOne()) {
|
|
122
|
+
os << "1";
|
|
123
|
+
} else {
|
|
124
|
+
if (RealNumber::exactlyZero(e.w.r)) {
|
|
125
|
+
os << "0";
|
|
126
|
+
} else if (RealNumber::exactlySqrt2over2(e.w.r)) {
|
|
127
|
+
os << "\xe2\x88\x9a\xc2\xbd";
|
|
128
|
+
} else if (RealNumber::exactlyOne(e.w.r)) {
|
|
129
|
+
os << "1";
|
|
130
|
+
} else {
|
|
131
|
+
os << std::hex << reinterpret_cast<std::uintptr_t>(e.w.r) << std::dec;
|
|
132
|
+
}
|
|
133
|
+
os << " ";
|
|
134
|
+
if (RealNumber::exactlyZero(e.w.i)) {
|
|
135
|
+
os << "0";
|
|
136
|
+
} else if (RealNumber::exactlySqrt2over2(e.w.i)) {
|
|
137
|
+
os << "\xe2\x88\x9a\xc2\xbd";
|
|
138
|
+
} else if (RealNumber::exactlyOne(e.w.i)) {
|
|
139
|
+
os << "1";
|
|
140
|
+
} else {
|
|
141
|
+
os << std::hex << reinterpret_cast<std::uintptr_t>(e.w.i) << std::dec;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
os << "]</font>>";
|
|
145
|
+
}
|
|
146
|
+
os << "]\n";
|
|
147
|
+
return os;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
std::ostream& modernNode(const mEdge& e, std::ostream& os,
|
|
151
|
+
bool formatAsPolar = true);
|
|
152
|
+
std::ostream& modernNode(const vEdge& e, std::ostream& os,
|
|
153
|
+
bool formatAsPolar = true);
|
|
154
|
+
std::ostream& classicNode(const mEdge& e, std::ostream& os,
|
|
155
|
+
bool formatAsPolar = true);
|
|
156
|
+
std::ostream& classicNode(const vEdge& e, std::ostream& os,
|
|
157
|
+
bool formatAsPolar = true);
|
|
158
|
+
template <class Node>
|
|
159
|
+
static std::ostream& memoryNode(const Edge<Node>& e, std::ostream& os) {
|
|
160
|
+
constexpr std::size_t n = std::tuple_size_v<decltype(e.p->e)>;
|
|
161
|
+
auto nodelabel = (reinterpret_cast<std::uintptr_t>(e.p) & 0x001fffffU) >>
|
|
162
|
+
1U; // this allows for 2^20 (roughly 1e6) unique nodes
|
|
163
|
+
os << nodelabel << "[label=<";
|
|
164
|
+
os << R"(<font point-size="10"><table border="1" cellspacing="0" cellpadding="2" style="rounded">)";
|
|
165
|
+
os << R"(<tr><td colspan=")" << n << R"(" border="1" sides="B">)" << std::hex
|
|
166
|
+
<< reinterpret_cast<std::uintptr_t>(e.p) << std::dec << "</td></tr>";
|
|
167
|
+
os << "<tr>";
|
|
168
|
+
for (std::size_t i = 0; i < n; ++i) {
|
|
169
|
+
os << "<td port=\"" << i << R"(" href="javascript:;" border="0" tooltip=")"
|
|
170
|
+
<< e.p->e[i].w.toString(false, 4) << "\">";
|
|
171
|
+
if (e.p->e[i].isZeroTerminal()) {
|
|
172
|
+
os << " 0 "
|
|
173
|
+
"";
|
|
174
|
+
} else {
|
|
175
|
+
os << "<font color=\"white\"> 0 </font>";
|
|
176
|
+
}
|
|
177
|
+
os << "</td>";
|
|
178
|
+
}
|
|
179
|
+
os << "</tr>";
|
|
180
|
+
os << "</table></font>>,tooltip=\"" << std::hex
|
|
181
|
+
<< reinterpret_cast<std::uintptr_t>(e.p) << "\"]\n"
|
|
182
|
+
<< std::dec;
|
|
183
|
+
return os;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
std::ostream& bwEdge(const mEdge& from, const mEdge& to, std::uint16_t idx,
|
|
187
|
+
std::ostream& os, bool edgeLabels = false,
|
|
188
|
+
bool classic = false, bool formatAsPolar = true);
|
|
189
|
+
std::ostream& bwEdge(const vEdge& from, const vEdge& to, std::uint16_t idx,
|
|
190
|
+
std::ostream& os, bool edgeLabels = false,
|
|
191
|
+
bool classic = false, bool formatAsPolar = true);
|
|
192
|
+
std::ostream& coloredEdge(const mEdge& from, const mEdge& to, std::uint16_t idx,
|
|
193
|
+
std::ostream& os, bool edgeLabels = false,
|
|
194
|
+
bool classic = false, bool formatAsPolar = true);
|
|
195
|
+
std::ostream& coloredEdge(const vEdge& from, const vEdge& to, std::uint16_t idx,
|
|
196
|
+
std::ostream& os, bool edgeLabels = false,
|
|
197
|
+
bool classic = false, bool formatAsPolar = true);
|
|
198
|
+
template <class Node>
|
|
199
|
+
static std::ostream& memoryEdge(const Edge<Node>& from, const Edge<Node>& to,
|
|
200
|
+
std::uint16_t idx, std::ostream& os,
|
|
201
|
+
bool edgeLabels = false) {
|
|
202
|
+
auto fromlabel =
|
|
203
|
+
(reinterpret_cast<std::uintptr_t>(from.p) & 0x001fffffU) >> 1U;
|
|
204
|
+
auto tolabel = (reinterpret_cast<std::uintptr_t>(to.p) & 0x001fffffU) >> 1U;
|
|
205
|
+
|
|
206
|
+
os << fromlabel << ":" << idx << ":s->";
|
|
207
|
+
if (to.isTerminal()) {
|
|
208
|
+
os << "t";
|
|
209
|
+
} else {
|
|
210
|
+
os << tolabel;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
auto mag = thicknessFromMagnitude(to.w);
|
|
214
|
+
auto color = colorFromPhase(to.w);
|
|
215
|
+
os << "[penwidth=\"" << mag << "\",tooltip=\"" << to.w.toString(false, 4)
|
|
216
|
+
<< "\" color=\"" << color << "\"";
|
|
217
|
+
if (edgeLabels) {
|
|
218
|
+
os << ",label=<<font point-size=\"8\"> [";
|
|
219
|
+
if (to.w.exactlyOne()) {
|
|
220
|
+
os << "1";
|
|
221
|
+
} else {
|
|
222
|
+
if (RealNumber::exactlyZero(to.w.r)) {
|
|
223
|
+
os << "0";
|
|
224
|
+
} else if (RealNumber::exactlySqrt2over2(to.w.r)) {
|
|
225
|
+
os << "\xe2\x88\x9a\xc2\xbd";
|
|
226
|
+
} else if (RealNumber::exactlyOne(to.w.r)) {
|
|
227
|
+
os << "1";
|
|
228
|
+
} else {
|
|
229
|
+
os << std::hex << reinterpret_cast<std::uintptr_t>(to.w.r) << std::dec;
|
|
230
|
+
}
|
|
231
|
+
os << " ";
|
|
232
|
+
if (RealNumber::exactlyZero(to.w.i)) {
|
|
233
|
+
os << "0";
|
|
234
|
+
} else if (RealNumber::exactlySqrt2over2(to.w.i)) {
|
|
235
|
+
os << "\xe2\x88\x9a\xc2\xbd";
|
|
236
|
+
} else if (RealNumber::exactlyOne(to.w.i)) {
|
|
237
|
+
os << "1";
|
|
238
|
+
} else {
|
|
239
|
+
os << std::hex << reinterpret_cast<std::uintptr_t>(to.w.i) << std::dec;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
os << "]</font>>";
|
|
243
|
+
}
|
|
244
|
+
os << "]\n";
|
|
245
|
+
|
|
246
|
+
return os;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
template <class Node>
|
|
250
|
+
static void toDot(const Edge<Node>& e, std::ostream& os, bool colored = true,
|
|
251
|
+
bool edgeLabels = false, bool classic = false,
|
|
252
|
+
bool memory = false, bool formatAsPolar = true) {
|
|
253
|
+
std::ostringstream oss{};
|
|
254
|
+
// header, root and terminal declaration
|
|
255
|
+
|
|
256
|
+
if (memory) {
|
|
257
|
+
memoryHeader(e, oss, edgeLabels);
|
|
258
|
+
} else if (colored) {
|
|
259
|
+
coloredHeader(e, oss, edgeLabels, formatAsPolar);
|
|
260
|
+
} else {
|
|
261
|
+
header(e, oss, edgeLabels, formatAsPolar);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
std::unordered_set<decltype(e.p)> nodes{};
|
|
265
|
+
|
|
266
|
+
auto priocmp = [](const Edge<Node>* left, const Edge<Node>* right) {
|
|
267
|
+
if (left->p == nullptr) {
|
|
268
|
+
return right->p != nullptr;
|
|
269
|
+
}
|
|
270
|
+
if (right->p == nullptr) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
return left->p->v < right->p->v;
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
std::priority_queue<const Edge<Node>*, std::vector<const Edge<Node>*>,
|
|
277
|
+
decltype(priocmp)>
|
|
278
|
+
q(priocmp);
|
|
279
|
+
q.push(&e);
|
|
280
|
+
|
|
281
|
+
// bfs until finished
|
|
282
|
+
while (!q.empty()) {
|
|
283
|
+
auto node = q.top();
|
|
284
|
+
q.pop();
|
|
285
|
+
|
|
286
|
+
// base case
|
|
287
|
+
if (node->isTerminal()) {
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// check if node has already been processed
|
|
292
|
+
auto ret = nodes.emplace(node->p);
|
|
293
|
+
if (!ret.second) {
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// node definition as HTML-like label (href="javascript:;" is used as
|
|
298
|
+
// workaround to make tooltips work)
|
|
299
|
+
if (memory) {
|
|
300
|
+
memoryNode(*node, oss);
|
|
301
|
+
} else if (classic) {
|
|
302
|
+
classicNode(*node, oss, formatAsPolar);
|
|
303
|
+
} else {
|
|
304
|
+
modernNode(*node, oss, formatAsPolar);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// iterate over edges in reverse to guarantee correct processing order
|
|
308
|
+
for (auto i = static_cast<std::int16_t>(node->p->e.size() - 1); i >= 0;
|
|
309
|
+
--i) {
|
|
310
|
+
auto& edge = node->p->e[static_cast<std::size_t>(i)];
|
|
311
|
+
if ((!memory && edge.w.approximatelyZero()) || edge.w.exactlyZero()) {
|
|
312
|
+
// potentially add zero stubs here
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// non-zero edge to be included
|
|
317
|
+
q.push(&edge);
|
|
318
|
+
|
|
319
|
+
if (memory) {
|
|
320
|
+
memoryEdge(*node, edge, static_cast<std::uint16_t>(i), oss, edgeLabels);
|
|
321
|
+
} else if (colored) {
|
|
322
|
+
coloredEdge(*node, edge, static_cast<std::uint16_t>(i), oss, edgeLabels,
|
|
323
|
+
classic, formatAsPolar);
|
|
324
|
+
} else {
|
|
325
|
+
bwEdge(*node, edge, static_cast<std::uint16_t>(i), oss, edgeLabels,
|
|
326
|
+
classic, formatAsPolar);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
oss << "}\n";
|
|
331
|
+
|
|
332
|
+
os << oss.str() << std::flush;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
template <class Node>
|
|
336
|
+
[[maybe_unused]] static void
|
|
337
|
+
export2Dot(Edge<Node> basic, const std::string& outputFilename,
|
|
338
|
+
bool colored = true, bool edgeLabels = false, bool classic = false,
|
|
339
|
+
bool memory = false, bool show = true, bool formatAsPolar = true) {
|
|
340
|
+
std::ofstream init(outputFilename);
|
|
341
|
+
toDot(basic, init, colored, edgeLabels, classic, memory, formatAsPolar);
|
|
342
|
+
init.close();
|
|
343
|
+
|
|
344
|
+
if (show) {
|
|
345
|
+
std::ostringstream oss;
|
|
346
|
+
oss << "dot -Tsvg " << outputFilename << " -o "
|
|
347
|
+
<< outputFilename.substr(0, outputFilename.find_last_of('.')) << ".svg";
|
|
348
|
+
const auto str =
|
|
349
|
+
oss.str(); // required to avoid immediate deallocation of temporary
|
|
350
|
+
const auto exitCode = std::system(str.c_str());
|
|
351
|
+
if (exitCode != 0) {
|
|
352
|
+
std::cerr << "Error: dot returned with exit code " << exitCode << "\n";
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
///
|
|
358
|
+
/// Serialization
|
|
359
|
+
/// Note: do not rely on the binary format being portable across different
|
|
360
|
+
/// architectures/platforms
|
|
361
|
+
///
|
|
362
|
+
|
|
363
|
+
void serialize(const vEdge& basic, std::ostream& os, bool writeBinary = false);
|
|
364
|
+
|
|
365
|
+
void serializeMatrix(const mEdge& basic, std::int64_t& idx,
|
|
366
|
+
std::unordered_map<mNode*, std::int64_t>& nodeIndex,
|
|
367
|
+
std::unordered_set<mNode*>& visited, std::ostream& os,
|
|
368
|
+
bool writeBinary = false);
|
|
369
|
+
void serialize(const mEdge& basic, std::ostream& os, bool writeBinary = false);
|
|
370
|
+
template <class Node>
|
|
371
|
+
static void serialize(const Edge<Node>& basic,
|
|
372
|
+
const std::string& outputFilename,
|
|
373
|
+
bool writeBinary = false) {
|
|
374
|
+
std::ofstream ofs = std::ofstream(outputFilename, std::ios::binary);
|
|
375
|
+
|
|
376
|
+
if (!ofs.good()) {
|
|
377
|
+
throw std::invalid_argument("Cannot open file: " + outputFilename);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
serialize(basic, ofs, writeBinary);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
template <typename Node>
|
|
384
|
+
static void exportEdgeWeights(const Edge<Node>& edge, std::ostream& stream) {
|
|
385
|
+
struct Priocmp {
|
|
386
|
+
bool operator()(const Edge<Node>* left, const Edge<Node>* right) {
|
|
387
|
+
if (left->p == nullptr) {
|
|
388
|
+
return right->p != nullptr;
|
|
389
|
+
}
|
|
390
|
+
if (right->p == nullptr) {
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
return left->p->v < right->p->v;
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
stream << std::showpos << RealNumber::val(edge.w.r)
|
|
397
|
+
<< RealNumber::val(edge.w.i) << std::noshowpos << "i\n";
|
|
398
|
+
|
|
399
|
+
std::unordered_set<decltype(edge.p)> nodes{};
|
|
400
|
+
|
|
401
|
+
std::priority_queue<const Edge<Node>*, std::vector<const Edge<Node>*>,
|
|
402
|
+
Priocmp>
|
|
403
|
+
q;
|
|
404
|
+
q.push(&edge);
|
|
405
|
+
|
|
406
|
+
// bfs until finished
|
|
407
|
+
while (!q.empty()) {
|
|
408
|
+
auto edgePtr = q.top();
|
|
409
|
+
q.pop();
|
|
410
|
+
|
|
411
|
+
// base case
|
|
412
|
+
if (edgePtr->isTerminal()) {
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// check if edgePtr has already been processed
|
|
417
|
+
if (auto ret = nodes.emplace(edgePtr->p); !ret.second) {
|
|
418
|
+
continue;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// iterate over edges in reverse to guarantee correct processing order
|
|
422
|
+
for (auto i = static_cast<std::int16_t>(edgePtr->p->e.size() - 1); i >= 0;
|
|
423
|
+
--i) {
|
|
424
|
+
auto& child = edgePtr->p->e[static_cast<std::size_t>(i)];
|
|
425
|
+
if (child.w.approximatelyZero()) {
|
|
426
|
+
// potentially add zero stubs here
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// non-zero child to be included
|
|
431
|
+
q.push(&child);
|
|
432
|
+
stream << std::showpos << RealNumber::val(child.w.r)
|
|
433
|
+
<< RealNumber::val(child.w.i) << std::noshowpos << "i\n";
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
} // namespace dd
|
|
@@ -0,0 +1,75 @@
|
|
|
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/Package_fwd.hpp"
|
|
14
|
+
|
|
15
|
+
namespace qc {
|
|
16
|
+
class QuantumComputation;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
namespace dd {
|
|
20
|
+
/**
|
|
21
|
+
* @brief Sequentially build a decision diagram representation for the
|
|
22
|
+
* functionality of a purely-quantum @ref qc::QuantumComputation.
|
|
23
|
+
*
|
|
24
|
+
* @details For a circuit \f$G\f$ with \f$|G|\f$ gates
|
|
25
|
+
* \f$g_0, g_1, \ldots, g_{|G|-1}\f$, the functionality of \f$G\f$ is defined as
|
|
26
|
+
* the unitary matrix \f$U\f$ such that
|
|
27
|
+
* \f[
|
|
28
|
+
* U = U_{|G|-1}) \cdot U_{|G|-2} \cdot \ldots \cdot U_1 \cdot U_0,
|
|
29
|
+
* \f]
|
|
30
|
+
* where \f$U_i\f$ is the unitary matrix corresponding to gate \f$g_i\f$.
|
|
31
|
+
* For an \f$n\f$-qubit quantum computation, \f$U\f$ is a \f$2^n \times 2^n\f$
|
|
32
|
+
* matrix.
|
|
33
|
+
*
|
|
34
|
+
* By representing every single operation in the circuit as a decision diagram
|
|
35
|
+
* instead of a unitary matrix and performing the matrix multiplication directly
|
|
36
|
+
* using decision diagrams, a representation of the functionality of a quantum
|
|
37
|
+
* computation can oftentimes be computed more efficiently in terms of memory
|
|
38
|
+
* and runtime.
|
|
39
|
+
*
|
|
40
|
+
* This function effectively computes
|
|
41
|
+
* \f[
|
|
42
|
+
* DD(U) = DD(g_{|G|-1}) \otimes DD(g_{|G|-2}) \otimes \ldots \otimes DD(g_0)
|
|
43
|
+
* \f]
|
|
44
|
+
* by sequentially applying the decision diagrams of the gates in the circuit to
|
|
45
|
+
* the current decision diagram representing the functionality of the quantum
|
|
46
|
+
* computation.
|
|
47
|
+
*
|
|
48
|
+
* @param qc The quantum computation to construct the functionality for
|
|
49
|
+
* @param dd The DD package to use for the construction
|
|
50
|
+
* @return The matrix diagram representing the functionality of the quantum
|
|
51
|
+
* computation
|
|
52
|
+
*/
|
|
53
|
+
MatrixDD buildFunctionality(const qc::QuantumComputation& qc, Package& dd);
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @brief Recursively build a decision diagram representation for the
|
|
57
|
+
* functionality of a purely-quantum @ref qc::QuantumComputation.
|
|
58
|
+
*
|
|
59
|
+
* @see buildFunctionality
|
|
60
|
+
* @details Instead of sequentially applying the decision diagrams of the gates
|
|
61
|
+
* in the circuit, this function builds a binary computation tree out of the
|
|
62
|
+
* decision diagrams of the gates in the circuit.
|
|
63
|
+
* This results in a recursive pairwise grouping that can be more memory and
|
|
64
|
+
* runtime efficient compared to the sequential approach.
|
|
65
|
+
* @see https://arxiv.org/abs/2103.08281
|
|
66
|
+
*
|
|
67
|
+
* @param qc The quantum computation to construct the functionality for
|
|
68
|
+
* @param dd The DD package to use for the construction
|
|
69
|
+
* @return The matrix diagram representing the functionality of the quantum
|
|
70
|
+
* computation
|
|
71
|
+
*/
|
|
72
|
+
MatrixDD buildFunctionalityRecursive(const qc::QuantumComputation& qc,
|
|
73
|
+
Package& dd);
|
|
74
|
+
|
|
75
|
+
} // namespace dd
|
|
@@ -0,0 +1,43 @@
|
|
|
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 "ir/operations/OpType.hpp"
|
|
15
|
+
|
|
16
|
+
#include <vector>
|
|
17
|
+
|
|
18
|
+
namespace dd {
|
|
19
|
+
|
|
20
|
+
/// Single-qubit gate matrix for collapsing a qubit to the |0> state
|
|
21
|
+
constexpr GateMatrix MEAS_ZERO_MAT{1, 0, 0, 0};
|
|
22
|
+
/// Single-qubit gate matrix for collapsing a qubit to the |1> state
|
|
23
|
+
constexpr GateMatrix MEAS_ONE_MAT{0, 0, 0, 1};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @brief Converts a given quantum operation to a single-qubit gate matrix
|
|
27
|
+
* @param t The quantum operation to convert
|
|
28
|
+
* @param params The parameters of the quantum operation
|
|
29
|
+
* @return The single-qubit gate matrix representation of the quantum operation
|
|
30
|
+
*/
|
|
31
|
+
GateMatrix opToSingleQubitGateMatrix(qc::OpType t,
|
|
32
|
+
const std::vector<fp>& params = {});
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @brief Converts a given quantum operation to a two-qubit gate matrix
|
|
36
|
+
* @param t The quantum operation to convert
|
|
37
|
+
* @param params The parameters of the quantum operation
|
|
38
|
+
* @return The two-qubit gate matrix representation of the quantum operation
|
|
39
|
+
*/
|
|
40
|
+
TwoQubitGateMatrix opToTwoQubitGateMatrix(qc::OpType t,
|
|
41
|
+
const std::vector<fp>& params = {});
|
|
42
|
+
|
|
43
|
+
} // namespace dd
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
/** @file
|
|
12
|
+
* @brief Linked list functionality required for UniqueTable and MemoryManager.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
#pragma once
|
|
16
|
+
|
|
17
|
+
namespace dd {
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @brief A class to provide a base for linked list objects
|
|
21
|
+
*/
|
|
22
|
+
struct LLBase {
|
|
23
|
+
/**
|
|
24
|
+
* @brief The pointer to the next object
|
|
25
|
+
* @details The next pointer is used to form linked lists of objects.
|
|
26
|
+
* Classes used in a linked list must solely inherit from this class.
|
|
27
|
+
* Other code in mqt-core relies on the assumption that all objects in a
|
|
28
|
+
* linked list are of the same type.
|
|
29
|
+
*/
|
|
30
|
+
LLBase* next_ = nullptr;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @brief Default getter for the next object
|
|
34
|
+
* @details Classes that inherit from LLBase should implement their own next()
|
|
35
|
+
* method to return the next object in the list with a specialized return
|
|
36
|
+
* type.
|
|
37
|
+
* @return LLBase*
|
|
38
|
+
*/
|
|
39
|
+
[[nodiscard]] LLBase* next() const noexcept { return next_; }
|
|
40
|
+
|
|
41
|
+
/// Setter for the next object
|
|
42
|
+
void setNext(LLBase* n) noexcept { next_ = n; }
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
} // namespace dd
|