Skip to content

Commit d74f02d

Browse files
Add tests
1 parent b86ce61 commit d74f02d

File tree

3 files changed

+105
-30
lines changed

3 files changed

+105
-30
lines changed

qermit/frame_randomisation/frame_randomisation.py

+7
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,17 @@
3333
from enum import Enum
3434
from pytket import OpType
3535
from pytket.passes import auto_rebase_pass
36+
from .h_series_randomisation import gen_h_series_randomised_circuit
3637

3738

3839
class FrameRandomisation(Enum):
3940

41+
@staticmethod
42+
def HSeriesRandomisation(
43+
circuit: Circuit, shots: int,
44+
) -> List[CircuitShots]:
45+
return [CircuitShots(Circuit=gen_h_series_randomised_circuit(circuit), Shots=shots)]
46+
4047
@staticmethod
4148
def PauliFrameRandomisation(
4249
circuit: Circuit, shots: int, samples: int

qermit/frame_randomisation/h_series_randomisation.py

+7-26
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,17 @@ def get_wfh():
1111
return wasm.WasmFileHandler(wasm_file)
1212

1313

14-
def gen_randomised_circuit(circuit):
14+
def gen_h_series_randomised_circuit(circuit):
1515

1616
wfh = get_wfh()
1717

1818
randomised_circuit = Circuit()
19+
randomisation_reg_dict = {}
1920
for q_register in circuit.q_registers:
2021
randomised_circuit.add_q_register(q_register)
22+
for qubit in q_register:
23+
randomisation_reg = randomised_circuit.add_c_register(f"randomisation_{qubit.to_list()}", 4)
24+
randomisation_reg_dict[qubit] = randomisation_reg
2125
for c_register in circuit.c_registers:
2226
randomised_circuit.add_c_register(c_register)
2327

@@ -39,16 +43,10 @@ def gen_randomised_circuit(circuit):
3943
randomised_circuit.Reset(qubit)
4044
randomised_circuit.add_wasm_to_reg("seed_randomisation", wfh, [seed_c_reg], [])
4145

42-
randomisation_reg = randomised_circuit.add_c_register("randomisation", 4)
43-
44-
# rand_vals = [10, 7]
45-
# command_count = 0
46-
4746
for command in circuit:
4847

4948
if command.op.type == OpType.ZZMax:
50-
randomised_circuit.add_wasm_to_reg("write_randomisation", wfh, [], [randomisation_reg])
51-
# randomised_circuit.add_c_setreg(rand_vals[command_count], randomisation_reg)
49+
randomised_circuit.add_wasm_to_reg("write_randomisation", wfh, [], [randomisation_reg_dict[command.args[0]]])
5250
randomised_circuit.Z(command.qubits[0], condition=randomisation_reg[0])
5351
randomised_circuit.Z(command.qubits[1], condition=randomisation_reg[1])
5452
randomised_circuit.X(command.qubits[0], condition=randomisation_reg[2])
@@ -67,26 +65,9 @@ def gen_randomised_circuit(circuit):
6765
)
6866
randomised_circuit.X(command.qubits[0], condition=randomisation_reg[2])
6967
randomised_circuit.X(command.qubits[1], condition=randomisation_reg[3])
70-
71-
# randomised_circuit.Z(command.qubits[0], condition=randomisation_reg[4])
72-
# randomised_circuit.Z(command.qubits[1], condition=randomisation_reg[5])
73-
# randomised_circuit.X(command.qubits[0], condition=randomisation_reg[6])
74-
# randomised_circuit.X(command.qubits[1], condition=randomisation_reg[7])
75-
76-
# randomised_circuit.Z(command.qubits[0], condition=randomisation_reg[0])
77-
# randomised_circuit.Z(command.qubits[0], condition=randomisation_reg[2])
78-
# randomised_circuit.Z(command.qubits[0], condition=randomisation_reg[3])
79-
# randomised_circuit.X(command.qubits[0], condition=randomisation_reg[2])
80-
81-
# randomised_circuit.Z(command.qubits[1], condition=randomisation_reg[1])
82-
# randomised_circuit.Z(command.qubits[1], condition=randomisation_reg[2])
83-
# randomised_circuit.Z(command.qubits[1], condition=randomisation_reg[3])
84-
# randomised_circuit.X(command.qubits[1], condition=randomisation_reg[3])
8568

8669
randomised_circuit.Phase(0.5, condition=randomisation_reg[2])
8770
randomised_circuit.Phase(0.5, condition=randomisation_reg[3])
8871
randomised_circuit.Phase(-1, condition=randomisation_reg[2] & randomisation_reg[3])
89-
90-
# command_count += 1
9172

92-
return randomised_circuit, wfh
73+
return randomised_circuit

tests/frame_randomisation_test.py

