diff --git a/src/qrisp/jasp/interpreter_tools/interpreters/environment_flattening.py b/src/qrisp/jasp/interpreter_tools/interpreters/environment_flattening.py index cfc3fa89..d57abfd3 100644 --- a/src/qrisp/jasp/interpreter_tools/interpreters/environment_flattening.py +++ b/src/qrisp/jasp/interpreter_tools/interpreters/environment_flattening.py @@ -128,9 +128,10 @@ def flatten_environments_in_while_eqn(eqn, context_dic): """ eqn = copy_jaxpr_eqn(eqn) + eqn.params["body_jaxpr"] = ClosedJaxpr(flatten_environments(eqn.params["body_jaxpr"].jaxpr), eqn.params["body_jaxpr"].consts) - + exec_eqn(eqn, context_dic) diff --git a/src/qrisp/simulator/simulator.py b/src/qrisp/simulator/simulator.py index e097541b..1ebc735a 100644 --- a/src/qrisp/simulator/simulator.py +++ b/src/qrisp/simulator/simulator.py @@ -403,12 +403,12 @@ def pre_calc_unitaries(op): return "".join(result_str)[::-1], quantum_state -def advance_quantum_state(qc, quantum_state): +def advance_quantum_state(qc, quantum_state, deallocated_qubits = []): if len(qc.data) == 0: return quantum_state progress_bar = tqdm( - desc=f"Simulating {len(qc.qubits)} qubits..", + desc=f"Simulating {len(qc.qubits)-len(deallocated_qubits)} qubits..", bar_format="{desc} |{bar}| [{percentage:3.0f}%]", ncols=85, leave=False, @@ -420,6 +420,10 @@ def advance_quantum_state(qc, quantum_state): LINE_CLEAR = "\x1b[2K" progress_bar.display() + + for instr in qc.data: + if instr.op.name == "qb_dealloc": + deallocated_qubits.append(instr.qubits[0]) # This command enables fast appending. Fast appending means that the .append method # of the QuantumCircuit class checks much less validity conditions and is also less @@ -490,6 +494,7 @@ def __init__(self): self.quantum_state = QuantumState(n = 0) self.buffer_qc = QuantumCircuit(0) + self.deallocated_qubits = [] def add_qubit(self): self.quantum_state.add_qubit() @@ -499,7 +504,8 @@ def append(self, op, qubits): self.buffer_qc.append(op, qubits) def apply_buffer(self): - self.quantum_state = advance_quantum_state(self.buffer_qc, self.quantum_state) + + self.quantum_state = advance_quantum_state(self.buffer_qc, self.quantum_state, self.deallocated_qubits) self.buffer_qc = self.buffer_qc.clearcopy() def measure(self, qubit):