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,318 @@
|
|
|
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
|
+
#if defined(GMP)
|
|
14
|
+
#include <boost/multiprecision/gmp.hpp> // IWYU pragma: keep
|
|
15
|
+
using Rational = boost::multiprecision::mpq_rational;
|
|
16
|
+
using BigInt = boost::multiprecision::mpz_int;
|
|
17
|
+
#else
|
|
18
|
+
#include <boost/multiprecision/cpp_int.hpp> // IWYU pragma: keep
|
|
19
|
+
#include <boost/multiprecision/fwd.hpp>
|
|
20
|
+
using Rational = boost::multiprecision::cpp_rational;
|
|
21
|
+
using BigInt = boost::multiprecision::cpp_int;
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
#include <boost/multiprecision/rational_adaptor.hpp>
|
|
25
|
+
#include <cmath>
|
|
26
|
+
#include <cstdint>
|
|
27
|
+
#include <cstdlib>
|
|
28
|
+
#include <iostream>
|
|
29
|
+
|
|
30
|
+
namespace zx {
|
|
31
|
+
|
|
32
|
+
/*
|
|
33
|
+
* @brief Representation of fractions as multiples of pi
|
|
34
|
+
* @details Rationals can only have values in the half-open interval (-1,1],
|
|
35
|
+
* corresponding to the interval (-pi, pi]
|
|
36
|
+
*/
|
|
37
|
+
class PiRational {
|
|
38
|
+
public:
|
|
39
|
+
/**
|
|
40
|
+
* @brief Default constructor initializes the rational to 0/1.
|
|
41
|
+
*/
|
|
42
|
+
PiRational() = default;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @brief Construct a PiRational from numerator and denominator.
|
|
46
|
+
* @details The input fraction is already assumed to be in multiples of Pi.
|
|
47
|
+
* For example, the fraction 1/2 corresponds to Pi/2.
|
|
48
|
+
* @param num Numerator of the fraction.
|
|
49
|
+
* @param denom Denominator of the fraction.
|
|
50
|
+
*/
|
|
51
|
+
explicit PiRational(int64_t num, int64_t denom) : frac(num, denom) {
|
|
52
|
+
modPi();
|
|
53
|
+
}
|
|
54
|
+
explicit PiRational(const BigInt& num, const BigInt& denom)
|
|
55
|
+
: frac(num, denom) {
|
|
56
|
+
modPi();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @brief Construct a PiRational from numerator. Denominator is assumed to
|
|
61
|
+
* be 1.
|
|
62
|
+
* @details The input numerator is already assumed to be in multiples of Pi.
|
|
63
|
+
* For example a numerator of 1 corresponds to a fraction Pi/1.
|
|
64
|
+
* @param num Numerator of the fraction.
|
|
65
|
+
*/
|
|
66
|
+
explicit PiRational(int64_t num) : frac(num, 1) { modPi(); }
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @brief Construct a PiRational from a double.
|
|
70
|
+
* @details The input double is approximated as a fraction of Pi within a
|
|
71
|
+
* tolerance of 1e-13.
|
|
72
|
+
* @param val Double value to be approximated.
|
|
73
|
+
*/
|
|
74
|
+
explicit PiRational(double val);
|
|
75
|
+
|
|
76
|
+
PiRational& operator+=(const PiRational& rhs);
|
|
77
|
+
PiRational& operator+=(int64_t rhs);
|
|
78
|
+
|
|
79
|
+
PiRational& operator-=(const PiRational& rhs);
|
|
80
|
+
PiRational& operator-=(int64_t rhs);
|
|
81
|
+
|
|
82
|
+
PiRational& operator*=(const PiRational& rhs);
|
|
83
|
+
PiRational& operator*=(int64_t rhs);
|
|
84
|
+
|
|
85
|
+
PiRational& operator/=(const PiRational& rhs);
|
|
86
|
+
PiRational& operator/=(int64_t rhs);
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @brief Check if the fraction is an integer, i.e., the denominator is 1.
|
|
90
|
+
* @return True if the fraction is an integer, false otherwise.
|
|
91
|
+
*/
|
|
92
|
+
[[nodiscard]] bool isInteger() const {
|
|
93
|
+
return boost::multiprecision::denominator(frac) == 1;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @brief Check if the fraction is zero, i,e, the numerator is 0.
|
|
98
|
+
* @return True if the fraction is zero, false otherwise.
|
|
99
|
+
*/
|
|
100
|
+
[[nodiscard]] bool isZero() const {
|
|
101
|
+
return boost::multiprecision::numerator(frac) == 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @brief Get the denominator of the fraction.
|
|
106
|
+
* @return Denominator of the fraction.
|
|
107
|
+
*/
|
|
108
|
+
[[nodiscard]] BigInt getDenom() const {
|
|
109
|
+
return boost::multiprecision::denominator(frac);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @brief Get the numerator of the fraction.
|
|
114
|
+
* @return Numerator of the fraction.
|
|
115
|
+
*/
|
|
116
|
+
[[nodiscard]] BigInt getNum() const {
|
|
117
|
+
return boost::multiprecision::numerator(frac);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @brief Convert the fraction to a double.
|
|
122
|
+
* @details The result is not taken mod Pi. Converting 1/1 will return an
|
|
123
|
+
* approximation of Pi.
|
|
124
|
+
* @return Double value of the fraction.
|
|
125
|
+
*/
|
|
126
|
+
[[nodiscard]] double toDouble() const;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @brief Convert the fraction to a double mod Pi.
|
|
130
|
+
* @details The result is taken mod Pi. Converting 1/1 will return 1.0.
|
|
131
|
+
* @return Double value of the fraction.
|
|
132
|
+
*/
|
|
133
|
+
[[nodiscard]] double toDoubleDivPi() const {
|
|
134
|
+
return frac.convert_to<double>();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* @brief Check if the fraction is close to a double value within a tolerance.
|
|
139
|
+
* @details The comparison is not done mod Pi. So if the fraction is 1/1
|
|
140
|
+
* isClose(1.0, 1e-13) will return true.
|
|
141
|
+
* @param x Double value to compare to.
|
|
142
|
+
* @param tolerance Tolerance for the comparison.
|
|
143
|
+
* @return True if the fraction is close to the double value, false otherwise.
|
|
144
|
+
*/
|
|
145
|
+
[[nodiscard]] bool isClose(const double x, const double tolerance) const {
|
|
146
|
+
return std::abs(toDouble() - x) < tolerance;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @brief Check if the fraction is close to a double value within a tolerance
|
|
151
|
+
* mod Pi.
|
|
152
|
+
* @details The comparison is done mod Pi. So if the fraction is 1/1
|
|
153
|
+
* isCloseDivPi(1.0, 1e-13) will return false, but isCloseDivPi(3.14159,
|
|
154
|
+
* 1e-14) will return true.
|
|
155
|
+
* @param x Double value to compare to.
|
|
156
|
+
* @param tolerance Tolerance for the comparison.
|
|
157
|
+
* @return True if the fraction is close to the double value divided by Pi,
|
|
158
|
+
* false otherwise.
|
|
159
|
+
*/
|
|
160
|
+
[[nodiscard]] bool isCloseDivPi(const double x,
|
|
161
|
+
const double tolerance) const {
|
|
162
|
+
return std::abs(toDoubleDivPi() - x) < tolerance;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* @brief Get the double value of the fraction.
|
|
167
|
+
* @details The result is not taken mod Pi. Converting 1/1 will return 1.0.
|
|
168
|
+
* @return Double value of the fraction.
|
|
169
|
+
*/
|
|
170
|
+
explicit operator double() const { return this->toDouble(); }
|
|
171
|
+
|
|
172
|
+
private:
|
|
173
|
+
Rational frac;
|
|
174
|
+
|
|
175
|
+
void modPi();
|
|
176
|
+
|
|
177
|
+
void setNum(const BigInt& num) {
|
|
178
|
+
boost::multiprecision::numerator(frac) = num;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
void setDenom(const BigInt& denom) const {
|
|
182
|
+
boost::multiprecision::denominator(frac) = denom;
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
inline PiRational operator-(const PiRational& rhs) {
|
|
187
|
+
return PiRational(-rhs.getNum(), rhs.getDenom());
|
|
188
|
+
}
|
|
189
|
+
inline PiRational operator+(PiRational lhs, const PiRational& rhs) {
|
|
190
|
+
lhs += rhs;
|
|
191
|
+
return lhs;
|
|
192
|
+
}
|
|
193
|
+
inline PiRational operator+(PiRational lhs, const int64_t rhs) {
|
|
194
|
+
lhs += rhs;
|
|
195
|
+
return lhs;
|
|
196
|
+
}
|
|
197
|
+
inline PiRational operator+(const int64_t lhs, PiRational rhs) {
|
|
198
|
+
rhs += lhs;
|
|
199
|
+
return rhs;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
inline PiRational operator-(PiRational lhs, const PiRational& rhs) {
|
|
203
|
+
lhs -= rhs;
|
|
204
|
+
return lhs;
|
|
205
|
+
}
|
|
206
|
+
inline PiRational operator-(PiRational lhs, const int64_t rhs) {
|
|
207
|
+
lhs -= rhs;
|
|
208
|
+
return lhs;
|
|
209
|
+
}
|
|
210
|
+
inline PiRational operator-(const int64_t lhs, PiRational rhs) {
|
|
211
|
+
rhs -= lhs;
|
|
212
|
+
return rhs;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
inline PiRational operator*(PiRational lhs, const PiRational& rhs) {
|
|
216
|
+
lhs *= rhs;
|
|
217
|
+
return lhs;
|
|
218
|
+
}
|
|
219
|
+
inline PiRational operator*(PiRational lhs, const int64_t rhs) {
|
|
220
|
+
lhs *= rhs;
|
|
221
|
+
return lhs;
|
|
222
|
+
}
|
|
223
|
+
inline PiRational operator*(const int64_t lhs, PiRational rhs) {
|
|
224
|
+
rhs *= lhs;
|
|
225
|
+
return rhs;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
inline PiRational operator/(PiRational lhs, const PiRational& rhs) {
|
|
229
|
+
lhs /= rhs;
|
|
230
|
+
return lhs;
|
|
231
|
+
}
|
|
232
|
+
inline PiRational operator/(PiRational lhs, const int64_t rhs) {
|
|
233
|
+
lhs /= rhs;
|
|
234
|
+
return lhs;
|
|
235
|
+
}
|
|
236
|
+
inline PiRational operator/(const int64_t lhs, PiRational rhs) {
|
|
237
|
+
rhs /= lhs;
|
|
238
|
+
return rhs;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
inline bool operator<(const PiRational& lhs, const PiRational& rhs) {
|
|
242
|
+
return (lhs.getNum() * rhs.getDenom()) < (rhs.getNum() * lhs.getDenom());
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
inline bool operator<(const PiRational& lhs, const int64_t rhs) {
|
|
246
|
+
return lhs.getNum() < (rhs * lhs.getDenom());
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
inline bool operator<(const int64_t lhs, const PiRational& rhs) {
|
|
250
|
+
return (lhs * rhs.getDenom()) < rhs.getNum();
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
inline bool operator<=(const PiRational& lhs, const PiRational& rhs) {
|
|
254
|
+
return (lhs.getNum() * rhs.getDenom()) <= (rhs.getNum() * lhs.getDenom());
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
inline bool operator<=(const PiRational& lhs, const int64_t rhs) {
|
|
258
|
+
return lhs.getNum() <= (rhs * lhs.getDenom());
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
inline bool operator<=(const int64_t lhs, const PiRational& rhs) {
|
|
262
|
+
return (lhs * rhs.getDenom()) <= rhs.getNum();
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
inline bool operator>(const PiRational& lhs, const PiRational& rhs) {
|
|
266
|
+
return rhs < lhs;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
inline bool operator>(const PiRational& lhs, const int64_t rhs) {
|
|
270
|
+
return rhs < lhs;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
inline bool operator>(const int64_t lhs, const PiRational& rhs) {
|
|
274
|
+
return rhs < lhs;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
inline bool operator>=(const PiRational& lhs, const PiRational& rhs) {
|
|
278
|
+
return rhs <= lhs;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
inline bool operator>=(const PiRational& lhs, const int64_t rhs) {
|
|
282
|
+
return rhs <= lhs;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
inline bool operator>=(const int64_t lhs, const PiRational& rhs) {
|
|
286
|
+
return rhs <= lhs;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
inline bool operator==(const PiRational& lhs, const PiRational& rhs) {
|
|
290
|
+
return lhs.getNum() == rhs.getNum() && lhs.getDenom() == rhs.getDenom();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
inline bool operator==(const PiRational& lhs, const int64_t rhs) {
|
|
294
|
+
return lhs.getNum() == rhs && lhs.getDenom() == 1;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
inline bool operator==(const int64_t lhs, const PiRational& rhs) {
|
|
298
|
+
return rhs == lhs;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
inline bool operator!=(const PiRational& lhs, const PiRational& rhs) {
|
|
302
|
+
return !(lhs == rhs);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
inline bool operator!=(const PiRational& lhs, const int64_t rhs) {
|
|
306
|
+
return !(lhs == rhs);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
inline bool operator!=(const int64_t lhs, const PiRational& rhs) {
|
|
310
|
+
return !(lhs == rhs);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
inline std::ostream& operator<<(std::ostream& os, const zx::PiRational& rhs) {
|
|
314
|
+
os << rhs.getNum() << "/" << rhs.getDenom();
|
|
315
|
+
return os;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
} // namespace zx
|
|
@@ -0,0 +1,132 @@
|
|
|
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 "ZXDefinitions.hpp"
|
|
14
|
+
|
|
15
|
+
namespace zx {
|
|
16
|
+
class ZXDiagram;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @brief Check whether the spider has exactly two incident edges and a phase of
|
|
20
|
+
* 0.
|
|
21
|
+
* @param diag The diagram.
|
|
22
|
+
* @param v The vertex to check.
|
|
23
|
+
* @return True if the spider has exactly two incident edges and a phase of 0.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
bool checkIdSimp(const ZXDiagram& diag, Vertex v);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @brief Remove spider from the diagram. checkIdSimp() should yield true.
|
|
30
|
+
* @details The spider is removed by connecting its incident edges.
|
|
31
|
+
*/
|
|
32
|
+
void removeId(ZXDiagram& diag, Vertex v);
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @brief Check whether two spiders can be fused.
|
|
36
|
+
* @details See https://arxiv.org/abs/2012.13966, page 27, rule (f).
|
|
37
|
+
* @param diag The diagram.
|
|
38
|
+
* @param v0 The first spider.
|
|
39
|
+
* @param v1 The second spider.
|
|
40
|
+
* @return True if the spiders can be fused.
|
|
41
|
+
*/
|
|
42
|
+
bool checkSpiderFusion(const ZXDiagram& diag, Vertex v0, Vertex v1);
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @brief Fuse two spiders. checkSpiderFusion() should yield true.
|
|
46
|
+
* @details The spiders are fused by connecting their incident edges.
|
|
47
|
+
*/
|
|
48
|
+
void fuseSpiders(ZXDiagram& diag, Vertex v0, Vertex v1);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @brief Check if the local complementation rule can be applied to the given
|
|
52
|
+
* spider.
|
|
53
|
+
* @details See https://arxiv.org/abs/2012.13966, equation (102).
|
|
54
|
+
* @param diag The diagram.
|
|
55
|
+
* @param v The spider.
|
|
56
|
+
* @return True if the local complementation rule can be applied.
|
|
57
|
+
*/
|
|
58
|
+
bool checkLocalComp(const ZXDiagram& diag, Vertex v);
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @brief Apply the local complementation rule to the given spider.
|
|
62
|
+
* checkLocalComp() should yield true.
|
|
63
|
+
* @details See https://arxiv.org/abs/2012.13966, equation (102).
|
|
64
|
+
*/
|
|
65
|
+
void localComp(ZXDiagram& diag, Vertex v);
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @brief Check if the pivot rule can be applied to the given interior spiders.
|
|
69
|
+
* @details See https://arxiv.org/abs/2012.13966, equation (103).
|
|
70
|
+
* @param diag The diagram.
|
|
71
|
+
* @param v0 The first spider.
|
|
72
|
+
* @param v1 The second spider.
|
|
73
|
+
* @return True if the pivot rule can be applied.
|
|
74
|
+
*/
|
|
75
|
+
bool checkPivotPauli(const ZXDiagram& diag, Vertex v0, Vertex v1);
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @brief Apply the pivot rule to the given interior spiders. checkPivotPauli()
|
|
79
|
+
* should yield true.
|
|
80
|
+
* @details See https://arxiv.org/abs/2012.13966, equation (103).
|
|
81
|
+
*/
|
|
82
|
+
void pivotPauli(ZXDiagram& diag, Vertex v0, Vertex v1);
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @brief Check if the pivot rule can be applied. Spiders can be connected to
|
|
86
|
+
* boundaries.
|
|
87
|
+
* @param diag The diagram.
|
|
88
|
+
* @param v0 The first spider.
|
|
89
|
+
* @param v1 The second spider.
|
|
90
|
+
* @return True if the pivot rule can be applied.
|
|
91
|
+
*/
|
|
92
|
+
bool checkPivot(const ZXDiagram& diag, Vertex v0, Vertex v1);
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @brief Apply the pivot rule. Spiders can be connected to boundaries.
|
|
96
|
+
* checkPivot() should yield true.
|
|
97
|
+
*/
|
|
98
|
+
void pivot(ZXDiagram& diag, Vertex v0, Vertex v1);
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* @brief Check if the gadget pivot rule can be applied. Spiders can be
|
|
102
|
+
* connected to boundaries.
|
|
103
|
+
* @details See https://arxiv.org/abs/1903.10477, page 13
|
|
104
|
+
* rule (P2) and (P3) for details.
|
|
105
|
+
* @param diag The diagram.
|
|
106
|
+
* @param v0 The first spider.
|
|
107
|
+
* @param v1 The second spider.
|
|
108
|
+
* @return True if the gadget pivot rule can be applied.
|
|
109
|
+
*/
|
|
110
|
+
bool checkPivotGadget(const ZXDiagram& diag, Vertex v0, Vertex v1);
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @brief Apply the gadget pivot rule. Spiders can be connected to boundaries.
|
|
114
|
+
* checkPivotGadget() should yield true.
|
|
115
|
+
* @details See https://arxiv.org/abs/1903.10477, page 13
|
|
116
|
+
* rule (P2) and (P3) for details.
|
|
117
|
+
*/
|
|
118
|
+
void pivotGadget(ZXDiagram& diag, Vertex v0, Vertex v1);
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @brief Check if a gadget can be fused with its connected spider and fuse if
|
|
122
|
+
* true.
|
|
123
|
+
* @details Unlike other rules, this function performs the check and
|
|
124
|
+
* modification in one step. This is for performance reasons, since the overhead
|
|
125
|
+
* for the check is significant and otherwise intermediate results would have to
|
|
126
|
+
* be computed twice. See https://arxiv.org/abs/1903.10477, page 13, rule (ID).
|
|
127
|
+
* @param diag The diagram.
|
|
128
|
+
* @param v The spider.
|
|
129
|
+
* @return True if the gadget can be fused with its connected spider.
|
|
130
|
+
*/
|
|
131
|
+
bool checkAndFuseGadget(ZXDiagram& diag, Vertex v);
|
|
132
|
+
} // namespace zx
|
|
@@ -0,0 +1,182 @@
|
|
|
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 "Rules.hpp"
|
|
14
|
+
#include "ZXDefinitions.hpp"
|
|
15
|
+
#include "ZXDiagram.hpp"
|
|
16
|
+
|
|
17
|
+
#include <cstddef>
|
|
18
|
+
|
|
19
|
+
namespace zx {
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @brief Simplify the diagram by applying the given rule to all vertices that
|
|
23
|
+
* match the given check.
|
|
24
|
+
* @tparam VertexCheckFun Type of the check function
|
|
25
|
+
* @tparam VertexRuleFun Type of the rule function
|
|
26
|
+
* @param diag The diagram to simplify
|
|
27
|
+
* @param check The check function that determines if a vertex should be
|
|
28
|
+
* simplified
|
|
29
|
+
* @param rule The rule function that is applied to the vertex
|
|
30
|
+
* @return The number of simplifications that were applied
|
|
31
|
+
*/
|
|
32
|
+
template <class VertexCheckFun, class VertexRuleFun>
|
|
33
|
+
std::size_t simplifyVertices(ZXDiagram& diag, VertexCheckFun check,
|
|
34
|
+
VertexRuleFun rule) {
|
|
35
|
+
std::size_t nSimplifications = 0;
|
|
36
|
+
bool newMatches = true;
|
|
37
|
+
|
|
38
|
+
while (newMatches) {
|
|
39
|
+
newMatches = false;
|
|
40
|
+
for (const auto& [v, _] : diag.getVertices()) {
|
|
41
|
+
if (check(diag, v)) {
|
|
42
|
+
rule(diag, v);
|
|
43
|
+
newMatches = true;
|
|
44
|
+
nSimplifications++;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return nSimplifications;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @brief Simplify the diagram by applying the given rule to all edges that
|
|
54
|
+
* match the given check.
|
|
55
|
+
* @tparam EdgeCheckFun Type of the check function
|
|
56
|
+
* @tparam EdgeRuleFun Type of the rule function
|
|
57
|
+
* @param diag The diagram to simplify
|
|
58
|
+
* @param check The check function that determines if an edge should be
|
|
59
|
+
* simplified
|
|
60
|
+
* @param rule The rule function that is applied to the edge
|
|
61
|
+
* @return The number of simplifications that were applied
|
|
62
|
+
*/
|
|
63
|
+
template <class EdgeCheckFun, class EdgeRuleFun>
|
|
64
|
+
std::size_t simplifyEdges(ZXDiagram& diag, EdgeCheckFun check,
|
|
65
|
+
EdgeRuleFun rule) {
|
|
66
|
+
std::size_t nSimplifications = 0;
|
|
67
|
+
bool newMatches = true;
|
|
68
|
+
|
|
69
|
+
while (newMatches) {
|
|
70
|
+
newMatches = false;
|
|
71
|
+
for (const auto& [v0, v1] : diag.getEdges()) {
|
|
72
|
+
if (diag.isDeleted(v0) || diag.isDeleted(v1) || !check(diag, v0, v1)) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
rule(diag, v0, v1);
|
|
76
|
+
newMatches = true;
|
|
77
|
+
nSimplifications++;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return nSimplifications;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
std::size_t gadgetSimp(ZXDiagram& diag);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @brief Apply the identity rule to the Diagram until exhaustion.
|
|
88
|
+
* @details A spider with exactly two incident edges and a phase of 0 is
|
|
89
|
+
* removed. See https://arxiv.org/abs/2012.13966 page 27, rule (id).
|
|
90
|
+
* @param diag The diagram to simplify
|
|
91
|
+
* @return The number of simplifications that were applied
|
|
92
|
+
*/
|
|
93
|
+
|
|
94
|
+
std::size_t idSimp(ZXDiagram& diag);
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @brief Apply the spider rule to the Diagram until exhaustion.
|
|
98
|
+
* @details Spiders of the same type connected by a regular edge can be turned
|
|
99
|
+
* into one
|
|
100
|
+
* by adding both phases and fusing all incident edges.
|
|
101
|
+
* See https://arxiv.org/abs/2012.13966 page 27, rule (f).
|
|
102
|
+
* @param diag The diagram to simplify
|
|
103
|
+
* @return The number of simplifications that were applied
|
|
104
|
+
*/
|
|
105
|
+
std::size_t spiderSimp(ZXDiagram& diag);
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @brief Apply the local complementation rule to the Diagram until exhaustion.
|
|
109
|
+
* @details See https://arxiv.org/abs/2012.13966 equation (102).
|
|
110
|
+
* @param diag The diagram to simplify
|
|
111
|
+
* @return The number of simplifications that were applied
|
|
112
|
+
*/
|
|
113
|
+
std::size_t localCompSimp(ZXDiagram& diag);
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @brief Simplify the diagram by applying the pivot rule.
|
|
117
|
+
* @details See https://arxiv.org/abs/2012.13966, equation 103 for details.
|
|
118
|
+
* Similar to the Pauli pivot rule but can be applied to vertices connectedto
|
|
119
|
+
* the boundary.
|
|
120
|
+
* @param diag The diagram to simplify.
|
|
121
|
+
* @return The number of simplifications applied.
|
|
122
|
+
*/
|
|
123
|
+
std::size_t pivotSimp(ZXDiagram& diag);
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Simplify the diagram by applying the pivot rule in the case that the pivot
|
|
127
|
+
* spiders have phases of Pi. See https://arxiv.org/abs/2012.13966, equation 103
|
|
128
|
+
* for details.
|
|
129
|
+
* @param diag The diagram to simplify.
|
|
130
|
+
* @return The number of simplifications applied.
|
|
131
|
+
*/
|
|
132
|
+
std::size_t pivotPauliSimp(ZXDiagram& diag);
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* @brief Simplify all internal vertices and edges of the diagram using Clifford
|
|
136
|
+
* simplifications.
|
|
137
|
+
* @details This function applies the id, spider, local complementation,
|
|
138
|
+
* and Pauli pivot rules.
|
|
139
|
+
* @param diag The diagram to simplify.
|
|
140
|
+
* @return The number of simplifications applied.
|
|
141
|
+
*/
|
|
142
|
+
std::size_t interiorCliffordSimp(ZXDiagram& diag);
|
|
143
|
+
|
|
144
|
+
/*
|
|
145
|
+
* @brief Simplify the diagram using Clifford simplifications.
|
|
146
|
+
* @details In addition to interior Clifford simplifications, this function also
|
|
147
|
+
* applies the regular pivot rule.
|
|
148
|
+
* @param diag The diagram to simplify.
|
|
149
|
+
* @return The number of simplifications applied.
|
|
150
|
+
*/
|
|
151
|
+
std::size_t cliffordSimp(ZXDiagram& diag);
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* @brief Simplify the diagram by applying the pivot rule to non-Pauli spider.
|
|
155
|
+
* @details By extracting the phases into extra "gadgets", the pivot rule can be
|
|
156
|
+
* applies to non-Pauli spiders. See https://arxiv.org/abs/1903.10477, page 13
|
|
157
|
+
* rule (P2) and (P3) for details.
|
|
158
|
+
* @param diag The diagram to simplify.
|
|
159
|
+
* @return The number of simplifications applied.
|
|
160
|
+
*/
|
|
161
|
+
std::size_t pivotgadgetSimp(ZXDiagram& diag);
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @brief Simplify the diagram by applying Clifford simplifications and the
|
|
165
|
+
* gadget pivot rule.
|
|
166
|
+
* @details In addition to the Clifford simplification, this function also
|
|
167
|
+
* applies the pivot gadget rule.
|
|
168
|
+
* @param diag The diagram to simplify.
|
|
169
|
+
* @return The number of simplifications applied.
|
|
170
|
+
*/
|
|
171
|
+
std::size_t fullReduce(ZXDiagram& diag);
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* @brief Apply full reduction to the diagram. Rounds phases to nearest multiple
|
|
175
|
+
* of Pi/2 during simplification.
|
|
176
|
+
* @param diag The diagram to simplify.
|
|
177
|
+
* @param tolerance The tolerance for rounding phases to multiples of Pi/2.
|
|
178
|
+
* @return The number of simplifications applied
|
|
179
|
+
*/
|
|
180
|
+
std::size_t fullReduceApproximate(ZXDiagram& diag, fp tolerance);
|
|
181
|
+
|
|
182
|
+
} // namespace zx
|