mqt-core 3.3.2__cp314-cp314t-macosx_11_0_x86_64.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,596 @@
|
|
|
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 "Definitions.hpp"
|
|
14
|
+
#include "Permutation.hpp"
|
|
15
|
+
#include "Register.hpp"
|
|
16
|
+
#include "operations/CompoundOperation.hpp"
|
|
17
|
+
#include "operations/Control.hpp"
|
|
18
|
+
#include "operations/Expression.hpp"
|
|
19
|
+
#include "operations/IfElseOperation.hpp"
|
|
20
|
+
#include "operations/OpType.hpp"
|
|
21
|
+
#include "operations/Operation.hpp"
|
|
22
|
+
#include "operations/StandardOperation.hpp"
|
|
23
|
+
|
|
24
|
+
#include <cstddef>
|
|
25
|
+
#include <cstdint>
|
|
26
|
+
#include <iostream>
|
|
27
|
+
#include <memory>
|
|
28
|
+
#include <optional>
|
|
29
|
+
#include <random>
|
|
30
|
+
#include <string>
|
|
31
|
+
#include <unordered_map>
|
|
32
|
+
#include <unordered_set>
|
|
33
|
+
#include <utility>
|
|
34
|
+
#include <vector>
|
|
35
|
+
|
|
36
|
+
namespace qc {
|
|
37
|
+
using QuantumRegisterMap = std::unordered_map<std::string, QuantumRegister>;
|
|
38
|
+
using ClassicalRegisterMap = std::unordered_map<std::string, ClassicalRegister>;
|
|
39
|
+
|
|
40
|
+
class QuantumComputation {
|
|
41
|
+
public:
|
|
42
|
+
using iterator = std::vector<std::unique_ptr<Operation>>::iterator;
|
|
43
|
+
using const_iterator =
|
|
44
|
+
std::vector<std::unique_ptr<Operation>>::const_iterator;
|
|
45
|
+
using reverse_iterator =
|
|
46
|
+
std::vector<std::unique_ptr<Operation>>::reverse_iterator;
|
|
47
|
+
using const_reverse_iterator =
|
|
48
|
+
std::vector<std::unique_ptr<Operation>>::const_reverse_iterator;
|
|
49
|
+
|
|
50
|
+
protected:
|
|
51
|
+
std::vector<std::unique_ptr<Operation>> ops;
|
|
52
|
+
std::size_t nqubits = 0;
|
|
53
|
+
std::size_t nclassics = 0;
|
|
54
|
+
std::size_t nancillae = 0;
|
|
55
|
+
std::string name;
|
|
56
|
+
|
|
57
|
+
QuantumRegisterMap quantumRegisters;
|
|
58
|
+
ClassicalRegisterMap classicalRegisters;
|
|
59
|
+
QuantumRegisterMap ancillaRegisters;
|
|
60
|
+
|
|
61
|
+
std::vector<bool> ancillary;
|
|
62
|
+
std::vector<bool> garbage;
|
|
63
|
+
|
|
64
|
+
std::mt19937_64 mt;
|
|
65
|
+
std::size_t seed = 0;
|
|
66
|
+
|
|
67
|
+
fp globalPhase = 0.;
|
|
68
|
+
|
|
69
|
+
std::unordered_set<sym::Variable> occurringVariables;
|
|
70
|
+
|
|
71
|
+
public:
|
|
72
|
+
explicit QuantumComputation(std::size_t nq = 0, std::size_t nc = 0U,
|
|
73
|
+
std::size_t s = 0);
|
|
74
|
+
QuantumComputation(QuantumComputation&& qc) noexcept = default;
|
|
75
|
+
QuantumComputation& operator=(QuantumComputation&& qc) noexcept = default;
|
|
76
|
+
QuantumComputation(const QuantumComputation& qc);
|
|
77
|
+
QuantumComputation& operator=(const QuantumComputation& qc);
|
|
78
|
+
~QuantumComputation() = default;
|
|
79
|
+
|
|
80
|
+
// physical qubits are used as keys, logical qubits as values
|
|
81
|
+
Permutation initialLayout;
|
|
82
|
+
Permutation outputPermutation;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @brief Construct a QuantumComputation from CompoundOperation object
|
|
86
|
+
* @details The function creates a copy of each operation in the compound
|
|
87
|
+
* operation. It uses the largest qubit index in the CompoundOperation for
|
|
88
|
+
* determining the number of qubits. It adds a single quantum register with
|
|
89
|
+
* all qubits from 0 to the largest qubit index and a corresponding classical
|
|
90
|
+
* register with the same size. The initial layout as well as the output
|
|
91
|
+
* permutation are set to the identity permutation.
|
|
92
|
+
* @param op The CompoundOperation to convert to a quantum circuit
|
|
93
|
+
* @return The constructed QuantumComputation
|
|
94
|
+
*/
|
|
95
|
+
[[nodiscard]] static QuantumComputation
|
|
96
|
+
fromCompoundOperation(const CompoundOperation& op);
|
|
97
|
+
|
|
98
|
+
[[nodiscard]] std::size_t getNops() const noexcept { return ops.size(); }
|
|
99
|
+
[[nodiscard]] std::size_t getNqubits() const noexcept {
|
|
100
|
+
return nqubits + nancillae;
|
|
101
|
+
}
|
|
102
|
+
[[nodiscard]] std::size_t getNancillae() const noexcept { return nancillae; }
|
|
103
|
+
[[nodiscard]] std::size_t getNqubitsWithoutAncillae() const noexcept {
|
|
104
|
+
return nqubits;
|
|
105
|
+
}
|
|
106
|
+
[[nodiscard]] const std::vector<bool>& getAncillary() const noexcept {
|
|
107
|
+
return ancillary;
|
|
108
|
+
}
|
|
109
|
+
[[nodiscard]] std::vector<bool>& getAncillary() noexcept { return ancillary; }
|
|
110
|
+
[[nodiscard]] const std::vector<bool>& getGarbage() const noexcept {
|
|
111
|
+
return garbage;
|
|
112
|
+
}
|
|
113
|
+
[[nodiscard]] std::vector<bool>& getGarbage() noexcept { return garbage; }
|
|
114
|
+
[[nodiscard]] std::size_t getNcbits() const noexcept { return nclassics; }
|
|
115
|
+
[[nodiscard]] std::string getName() const noexcept { return name; }
|
|
116
|
+
[[nodiscard]] const auto& getQuantumRegisters() const noexcept {
|
|
117
|
+
return quantumRegisters;
|
|
118
|
+
}
|
|
119
|
+
[[nodiscard]] const auto& getClassicalRegisters() const noexcept {
|
|
120
|
+
return classicalRegisters;
|
|
121
|
+
}
|
|
122
|
+
[[nodiscard]] const auto& getAncillaRegisters() const noexcept {
|
|
123
|
+
return ancillaRegisters;
|
|
124
|
+
}
|
|
125
|
+
[[nodiscard]] decltype(mt)& getGenerator() noexcept { return mt; }
|
|
126
|
+
|
|
127
|
+
[[nodiscard]] fp getGlobalPhase() const noexcept { return globalPhase; }
|
|
128
|
+
[[nodiscard]] bool hasGlobalPhase() const noexcept {
|
|
129
|
+
return std::abs(getGlobalPhase()) > 0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
[[nodiscard]] const std::unordered_set<sym::Variable>&
|
|
133
|
+
getVariables() const noexcept {
|
|
134
|
+
return occurringVariables;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
[[nodiscard]] std::size_t getNmeasuredQubits() const noexcept;
|
|
138
|
+
[[nodiscard]] std::size_t getNgarbageQubits() const;
|
|
139
|
+
|
|
140
|
+
void setName(const std::string& n) noexcept { name = n; }
|
|
141
|
+
|
|
142
|
+
[[nodiscard]] std::size_t getNindividualOps() const;
|
|
143
|
+
[[nodiscard]] std::size_t getNsingleQubitOps() const;
|
|
144
|
+
[[nodiscard]] std::size_t getDepth() const;
|
|
145
|
+
|
|
146
|
+
[[nodiscard]] QuantumRegister& getQubitRegister(Qubit physicalQubitIndex);
|
|
147
|
+
/// Returns the highest qubit index used as a value in the initial layout
|
|
148
|
+
[[nodiscard]] Qubit getHighestLogicalQubitIndex() const;
|
|
149
|
+
/// Returns the highest qubit index used as a key in the initial layout
|
|
150
|
+
[[nodiscard]] Qubit getHighestPhysicalQubitIndex() const;
|
|
151
|
+
/**
|
|
152
|
+
* @brief Returns the physical qubit index of the given logical qubit index
|
|
153
|
+
* @details Iterates over the initial layout dictionary and returns the key
|
|
154
|
+
* corresponding to the given value.
|
|
155
|
+
* @param logicalQubitIndex The logical qubit index to look for
|
|
156
|
+
* @return The physical qubit index of the given logical qubit index
|
|
157
|
+
*/
|
|
158
|
+
[[nodiscard]] Qubit getPhysicalQubitIndex(Qubit logicalQubitIndex) const;
|
|
159
|
+
[[nodiscard]] bool isIdleQubit(Qubit physicalQubit) const;
|
|
160
|
+
[[nodiscard]] bool isLastOperationOnQubit(const const_iterator& opIt,
|
|
161
|
+
const const_iterator& end) const;
|
|
162
|
+
[[nodiscard]] bool physicalQubitIsAncillary(Qubit physicalQubitIndex) const;
|
|
163
|
+
[[nodiscard]] bool
|
|
164
|
+
logicalQubitIsAncillary(const Qubit logicalQubitIndex) const {
|
|
165
|
+
return ancillary[logicalQubitIndex];
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* @brief Sets the given logical qubit to be ancillary
|
|
169
|
+
* @details Removes the qubit from the qubit register and adds it to the
|
|
170
|
+
* ancillary register, if such a register exists. Otherwise a new ancillary
|
|
171
|
+
* register is created.
|
|
172
|
+
* @param logicalQubitIndex
|
|
173
|
+
*/
|
|
174
|
+
void setLogicalQubitAncillary(Qubit logicalQubitIndex);
|
|
175
|
+
/**
|
|
176
|
+
* @brief Sets all logical qubits in the range [minLogicalQubitIndex,
|
|
177
|
+
* maxLogicalQubitIndex] to be ancillary
|
|
178
|
+
* @details Removes the qubits from the qubit register and adds it to the
|
|
179
|
+
* ancillary register, if such a register exists. Otherwise a new ancillary
|
|
180
|
+
* register is created.
|
|
181
|
+
* @param minLogicalQubitIndex first qubit that is set to be ancillary
|
|
182
|
+
* @param maxLogicalQubitIndex last qubit that is set to be ancillary
|
|
183
|
+
*/
|
|
184
|
+
void setLogicalQubitsAncillary(Qubit minLogicalQubitIndex,
|
|
185
|
+
Qubit maxLogicalQubitIndex);
|
|
186
|
+
[[nodiscard]] bool
|
|
187
|
+
logicalQubitIsGarbage(const Qubit logicalQubitIndex) const {
|
|
188
|
+
return garbage[logicalQubitIndex];
|
|
189
|
+
}
|
|
190
|
+
void setLogicalQubitGarbage(Qubit logicalQubitIndex);
|
|
191
|
+
/**
|
|
192
|
+
* @brief Sets all logical qubits in the range [minLogicalQubitIndex,
|
|
193
|
+
* maxLogicalQubitIndex] to be garbage
|
|
194
|
+
* @param minLogicalQubitIndex first qubit that is set to be garbage
|
|
195
|
+
* @param maxLogicalQubitIndex last qubit that is set to be garbage
|
|
196
|
+
*/
|
|
197
|
+
void setLogicalQubitsGarbage(Qubit minLogicalQubitIndex,
|
|
198
|
+
Qubit maxLogicalQubitIndex);
|
|
199
|
+
|
|
200
|
+
/// checks whether the given logical qubit exists in the initial layout.
|
|
201
|
+
/// \param logicalQubitIndex the logical qubit index to check
|
|
202
|
+
/// \return whether the given logical qubit exists in the initial layout and
|
|
203
|
+
/// to which physical qubit it is mapped
|
|
204
|
+
[[nodiscard]] std::pair<bool, std::optional<Qubit>>
|
|
205
|
+
containsLogicalQubit(Qubit logicalQubitIndex) const;
|
|
206
|
+
|
|
207
|
+
/// Adds a global phase to the quantum circuit.
|
|
208
|
+
/// \param angle the angle to add
|
|
209
|
+
void gphase(fp angle);
|
|
210
|
+
|
|
211
|
+
#define DECLARE_SINGLE_TARGET_OPERATION(op) \
|
|
212
|
+
void op(Qubit target); \
|
|
213
|
+
void c##op(const Control& control, Qubit target); \
|
|
214
|
+
void mc##op(const Controls& controls, const Qubit target);
|
|
215
|
+
|
|
216
|
+
DECLARE_SINGLE_TARGET_OPERATION(i)
|
|
217
|
+
DECLARE_SINGLE_TARGET_OPERATION(x)
|
|
218
|
+
DECLARE_SINGLE_TARGET_OPERATION(y)
|
|
219
|
+
DECLARE_SINGLE_TARGET_OPERATION(z)
|
|
220
|
+
DECLARE_SINGLE_TARGET_OPERATION(h)
|
|
221
|
+
DECLARE_SINGLE_TARGET_OPERATION(s)
|
|
222
|
+
DECLARE_SINGLE_TARGET_OPERATION(sdg)
|
|
223
|
+
DECLARE_SINGLE_TARGET_OPERATION(t)
|
|
224
|
+
DECLARE_SINGLE_TARGET_OPERATION(tdg)
|
|
225
|
+
DECLARE_SINGLE_TARGET_OPERATION(v)
|
|
226
|
+
DECLARE_SINGLE_TARGET_OPERATION(vdg)
|
|
227
|
+
DECLARE_SINGLE_TARGET_OPERATION(sx)
|
|
228
|
+
DECLARE_SINGLE_TARGET_OPERATION(sxdg)
|
|
229
|
+
|
|
230
|
+
#undef DECLARE_SINGLE_TARGET_OPERATION
|
|
231
|
+
|
|
232
|
+
#define DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION(op, param) \
|
|
233
|
+
void op(const SymbolOrNumber&(param), Qubit target); \
|
|
234
|
+
void c##op(const SymbolOrNumber&(param), const Control& control, \
|
|
235
|
+
Qubit target); \
|
|
236
|
+
void mc##op(const SymbolOrNumber&(param), const Controls& controls, \
|
|
237
|
+
Qubit target);
|
|
238
|
+
|
|
239
|
+
DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION(rx, theta)
|
|
240
|
+
DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION(ry, theta)
|
|
241
|
+
DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION(rz, theta)
|
|
242
|
+
DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION(p, theta)
|
|
243
|
+
|
|
244
|
+
#undef DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION
|
|
245
|
+
|
|
246
|
+
#define DECLARE_SINGLE_TARGET_TWO_PARAMETER_OPERATION(op, param0, param1) \
|
|
247
|
+
void op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
|
|
248
|
+
Qubit target); \
|
|
249
|
+
void c##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
|
|
250
|
+
const Control& control, const Qubit target); \
|
|
251
|
+
void mc##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
|
|
252
|
+
const Controls& controls, const Qubit target);
|
|
253
|
+
|
|
254
|
+
DECLARE_SINGLE_TARGET_TWO_PARAMETER_OPERATION(u2, phi, lambda)
|
|
255
|
+
DECLARE_SINGLE_TARGET_TWO_PARAMETER_OPERATION(r, theta, phi)
|
|
256
|
+
|
|
257
|
+
#undef DECLARE_SINGLE_TARGET_TWO_PARAMETER_OPERATION
|
|
258
|
+
|
|
259
|
+
#define DECLARE_SINGLE_TARGET_THREE_PARAMETER_OPERATION(op, param0, param1, \
|
|
260
|
+
param2) \
|
|
261
|
+
void op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
|
|
262
|
+
const SymbolOrNumber&(param2), Qubit target); \
|
|
263
|
+
void c##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
|
|
264
|
+
const SymbolOrNumber&(param2), const Control& control, \
|
|
265
|
+
Qubit target); \
|
|
266
|
+
void mc##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
|
|
267
|
+
const SymbolOrNumber&(param2), const Controls& controls, \
|
|
268
|
+
Qubit target);
|
|
269
|
+
|
|
270
|
+
DECLARE_SINGLE_TARGET_THREE_PARAMETER_OPERATION(u, theta, phi, lambda)
|
|
271
|
+
|
|
272
|
+
#undef DECLARE_SINGLE_TARGET_THREE_PARAMETER_OPERATION
|
|
273
|
+
|
|
274
|
+
#define DECLARE_TWO_TARGET_OPERATION(op) \
|
|
275
|
+
void op(const Qubit target0, const Qubit target1); \
|
|
276
|
+
void c##op(const Control& control, Qubit target0, Qubit target1); \
|
|
277
|
+
void mc##op(const Controls& controls, Qubit target0, Qubit target1);
|
|
278
|
+
|
|
279
|
+
DECLARE_TWO_TARGET_OPERATION(swap) // NOLINT: bugprone-exception-escape
|
|
280
|
+
DECLARE_TWO_TARGET_OPERATION(dcx)
|
|
281
|
+
DECLARE_TWO_TARGET_OPERATION(ecr)
|
|
282
|
+
DECLARE_TWO_TARGET_OPERATION(iswap)
|
|
283
|
+
DECLARE_TWO_TARGET_OPERATION(iswapdg)
|
|
284
|
+
DECLARE_TWO_TARGET_OPERATION(peres)
|
|
285
|
+
DECLARE_TWO_TARGET_OPERATION(peresdg)
|
|
286
|
+
DECLARE_TWO_TARGET_OPERATION(move)
|
|
287
|
+
|
|
288
|
+
#undef DECLARE_TWO_TARGET_OPERATION
|
|
289
|
+
|
|
290
|
+
#define DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(op, param) \
|
|
291
|
+
void op(const SymbolOrNumber&(param), Qubit target0, Qubit target1); \
|
|
292
|
+
void c##op(const SymbolOrNumber&(param), const Control& control, \
|
|
293
|
+
Qubit target0, Qubit target1); \
|
|
294
|
+
void mc##op(const SymbolOrNumber&(param), const Controls& controls, \
|
|
295
|
+
Qubit target0, Qubit target1);
|
|
296
|
+
|
|
297
|
+
DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(rxx, theta)
|
|
298
|
+
DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(ryy, theta)
|
|
299
|
+
DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(rzz, theta)
|
|
300
|
+
DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(rzx, theta)
|
|
301
|
+
|
|
302
|
+
#undef DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION
|
|
303
|
+
|
|
304
|
+
#define DECLARE_TWO_TARGET_TWO_PARAMETER_OPERATION(op, param0, param1) \
|
|
305
|
+
void op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
|
|
306
|
+
Qubit target0, Qubit target1); \
|
|
307
|
+
void c##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
|
|
308
|
+
const Control& control, Qubit target0, Qubit target1); \
|
|
309
|
+
void mc##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
|
|
310
|
+
const Controls& controls, Qubit target0, Qubit target1);
|
|
311
|
+
|
|
312
|
+
// NOLINTNEXTLINE(readability-identifier-naming)
|
|
313
|
+
DECLARE_TWO_TARGET_TWO_PARAMETER_OPERATION(xx_minus_yy, theta, beta)
|
|
314
|
+
// NOLINTNEXTLINE(readability-identifier-naming)
|
|
315
|
+
DECLARE_TWO_TARGET_TWO_PARAMETER_OPERATION(xx_plus_yy, theta, beta)
|
|
316
|
+
|
|
317
|
+
#undef DECLARE_TWO_TARGET_TWO_PARAMETER_OPERATION
|
|
318
|
+
|
|
319
|
+
void measure(Qubit qubit, std::size_t bit);
|
|
320
|
+
void measure(const Targets& qubits, const std::vector<Bit>& bits);
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* @brief Add measurements to all qubits
|
|
324
|
+
* @param addBits Whether to add new classical bits to the circuit
|
|
325
|
+
* @details This function adds measurements to all qubits in the circuit and
|
|
326
|
+
* appends a new classical register (named "meas") to the circuit if addBits
|
|
327
|
+
* is true. Otherwise, qubit q is measured into classical bit q.
|
|
328
|
+
*/
|
|
329
|
+
void measureAll(bool addBits = true);
|
|
330
|
+
|
|
331
|
+
void reset(Qubit target);
|
|
332
|
+
void reset(const Targets& targets);
|
|
333
|
+
|
|
334
|
+
void barrier();
|
|
335
|
+
void barrier(Qubit target);
|
|
336
|
+
void barrier(const Targets& targets);
|
|
337
|
+
|
|
338
|
+
void ifElse(std::unique_ptr<Operation>&& thenOp,
|
|
339
|
+
std::unique_ptr<Operation>&& elseOp,
|
|
340
|
+
const ClassicalRegister& controlRegister,
|
|
341
|
+
std::uint64_t expectedValue = 1U, ComparisonKind cmp = Eq);
|
|
342
|
+
void ifElse(std::unique_ptr<Operation>&& thenOp,
|
|
343
|
+
std::unique_ptr<Operation>&& elseOp, Bit controlBit,
|
|
344
|
+
bool expectedValue = true, ComparisonKind cmp = Eq);
|
|
345
|
+
|
|
346
|
+
void if_(OpType op, Qubit target, const ClassicalRegister& controlRegister,
|
|
347
|
+
std::uint64_t expectedValue = 1U, ComparisonKind cmp = Eq,
|
|
348
|
+
const std::vector<fp>& params = {});
|
|
349
|
+
void if_(OpType op, Qubit target, Control control,
|
|
350
|
+
const ClassicalRegister& controlRegister,
|
|
351
|
+
std::uint64_t expectedValue = 1U, ComparisonKind cmp = Eq,
|
|
352
|
+
const std::vector<fp>& params = {});
|
|
353
|
+
void if_(OpType op, Qubit target, const Controls& controls,
|
|
354
|
+
const ClassicalRegister& controlRegister,
|
|
355
|
+
std::uint64_t expectedValue = 1U, ComparisonKind cmp = Eq,
|
|
356
|
+
const std::vector<fp>& params = {});
|
|
357
|
+
void if_(OpType op, Qubit target, Bit controlBit, bool expectedValue = true,
|
|
358
|
+
ComparisonKind cmp = Eq, const std::vector<fp>& params = {});
|
|
359
|
+
void if_(OpType op, Qubit target, Control control, Bit controlBit,
|
|
360
|
+
bool expectedValue = true, ComparisonKind cmp = Eq,
|
|
361
|
+
const std::vector<fp>& params = {});
|
|
362
|
+
void if_(OpType op, Qubit target, const Controls& controls, Bit controlBit,
|
|
363
|
+
bool expectedValue = true, ComparisonKind cmp = Eq,
|
|
364
|
+
const std::vector<fp>& params = {});
|
|
365
|
+
|
|
366
|
+
/// strip away qubits with no operations applied to them and which do not pop
|
|
367
|
+
/// up in the output permutation \param force if true, also strip away idle
|
|
368
|
+
/// qubits occurring in the output permutation
|
|
369
|
+
void stripIdleQubits(bool force = false);
|
|
370
|
+
|
|
371
|
+
void initializeIOMapping();
|
|
372
|
+
// append measurements to the end of the circuit according to the tracked
|
|
373
|
+
// output permutation
|
|
374
|
+
void appendMeasurementsAccordingToOutputPermutation(
|
|
375
|
+
const std::string& registerName = "c");
|
|
376
|
+
|
|
377
|
+
// this function augments a given circuit by additional registers
|
|
378
|
+
const QuantumRegister& addQubitRegister(std::size_t nq,
|
|
379
|
+
const std::string& regName = "q");
|
|
380
|
+
const ClassicalRegister&
|
|
381
|
+
addClassicalRegister(std::size_t nc, const std::string& regName = "c");
|
|
382
|
+
const QuantumRegister&
|
|
383
|
+
addAncillaryRegister(std::size_t nq, const std::string& regName = "anc");
|
|
384
|
+
// a function to combine all quantum registers (qregs and ancregs) into a
|
|
385
|
+
// single register (useful for circuits mapped to a device)
|
|
386
|
+
const QuantumRegister&
|
|
387
|
+
unifyQuantumRegisters(const std::string& regName = "q");
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* @brief Removes a logical qubit
|
|
391
|
+
* @param logicalQubitIndex The qubit to remove
|
|
392
|
+
* @return The physical qubit index that the logical qubit was mapped to in
|
|
393
|
+
* the initial layout and the output qubit index that the logical qubit was
|
|
394
|
+
* mapped to in the output permutation.
|
|
395
|
+
*/
|
|
396
|
+
std::pair<Qubit, std::optional<Qubit>> removeQubit(Qubit logicalQubitIndex);
|
|
397
|
+
|
|
398
|
+
// adds physical qubit as ancillary qubit and gives it the appropriate output
|
|
399
|
+
// mapping
|
|
400
|
+
void addAncillaryQubit(Qubit physicalQubitIndex,
|
|
401
|
+
std::optional<Qubit> outputQubitIndex);
|
|
402
|
+
// try to add logical qubit to circuit and assign it to physical qubit with
|
|
403
|
+
// certain output permutation value
|
|
404
|
+
void addQubit(Qubit logicalQubitIndex, Qubit physicalQubitIndex,
|
|
405
|
+
std::optional<Qubit> outputQubitIndex);
|
|
406
|
+
|
|
407
|
+
[[nodiscard]] QuantumComputation
|
|
408
|
+
instantiate(const VariableAssignment& assignment) const;
|
|
409
|
+
void instantiateInplace(const VariableAssignment& assignment);
|
|
410
|
+
|
|
411
|
+
void addVariable(const SymbolOrNumber& expr);
|
|
412
|
+
|
|
413
|
+
template <typename... Vars> void addVariables(const Vars&... vars) {
|
|
414
|
+
(addVariable(vars), ...);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
[[nodiscard]] bool isVariableFree() const;
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* @brief Invert the circuit
|
|
421
|
+
* @details Inverts the circuit by inverting all operations and reversing the
|
|
422
|
+
* order of the operations. Additionally, the initial layout and output
|
|
423
|
+
* permutation are swapped. If the circuit has different initial
|
|
424
|
+
* layout and output permutation sizes, the initial layout and output
|
|
425
|
+
* permutation will not be swapped.
|
|
426
|
+
*/
|
|
427
|
+
void invert();
|
|
428
|
+
|
|
429
|
+
[[nodiscard]] bool operator==(const QuantumComputation& rhs) const;
|
|
430
|
+
[[nodiscard]] bool operator!=(const QuantumComputation& rhs) const {
|
|
431
|
+
return !(*this == rhs);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* printing
|
|
436
|
+
*/
|
|
437
|
+
std::ostream& print(std::ostream& os) const;
|
|
438
|
+
|
|
439
|
+
friend std::ostream& operator<<(std::ostream& os,
|
|
440
|
+
const QuantumComputation& qc) {
|
|
441
|
+
return qc.print(os);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
std::ostream& printStatistics(std::ostream& os) const;
|
|
445
|
+
|
|
446
|
+
static std::ostream& printPermutation(const Permutation& permutation,
|
|
447
|
+
std::ostream& os = std::cout);
|
|
448
|
+
|
|
449
|
+
void dump(const std::string& filename,
|
|
450
|
+
Format format = Format::OpenQASM3) const;
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* @brief Dumps the circuit in OpenQASM format to the given output stream
|
|
454
|
+
* @param of The output stream to write the OpenQASM representation to
|
|
455
|
+
* @param openQasm3 Whether to use OpenQASM 3.0 or 2.0
|
|
456
|
+
*/
|
|
457
|
+
void dumpOpenQASM(std::ostream& of, bool openQasm3 = true) const;
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* @brief Returns the OpenQASM representation of the circuit
|
|
461
|
+
* @param qasm3 Whether to use OpenQASM 3.0 or 2.0
|
|
462
|
+
* @return The OpenQASM representation of the circuit
|
|
463
|
+
*/
|
|
464
|
+
[[nodiscard]] std::string toQASM(bool qasm3 = true) const;
|
|
465
|
+
|
|
466
|
+
// this convenience method allows to turn a circuit into a compound operation.
|
|
467
|
+
std::unique_ptr<CompoundOperation> asCompoundOperation() {
|
|
468
|
+
return std::make_unique<CompoundOperation>(std::move(ops));
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// this convenience method allows to turn a circuit into an operation.
|
|
472
|
+
std::unique_ptr<Operation> asOperation();
|
|
473
|
+
|
|
474
|
+
void reset();
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* @brief Reorders the operations in the quantum computation to establish a
|
|
478
|
+
* canonical order
|
|
479
|
+
* @details Uses iterative breadth-first search starting from the topmost
|
|
480
|
+
* qubit.
|
|
481
|
+
*/
|
|
482
|
+
void reorderOperations();
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* @brief Check whether the quantum computation contains dynamic circuit
|
|
486
|
+
* primitives
|
|
487
|
+
* @details Dynamic circuit primitives are mid-circuit measurements, resets,
|
|
488
|
+
* or classical control flow operations. This method traverses the whole
|
|
489
|
+
* circuit once until it finds a dynamic operation.
|
|
490
|
+
* @return Whether the quantum computation contains dynamic circuit primitives
|
|
491
|
+
*/
|
|
492
|
+
[[nodiscard]] bool isDynamic() const;
|
|
493
|
+
|
|
494
|
+
protected:
|
|
495
|
+
[[nodiscard]] std::size_t getSmallestAncillary() const {
|
|
496
|
+
for (std::size_t i = 0; i < ancillary.size(); ++i) {
|
|
497
|
+
if (ancillary[i]) {
|
|
498
|
+
return i;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
return ancillary.size();
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
[[nodiscard]] std::size_t getSmallestGarbage() const {
|
|
505
|
+
for (std::size_t i = 0; i < garbage.size(); ++i) {
|
|
506
|
+
if (garbage[i]) {
|
|
507
|
+
return i;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
return garbage.size();
|
|
511
|
+
}
|
|
512
|
+
[[nodiscard]] bool isLastOperationOnQubit(const const_iterator& opIt) const {
|
|
513
|
+
const auto end = ops.cend();
|
|
514
|
+
return isLastOperationOnQubit(opIt, end);
|
|
515
|
+
}
|
|
516
|
+
void checkQubitRange(Qubit qubit) const;
|
|
517
|
+
void checkQubitRange(Qubit qubit, const Controls& controls) const;
|
|
518
|
+
void checkQubitRange(Qubit qubit0, Qubit qubit1,
|
|
519
|
+
const Controls& controls) const;
|
|
520
|
+
void checkQubitRange(const std::vector<Qubit>& qubits) const;
|
|
521
|
+
void checkBitRange(Bit bit) const;
|
|
522
|
+
void checkBitRange(const std::vector<Bit>& bits) const;
|
|
523
|
+
void checkClassicalRegister(const ClassicalRegister& creg) const;
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* Pass-Through
|
|
527
|
+
*/
|
|
528
|
+
public:
|
|
529
|
+
// Iterators (pass-through)
|
|
530
|
+
auto begin() noexcept { return ops.begin(); }
|
|
531
|
+
[[nodiscard]] auto begin() const noexcept { return ops.begin(); }
|
|
532
|
+
[[nodiscard]] auto cbegin() const noexcept { return ops.cbegin(); }
|
|
533
|
+
auto end() noexcept { return ops.end(); }
|
|
534
|
+
[[nodiscard]] auto end() const noexcept { return ops.end(); }
|
|
535
|
+
[[nodiscard]] auto cend() const noexcept { return ops.cend(); }
|
|
536
|
+
auto rbegin() noexcept { return ops.rbegin(); }
|
|
537
|
+
[[nodiscard]] auto rbegin() const noexcept { return ops.rbegin(); }
|
|
538
|
+
[[nodiscard]] auto crbegin() const noexcept { return ops.crbegin(); }
|
|
539
|
+
auto rend() noexcept { return ops.rend(); }
|
|
540
|
+
[[nodiscard]] auto rend() const noexcept { return ops.rend(); }
|
|
541
|
+
[[nodiscard]] auto crend() const noexcept { return ops.crend(); }
|
|
542
|
+
|
|
543
|
+
// Capacity (pass-through)
|
|
544
|
+
[[nodiscard]] bool empty() const noexcept { return ops.empty(); }
|
|
545
|
+
[[nodiscard]] std::size_t size() const noexcept { return ops.size(); }
|
|
546
|
+
// NOLINTNEXTLINE(readability-identifier-naming)
|
|
547
|
+
[[nodiscard]] std::size_t max_size() const noexcept { return ops.max_size(); }
|
|
548
|
+
[[nodiscard]] std::size_t capacity() const noexcept { return ops.capacity(); }
|
|
549
|
+
|
|
550
|
+
void reserve(const std::size_t newCap) { ops.reserve(newCap); }
|
|
551
|
+
// NOLINTNEXTLINE(readability-identifier-naming)
|
|
552
|
+
void shrink_to_fit() { ops.shrink_to_fit(); }
|
|
553
|
+
|
|
554
|
+
// Modifiers (pass-through)
|
|
555
|
+
void clear() noexcept { ops.clear(); }
|
|
556
|
+
// NOLINTNEXTLINE(readability-identifier-naming)
|
|
557
|
+
void pop_back() { ops.pop_back(); }
|
|
558
|
+
void resize(const std::size_t count) { ops.resize(count); }
|
|
559
|
+
iterator erase(const const_iterator pos) { return ops.erase(pos); }
|
|
560
|
+
iterator erase(const const_iterator first, const const_iterator last) {
|
|
561
|
+
return ops.erase(first, last);
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// NOLINTNEXTLINE(readability-identifier-naming)
|
|
565
|
+
template <class T> void push_back(const T& op) {
|
|
566
|
+
ops.push_back(std::make_unique<T>(op));
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// NOLINTNEXTLINE(readability-identifier-naming)
|
|
570
|
+
template <class T, class... Args> void emplace_back(Args&&... args) {
|
|
571
|
+
ops.emplace_back(std::make_unique<T>(std::forward<Args>(args)...));
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// NOLINTNEXTLINE(readability-identifier-naming)
|
|
575
|
+
template <class T> void emplace_back(std::unique_ptr<T>& op) {
|
|
576
|
+
ops.emplace_back(std::move(op));
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
// NOLINTNEXTLINE(readability-identifier-naming)
|
|
580
|
+
template <class T> void emplace_back(std::unique_ptr<T>&& op) {
|
|
581
|
+
ops.emplace_back(std::move(op));
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
template <class T> iterator insert(const_iterator pos, T&& op) {
|
|
585
|
+
return ops.insert(pos, std::forward<T>(op));
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
[[nodiscard]] const auto& at(const std::size_t i) const { return ops.at(i); }
|
|
589
|
+
[[nodiscard]] auto& at(const std::size_t i) { return ops.at(i); }
|
|
590
|
+
[[nodiscard]] const auto& front() const { return ops.front(); }
|
|
591
|
+
[[nodiscard]] const auto& back() const { return ops.back(); }
|
|
592
|
+
|
|
593
|
+
// reverse
|
|
594
|
+
void reverse();
|
|
595
|
+
};
|
|
596
|
+
} // namespace qc
|