mqt-core 3.3.2__cp313-cp313t-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mqt/core/__init__.py +89 -0
- mqt/core/__main__.py +55 -0
- mqt/core/_commands.py +52 -0
- mqt/core/_compat/__init__.py +11 -0
- mqt/core/_compat/typing.py +29 -0
- mqt/core/_version.py +34 -0
- mqt/core/_version.pyi +12 -0
- mqt/core/bin/mqt-core-algorithms.dll +0 -0
- mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
- mqt/core/bin/mqt-core-dd.dll +0 -0
- mqt/core/bin/mqt-core-ds.dll +0 -0
- mqt/core/bin/mqt-core-fomac.dll +0 -0
- mqt/core/bin/mqt-core-ir.dll +0 -0
- mqt/core/bin/mqt-core-na-fomac.dll +0 -0
- mqt/core/bin/mqt-core-na.dll +0 -0
- mqt/core/bin/mqt-core-qasm.dll +0 -0
- mqt/core/bin/mqt-core-qdmi-driver.dll +0 -0
- mqt/core/bin/mqt-core-qdmi-na-device.dll +0 -0
- mqt/core/bin/mqt-core-zx.dll +0 -0
- mqt/core/dd.cp313t-win_amd64.pyd +0 -0
- mqt/core/dd.pyi +1016 -0
- mqt/core/dd_evaluation.py +368 -0
- mqt/core/fomac.cp313t-win_amd64.pyd +0 -0
- mqt/core/fomac.pyi +125 -0
- mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
- mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
- mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
- mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
- mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
- mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
- mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
- mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
- mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
- mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
- mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
- mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
- mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
- mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
- mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
- mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
- mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
- mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
- mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
- mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
- mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
- mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
- mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
- mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
- mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
- mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
- mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
- mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
- mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
- mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
- mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
- mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
- mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
- mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
- mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
- mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
- mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
- mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
- mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
- mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
- mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
- mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
- mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
- mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
- mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
- mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
- mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
- mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
- mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
- mqt/core/include/mqt-core/boost/config.hpp +67 -0
- mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
- mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
- mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
- mqt/core/include/mqt-core/boost/limits.hpp +146 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
- mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
- mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
- mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
- mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
- mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
- mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
- mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
- mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
- mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
- mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
- mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
- mqt/core/include/mqt-core/boost/version.hpp +32 -0
- mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +119 -0
- mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
- mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
- mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
- mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
- mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
- mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
- mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
- mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
- mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
- mqt/core/include/mqt-core/dd/CachedEdge.hpp +174 -0
- mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
- mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
- mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
- mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
- mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
- mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
- mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
- mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
- mqt/core/include/mqt-core/dd/Export.hpp +438 -0
- mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
- mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
- mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
- mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
- mqt/core/include/mqt-core/dd/Node.hpp +223 -0
- mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
- mqt/core/include/mqt-core/dd/Operations.hpp +306 -0
- mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
- mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
- mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
- mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
- mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
- mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
- mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
- mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
- mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
- mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
- mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
- mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
- mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
- mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
- mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
- mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
- mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
- mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
- mqt/core/include/mqt-core/ir/QuantumComputation.hpp +596 -0
- mqt/core/include/mqt-core/ir/Register.hpp +125 -0
- mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
- mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
- mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +212 -0
- mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
- mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
- mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
- mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
- mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
- mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
- mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
- mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
- mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
- mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
- mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
- mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
- mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
- mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
- mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
- mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
- mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
- mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
- mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
- mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
- mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
- mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
- mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
- mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
- mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
- mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
- mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
- mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
- mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
- mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
- mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
- mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
- mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
- mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
- mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
- mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
- mqt/core/include/mqt-core/qasm3/StdGates.hpp +232 -0
- mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
- mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
- mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
- mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
- mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
- mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
- mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
- mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
- mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
- mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
- mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
- mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
- mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
- mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
- mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
- mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
- mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
- mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
- mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
- mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
- mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
- mqt/core/include/nlohmann/detail/hash.hpp +129 -0
- mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
- mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
- mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
- mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
- mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
- mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
- mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
- mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
- mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
- mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
- mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
- mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
- mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
- mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
- mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
- mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
- mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
- mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
- mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
- mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
- mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
- mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
- mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
- mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
- mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
- mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
- mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
- mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
- mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
- mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
- mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
- mqt/core/include/nlohmann/json.hpp +5306 -0
- mqt/core/include/nlohmann/json_fwd.hpp +75 -0
- mqt/core/include/nlohmann/ordered_map.hpp +359 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
- mqt/core/include/qdmi/qdmi/client.h +990 -0
- mqt/core/include/qdmi/qdmi/constants.h +1139 -0
- mqt/core/include/qdmi/qdmi/device.h +602 -0
- mqt/core/include/qdmi/qdmi/types.h +78 -0
- mqt/core/include/spdlog/async.h +99 -0
- mqt/core/include/spdlog/async_logger-inl.h +84 -0
- mqt/core/include/spdlog/async_logger.h +74 -0
- mqt/core/include/spdlog/cfg/argv.h +40 -0
- mqt/core/include/spdlog/cfg/env.h +36 -0
- mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
- mqt/core/include/spdlog/cfg/helpers.h +29 -0
- mqt/core/include/spdlog/common-inl.h +68 -0
- mqt/core/include/spdlog/common.h +406 -0
- mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
- mqt/core/include/spdlog/details/backtracer.h +45 -0
- mqt/core/include/spdlog/details/circular_q.h +115 -0
- mqt/core/include/spdlog/details/console_globals.h +28 -0
- mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
- mqt/core/include/spdlog/details/file_helper.h +61 -0
- mqt/core/include/spdlog/details/fmt_helper.h +141 -0
- mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
- mqt/core/include/spdlog/details/log_msg.h +40 -0
- mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
- mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
- mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
- mqt/core/include/spdlog/details/null_mutex.h +35 -0
- mqt/core/include/spdlog/details/os-inl.h +606 -0
- mqt/core/include/spdlog/details/os.h +127 -0
- mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
- mqt/core/include/spdlog/details/periodic_worker.h +58 -0
- mqt/core/include/spdlog/details/registry-inl.h +270 -0
- mqt/core/include/spdlog/details/registry.h +131 -0
- mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
- mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
- mqt/core/include/spdlog/details/tcp_client.h +127 -0
- mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
- mqt/core/include/spdlog/details/thread_pool.h +117 -0
- mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
- mqt/core/include/spdlog/details/udp_client.h +81 -0
- mqt/core/include/spdlog/details/windows_include.h +11 -0
- mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
- mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
- mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
- mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
- mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
- mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
- mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
- mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
- mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
- mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
- mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
- mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
- mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
- mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
- mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
- mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
- mqt/core/include/spdlog/fmt/chrono.h +23 -0
- mqt/core/include/spdlog/fmt/compile.h +23 -0
- mqt/core/include/spdlog/fmt/fmt.h +30 -0
- mqt/core/include/spdlog/fmt/ostr.h +23 -0
- mqt/core/include/spdlog/fmt/ranges.h +23 -0
- mqt/core/include/spdlog/fmt/std.h +24 -0
- mqt/core/include/spdlog/fmt/xchar.h +23 -0
- mqt/core/include/spdlog/formatter.h +17 -0
- mqt/core/include/spdlog/fwd.h +18 -0
- mqt/core/include/spdlog/logger-inl.h +198 -0
- mqt/core/include/spdlog/logger.h +379 -0
- mqt/core/include/spdlog/mdc.h +52 -0
- mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
- mqt/core/include/spdlog/pattern_formatter.h +118 -0
- mqt/core/include/spdlog/sinks/android_sink.h +137 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
- mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
- mqt/core/include/spdlog/sinks/base_sink.h +51 -0
- mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
- mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
- mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
- mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
- mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
- mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
- mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
- mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
- mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
- mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
- mqt/core/include/spdlog/sinks/null_sink.h +41 -0
- mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
- mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
- mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
- mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
- mqt/core/include/spdlog/sinks/sink.h +34 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
- mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
- mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
- mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
- mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
- mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
- mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
- mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
- mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
- mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
- mqt/core/include/spdlog/spdlog-inl.h +96 -0
- mqt/core/include/spdlog/spdlog.h +357 -0
- mqt/core/include/spdlog/stopwatch.h +66 -0
- mqt/core/include/spdlog/tweakme.h +148 -0
- mqt/core/include/spdlog/version.h +11 -0
- mqt/core/ir/__init__.pyi +2078 -0
- mqt/core/ir/operations.pyi +1011 -0
- mqt/core/ir/registers.pyi +91 -0
- mqt/core/ir/symbolic.pyi +177 -0
- mqt/core/ir.cp313t-win_amd64.pyd +0 -0
- mqt/core/lib/mqt-core-algorithms.lib +0 -0
- mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
- mqt/core/lib/mqt-core-dd.lib +0 -0
- mqt/core/lib/mqt-core-ds.lib +0 -0
- mqt/core/lib/mqt-core-fomac.lib +0 -0
- mqt/core/lib/mqt-core-ir.lib +0 -0
- mqt/core/lib/mqt-core-na-fomac.lib +0 -0
- mqt/core/lib/mqt-core-na.lib +0 -0
- mqt/core/lib/mqt-core-qasm.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-driver.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-na-device-gen.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-na-device.lib +0 -0
- mqt/core/lib/mqt-core-zx.lib +0 -0
- mqt/core/lib/pkgconfig/spdlog.pc +13 -0
- mqt/core/lib/spdlog.lib +0 -0
- mqt/core/na/__init__.py +12 -0
- mqt/core/na/fomac.cp313t-win_amd64.pyd +0 -0
- mqt/core/na/fomac.pyi +117 -0
- mqt/core/nlohmann_json.natvis +278 -0
- mqt/core/plugins/__init__.py +9 -0
- mqt/core/plugins/qiskit/__init__.py +19 -0
- mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
- mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
- mqt/core/py.typed +2 -0
- mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
- mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
- mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
- mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -0
- mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
- mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +52 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +445 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +110 -0
- mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
- mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
- mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
- mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
- mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
- mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
- mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +121 -0
- mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
- mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
- mqt_core-3.3.2.dist-info/DELVEWHEEL +2 -0
- mqt_core-3.3.2.dist-info/METADATA +210 -0
- mqt_core-3.3.2.dist-info/RECORD +537 -0
- mqt_core-3.3.2.dist-info/WHEEL +5 -0
- mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
- mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -0
- mqt_core.libs/msvcp140.dll +0 -0
|
@@ -0,0 +1,847 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023 - 2025 Chair for Design Automation, TUM
|
|
3
|
+
* Copyright (c) 2025 Munich Quantum Software Company GmbH
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* SPDX-License-Identifier: MIT
|
|
7
|
+
*
|
|
8
|
+
* Licensed under the MIT License
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#pragma once
|
|
12
|
+
|
|
13
|
+
#include "ir/Definitions.hpp"
|
|
14
|
+
|
|
15
|
+
#include <algorithm>
|
|
16
|
+
#include <cmath>
|
|
17
|
+
#include <cstddef>
|
|
18
|
+
#include <cstdint>
|
|
19
|
+
#include <functional>
|
|
20
|
+
#include <numeric>
|
|
21
|
+
#include <ostream>
|
|
22
|
+
#include <stdexcept>
|
|
23
|
+
#include <string>
|
|
24
|
+
#include <type_traits>
|
|
25
|
+
#include <unordered_map>
|
|
26
|
+
#include <unordered_set>
|
|
27
|
+
#include <utility>
|
|
28
|
+
#include <variant>
|
|
29
|
+
#include <vector>
|
|
30
|
+
|
|
31
|
+
namespace sym {
|
|
32
|
+
static constexpr double TOLERANCE = 1e-9;
|
|
33
|
+
|
|
34
|
+
class SymbolicException final : public std::invalid_argument {
|
|
35
|
+
std::string msg;
|
|
36
|
+
|
|
37
|
+
public:
|
|
38
|
+
explicit SymbolicException(std::string m)
|
|
39
|
+
: std::invalid_argument("Symbolic Exception"), msg(std::move(m)) {}
|
|
40
|
+
|
|
41
|
+
[[nodiscard]] const char* what() const noexcept override {
|
|
42
|
+
return msg.c_str();
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @brief Struct representing a symbolic variable.
|
|
48
|
+
* @details Variable names are assigned ids during creation. These ids are
|
|
49
|
+
* statically stored in a map. The name of a variable can be retrieved by its
|
|
50
|
+
* id. Variables are lexicographically ordered by their ids.
|
|
51
|
+
*/
|
|
52
|
+
struct Variable {
|
|
53
|
+
// NOLINTBEGIN(cppcoreguidelines-avoid-non-const-global-variables)
|
|
54
|
+
static inline std::unordered_map<std::string, std::size_t> registered{};
|
|
55
|
+
static inline std::unordered_map<std::size_t, std::string> names{};
|
|
56
|
+
static inline std::size_t nextId{};
|
|
57
|
+
// NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables)
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @brief Construct variable with given name.
|
|
61
|
+
* @param name Name of the variable.
|
|
62
|
+
*/
|
|
63
|
+
explicit Variable(const std::string& name);
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @brief Get the name of the variable.
|
|
67
|
+
* @return Name of the variable.
|
|
68
|
+
*/
|
|
69
|
+
[[nodiscard]] std::string getName() const noexcept;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @brief Check whether this variable's id is equal to another variable's id.
|
|
73
|
+
* @param rhs Variable to compare with.
|
|
74
|
+
* @return True if the variables are equal, false otherwise.
|
|
75
|
+
*/
|
|
76
|
+
bool operator==(const Variable& rhs) const { return id == rhs.id; }
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @brief Check whether this variable's id is not equal to another variable's
|
|
80
|
+
* id.
|
|
81
|
+
* @param rhs Variable to compare with.
|
|
82
|
+
* @return True if the variables are not equal, false otherwise.
|
|
83
|
+
*/
|
|
84
|
+
bool operator!=(const Variable& rhs) const { return !((*this) == rhs); }
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @brief Check whether this variable's id is less than another variable's id
|
|
88
|
+
* with respect to the default lexicographic ordering.
|
|
89
|
+
* @param rhs Variable to compare with.
|
|
90
|
+
* @return True if this variable's id is less than the other variable's id,
|
|
91
|
+
* false otherwise.
|
|
92
|
+
*/
|
|
93
|
+
bool operator<(const Variable& rhs) const { return id < rhs.id; }
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @brief Check whether this variable's id is greater than another variable's
|
|
97
|
+
* id with respect to the default lexicographic ordering.
|
|
98
|
+
* @param rhs Variable to compare with.
|
|
99
|
+
* @return True if this variable's id is greater than the other variable's id,
|
|
100
|
+
* false otherwise.
|
|
101
|
+
*/
|
|
102
|
+
bool operator>(const Variable& rhs) const { return id > rhs.id; }
|
|
103
|
+
|
|
104
|
+
private:
|
|
105
|
+
std::size_t id{};
|
|
106
|
+
};
|
|
107
|
+
} // namespace sym
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @brief Hash function for the Variable struct.
|
|
111
|
+
*/
|
|
112
|
+
template <> struct std::hash<sym::Variable> {
|
|
113
|
+
std::size_t operator()(const sym::Variable& var) const noexcept {
|
|
114
|
+
return std::hash<std::string>()(var.getName());
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
namespace sym {
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @brief Type alias for a variable assignment. Maps variables to their assigned
|
|
122
|
+
* values.
|
|
123
|
+
*/
|
|
124
|
+
using VariableAssignment = std::unordered_map<Variable, double>;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* @brief Struct representing a symbolic term. A term is a variable multiplied
|
|
128
|
+
* by a coefficient.
|
|
129
|
+
* @tparam T Type of the coefficient. Must be constructible from an integer and
|
|
130
|
+
* a double.
|
|
131
|
+
*/
|
|
132
|
+
template <typename T,
|
|
133
|
+
typename = std::enable_if_t<std::is_constructible_v<int, T> &&
|
|
134
|
+
std::is_constructible_v<T, double>>>
|
|
135
|
+
class Term {
|
|
136
|
+
public:
|
|
137
|
+
/**
|
|
138
|
+
* @brief Get the variable of the term.
|
|
139
|
+
* @return Variable of the term.
|
|
140
|
+
*/
|
|
141
|
+
[[nodiscard]] Variable getVar() const noexcept { return var; }
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @brief Get the coefficient of the term.
|
|
145
|
+
* @return Coefficient of the term.
|
|
146
|
+
*/
|
|
147
|
+
[[nodiscard]] T getCoeff() const noexcept { return coeff; }
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @brief Check whether the term has a zero coefficient.
|
|
151
|
+
* @return True if the coefficient is zero, false otherwise.
|
|
152
|
+
*/
|
|
153
|
+
[[nodiscard]] bool hasZeroCoeff() const {
|
|
154
|
+
return std::abs(static_cast<double>(coeff)) < TOLERANCE;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* @brief Construct a term with a given variable and coefficient.
|
|
159
|
+
* @param v Variable of the term.
|
|
160
|
+
* @param coef Coefficient of the term.
|
|
161
|
+
*/
|
|
162
|
+
explicit Term(const Variable v, T coef = 1.) : coeff(coef), var(v) {};
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* @brief Get the negative of the term.
|
|
166
|
+
* @return Negative of the term.
|
|
167
|
+
*/
|
|
168
|
+
Term operator-() const { return Term(var, -coeff); }
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @brief Add to the coefficient of the term.
|
|
172
|
+
* @param rhs Value to add to the coefficient.
|
|
173
|
+
*/
|
|
174
|
+
void addCoeff(const T& rhs) { coeff += rhs; }
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @brief Multiply the term by a scalar (add coefficients).
|
|
178
|
+
* @param rhs Scalar to multiply the term by.
|
|
179
|
+
* @return Reference to the term.
|
|
180
|
+
*/
|
|
181
|
+
Term& operator*=(const T& rhs) {
|
|
182
|
+
coeff *= rhs;
|
|
183
|
+
return *this;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* @brief Divide the term by a scalar (divide coefficients).
|
|
188
|
+
* @param rhs Scalar to divide the term by.
|
|
189
|
+
* @return Reference to the term.
|
|
190
|
+
*/
|
|
191
|
+
Term& operator/=(const T& rhs) {
|
|
192
|
+
coeff /= rhs;
|
|
193
|
+
return *this;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* @brief Multiply the term by a scalar (add coefficients).
|
|
198
|
+
* @param rhs Scalar to multiply the term by.
|
|
199
|
+
* @return Reference to the term.
|
|
200
|
+
*/
|
|
201
|
+
Term& operator/=(const std::int64_t rhs) {
|
|
202
|
+
coeff /= static_cast<T>(rhs);
|
|
203
|
+
return *this;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* @brief Check whether the Term's variable is assigned in a given assignment.
|
|
208
|
+
* @param assignment Assignment to check.
|
|
209
|
+
* @return True if the variable is assigned, false otherwise.
|
|
210
|
+
*/
|
|
211
|
+
[[nodiscard]] bool
|
|
212
|
+
totalAssignment(const VariableAssignment& assignment) const {
|
|
213
|
+
return assignment.contains(getVar());
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* @brief Evaluate the term with respect to a given assignment.
|
|
218
|
+
* @param assignment Assignment to evaluate the term with.
|
|
219
|
+
* @return Result of the evaluation.
|
|
220
|
+
*/
|
|
221
|
+
[[nodiscard]] double evaluate(const VariableAssignment& assignment) const {
|
|
222
|
+
if (!totalAssignment(assignment)) {
|
|
223
|
+
throw SymbolicException("Cannot instantiate variable " +
|
|
224
|
+
getVar().getName() + ". No value given.");
|
|
225
|
+
}
|
|
226
|
+
return assignment.at(getVar()) * getCoeff();
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
private:
|
|
230
|
+
T coeff;
|
|
231
|
+
Variable var;
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
/** @name Term operators
|
|
235
|
+
* @brief Overloaded operators for the Term struct.
|
|
236
|
+
* @param lhs Left-hand side of the operator.
|
|
237
|
+
* @param rhs Right-hand side of the operator.
|
|
238
|
+
* @return Term obtained by applying the operation.
|
|
239
|
+
*/
|
|
240
|
+
///@{
|
|
241
|
+
template <typename T,
|
|
242
|
+
typename = std::enable_if_t<std::is_constructible_v<int, T>>>
|
|
243
|
+
Term<T> operator*(Term<T> lhs, const double rhs) {
|
|
244
|
+
lhs *= rhs;
|
|
245
|
+
return lhs;
|
|
246
|
+
}
|
|
247
|
+
template <typename T,
|
|
248
|
+
typename = std::enable_if_t<std::is_constructible_v<int, T>>>
|
|
249
|
+
Term<T> operator/(Term<T> lhs, const double rhs) {
|
|
250
|
+
lhs /= rhs;
|
|
251
|
+
return lhs;
|
|
252
|
+
}
|
|
253
|
+
template <typename T,
|
|
254
|
+
typename = std::enable_if_t<std::is_constructible_v<int, T>>>
|
|
255
|
+
Term<T> operator*(double lhs, const Term<T>& rhs) {
|
|
256
|
+
return rhs * lhs;
|
|
257
|
+
}
|
|
258
|
+
template <typename T,
|
|
259
|
+
typename = std::enable_if_t<std::is_constructible_v<int, T>>>
|
|
260
|
+
Term<T> operator/(double lhs, const Term<T>& rhs) {
|
|
261
|
+
return rhs / lhs;
|
|
262
|
+
}
|
|
263
|
+
///@}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* @brief Check whether two terms are equal.
|
|
267
|
+
* @details Two terms are equal if their variables are equal and their
|
|
268
|
+
* coefficients are equal within a small tolerance.
|
|
269
|
+
* @param lhs Left-hand side of the operator.
|
|
270
|
+
* @param rhs Right-hand side of the operator.
|
|
271
|
+
* @return True if the terms are equal, false otherwise.
|
|
272
|
+
*/
|
|
273
|
+
template <typename T> bool operator==(const Term<T>& lhs, const Term<T>& rhs) {
|
|
274
|
+
return lhs.getVar() == rhs.getVar() &&
|
|
275
|
+
std::abs(lhs.getCoeff() - rhs.getCoeff()) < TOLERANCE;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* @brief Check whether two terms are not equal.
|
|
280
|
+
* @details Two terms are not equal if their variables are not equal or their
|
|
281
|
+
* coefficients are not equal within a small tolerance.
|
|
282
|
+
* @param lhs Left-hand side of the operator.
|
|
283
|
+
* @param rhs Right-hand side of the operator.
|
|
284
|
+
* @return True if the terms are not equal, false otherwise.
|
|
285
|
+
*/
|
|
286
|
+
template <typename T> bool operator!=(const Term<T>& lhs, const Term<T>& rhs) {
|
|
287
|
+
return !(lhs == rhs);
|
|
288
|
+
}
|
|
289
|
+
} // namespace sym
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* @brief Hash function for the Term struct.
|
|
293
|
+
*/
|
|
294
|
+
template <typename T> struct std::hash<sym::Term<T>> {
|
|
295
|
+
std::size_t operator()(const sym::Term<T>& term) const noexcept {
|
|
296
|
+
const auto h1 = std::hash<sym::Variable>{}(term.getVar());
|
|
297
|
+
const auto h2 = std::hash<T>{}(term.getCoeff());
|
|
298
|
+
return qc::combineHash(h1, h2);
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
namespace sym {
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* @brief Class representing a symbolic expression. An expression is a sum of
|
|
306
|
+
* terms and a constant.
|
|
307
|
+
* @tparam T Type of the coefficients of the terms. Must be constructible from
|
|
308
|
+
* an integer and a double.
|
|
309
|
+
* @tparam U Type of the constant. Must be constructible from a double.
|
|
310
|
+
*/
|
|
311
|
+
template <
|
|
312
|
+
typename T, typename U,
|
|
313
|
+
typename = std::enable_if_t<
|
|
314
|
+
std::is_constructible_v<T, U> && std::is_constructible_v<U, T> &&
|
|
315
|
+
std::is_constructible_v<int, T> && std::is_constructible_v<T, double> &&
|
|
316
|
+
std::is_constructible_v<U, double>>>
|
|
317
|
+
class Expression {
|
|
318
|
+
public:
|
|
319
|
+
using iterator = typename std::vector<Term<T>>::iterator;
|
|
320
|
+
using const_iterator = typename std::vector<Term<T>>::const_iterator;
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* @brief Construct an Expression from a varargs list of terms. Constant is
|
|
324
|
+
* set to 0.
|
|
325
|
+
* @tparam Args Variadic template parameter for the terms.
|
|
326
|
+
* @param t First term.
|
|
327
|
+
* @param ms Remaining terms.
|
|
328
|
+
*/
|
|
329
|
+
template <typename... Args> explicit Expression(Term<T> t, Args&&... ms) {
|
|
330
|
+
terms.emplace_back(t);
|
|
331
|
+
(terms.emplace_back(std::forward<Args>(ms)), ...);
|
|
332
|
+
sortTerms();
|
|
333
|
+
aggregateEqualTerms();
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* @brief Construct an Expression from a varargs list of variables. Constant
|
|
338
|
+
* is set to 0 and coefficients of the variables are set to 1.
|
|
339
|
+
* @tparam Args Variadic template parameter for the variables.
|
|
340
|
+
* @param v First variable.
|
|
341
|
+
* @param ms Remaining variables.
|
|
342
|
+
*/
|
|
343
|
+
template <typename... Args> explicit Expression(Variable v, Args&&... ms) {
|
|
344
|
+
terms.emplace_back(Term<T>(v));
|
|
345
|
+
(terms.emplace_back(std::forward<Args>(ms)), ...);
|
|
346
|
+
sortTerms();
|
|
347
|
+
aggregateEqualTerms();
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* @brief Construct an Expression from a vector of terms and a constant.
|
|
352
|
+
* @param ts Vector of terms.
|
|
353
|
+
* @param con Constant of the expression.
|
|
354
|
+
*/
|
|
355
|
+
Expression(const std::vector<Term<T>>& ts, const U& con)
|
|
356
|
+
: terms(ts), constant(con) {};
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* @brief Default constructor. Expression has no Terms and a constant of 0.
|
|
360
|
+
*/
|
|
361
|
+
Expression() = default;
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* @brief Construct an Expression from a constant. Expression has no Terms.
|
|
365
|
+
* @param r Constant of the expression.
|
|
366
|
+
*/
|
|
367
|
+
explicit Expression(const U& r) : constant(r) {};
|
|
368
|
+
|
|
369
|
+
iterator begin() { return terms.begin(); }
|
|
370
|
+
[[nodiscard]] const_iterator begin() const { return terms.cbegin(); }
|
|
371
|
+
iterator end() { return terms.end(); }
|
|
372
|
+
[[nodiscard]] const_iterator end() const { return terms.cend(); }
|
|
373
|
+
[[nodiscard]] const_iterator cbegin() const { return terms.cbegin(); }
|
|
374
|
+
[[nodiscard]] const_iterator cend() const { return terms.cend(); }
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* @brief Check whether the expression is zero, i.e. has no Terms and 0
|
|
378
|
+
* constant.
|
|
379
|
+
* @return True if the expression is zero, false otherwise.
|
|
380
|
+
*/
|
|
381
|
+
[[nodiscard]] bool isZero() const {
|
|
382
|
+
return terms.empty() && constant == U{T{0}};
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* @brief Check whether the expression is a constant, i.e. has no Terms.
|
|
387
|
+
* @return True if the expression is a constant, false otherwise.
|
|
388
|
+
*/
|
|
389
|
+
[[nodiscard]] bool isConstant() const { return terms.empty(); }
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* @brief Add two expressions. Coefficients of like terms and constants are
|
|
393
|
+
* added.
|
|
394
|
+
* @details If a term for the same variable is already present in the
|
|
395
|
+
* expression, the coefficients are added. Otherwise, the term is inserted
|
|
396
|
+
* into the expression.
|
|
397
|
+
* @param rhs Expression to add.
|
|
398
|
+
* @return Reference to the expression.
|
|
399
|
+
*/
|
|
400
|
+
Expression& operator+=(const Expression& rhs) {
|
|
401
|
+
if (this->isZero()) {
|
|
402
|
+
*this = rhs;
|
|
403
|
+
return *this;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
if (rhs.isZero()) {
|
|
407
|
+
return *this;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
auto t = rhs.begin();
|
|
411
|
+
|
|
412
|
+
while (t != rhs.end()) {
|
|
413
|
+
const auto insertPos =
|
|
414
|
+
std::lower_bound(terms.begin(), terms.end(), *t,
|
|
415
|
+
[&](const Term<T>& lhs, const Term<T>& r) {
|
|
416
|
+
return lhs.getVar() < r.getVar();
|
|
417
|
+
});
|
|
418
|
+
if (insertPos != terms.end() && insertPos->getVar() == t->getVar()) {
|
|
419
|
+
if (std::abs(insertPos->getCoeff() + t->getCoeff()) < TOLERANCE) {
|
|
420
|
+
terms.erase(insertPos);
|
|
421
|
+
} else {
|
|
422
|
+
insertPos->addCoeff(t->getCoeff());
|
|
423
|
+
}
|
|
424
|
+
} else {
|
|
425
|
+
terms.insert(insertPos, *t);
|
|
426
|
+
}
|
|
427
|
+
++t;
|
|
428
|
+
}
|
|
429
|
+
constant += rhs.constant;
|
|
430
|
+
return *this;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* @brief Add a term to the expression. Coefficients of like terms are added.
|
|
435
|
+
* @details If a term for the same variable is already present in the
|
|
436
|
+
* expression, the coefficients are added. Otherwise, the term is inserted
|
|
437
|
+
* into the expression.
|
|
438
|
+
* @param rhs Term to add.
|
|
439
|
+
* @return Reference to the expression.
|
|
440
|
+
*/
|
|
441
|
+
Expression<T, U>& operator+=(const Term<T>& rhs) {
|
|
442
|
+
return *this += Expression(rhs);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* @brief Add a constant to the expression.
|
|
447
|
+
* @param rhs Constant to add.
|
|
448
|
+
* @return Reference to the expression.
|
|
449
|
+
*/
|
|
450
|
+
Expression<T, U>& operator+=(const U& rhs) {
|
|
451
|
+
constant += rhs;
|
|
452
|
+
return *this;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* @brief Subtract two expressions. Coefficients of like terms and constants
|
|
457
|
+
* are subtracted.
|
|
458
|
+
* @details If a term for the same variable is already present in the
|
|
459
|
+
* expression, the coefficients are subtracted. Otherwise, the term is
|
|
460
|
+
* inserted into the expression.
|
|
461
|
+
* @param rhs Expression to subtract.
|
|
462
|
+
* @return Reference to the expression.
|
|
463
|
+
*/
|
|
464
|
+
Expression<T, U>& operator-=(const Expression<T, U>& rhs) {
|
|
465
|
+
return *this += -rhs;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* @brief Subtract a term from the expression. Coefficients of like terms are
|
|
470
|
+
* subtracted.
|
|
471
|
+
* @details If a term for the same variable is already present in the
|
|
472
|
+
* expression, the coefficients are subtracted. Otherwise, the term is
|
|
473
|
+
* inserted into the expression.
|
|
474
|
+
* @param rhs Term to subtract.
|
|
475
|
+
* @return Reference to the expression.
|
|
476
|
+
*/
|
|
477
|
+
Expression<T, U>& operator-=(const Term<T>& rhs) { return *this += -rhs; }
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* @brief Subtract a constant from the expression.
|
|
481
|
+
* @param rhs Constant to subtract.
|
|
482
|
+
* @return Reference to the expression.
|
|
483
|
+
*/
|
|
484
|
+
Expression<T, U>& operator-=(const U& rhs) { return *this += -rhs; }
|
|
485
|
+
|
|
486
|
+
/** @name Multiplication operators
|
|
487
|
+
* @brief Multiply the expression by a scalar. Multiplies the coefficients of
|
|
488
|
+
* the terms and the constant by the scalar.
|
|
489
|
+
* @param rhs Scalar to multiply the expression by.
|
|
490
|
+
* @return Reference to the expression.
|
|
491
|
+
*/
|
|
492
|
+
///@{
|
|
493
|
+
Expression<T, U>& operator*=(const T& rhs) {
|
|
494
|
+
if (std::abs(static_cast<double>(rhs)) < TOLERANCE) {
|
|
495
|
+
terms.clear();
|
|
496
|
+
constant = U{T{0}};
|
|
497
|
+
return *this;
|
|
498
|
+
}
|
|
499
|
+
std::for_each(terms.begin(), terms.end(), [&](auto& term) { term *= rhs; });
|
|
500
|
+
constant = U{double{constant} * double{rhs}};
|
|
501
|
+
return *this;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
template <typename V = U, std::enable_if_t<!std::is_same_v<T, V>, int> = 0>
|
|
505
|
+
Expression<T, U>& operator*=(const U& rhs) {
|
|
506
|
+
if (std::abs(static_cast<double>(T{rhs})) < TOLERANCE) {
|
|
507
|
+
terms.clear();
|
|
508
|
+
constant = U{T{0}};
|
|
509
|
+
return *this;
|
|
510
|
+
}
|
|
511
|
+
std::for_each(terms.begin(), terms.end(),
|
|
512
|
+
[&](auto& term) { term *= T{rhs}; });
|
|
513
|
+
constant *= rhs;
|
|
514
|
+
return *this;
|
|
515
|
+
}
|
|
516
|
+
///@}
|
|
517
|
+
|
|
518
|
+
/** @name Division operators
|
|
519
|
+
* @brief Divide the expression by a scalar. Divides the coefficients of the
|
|
520
|
+
* terms and the constant by the scalar.
|
|
521
|
+
* @details Throws an exception if the scalar is zero.
|
|
522
|
+
* @param rhs Scalar to divide the expression by.
|
|
523
|
+
* @return Reference to the expression.
|
|
524
|
+
*/
|
|
525
|
+
///@{
|
|
526
|
+
Expression<T, U>& operator/=(const T& rhs) {
|
|
527
|
+
if (std::abs(static_cast<double>(T{rhs})) < TOLERANCE) {
|
|
528
|
+
throw std::runtime_error("Trying to divide expression by 0!");
|
|
529
|
+
}
|
|
530
|
+
std::for_each(terms.begin(), terms.end(), [&](auto& term) { term /= rhs; });
|
|
531
|
+
constant = U{double{constant} / double{rhs}};
|
|
532
|
+
return *this;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
template <typename V = U, std::enable_if_t<!std::is_same_v<T, V>, int> = 0>
|
|
536
|
+
Expression<T, U>& operator/=(const U& rhs) {
|
|
537
|
+
if (std::abs(static_cast<double>(T{rhs})) < TOLERANCE) {
|
|
538
|
+
throw std::runtime_error("Trying to divide expression by 0!");
|
|
539
|
+
}
|
|
540
|
+
std::for_each(terms.begin(), terms.end(),
|
|
541
|
+
[&](auto& term) { term /= T{rhs}; });
|
|
542
|
+
constant /= rhs;
|
|
543
|
+
return *this;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
Expression<T, U>& operator/=(int64_t rhs) {
|
|
547
|
+
if (rhs == 0) {
|
|
548
|
+
throw std::runtime_error("Trying to divide expression by 0!");
|
|
549
|
+
}
|
|
550
|
+
std::for_each(terms.begin(), terms.end(),
|
|
551
|
+
[&](auto& term) { term /= T{static_cast<double>(rhs)}; });
|
|
552
|
+
constant = U{double{constant} / static_cast<double>(rhs)};
|
|
553
|
+
return *this;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
///@}
|
|
557
|
+
|
|
558
|
+
/**
|
|
559
|
+
* @brief Get the negative of the expression.
|
|
560
|
+
* @details Negates the coefficients of the terms and the constant.
|
|
561
|
+
* @return Negative of the expression.
|
|
562
|
+
*/
|
|
563
|
+
[[nodiscard]] Expression<T, U> operator-() const {
|
|
564
|
+
Expression<T, U> e;
|
|
565
|
+
e.terms.reserve(terms.size());
|
|
566
|
+
for (auto& t : terms) {
|
|
567
|
+
e.terms.push_back(-t);
|
|
568
|
+
}
|
|
569
|
+
e.constant = -constant;
|
|
570
|
+
return e;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* @brief Get the term at a given index.
|
|
575
|
+
* @details No bounds checking is performed.
|
|
576
|
+
* @param i Index of the term.
|
|
577
|
+
* @return Term at the given index.
|
|
578
|
+
*/
|
|
579
|
+
[[nodiscard]] const Term<T>& operator[](const std::size_t i) const {
|
|
580
|
+
return terms[i];
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/**
|
|
584
|
+
* @brief Get the constant of the expression.
|
|
585
|
+
* @return Constant of the expression.
|
|
586
|
+
*/
|
|
587
|
+
[[nodiscard]] U getConst() const noexcept { return constant; }
|
|
588
|
+
|
|
589
|
+
/**
|
|
590
|
+
* @brief Set the constant of the expression.
|
|
591
|
+
* @param val Constant to set.
|
|
592
|
+
*/
|
|
593
|
+
void setConst(const U& val) { constant = val; }
|
|
594
|
+
[[nodiscard]] auto numTerms() const { return terms.size(); }
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* @brief Get the terms of the expression.
|
|
598
|
+
* @return Terms of the expression.
|
|
599
|
+
*/
|
|
600
|
+
[[nodiscard]] const std::vector<Term<T>>& getTerms() const { return terms; }
|
|
601
|
+
|
|
602
|
+
/**
|
|
603
|
+
* @brief Get the variables appearing in terms of the expression.
|
|
604
|
+
* @return Variables of the expression.
|
|
605
|
+
*/
|
|
606
|
+
[[nodiscard]] std::unordered_set<Variable> getVariables() const {
|
|
607
|
+
auto vars = std::unordered_set<Variable>{};
|
|
608
|
+
for (const auto& term : terms) {
|
|
609
|
+
vars.insert(term.getVar());
|
|
610
|
+
}
|
|
611
|
+
return vars;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* @brief Convert the expression to a different type.
|
|
616
|
+
* @details Converts the coefficients of the terms and the constant to a
|
|
617
|
+
* different type.
|
|
618
|
+
* @tparam V Type to convert to.
|
|
619
|
+
* @return Expression with coefficients and constant converted to type V.
|
|
620
|
+
*/
|
|
621
|
+
template <typename V,
|
|
622
|
+
std::enable_if_t<std::is_constructible_v<U, V>>* = nullptr>
|
|
623
|
+
Expression<T, V> convert() const {
|
|
624
|
+
return Expression<T, V>(terms, V{constant});
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
/**
|
|
628
|
+
* @brief Evaluate the expression with respect to a given assignment.
|
|
629
|
+
* @param assignment Assignment to evaluate the expression with.
|
|
630
|
+
* @return Result of the evaluation.
|
|
631
|
+
*/
|
|
632
|
+
[[nodiscard]] double evaluate(const VariableAssignment& assignment) const {
|
|
633
|
+
auto initial = static_cast<double>(constant);
|
|
634
|
+
return std::accumulate(terms.begin(), terms.end(), initial,
|
|
635
|
+
[&](const double sum, const auto& term) {
|
|
636
|
+
return term.evaluate(assignment) + sum;
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
private:
|
|
641
|
+
std::vector<Term<T>> terms;
|
|
642
|
+
U constant{T{0.0}};
|
|
643
|
+
|
|
644
|
+
void sortTerms() {
|
|
645
|
+
std::sort(terms.begin(), terms.end(),
|
|
646
|
+
[&](const Term<T>& lhs, const Term<T>& rhs) {
|
|
647
|
+
return lhs.getVar() < rhs.getVar();
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
void aggregateEqualTerms() {
|
|
652
|
+
for (auto t = terms.begin(); t != terms.end();) {
|
|
653
|
+
auto next = std::next(t);
|
|
654
|
+
while (next != terms.end() && t->getVar() == next->getVar()) {
|
|
655
|
+
t->addCoeff(next->getCoeff());
|
|
656
|
+
next = terms.erase(next);
|
|
657
|
+
}
|
|
658
|
+
if (t->hasZeroCoeff()) {
|
|
659
|
+
t = terms.erase(t);
|
|
660
|
+
} else {
|
|
661
|
+
t = next;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
};
|
|
666
|
+
|
|
667
|
+
/** @name Arithmetic Expression operators
|
|
668
|
+
* @brief Overloaded operators for the Expression struct.
|
|
669
|
+
* @param lhs Left-hand side of the operator.
|
|
670
|
+
* @param rhs Right-hand side of the operator.
|
|
671
|
+
* @return Expression obtained by applying the operation.
|
|
672
|
+
*/
|
|
673
|
+
///@{
|
|
674
|
+
template <typename T, typename U>
|
|
675
|
+
Expression<T, U> operator+(Expression<T, U> lhs, const Expression<T, U>& rhs) {
|
|
676
|
+
lhs += rhs;
|
|
677
|
+
return lhs;
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
template <typename T, typename U>
|
|
681
|
+
Expression<T, U> operator+(Expression<T, U> lhs, const Term<T>& rhs) {
|
|
682
|
+
lhs += rhs;
|
|
683
|
+
return lhs;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
template <typename T, typename U>
|
|
687
|
+
Expression<T, U> operator+(const Term<T>& lhs, Expression<T, U> rhs) {
|
|
688
|
+
rhs += lhs;
|
|
689
|
+
return rhs;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
template <typename T, typename U>
|
|
693
|
+
Expression<T, U> operator+(const U& lhs, Expression<T, U> rhs) {
|
|
694
|
+
rhs += lhs;
|
|
695
|
+
return rhs;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
template <typename T, typename U>
|
|
699
|
+
Expression<T, U> operator+(Expression<T, U> lhs, const U& rhs) {
|
|
700
|
+
lhs += rhs;
|
|
701
|
+
return lhs;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
template <typename T, typename U>
|
|
705
|
+
Expression<T, U> operator+([[maybe_unused]] const T& lhs,
|
|
706
|
+
Expression<T, U> rhs) {
|
|
707
|
+
rhs += rhs;
|
|
708
|
+
return rhs;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
template <typename T, typename U>
|
|
712
|
+
Expression<T, U> operator-(Expression<T, U> lhs, const Expression<T, U>& rhs) {
|
|
713
|
+
lhs -= rhs;
|
|
714
|
+
return lhs;
|
|
715
|
+
}
|
|
716
|
+
template <typename T, typename U>
|
|
717
|
+
Expression<T, U> operator-(Expression<T, U> lhs, const Term<T>& rhs) {
|
|
718
|
+
lhs -= rhs;
|
|
719
|
+
return lhs;
|
|
720
|
+
}
|
|
721
|
+
template <typename T, typename U>
|
|
722
|
+
Expression<T, U> operator-(const Term<T>& lhs, Expression<T, U> rhs) {
|
|
723
|
+
rhs -= lhs;
|
|
724
|
+
return rhs;
|
|
725
|
+
}
|
|
726
|
+
template <typename T, typename U>
|
|
727
|
+
Expression<T, U> operator-(const U& lhs, Expression<T, U> rhs) {
|
|
728
|
+
rhs -= lhs;
|
|
729
|
+
return rhs;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
template <typename T, typename U>
|
|
733
|
+
Expression<T, U> operator-(Expression<T, U> lhs, const U& rhs) {
|
|
734
|
+
lhs -= rhs;
|
|
735
|
+
return lhs;
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
template <typename T, typename U>
|
|
739
|
+
Expression<T, U> operator*(Expression<T, U> lhs, const T& rhs) {
|
|
740
|
+
lhs *= rhs;
|
|
741
|
+
return lhs;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
template <typename T, typename U,
|
|
745
|
+
std::enable_if_t<!std::is_same_v<T, U>>* = nullptr>
|
|
746
|
+
Expression<T, U> operator*(Expression<T, U> lhs, const U& rhs) {
|
|
747
|
+
lhs *= rhs;
|
|
748
|
+
return lhs;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
template <typename T, typename U>
|
|
752
|
+
Expression<T, U> operator/(Expression<T, U> lhs, const T& rhs) {
|
|
753
|
+
lhs /= rhs;
|
|
754
|
+
return lhs;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
template <typename T, typename U,
|
|
758
|
+
std::enable_if_t<!std::is_same_v<T, U>>* = nullptr>
|
|
759
|
+
Expression<T, U> operator/(Expression<T, U> lhs, const U& rhs) {
|
|
760
|
+
lhs /= rhs;
|
|
761
|
+
return lhs;
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
template <typename T, typename U>
|
|
765
|
+
Expression<T, U> operator/(Expression<T, U> lhs, int64_t rhs) {
|
|
766
|
+
lhs /= rhs;
|
|
767
|
+
return lhs;
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
template <typename T, typename U>
|
|
771
|
+
Expression<T, U> operator*(const T& lhs, Expression<T, U> rhs) {
|
|
772
|
+
return rhs * lhs;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
template <typename T, typename U,
|
|
776
|
+
std::enable_if_t<!std::is_same_v<T, U>>* = nullptr>
|
|
777
|
+
Expression<T, U> operator*(const U& lhs, Expression<T, U> rhs) {
|
|
778
|
+
return rhs * lhs;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
///@}
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* @brief Check whether two expressions are equal.
|
|
785
|
+
* @param lhs Left-hand side of the operator.
|
|
786
|
+
* @param rhs Right-hand side of the operator.
|
|
787
|
+
* @return True if the expressions are equal, false otherwise.
|
|
788
|
+
*/
|
|
789
|
+
template <typename T, typename U>
|
|
790
|
+
bool operator==(const Expression<T, U>& lhs, const Expression<T, U>& rhs) {
|
|
791
|
+
if (lhs.numTerms() != rhs.numTerms() || lhs.getConst() != rhs.getConst()) {
|
|
792
|
+
return false;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
const auto lhsTerms = lhs.numTerms();
|
|
796
|
+
for (size_t i = 0; i < lhsTerms; ++i) {
|
|
797
|
+
if (std::abs(lhs[i].getCoeff() - rhs[i].getCoeff()) >= TOLERANCE) {
|
|
798
|
+
return false;
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
return true;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/**
|
|
805
|
+
* @brief Check whether two expressions are not equal.
|
|
806
|
+
* @param lhs Left-hand side of the operator.
|
|
807
|
+
* @param rhs Right-hand side of the operator.
|
|
808
|
+
* @return True if the expressions are not equal, false otherwise.
|
|
809
|
+
*/
|
|
810
|
+
template <typename T, typename U>
|
|
811
|
+
bool operator!=(const Expression<T, U>& lhs, const Expression<T, U>& rhs) {
|
|
812
|
+
return !(lhs == rhs);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
std::ostream& operator<<(std::ostream& os, const Variable& var);
|
|
816
|
+
|
|
817
|
+
template <typename T>
|
|
818
|
+
std::ostream& operator<<(std::ostream& os, const Term<T>& term) {
|
|
819
|
+
os << term.getCoeff() << "*" << term.getVar().getName();
|
|
820
|
+
return os;
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
template <typename T, typename U>
|
|
824
|
+
std::ostream& operator<<(std::ostream& os, const Expression<T, U>& expr) {
|
|
825
|
+
std::for_each(expr.begin(), expr.end(),
|
|
826
|
+
[&](const auto& term) { os << term << " + "; });
|
|
827
|
+
os << expr.getConst();
|
|
828
|
+
return os;
|
|
829
|
+
}
|
|
830
|
+
} // namespace sym
|
|
831
|
+
|
|
832
|
+
template <typename T, typename U> struct std::hash<sym::Expression<T, U>> {
|
|
833
|
+
std::size_t operator()(const sym::Expression<T, U>& expr) const noexcept {
|
|
834
|
+
std::size_t seed = 0U;
|
|
835
|
+
for (const auto& term : expr) {
|
|
836
|
+
qc::hashCombine(seed, std::hash<sym::Term<T>>{}(term));
|
|
837
|
+
}
|
|
838
|
+
qc::hashCombine(seed, std::hash<U>{}(expr.getConst()));
|
|
839
|
+
return seed;
|
|
840
|
+
}
|
|
841
|
+
}; // namespace std
|
|
842
|
+
|
|
843
|
+
namespace qc {
|
|
844
|
+
using Symbolic = sym::Expression<fp, fp>;
|
|
845
|
+
using VariableAssignment = std::unordered_map<sym::Variable, fp>;
|
|
846
|
+
using SymbolOrNumber = std::variant<Symbolic, fp>;
|
|
847
|
+
} // namespace qc
|