Skip to content

Commit

Permalink
Fix reconstruction
Browse files Browse the repository at this point in the history
  • Loading branch information
mar-be committed May 8, 2024
1 parent 8a69824 commit ba9a563
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 18 deletions.
15 changes: 11 additions & 4 deletions app/CKT_cutter.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,8 @@ def reconstruct_distribution(
if label not in labels:
labels.append(label)

qubits = {key: len(val) for key, val in subobservables.items()}
observable = "".join([subobservables[l] for l in labels])
qubits = {key: val.count("Z") for key, val in subobservables.items()}
observable = "".join([subobservables[l] for l in reversed(labels)])

label_index_lists = defaultdict(list)
for ind, (label, _) in enumerate(qubit_map):
Expand Down Expand Up @@ -178,8 +178,15 @@ def reconstruct_distribution(
return result_dict

result_dict_traced_out = defaultdict(float)
qubits_to_trace_out = list(find_character_in_string(observable, "I"))
qubits_to_trace_out = [len(observable) - i - 1 for i in qubits_to_trace_out]
qubits_to_trace_out = []
for label, sub_obs in subobservables.items():
qubits_to_trace_out_in_sub_obs = list(find_character_in_string(sub_obs, "I"))
qubits_to_trace_out_in_sub_obs = [
len(sub_obs) - i - 1 for i in qubits_to_trace_out_in_sub_obs
]
for qubit_in_sub_obs in qubits_to_trace_out_in_sub_obs:
qubit = label_index_lists[label][qubit_in_sub_obs]
qubits_to_trace_out.append(qubit)

for meas, val in result_dict.items():
meas_traced_out = remove_bits(meas, qubits_to_trace_out)
Expand Down
3 changes: 2 additions & 1 deletion app/gate_cutting_reconstruct_distribution.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,12 @@ def _process_outcome_distribution(
A tuple with the QPD factor in the measurement outcome
"""
outcome = _outcome_to_int(outcome)
# remove outcome of mid-circuit measurements
meas_outcomes = outcome & ((1 << num_meas_bits) - 1)
qpd_outcomes = outcome >> num_meas_bits

# qpd_factor will be -1 or +1, depending on the overall parity of qpd
# measurements.
# measurements, thereby it accounts for mid-circuit measurements
qpd_factor = 1 - 2 * (bit_count(qpd_outcomes) & 1)

return qpd_factor, meas_outcomes
Expand Down
43 changes: 30 additions & 13 deletions test/test_CKT_cutter.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ def test_reconstruction(self):
reconstructed_dist = counts_to_array(reconstructed_counts, circuit.num_qubits)

self.assertTrue(
np.allclose(exact_distribution, reconstructed_dist, atol=0.1),
np.allclose(exact_distribution, reconstructed_dist, atol=0.01),
msg=f"\nExact distribution: {exact_distribution}\nReconstruced distribution: {reconstructed_dist}\nDiff: {np.abs(exact_distribution- reconstructed_dist)}",
)

Expand All @@ -138,11 +138,11 @@ def test_reconstruction_2(self):
circuit.cx(2, 1)
circuit.cx(1, 0)

exact_expval_list, actual_expval_list = get_expals(circuit, 2 ** 12)
exact_expval_list, actual_expval_list, observable = get_expals(circuit, 2 ** 12)

self.assertTrue(
np.allclose(exact_expval_list, actual_expval_list, atol=0.1),
msg=f"\nExact expectations: {exact_expval_list}\nReconstruced expectations: {actual_expval_list}",
msg=f"\nEObservables: {observable.paulis}\nExact expectations: {exact_expval_list}\nReconstruced expectations: {actual_expval_list}",
)

def test_reconstruction_3(self):
Expand All @@ -156,14 +156,14 @@ def test_reconstruction_3(self):
circuit.cx(2, 1)
circuit.cx(1, 0)

exact_expval_list, actual_expval_list = get_expals(circuit, 2 ** 12)
exact_expval_list, actual_expval_list, observable = get_expals(circuit, 2 ** 12)

self.assertTrue(
np.allclose(exact_expval_list, actual_expval_list, atol=0.1),
msg=f"\nExact expectations: {exact_expval_list}\nReconstruced expectations: {actual_expval_list}",
msg=f"\nEObservables: {observable.paulis}\nExact expectations: {exact_expval_list}\nReconstruced expectations: {actual_expval_list}",
)

def test_reconstruction_3(self):
def test_reconstruction_4(self):

circuit = QuantumCircuit(4)
circuit.h(0)
Expand All @@ -174,17 +174,17 @@ def test_reconstruction_3(self):
circuit.cx(2, 1)
circuit.cx(1, 0)

exact_expval_list, actual_expval_list = get_expals(circuit, 2 ** 12)
exact_expval_list, actual_expval_list, observable = get_expals(circuit, 2 ** 12)

self.assertTrue(
np.allclose(exact_expval_list, actual_expval_list, atol=0.1),
msg=f"\nExact expectations: {exact_expval_list}\nReconstruced expectations: {actual_expval_list}",
msg=f"\nEObservables: {observable.paulis}\nExact expectations: {exact_expval_list}\nReconstruced expectations: {actual_expval_list}",
)

def test_reconstruction_4(self):
def test_reconstruction_5(self):

circuit = QuantumCircuit(5)
circuit.x(0)
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.cx(1, 0)
Expand All @@ -193,11 +193,28 @@ def test_reconstruction_4(self):
circuit.cx(3, 4)
circuit.cx(2, 4)

exact_expval_list, actual_expval_list = get_expals(circuit, 2 ** 12)
exact_expval_list, actual_expval_list, observable = get_expals(circuit, 2 ** 12)

self.assertTrue(
np.allclose(exact_expval_list, actual_expval_list, atol=0.1),
msg=f"\nEObservables: {observable.paulis}\nExact expectations: {exact_expval_list}\nReconstruced expectations: {actual_expval_list}",
)

def test_reconstruction_6(self):

circuit = QuantumCircuit(4)
circuit.x(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.cx(3, 2)
circuit.cx(2, 1)
circuit.cx(1, 0)

exact_expval_list, actual_expval_list, observable = get_expals(circuit, 2 ** 12)

self.assertTrue(
np.allclose(exact_expval_list, actual_expval_list, atol=0.1),
msg=f"\nExact expectations: {exact_expval_list}\nReconstruced expectations: {actual_expval_list}",
msg=f"\nEObservables: {observable.paulis}\nExact expectations: {exact_expval_list}\nReconstruced expectations: {actual_expval_list}",
)


Expand Down Expand Up @@ -247,4 +264,4 @@ def get_expals(circuit, shots):
exact_expval = estimator.run([(circuit, observable.paulis[i])]).result()
exact_expval_list.append(exact_expval[0].data.evs)

return exact_expval_list, actual_expval_list
return exact_expval_list, actual_expval_list, observable

0 comments on commit ba9a563

Please sign in to comment.