+91-4
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,25 @@
2323
from pytket import Circuit
2424
from pytket.extensions.qiskit import AerBackend # type: ignore
2525
from pytket.extensions.quantinuum import QuantinuumBackend, QuantinuumAPIOffline
26-
from qermit.frame_randomisation.h_series_randomisation import gen_randomised_circuit
26+
from qermit.frame_randomisation.h_series_randomisation import gen_h_series_randomised_circuit, get_wfh
27+
2728
from pytket.unit_id import BitRegister
2829
from collections import Counter
2930

3031

3132
def test_h_series_randomisation():
33+
# These tests check that the ideal behaviour of the circuits
34+
# is not altered by adding randomisation.
3235

3336
api_offline = QuantinuumAPIOffline()
3437
backend = QuantinuumBackend(
3538
device_name="H1-1LE",
3639
api_handler = api_offline,
3740
)
41+
wasm_file_handler=get_wfh()
3842

43+
# Small circuit with just one ZZMax.
44+
# The ideal output is 00.
3945
circuit = Circuit(3)
4046
meas_reg = BitRegister(name='measure', size=2)
4147
circuit.add_c_register(meas_reg)
@@ -50,19 +56,100 @@ def test_h_series_randomisation():
5056
bit=meas_reg[1]
5157
)
5258

53-
randomised_circuit, wfh = gen_randomised_circuit(circuit)
54-
59+
randomised_circuit = gen_h_series_randomised_circuit(circuit)
5560
compiled_circuit = backend.get_compiled_circuit(randomised_circuit, optimisation_level=0)
5661

5762
n_shots = 100
5863
result = backend.run_circuit(
5964
compiled_circuit,
6065
n_shots=n_shots,
61-
wasm_file_handler=wfh,
66+
wasm_file_handler=wasm_file_handler,
6267
no_opt=True
6368
)
6469
assert result.get_counts(cbits=meas_reg) == Counter({(0,0,): n_shots})
6570

71+
# To consecutive ZZMax gates.
72+
# Has the effect of acting Z_0 Z_1.
73+
# Checked by applying hadamard rotations.
74+
# I deal outcome in rotate basis is 11.
75+
circuit = Circuit(3)
76+
meas_reg = BitRegister(name='measure', size=2)
77+
circuit.add_c_register(meas_reg)
78+
79+
circuit.H(0)
80+
circuit.H(1)
81+
82+
circuit.ZZMax(0,1)
83+
circuit.ZZMax(0,1)
84+
85+
circuit.H(0)
86+
circuit.H(1)
87+
88+
circuit.Measure(
89+
qubit=circuit.qubits[0],
90+
bit=meas_reg[0]
91+
)
92+
circuit.Measure(
93+
qubit=circuit.qubits[1],
94+
bit=meas_reg[1]
95+
)
96+
97+
randomised_circuit = gen_h_series_randomised_circuit(circuit)
98+
compiled_circuit = backend.get_compiled_circuit(randomised_circuit, optimisation_level=0)
99+
100+
n_shots = 100
101+
result = backend.run_circuit(
102+
compiled_circuit,
103+
n_shots=n_shots,
104+
wasm_file_handler=wasm_file_handler,
105+
no_opt=True
106+
)
107+
assert result.get_counts(cbits=meas_reg) == Counter({(1,1,): n_shots})
108+
109+
# Slightly larger circuit.
110+
# Ideal outcome in rotated basis is 101.
111+
circuit = Circuit(3)
112+
meas_reg = BitRegister(name='measure', size=3)
113+
circuit.add_c_register(meas_reg)
114+
115+
circuit.H(0)
116+
circuit.H(1)
117+
circuit.H(2)
118+
119+
circuit.ZZMax(0,1)
120+
circuit.ZZMax(1,2)
121+
circuit.ZZMax(0,1)
122+
circuit.ZZMax(1,2)
123+
124+
circuit.H(0)
125+
circuit.H(1)
126+
circuit.H(2)
127+
128+
circuit.Measure(
129+
qubit=circuit.qubits[0],
130+
bit=meas_reg[0]
131+
)
132+
circuit.Measure(
133+
qubit=circuit.qubits[1],
134+
bit=meas_reg[1]
135+
)
136+
circuit.Measure(
137+
qubit=circuit.qubits[2],
138+
bit=meas_reg[2]
139+
)
140+
141+
randomised_circuit = gen_h_series_randomised_circuit(circuit)
142+
compiled_circuit = backend.get_compiled_circuit(randomised_circuit, optimisation_level=0)
143+
144+
n_shots = 100
145+
result = backend.run_circuit(
146+
compiled_circuit,
147+
n_shots=n_shots,
148+
wasm_file_handler=wasm_file_handler,
149+
no_opt=True
150+
)
151+
assert result.get_counts(cbits=meas_reg) == Counter({(1,0,1,): n_shots})
152+
66153
def test_frame_randomisation_circuits_task_gen():
67154
c = Circuit(2).CX(0, 1).Rx(0.289, 1).CX(0, 1).measure_all()
68155
ufr_task = frame_randomisation_circuits_task_gen(

0 commit comments

Comments
 (0)