mqt-core 3.3.2__cp312-cp312-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mqt/core/__init__.py +89 -0
- mqt/core/__main__.py +55 -0
- mqt/core/_commands.py +52 -0
- mqt/core/_compat/__init__.py +11 -0
- mqt/core/_compat/typing.py +29 -0
- mqt/core/_version.py +34 -0
- mqt/core/_version.pyi +12 -0
- mqt/core/bin/mqt-core-algorithms.dll +0 -0
- mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
- mqt/core/bin/mqt-core-dd.dll +0 -0
- mqt/core/bin/mqt-core-ds.dll +0 -0
- mqt/core/bin/mqt-core-fomac.dll +0 -0
- mqt/core/bin/mqt-core-ir.dll +0 -0
- mqt/core/bin/mqt-core-na-fomac.dll +0 -0
- mqt/core/bin/mqt-core-na.dll +0 -0
- mqt/core/bin/mqt-core-qasm.dll +0 -0
- mqt/core/bin/mqt-core-qdmi-driver.dll +0 -0
- mqt/core/bin/mqt-core-qdmi-na-device.dll +0 -0
- mqt/core/bin/mqt-core-zx.dll +0 -0
- mqt/core/dd.cp312-win_amd64.pyd +0 -0
- mqt/core/dd.pyi +1016 -0
- mqt/core/dd_evaluation.py +368 -0
- mqt/core/fomac.cp312-win_amd64.pyd +0 -0
- mqt/core/fomac.pyi +125 -0
- mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
- mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
- mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
- mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
- mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
- mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
- mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
- mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
- mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
- mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
- mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
- mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
- mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
- mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
- mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
- mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
- mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
- mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
- mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
- mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
- mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
- mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
- mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
- mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
- mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
- mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
- mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
- mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
- mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
- mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
- mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
- mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
- mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
- mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
- mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
- mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
- mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
- mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
- mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
- mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
- mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
- mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
- mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
- mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
- mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
- mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
- mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
- mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
- mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
- mqt/core/include/mqt-core/boost/config.hpp +67 -0
- mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
- mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
- mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
- mqt/core/include/mqt-core/boost/limits.hpp +146 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
- mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
- mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
- mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
- mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
- mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
- mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
- mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
- mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
- mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
- mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
- mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
- mqt/core/include/mqt-core/boost/version.hpp +32 -0
- mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +119 -0
- mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
- mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
- mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
- mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
- mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
- mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
- mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
- mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
- mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
- mqt/core/include/mqt-core/dd/CachedEdge.hpp +174 -0
- mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
- mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
- mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
- mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
- mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
- mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
- mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
- mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
- mqt/core/include/mqt-core/dd/Export.hpp +438 -0
- mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
- mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
- mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
- mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
- mqt/core/include/mqt-core/dd/Node.hpp +223 -0
- mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
- mqt/core/include/mqt-core/dd/Operations.hpp +306 -0
- mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
- mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
- mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
- mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
- mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
- mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
- mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
- mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
- mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
- mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
- mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
- mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
- mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
- mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
- mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
- mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
- mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
- mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
- mqt/core/include/mqt-core/ir/QuantumComputation.hpp +596 -0
- mqt/core/include/mqt-core/ir/Register.hpp +125 -0
- mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
- mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
- mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +212 -0
- mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
- mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
- mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
- mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
- mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
- mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
- mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
- mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
- mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
- mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
- mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
- mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
- mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
- mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
- mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
- mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
- mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
- mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
- mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
- mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
- mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
- mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
- mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
- mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
- mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
- mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
- mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
- mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
- mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
- mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
- mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
- mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
- mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
- mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
- mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
- mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
- mqt/core/include/mqt-core/qasm3/StdGates.hpp +232 -0
- mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
- mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
- mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
- mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
- mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
- mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
- mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
- mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
- mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
- mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
- mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
- mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
- mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
- mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
- mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
- mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
- mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
- mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
- mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
- mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
- mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
- mqt/core/include/nlohmann/detail/hash.hpp +129 -0
- mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
- mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
- mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
- mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
- mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
- mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
- mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
- mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
- mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
- mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
- mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
- mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
- mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
- mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
- mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
- mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
- mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
- mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
- mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
- mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
- mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
- mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
- mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
- mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
- mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
- mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
- mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
- mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
- mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
- mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
- mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
- mqt/core/include/nlohmann/json.hpp +5306 -0
- mqt/core/include/nlohmann/json_fwd.hpp +75 -0
- mqt/core/include/nlohmann/ordered_map.hpp +359 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
- mqt/core/include/qdmi/qdmi/client.h +990 -0
- mqt/core/include/qdmi/qdmi/constants.h +1139 -0
- mqt/core/include/qdmi/qdmi/device.h +602 -0
- mqt/core/include/qdmi/qdmi/types.h +78 -0
- mqt/core/include/spdlog/async.h +99 -0
- mqt/core/include/spdlog/async_logger-inl.h +84 -0
- mqt/core/include/spdlog/async_logger.h +74 -0
- mqt/core/include/spdlog/cfg/argv.h +40 -0
- mqt/core/include/spdlog/cfg/env.h +36 -0
- mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
- mqt/core/include/spdlog/cfg/helpers.h +29 -0
- mqt/core/include/spdlog/common-inl.h +68 -0
- mqt/core/include/spdlog/common.h +406 -0
- mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
- mqt/core/include/spdlog/details/backtracer.h +45 -0
- mqt/core/include/spdlog/details/circular_q.h +115 -0
- mqt/core/include/spdlog/details/console_globals.h +28 -0
- mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
- mqt/core/include/spdlog/details/file_helper.h +61 -0
- mqt/core/include/spdlog/details/fmt_helper.h +141 -0
- mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
- mqt/core/include/spdlog/details/log_msg.h +40 -0
- mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
- mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
- mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
- mqt/core/include/spdlog/details/null_mutex.h +35 -0
- mqt/core/include/spdlog/details/os-inl.h +606 -0
- mqt/core/include/spdlog/details/os.h +127 -0
- mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
- mqt/core/include/spdlog/details/periodic_worker.h +58 -0
- mqt/core/include/spdlog/details/registry-inl.h +270 -0
- mqt/core/include/spdlog/details/registry.h +131 -0
- mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
- mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
- mqt/core/include/spdlog/details/tcp_client.h +127 -0
- mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
- mqt/core/include/spdlog/details/thread_pool.h +117 -0
- mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
- mqt/core/include/spdlog/details/udp_client.h +81 -0
- mqt/core/include/spdlog/details/windows_include.h +11 -0
- mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
- mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
- mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
- mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
- mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
- mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
- mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
- mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
- mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
- mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
- mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
- mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
- mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
- mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
- mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
- mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
- mqt/core/include/spdlog/fmt/chrono.h +23 -0
- mqt/core/include/spdlog/fmt/compile.h +23 -0
- mqt/core/include/spdlog/fmt/fmt.h +30 -0
- mqt/core/include/spdlog/fmt/ostr.h +23 -0
- mqt/core/include/spdlog/fmt/ranges.h +23 -0
- mqt/core/include/spdlog/fmt/std.h +24 -0
- mqt/core/include/spdlog/fmt/xchar.h +23 -0
- mqt/core/include/spdlog/formatter.h +17 -0
- mqt/core/include/spdlog/fwd.h +18 -0
- mqt/core/include/spdlog/logger-inl.h +198 -0
- mqt/core/include/spdlog/logger.h +379 -0
- mqt/core/include/spdlog/mdc.h +52 -0
- mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
- mqt/core/include/spdlog/pattern_formatter.h +118 -0
- mqt/core/include/spdlog/sinks/android_sink.h +137 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
- mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
- mqt/core/include/spdlog/sinks/base_sink.h +51 -0
- mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
- mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
- mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
- mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
- mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
- mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
- mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
- mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
- mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
- mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
- mqt/core/include/spdlog/sinks/null_sink.h +41 -0
- mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
- mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
- mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
- mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
- mqt/core/include/spdlog/sinks/sink.h +34 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
- mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
- mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
- mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
- mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
- mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
- mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
- mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
- mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
- mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
- mqt/core/include/spdlog/spdlog-inl.h +96 -0
- mqt/core/include/spdlog/spdlog.h +357 -0
- mqt/core/include/spdlog/stopwatch.h +66 -0
- mqt/core/include/spdlog/tweakme.h +148 -0
- mqt/core/include/spdlog/version.h +11 -0
- mqt/core/ir/__init__.pyi +2078 -0
- mqt/core/ir/operations.pyi +1011 -0
- mqt/core/ir/registers.pyi +91 -0
- mqt/core/ir/symbolic.pyi +177 -0
- mqt/core/ir.cp312-win_amd64.pyd +0 -0
- mqt/core/lib/mqt-core-algorithms.lib +0 -0
- mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
- mqt/core/lib/mqt-core-dd.lib +0 -0
- mqt/core/lib/mqt-core-ds.lib +0 -0
- mqt/core/lib/mqt-core-fomac.lib +0 -0
- mqt/core/lib/mqt-core-ir.lib +0 -0
- mqt/core/lib/mqt-core-na-fomac.lib +0 -0
- mqt/core/lib/mqt-core-na.lib +0 -0
- mqt/core/lib/mqt-core-qasm.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-driver.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-na-device-gen.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-na-device.lib +0 -0
- mqt/core/lib/mqt-core-zx.lib +0 -0
- mqt/core/lib/pkgconfig/spdlog.pc +13 -0
- mqt/core/lib/spdlog.lib +0 -0
- mqt/core/na/__init__.py +12 -0
- mqt/core/na/fomac.cp312-win_amd64.pyd +0 -0
- mqt/core/na/fomac.pyi +117 -0
- mqt/core/nlohmann_json.natvis +278 -0
- mqt/core/plugins/__init__.py +9 -0
- mqt/core/plugins/qiskit/__init__.py +19 -0
- mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
- mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
- mqt/core/py.typed +2 -0
- mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
- mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
- mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
- mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -0
- mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
- mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +52 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +445 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +110 -0
- mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
- mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
- mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
- mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
- mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
- mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
- mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +121 -0
- mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
- mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
- mqt_core-3.3.2.dist-info/DELVEWHEEL +2 -0
- mqt_core-3.3.2.dist-info/METADATA +210 -0
- mqt_core-3.3.2.dist-info/RECORD +537 -0
- mqt_core-3.3.2.dist-info/WHEEL +5 -0
- mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
- mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -0
- mqt_core.libs/msvcp140.dll +0 -0
|
@@ -0,0 +1,119 @@
|
|
|
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/QuantumComputation.hpp"
|
|
14
|
+
#include "ir/operations/OpType.hpp"
|
|
15
|
+
#include "ir/operations/Operation.hpp"
|
|
16
|
+
|
|
17
|
+
#include <cstddef>
|
|
18
|
+
#include <deque>
|
|
19
|
+
#include <memory>
|
|
20
|
+
#include <unordered_set>
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
namespace qc {
|
|
24
|
+
|
|
25
|
+
class CircuitOptimizer {
|
|
26
|
+
public:
|
|
27
|
+
CircuitOptimizer() = default;
|
|
28
|
+
|
|
29
|
+
using DAG = std::vector<std::deque<std::unique_ptr<Operation>*>>;
|
|
30
|
+
using DAGIterator = std::deque<std::unique_ptr<Operation>*>::iterator;
|
|
31
|
+
using DAGReverseIterator =
|
|
32
|
+
std::deque<std::unique_ptr<Operation>*>::reverse_iterator;
|
|
33
|
+
using DAGIterators = std::vector<DAGIterator>;
|
|
34
|
+
using DAGReverseIterators = std::vector<DAGReverseIterator>;
|
|
35
|
+
|
|
36
|
+
static DAG constructDAG(QuantumComputation& qc);
|
|
37
|
+
|
|
38
|
+
static void swapReconstruction(QuantumComputation& qc);
|
|
39
|
+
|
|
40
|
+
static void singleQubitGateFusion(QuantumComputation& qc);
|
|
41
|
+
|
|
42
|
+
static void removeIdentities(QuantumComputation& qc);
|
|
43
|
+
|
|
44
|
+
static void removeOperation(QuantumComputation& qc,
|
|
45
|
+
const std::unordered_set<OpType>& opTypes,
|
|
46
|
+
size_t opSize);
|
|
47
|
+
|
|
48
|
+
static void removeDiagonalGatesBeforeMeasure(QuantumComputation& qc);
|
|
49
|
+
|
|
50
|
+
static void removeFinalMeasurements(QuantumComputation& qc);
|
|
51
|
+
|
|
52
|
+
static void decomposeSWAP(QuantumComputation& qc,
|
|
53
|
+
bool isDirectedArchitecture);
|
|
54
|
+
|
|
55
|
+
static void eliminateResets(QuantumComputation& qc);
|
|
56
|
+
|
|
57
|
+
static void deferMeasurements(QuantumComputation& qc);
|
|
58
|
+
|
|
59
|
+
static void flattenOperations(QuantumComputation& qc,
|
|
60
|
+
bool customGatesOnly = false);
|
|
61
|
+
|
|
62
|
+
static void cancelCNOTs(QuantumComputation& qc);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @brief Replaces all MCX gates with MCZ gates (and H gates surrounding the
|
|
66
|
+
* target qubit) in the given circuit.
|
|
67
|
+
* @param qc the quantum circuit
|
|
68
|
+
*/
|
|
69
|
+
static void replaceMCXWithMCZ(QuantumComputation& qc);
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @brief Backpropagates the output permutation through the circuit.
|
|
73
|
+
* @details Starts at the end of the circuit with a potentially incomplete
|
|
74
|
+
* output permutation and backpropagates it through the circuit until the
|
|
75
|
+
* beginning of the circuit is reached. The tracked permutation is updated
|
|
76
|
+
* with every SWAP gate and, eventually, the initial layout of the circuit is
|
|
77
|
+
* set to the tracked permutation. Any unassigned qubit in the initial layout
|
|
78
|
+
* is assigned to the first available position (favoring an identity mapping).
|
|
79
|
+
* @param qc the quantum circuit
|
|
80
|
+
*/
|
|
81
|
+
static void backpropagateOutputPermutation(QuantumComputation& qc);
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @brief Collects all operations in the circuit into blocks of a maximum
|
|
85
|
+
* size.
|
|
86
|
+
* @details The circuit is traversed and operations are collected into blocks
|
|
87
|
+
* of a maximum size. The blocks are then appended to the circuit in the order
|
|
88
|
+
* they were collected. Each block is realized as a compound operation.
|
|
89
|
+
* Light optimizations are applied to the blocks, such as removing identity
|
|
90
|
+
* gates and fusing single-qubit gates.
|
|
91
|
+
* @param qc the quantum circuit
|
|
92
|
+
* @param maxBlockSize the maximum size of a block
|
|
93
|
+
*/
|
|
94
|
+
static void collectBlocks(QuantumComputation& qc, std::size_t maxBlockSize);
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @brief Collects all Clifford blocks in the circuit.
|
|
98
|
+
* @details The circuit is traversed and all operations that are part of a
|
|
99
|
+
* Clifford block are collected into a compound operation with a certain
|
|
100
|
+
* maximum block size. All non-Clifford operations remain untouched.
|
|
101
|
+
* Light optimizations are applied to the blocks, such as removing identity
|
|
102
|
+
* gates.
|
|
103
|
+
* @param qc the quantum circuit
|
|
104
|
+
* @param maxBlockSize the maximum size of a block
|
|
105
|
+
*/
|
|
106
|
+
static void collectCliffordBlocks(QuantumComputation& qc,
|
|
107
|
+
std::size_t maxBlockSize);
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @brief Elide permutations by propagating them through the circuit.
|
|
111
|
+
* @details The circuit is traversed and any SWAP gate is eliminated by
|
|
112
|
+
* propagating the permutation through the circuit. The final layout of the
|
|
113
|
+
* circuit is updated accordingly. This pass works well together with the
|
|
114
|
+
* `swapReconstruction` pass.
|
|
115
|
+
* @param qc the quantum circuit
|
|
116
|
+
*/
|
|
117
|
+
static void elidePermutations(QuantumComputation& qc);
|
|
118
|
+
};
|
|
119
|
+
} // namespace qc
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
|
|
2
|
+
#ifndef MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT_H
|
|
3
|
+
#define MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT_H
|
|
4
|
+
|
|
5
|
+
#ifdef MQT_CORE_CIRCUIT_OPTIMIZER_STATIC_DEFINE
|
|
6
|
+
# define MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT
|
|
7
|
+
# define MQT_CORE_CIRCUIT_OPTIMIZER_NO_EXPORT
|
|
8
|
+
#else
|
|
9
|
+
# ifndef MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT
|
|
10
|
+
# ifdef mqt_core_circuit_optimizer_EXPORTS
|
|
11
|
+
/* We are building this library */
|
|
12
|
+
# define MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT __declspec(dllexport)
|
|
13
|
+
# else
|
|
14
|
+
/* We are using this library */
|
|
15
|
+
# define MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT __declspec(dllimport)
|
|
16
|
+
# endif
|
|
17
|
+
# endif
|
|
18
|
+
|
|
19
|
+
# ifndef MQT_CORE_CIRCUIT_OPTIMIZER_NO_EXPORT
|
|
20
|
+
# define MQT_CORE_CIRCUIT_OPTIMIZER_NO_EXPORT
|
|
21
|
+
# endif
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
#ifndef MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED
|
|
25
|
+
# define MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED __declspec(deprecated)
|
|
26
|
+
#endif
|
|
27
|
+
|
|
28
|
+
#ifndef MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED_EXPORT
|
|
29
|
+
# define MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED_EXPORT MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED
|
|
30
|
+
#endif
|
|
31
|
+
|
|
32
|
+
#ifndef MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED_NO_EXPORT
|
|
33
|
+
# define MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED_NO_EXPORT MQT_CORE_CIRCUIT_OPTIMIZER_NO_EXPORT MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED
|
|
34
|
+
#endif
|
|
35
|
+
|
|
36
|
+
/* NOLINTNEXTLINE(readability-avoid-unconditional-preprocessor-if) */
|
|
37
|
+
#if 0 /* DEFINE_NO_DEPRECATED */
|
|
38
|
+
# ifndef MQT_CORE_CIRCUIT_OPTIMIZER_NO_DEPRECATED
|
|
39
|
+
# define MQT_CORE_CIRCUIT_OPTIMIZER_NO_DEPRECATED
|
|
40
|
+
# endif
|
|
41
|
+
#endif
|
|
42
|
+
|
|
43
|
+
#endif /* MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT_H */
|
|
@@ -0,0 +1,117 @@
|
|
|
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 "DirectedGraph.hpp"
|
|
14
|
+
|
|
15
|
+
#include <algorithm>
|
|
16
|
+
#include <cassert>
|
|
17
|
+
#include <cstddef>
|
|
18
|
+
#include <sstream>
|
|
19
|
+
#include <stack>
|
|
20
|
+
#include <stdexcept>
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
namespace qc {
|
|
24
|
+
|
|
25
|
+
template <class V> class DirectedAcyclicGraph final : public DirectedGraph<V> {
|
|
26
|
+
protected:
|
|
27
|
+
// transitive closure matrix to detect cycles
|
|
28
|
+
std::vector<std::vector<bool>> closureMatrix;
|
|
29
|
+
|
|
30
|
+
public:
|
|
31
|
+
auto addVertex(const V& v) -> void override {
|
|
32
|
+
DirectedGraph<V>::addVertex(v);
|
|
33
|
+
for (auto& row : closureMatrix) {
|
|
34
|
+
row.emplace_back(false);
|
|
35
|
+
}
|
|
36
|
+
closureMatrix.emplace_back(this->nVertices, false);
|
|
37
|
+
const auto i = this->mapping.at(v);
|
|
38
|
+
closureMatrix[i][i] = true;
|
|
39
|
+
}
|
|
40
|
+
auto addEdge(const V& u, const V& v) -> void override {
|
|
41
|
+
if (!this->mapping.contains(u)) {
|
|
42
|
+
addVertex(u);
|
|
43
|
+
}
|
|
44
|
+
if (!this->mapping.contains(v)) {
|
|
45
|
+
addVertex(v);
|
|
46
|
+
}
|
|
47
|
+
std::size_t const i = this->mapping.at(u);
|
|
48
|
+
std::size_t const j = this->mapping.at(v);
|
|
49
|
+
if (closureMatrix[j][i]) {
|
|
50
|
+
std::ostringstream oss;
|
|
51
|
+
oss << "Adding edge (" << u << ", " << v << ") would create a cycle.";
|
|
52
|
+
throw std::logic_error(oss.str());
|
|
53
|
+
}
|
|
54
|
+
DirectedGraph<V>::addEdge(u, v);
|
|
55
|
+
for (std::size_t k = 0; k < this->nVertices; ++k) {
|
|
56
|
+
if (closureMatrix[k][i]) {
|
|
57
|
+
closureMatrix[k][j] = true;
|
|
58
|
+
}
|
|
59
|
+
if (closureMatrix[j][k]) {
|
|
60
|
+
closureMatrix[i][k] = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
[[nodiscard]] auto isReachable(const V& u, const V& v) const -> bool {
|
|
65
|
+
if (!this->mapping.contains(u)) {
|
|
66
|
+
throw std::invalid_argument("Vertex u not in graph.");
|
|
67
|
+
}
|
|
68
|
+
if (!this->mapping.contains(v)) {
|
|
69
|
+
throw std::invalid_argument("Vertex v not in graph.");
|
|
70
|
+
}
|
|
71
|
+
return closureMatrix[this->mapping.at(u)][this->mapping.at(v)];
|
|
72
|
+
}
|
|
73
|
+
/// Perform a depth-first search on the graph and return the nodes in a
|
|
74
|
+
/// topological order
|
|
75
|
+
[[nodiscard]] auto orderTopologically() const -> std::vector<V> {
|
|
76
|
+
std::stack<std::size_t> stack{};
|
|
77
|
+
std::vector<std::size_t> result;
|
|
78
|
+
result.reserve(this->nVertices);
|
|
79
|
+
std::vector visited(this->nVertices, false);
|
|
80
|
+
// visitedInDegree is used to count the incoming edges that have been
|
|
81
|
+
// visited already such that the resulting order of the nodes is one that
|
|
82
|
+
// satisfies a topological ordering
|
|
83
|
+
std::vector<std::size_t> visitedInDegree(this->nVertices, 0);
|
|
84
|
+
// Push nodes with 0 indegree onto the stack
|
|
85
|
+
for (std::size_t k = 0; k < this->nVertices; ++k) {
|
|
86
|
+
if (this->inDegrees[k] == 0) {
|
|
87
|
+
stack.push(k);
|
|
88
|
+
visited[k] = true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Perform DFS
|
|
92
|
+
while (!stack.empty()) {
|
|
93
|
+
const auto u = stack.top();
|
|
94
|
+
stack.pop();
|
|
95
|
+
result.emplace_back(u);
|
|
96
|
+
|
|
97
|
+
for (std::size_t k = 0; k < this->nVertices; ++k) {
|
|
98
|
+
if (this->adjacencyMatrix[u][k]) {
|
|
99
|
+
if (!visited[k]) {
|
|
100
|
+
if (++visitedInDegree[k] == this->inDegrees[k]) {
|
|
101
|
+
stack.push(k);
|
|
102
|
+
visited[k] = true;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Otherwise graph has a cycle
|
|
109
|
+
assert(result.size() == this->nVertices);
|
|
110
|
+
std::vector<V> vertices;
|
|
111
|
+
vertices.reserve(this->nVertices);
|
|
112
|
+
std::transform(result.cbegin(), result.cend(), std::back_inserter(vertices),
|
|
113
|
+
[&](const auto i) { return this->invMapping.at(i); });
|
|
114
|
+
return vertices;
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
} // namespace qc
|
|
@@ -0,0 +1,158 @@
|
|
|
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 <cstddef>
|
|
14
|
+
#include <numeric>
|
|
15
|
+
#include <ostream>
|
|
16
|
+
#include <sstream>
|
|
17
|
+
#include <stdexcept>
|
|
18
|
+
#include <string>
|
|
19
|
+
#include <unordered_map>
|
|
20
|
+
#include <unordered_set>
|
|
21
|
+
#include <utility>
|
|
22
|
+
#include <vector>
|
|
23
|
+
|
|
24
|
+
namespace qc {
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Class representing generic directed graphs.
|
|
28
|
+
*
|
|
29
|
+
* @tparam V the type of the vertices in the graph. Must implement `operator<<`.
|
|
30
|
+
*/
|
|
31
|
+
template <class V> class DirectedGraph {
|
|
32
|
+
static_assert(std::is_same_v<decltype(std::declval<std::ostream&>()
|
|
33
|
+
<< std::declval<V>()),
|
|
34
|
+
std::ostream&>,
|
|
35
|
+
"V must support `operator<<`.");
|
|
36
|
+
|
|
37
|
+
protected:
|
|
38
|
+
// the adjecency matrix works with indices
|
|
39
|
+
std::vector<std::vector<bool>> adjacencyMatrix;
|
|
40
|
+
// the mapping of vertices to indices in the graph are stored in a map
|
|
41
|
+
std::unordered_map<V, std::size_t> mapping;
|
|
42
|
+
// the inverse mapping is used to get the vertex from the index
|
|
43
|
+
std::vector<V> invMapping;
|
|
44
|
+
// the number of vertices in the graph
|
|
45
|
+
std::size_t nVertices = 0;
|
|
46
|
+
// the number of edges in the graph
|
|
47
|
+
std::size_t nEdges = 0;
|
|
48
|
+
// the in-degrees of the vertices in the graph
|
|
49
|
+
std::vector<std::size_t> inDegrees;
|
|
50
|
+
// the out-degrees of the vertices in the graph
|
|
51
|
+
std::vector<std::size_t> outDegrees;
|
|
52
|
+
|
|
53
|
+
public:
|
|
54
|
+
DirectedGraph() = default;
|
|
55
|
+
DirectedGraph(const DirectedGraph&) = default;
|
|
56
|
+
DirectedGraph(DirectedGraph&&) = default;
|
|
57
|
+
DirectedGraph& operator=(const DirectedGraph&) = default;
|
|
58
|
+
DirectedGraph& operator=(DirectedGraph&&) = default;
|
|
59
|
+
virtual ~DirectedGraph() = default;
|
|
60
|
+
virtual auto addVertex(const V& v) -> void {
|
|
61
|
+
// check whether the vertex is already in the graph, if so do nothing
|
|
62
|
+
if (mapping.contains(v)) {
|
|
63
|
+
std::stringstream ss;
|
|
64
|
+
ss << "The vertex " << v << " is already in the graph.";
|
|
65
|
+
throw std::invalid_argument(ss.str());
|
|
66
|
+
}
|
|
67
|
+
mapping[v] = nVertices;
|
|
68
|
+
invMapping.emplace_back(v);
|
|
69
|
+
++nVertices;
|
|
70
|
+
for (auto& row : adjacencyMatrix) {
|
|
71
|
+
row.emplace_back(false);
|
|
72
|
+
}
|
|
73
|
+
adjacencyMatrix.emplace_back(nVertices, false);
|
|
74
|
+
inDegrees.emplace_back(0);
|
|
75
|
+
outDegrees.emplace_back(0);
|
|
76
|
+
}
|
|
77
|
+
virtual auto addEdge(const V& u, const V& v) -> void {
|
|
78
|
+
if (!mapping.contains(u)) {
|
|
79
|
+
addVertex(u);
|
|
80
|
+
}
|
|
81
|
+
if (!mapping.contains(v)) {
|
|
82
|
+
addVertex(v);
|
|
83
|
+
}
|
|
84
|
+
const auto i = mapping.at(u);
|
|
85
|
+
const auto j = mapping.at(v);
|
|
86
|
+
if (!adjacencyMatrix[i][j]) {
|
|
87
|
+
adjacencyMatrix[i][j] = true;
|
|
88
|
+
++outDegrees[i];
|
|
89
|
+
++inDegrees[j];
|
|
90
|
+
++nEdges;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
[[nodiscard]] auto getNVertices() const -> std::size_t { return nVertices; }
|
|
94
|
+
[[nodiscard]] auto getNEdges() const -> std::size_t { return nEdges; }
|
|
95
|
+
[[nodiscard]] auto getInDegree(const V& v) const -> std::size_t {
|
|
96
|
+
if (!mapping.contains(v)) {
|
|
97
|
+
std::stringstream ss;
|
|
98
|
+
ss << "The vertex " << v << " is not in the graph.";
|
|
99
|
+
throw std::invalid_argument(ss.str());
|
|
100
|
+
}
|
|
101
|
+
const auto i = mapping.at(v);
|
|
102
|
+
return inDegrees[i];
|
|
103
|
+
}
|
|
104
|
+
[[nodiscard]] auto getOutDegree(const V& v) const -> std::size_t {
|
|
105
|
+
if (!mapping.contains(v)) {
|
|
106
|
+
std::stringstream ss;
|
|
107
|
+
ss << "The vertex " << v << " is not in the graph.";
|
|
108
|
+
throw std::invalid_argument(ss.str());
|
|
109
|
+
}
|
|
110
|
+
const auto i = mapping.at(v);
|
|
111
|
+
return outDegrees[i];
|
|
112
|
+
}
|
|
113
|
+
[[nodiscard]] auto getVertices() const -> std::unordered_set<V> {
|
|
114
|
+
return std::accumulate(mapping.cbegin(), mapping.cend(),
|
|
115
|
+
std::unordered_set<V>(),
|
|
116
|
+
[](auto acc, const auto& v) {
|
|
117
|
+
acc.emplace(v.first);
|
|
118
|
+
return acc;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
[[nodiscard]] auto isEdge(const V& u, const V& v) const -> bool {
|
|
122
|
+
if (!mapping.contains(u)) {
|
|
123
|
+
std::stringstream ss;
|
|
124
|
+
ss << "The vertex " << u << " is not in the graph.";
|
|
125
|
+
throw std::invalid_argument(ss.str());
|
|
126
|
+
}
|
|
127
|
+
if (!mapping.contains(v)) {
|
|
128
|
+
std::stringstream ss;
|
|
129
|
+
ss << "The vertex " << v << " is not in the graph.";
|
|
130
|
+
throw std::invalid_argument(ss.str());
|
|
131
|
+
}
|
|
132
|
+
const auto i = mapping.at(u);
|
|
133
|
+
const auto j = mapping.at(v);
|
|
134
|
+
return adjacencyMatrix[i][j];
|
|
135
|
+
}
|
|
136
|
+
/// Outputs a string representation of the graph in the DOT format
|
|
137
|
+
[[nodiscard]] auto toString() const -> std::string {
|
|
138
|
+
std::stringstream ss;
|
|
139
|
+
ss << "digraph {\n";
|
|
140
|
+
for (const auto& [v, i] : mapping) {
|
|
141
|
+
ss << " " << i << " [label=\"" << v << "\"];\n";
|
|
142
|
+
}
|
|
143
|
+
for (std::size_t i = 0; i < nVertices; ++i) {
|
|
144
|
+
for (std::size_t j = 0; j < nVertices; ++j) {
|
|
145
|
+
if (adjacencyMatrix[i][j]) {
|
|
146
|
+
ss << " " << i << " -> " << j << ";\n";
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
ss << "}\n";
|
|
151
|
+
return ss.str();
|
|
152
|
+
}
|
|
153
|
+
friend auto operator<<(std::ostream& os, const DirectedGraph& g)
|
|
154
|
+
-> std::ostream& {
|
|
155
|
+
return os << g.toString(); // Using toString() method
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
} // namespace qc
|
|
@@ -0,0 +1,50 @@
|
|
|
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 <algorithm>
|
|
14
|
+
#include <cstddef>
|
|
15
|
+
#include <unordered_map>
|
|
16
|
+
|
|
17
|
+
namespace qc {
|
|
18
|
+
template <class T> struct DisjointSet {
|
|
19
|
+
std::unordered_map<T, T> parent;
|
|
20
|
+
std::unordered_map<T, std::size_t> rank;
|
|
21
|
+
|
|
22
|
+
template <class Iterator>
|
|
23
|
+
explicit DisjointSet(const Iterator& begin, const Iterator& end) {
|
|
24
|
+
std::for_each(begin, end, [&](const auto& element) {
|
|
25
|
+
parent[element] = element;
|
|
26
|
+
rank[element] = 0;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
T findSet(const T& v) {
|
|
31
|
+
if (parent[v] != v) {
|
|
32
|
+
parent[v] = findSet(parent[v]);
|
|
33
|
+
}
|
|
34
|
+
return parent[v];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
void unionSet(const T& x, const T& y) {
|
|
38
|
+
const auto& xSet = findSet(x);
|
|
39
|
+
const auto& ySet = findSet(y);
|
|
40
|
+
if (rank[xSet] > rank[ySet]) {
|
|
41
|
+
parent[ySet] = xSet;
|
|
42
|
+
} else {
|
|
43
|
+
parent[xSet] = ySet;
|
|
44
|
+
if (rank[xSet] == rank[ySet]) {
|
|
45
|
+
++rank[ySet];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
} // namespace qc
|
|
@@ -0,0 +1,172 @@
|
|
|
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 "datastructures/UndirectedGraph.hpp"
|
|
14
|
+
#include "ir/Definitions.hpp"
|
|
15
|
+
#include "ir/QuantumComputation.hpp"
|
|
16
|
+
#include "ir/operations/OpType.hpp"
|
|
17
|
+
#include "ir/operations/Operation.hpp"
|
|
18
|
+
|
|
19
|
+
#include <cassert>
|
|
20
|
+
#include <cstddef>
|
|
21
|
+
#include <cstdint>
|
|
22
|
+
#include <memory>
|
|
23
|
+
#include <stdexcept>
|
|
24
|
+
#include <unordered_set>
|
|
25
|
+
#include <vector>
|
|
26
|
+
|
|
27
|
+
namespace qc {
|
|
28
|
+
/**
|
|
29
|
+
* @brief Class to manage the creation of layers when traversing a quantum
|
|
30
|
+
* circuit.
|
|
31
|
+
* @details The class uses the DAG of the circuit to create layers of gates that
|
|
32
|
+
* can be executed at the same time. It can be used to create the front or look
|
|
33
|
+
* ahead layer.
|
|
34
|
+
*/
|
|
35
|
+
class Layer final {
|
|
36
|
+
public:
|
|
37
|
+
class DAGVertex;
|
|
38
|
+
using ExecutableSet = std::unordered_set<std::shared_ptr<DAGVertex>>;
|
|
39
|
+
using InteractionGraph = UndirectedGraph<Qubit, std::shared_ptr<DAGVertex>>;
|
|
40
|
+
|
|
41
|
+
class DAGVertex : public std::enable_shared_from_this<DAGVertex> {
|
|
42
|
+
protected:
|
|
43
|
+
// if the executableCounter becomes equal to the executableThreshold the
|
|
44
|
+
// vertex becomes executable
|
|
45
|
+
std::int64_t executableThreshold = 0;
|
|
46
|
+
std::int64_t executableCounter = 0;
|
|
47
|
+
std::vector<std::shared_ptr<DAGVertex>> enabledSuccessors;
|
|
48
|
+
std::vector<std::shared_ptr<DAGVertex>> disabledSuccessors;
|
|
49
|
+
bool executed = false;
|
|
50
|
+
Operation* operation;
|
|
51
|
+
ExecutableSet* executableSet;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @brief Construct a new DAGVertex
|
|
55
|
+
* @details The constructor initializes the vertex with the given operation
|
|
56
|
+
* and the given executable set, which is shared among all vertices.
|
|
57
|
+
*
|
|
58
|
+
* @param op
|
|
59
|
+
* @param es
|
|
60
|
+
*/
|
|
61
|
+
DAGVertex(Operation* op, ExecutableSet& es)
|
|
62
|
+
: operation(op), executableSet(&es) {}
|
|
63
|
+
|
|
64
|
+
public:
|
|
65
|
+
[[nodiscard]] static auto create(Operation* operation,
|
|
66
|
+
ExecutableSet& executableSet)
|
|
67
|
+
-> std::shared_ptr<DAGVertex> {
|
|
68
|
+
std::shared_ptr<DAGVertex> v(new DAGVertex(operation, executableSet));
|
|
69
|
+
v->updateExecutableSet();
|
|
70
|
+
return v;
|
|
71
|
+
}
|
|
72
|
+
[[nodiscard]] auto isExecutable() const {
|
|
73
|
+
assert(executableCounter <= executableThreshold);
|
|
74
|
+
return (!executed) && executableCounter == executableThreshold;
|
|
75
|
+
}
|
|
76
|
+
[[nodiscard]] auto isExecuted() const { return executed; }
|
|
77
|
+
[[nodiscard]] auto getOperation() const -> const Operation* {
|
|
78
|
+
return operation;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
protected:
|
|
82
|
+
auto incExecutableCounter() {
|
|
83
|
+
executableCounter++;
|
|
84
|
+
updateExecutableSet();
|
|
85
|
+
}
|
|
86
|
+
auto decExecutableCounter() {
|
|
87
|
+
executableCounter--;
|
|
88
|
+
updateExecutableSet();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* @brief Inserts or removes the vertex from the executable set.
|
|
92
|
+
* @warning May not be called from the constructor.
|
|
93
|
+
*/
|
|
94
|
+
auto updateExecutableSet() -> void {
|
|
95
|
+
if (isExecutable()) {
|
|
96
|
+
if (const auto& it = executableSet->find(shared_from_this());
|
|
97
|
+
it == executableSet->end()) {
|
|
98
|
+
executableSet->insert(shared_from_this());
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
if (const auto& it = executableSet->find(shared_from_this());
|
|
102
|
+
it != executableSet->end()) {
|
|
103
|
+
executableSet->erase(it);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public:
|
|
109
|
+
auto execute() -> void {
|
|
110
|
+
if (isExecutable()) {
|
|
111
|
+
executed = true;
|
|
112
|
+
for (const auto& successor : disabledSuccessors) {
|
|
113
|
+
successor->decExecutableCounter();
|
|
114
|
+
}
|
|
115
|
+
for (const auto& successor : enabledSuccessors) {
|
|
116
|
+
successor->incExecutableCounter();
|
|
117
|
+
}
|
|
118
|
+
updateExecutableSet();
|
|
119
|
+
} else {
|
|
120
|
+
throw std::logic_error(
|
|
121
|
+
"The vertex is not executable and cannot be executed.");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
auto addEnabledSuccessor(const std::shared_ptr<DAGVertex>& successor) {
|
|
125
|
+
enabledSuccessors.emplace_back(successor);
|
|
126
|
+
++successor->executableThreshold;
|
|
127
|
+
successor->updateExecutableSet();
|
|
128
|
+
}
|
|
129
|
+
auto addDisabledSuccessor(const std::shared_ptr<DAGVertex>& successor) {
|
|
130
|
+
disabledSuccessors.emplace_back(successor);
|
|
131
|
+
--successor->executableThreshold;
|
|
132
|
+
successor->updateExecutableSet();
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
protected:
|
|
137
|
+
ExecutableSet executableSet;
|
|
138
|
+
auto constructDAG(const QuantumComputation& qc, bool commutable) -> void;
|
|
139
|
+
|
|
140
|
+
public:
|
|
141
|
+
Layer() = default;
|
|
142
|
+
Layer(const Layer&) = default;
|
|
143
|
+
Layer(Layer&&) = default;
|
|
144
|
+
Layer& operator=(const Layer&) = default;
|
|
145
|
+
Layer& operator=(Layer&&) = default;
|
|
146
|
+
~Layer() = default;
|
|
147
|
+
/**
|
|
148
|
+
* @brief Constructs a new layer from the given quantum circuit.
|
|
149
|
+
* @details The layer contains all gates that are currently executable in a
|
|
150
|
+
* set of executable gates. When a gate is executed, this can enable other
|
|
151
|
+
* gates that are added to the set of executable sets then, or disable gates
|
|
152
|
+
* that are removed from the set of executable gates. The commutable flag can
|
|
153
|
+
* be used to specify whether commutation rules should be considered.
|
|
154
|
+
*
|
|
155
|
+
* @param qc quantum circuit
|
|
156
|
+
* @param commutable true if commutation rules should be considered, false
|
|
157
|
+
* otherwise (default: true)
|
|
158
|
+
*/
|
|
159
|
+
explicit Layer(const QuantumComputation& qc, bool commutable = true) {
|
|
160
|
+
constructDAG(qc, commutable);
|
|
161
|
+
}
|
|
162
|
+
[[nodiscard]] auto getExecutableSet() const -> const ExecutableSet& {
|
|
163
|
+
return executableSet;
|
|
164
|
+
}
|
|
165
|
+
[[nodiscard]] auto constructInteractionGraph(OpType opType,
|
|
166
|
+
std::size_t nControls) const
|
|
167
|
+
-> InteractionGraph;
|
|
168
|
+
[[nodiscard]] auto getExecutablesOfType(OpType opType,
|
|
169
|
+
std::size_t nControls) const
|
|
170
|
+
-> std::vector<std::shared_ptr<DAGVertex>>;
|
|
171
|
+
};
|
|
172
|
+
} // namespace qc
|