Skip to content

Commit

Permalink
refactor: Raise error if observable qubits do not feature in circuit. (
Browse files Browse the repository at this point in the history
…#182)

* Add check that observable is correct

* Add test

* Remove prints

* Minor tidy
  • Loading branch information
daniel-mills-cqc authored Dec 2, 2024
1 parent e5169f7 commit 53fc103
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
12 changes: 12 additions & 0 deletions qermit/taskgraph/mitex.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,18 @@ def task(
symbols = ansatz_circuit[2]
observable_tracker = measurement_wire[1]

non_existant_qubits = (
observable_tracker.qubit_pauli_operator.all_qubits.difference(
set(circuit.qubits)
)
)
# TODO: In a future refactor, this check should be done
# inside ObservableExperiment.
if len(non_existant_qubits) > 0:
raise Exception(
f"ObservableTracker qubits {non_existant_qubits} are not found in circuit."
)

# first make sure all observable has some measurement circuit
strings_for_circuits = observable_tracker.get_empty_strings()
for string in strings_for_circuits:
Expand Down
39 changes: 39 additions & 0 deletions tests/mitex_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import copy

import pytest
from pytket.circuit import Circuit, OpType, Qubit, fresh_symbol # type: ignore
from pytket.extensions.qiskit import AerBackend # type: ignore
from pytket.pauli import Pauli, QubitPauliString # type: ignore
Expand All @@ -37,6 +38,44 @@
)


def test_valid_observable():
backend = AerBackend(n_qubits=2)
mitex = MitEx(backend=backend)

circuit = Circuit()
q_reg = circuit.add_q_register(name="my_quibts", size=2)
circuit.CX(q_reg[0], q_reg[1])

qps_one = QubitPauliString(
[Qubit(name="my_quibts", index=0), Qubit(name="my_quibts", index=1)],
[Pauli.Z, Pauli.Z],
)
qps_two = QubitPauliString([Qubit(1), Qubit(2)], [Pauli.Z, Pauli.Z])

obs_exp = ObservableExperiment(
AnsatzCircuit(circuit, 2, SymbolsDict()),
ObservableTracker(
QubitPauliOperator(
{
qps_one: 1,
}
)
),
)

assert mitex.run([obs_exp])[0]._dict[qps_one] == 1.0

obs_exp = ObservableExperiment(
AnsatzCircuit(circuit, 2, SymbolsDict()),
ObservableTracker(QubitPauliOperator({qps_one: 1, qps_two: 1})),
)
with pytest.raises(
Exception,
match="ObservableTracker qubits \{q\[2\], q\[1\]\} are not found in circuit.",
):
mitex.run([obs_exp])


def test_mitex_cache():
circuit = Circuit(1).X(0)
backend = AerBackend()
Expand Down

0 comments on commit 53fc103

Please sign in to comment.