diff --git a/cmake/ExternalDependencies.cmake b/cmake/ExternalDependencies.cmake index 468242ee..399e8d41 100644 --- a/cmake/ExternalDependencies.cmake +++ b/cmake/ExternalDependencies.cmake @@ -22,7 +22,7 @@ endif() # cmake-format: off set(MQT_CORE_VERSION 2.6.1 CACHE STRING "MQT Core version") -set(MQT_CORE_REV "89f18fb322ff2ce86e33558e3a2b42a08e655174" +set(MQT_CORE_REV "41eea72cdbefbd86ba06f76dc41a911950dd3081" CACHE STRING "MQT Core identifier (tag, branch or commit hash)") set(MQT_CORE_REPO_OWNER "cda-tum" CACHE STRING "MQT Core repository owner (change when using a fork)") diff --git a/src/mqt/qcec/parameterized.py b/src/mqt/qcec/parameterized.py index cd94b8e6..211c2927 100644 --- a/src/mqt/qcec/parameterized.py +++ b/src/mqt/qcec/parameterized.py @@ -52,7 +52,7 @@ def extract_params( p = p1.union(p2) n_params = len(p) - exprs = list(chain(*[instr[0].params for instr in circ1.data + circ2.data if instr[0].params != []])) + exprs = list(chain(*[instr.operation.params for instr in circ1.data + circ2.data if instr.operation.params != []])) def is_expr(x: float | Parameter | ParameterExpression) -> bool: return isinstance(x, (Parameter, ParameterExpression)) @@ -115,14 +115,14 @@ def check_parameterized( total_simulations_started = 0 total_simulations_finished = 0 - def update_stats(res: EquivalenceCheckingManager.Results) -> None: + def _update_stats(res: EquivalenceCheckingManager.Results) -> None: nonlocal total_preprocessing_time, total_runtime, total_simulations_started, total_simulations_finished total_preprocessing_time += res.preprocessing_time total_runtime += res.check_time total_simulations_started += res.started_simulations total_simulations_finished += res.performed_simulations - def write_stats(i: int, res: EquivalenceCheckingManager.Results) -> None: + def _write_stats(i: int, res: EquivalenceCheckingManager.Results) -> None: nonlocal total_preprocessing_time, total_runtime, total_simulations_started, total_simulations_finished res.check_time = total_runtime res.preprocessing_time = total_preprocessing_time @@ -135,7 +135,7 @@ def write_stats(i: int, res: EquivalenceCheckingManager.Results) -> None: if res.considered_equivalent(): return res - update_stats(res) + _update_stats(res) timeout = __adjust_timeout(configuration.execution.timeout, res) n_checks = configuration.parameterized.additional_instantiations @@ -143,7 +143,7 @@ def write_stats(i: int, res: EquivalenceCheckingManager.Results) -> None: parameters, mat, offsets = extract_params(circ1, circ2) - def instantiate_params( + def _instantiate_params( qc1: QuantumCircuit, qc2: QuantumCircuit, b: NDArray[np.float64] ) -> tuple[QuantumCircuit, QuantumCircuit, float]: start_time = time.time() @@ -153,60 +153,61 @@ def instantiate_params( qc1_bound = qc1.assign_parameters(param_map) qc2_bound = qc2.assign_parameters(param_map) - def round_zero_params(qc: QuantumCircuit) -> QuantumCircuit: + def _round_zero_params(qc: QuantumCircuit) -> QuantumCircuit: for instr in qc.data: - if not hasattr(instr[0], "mutable") or instr[0].mutable: - params = instr[0].params - instr[0].params = [float(x) for x in params] - instr[0].params = [0 if np.abs(x) < tol else x for x in instr[0].params] + operation = instr.operation + if not hasattr(operation, "mutable") or operation.mutable: + params = operation.params + operation.params = [float(x) for x in params] + operation.params = [0 if np.abs(x) < tol else x for x in operation.params] return qc - qc1_bound = round_zero_params(qc1_bound) - qc2_bound = round_zero_params(qc2_bound) + qc1_bound = _round_zero_params(qc1_bound) + qc2_bound = _round_zero_params(qc2_bound) return qc1_bound, qc2_bound, time.time() - start_time - def instantiate_params_zero( + def _instantiate_params_zero( qc1: QuantumCircuit, qc2: QuantumCircuit ) -> tuple[QuantumCircuit, QuantumCircuit, float]: - return instantiate_params(qc1, qc2, offsets) + return _instantiate_params(qc1, qc2, offsets) - def instantiate_params_phases( + def _instantiate_params_phases( qc1: QuantumCircuit, qc2: QuantumCircuit ) -> tuple[QuantumCircuit, QuantumCircuit, float]: phases = [0, np.pi, np.pi / 2, -np.pi / 2, np.pi / 4, -np.pi / 4] rng = np.random.default_rng() b = rng.choice(phases, size=len(offsets)) + offsets - return instantiate_params(qc1, qc2, b) + return _instantiate_params(qc1, qc2, b) - circ1_inst, circ2_inst, runtime = instantiate_params_zero(circ1, circ2) + circ1_inst, circ2_inst, runtime = _instantiate_params_zero(circ1, circ2) timeout = __adjust_timeout(timeout, runtime) if timeout < 0: - write_stats(1, res) + _write_stats(1, res) res.equivalence = EquivalenceCriterion.no_information return res res = check_instantiated(circ1_inst, circ2_inst, configuration) - update_stats(res) + _update_stats(res) if res.equivalence == EquivalenceCriterion.not_equivalent: - write_stats(1, res) + _write_stats(1, res) return res for i in range(n_checks): - circ1_inst, circ2_inst, runtime = instantiate_params_phases(circ1, circ2) + circ1_inst, circ2_inst, runtime = _instantiate_params_phases(circ1, circ2) timeout = __adjust_timeout(timeout, runtime) res = check_instantiated(circ1_inst, circ2_inst, configuration) timeout = __adjust_timeout(timeout, res) if timeout < 0: - write_stats(i + 2, res) + _write_stats(i + 2, res) res.equivalence = EquivalenceCriterion.no_information return res - update_stats(res) + _update_stats(res) if res.equivalence == EquivalenceCriterion.not_equivalent: - write_stats(i + 2, res) + _write_stats(i + 2, res) return res res = check_instantiated_random(circ1, circ2, parameters, configuration) @@ -214,6 +215,6 @@ def instantiate_params_phases( if timeout < 0: res.equivalence = EquivalenceCriterion.no_information - update_stats(res) - write_stats(n_checks + 2, res) + _update_stats(res) + _write_stats(n_checks + 2, res) return res