-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpost_process.py
More file actions
129 lines (126 loc) · 6.18 KB
/
Copy pathpost_process.py
File metadata and controls
129 lines (126 loc) · 6.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import itertools
def find_init_meas(combination, O_rho_pairs, subcircuits):
# print('Finding init_meas for',combination)
all_init_meas = {}
for subcircuit_idx, subcircuit in enumerate(subcircuits):
init = ['zero' for q in range(subcircuit.num_qubits)]
meas = ['comp' for q in range(subcircuit.num_qubits)]
all_init_meas[subcircuit_idx] = [init,meas]
for s, pair in zip(combination, O_rho_pairs):
O_qubit, rho_qubit = pair
O_qubit_subcircuit_qubits = subcircuits[O_qubit['subcircuit_idx']].qubits
rho_qubit_subcircuit_qubits = subcircuits[rho_qubit['subcircuit_idx']].qubits
all_init_meas[rho_qubit['subcircuit_idx']][0][rho_qubit_subcircuit_qubits.index(rho_qubit['subcircuit_qubit'])] = s
all_init_meas[O_qubit['subcircuit_idx']][1][O_qubit_subcircuit_qubits.index(O_qubit['subcircuit_qubit'])] = s
# print(all_init_meas)
for subcircuit_idx in all_init_meas:
init = all_init_meas[subcircuit_idx][0]
init_combinations = []
for idx, x in enumerate(init):
if x == 'zero':
init_combinations.append(['zero'])
elif x == 'I':
init_combinations.append(['+zero','+one'])
elif x == 'X':
init_combinations.append(['2plus','-zero','-one'])
elif x == 'Y':
init_combinations.append(['2plusI','-zero','-one'])
elif x == 'Z':
init_combinations.append(['+zero','-one'])
else:
raise Exception('Illegal initilization symbol :',x)
init_combinations = list(itertools.product(*init_combinations))
meas = all_init_meas[subcircuit_idx][1]
meas_combinations = []
for x in meas:
if x == 'comp':
meas_combinations.append(['comp'])
elif x=='I' or x == 'X' or x == 'Y' or x=='Z':
meas_combinations.append(['+%s'%x])
else:
raise Exception('Illegal measurement symbol :',x)
meas_combinations = list(itertools.product(*meas_combinations))
subcircuit_init_meas = []
for init in init_combinations:
for meas in meas_combinations:
subcircuit_init_meas.append((tuple(init),tuple(meas)))
all_init_meas[subcircuit_idx] = subcircuit_init_meas
# print(all_init_meas)
return all_init_meas
def get_combinations(complete_path_map):
O_rho_pairs = []
for input_qubit in complete_path_map:
path = complete_path_map[input_qubit]
if len(path)>1:
for path_ctr, item in enumerate(path[:-1]):
O_qubit_tuple = item
rho_qubit_tuple = path[path_ctr+1]
O_rho_pairs.append((O_qubit_tuple, rho_qubit_tuple))
basis = ['I','X','Y','Z']
combinations = list(itertools.product(basis,repeat=len(O_rho_pairs)))
return O_rho_pairs, combinations
def build(full_circuit, combinations, O_rho_pairs, subcircuits, all_indexed_combinations):
kronecker_terms = {subcircuit_idx:{} for subcircuit_idx in range(len(subcircuits))}
summation_terms = []
for i, combination in enumerate(combinations):
# print('%d/%d combinations:'%(i+1,len(combinations)),combination)
summation_term = {}
all_init_meas = find_init_meas(combination, O_rho_pairs, subcircuits)
for subcircuit_idx in range(len(subcircuits)):
subcircuit_kron_term = []
# print('Subcircuit_%d init_meas ='%subcircuit_idx,all_init_meas[subcircuit_idx])
for init_meas in all_init_meas[subcircuit_idx]:
# print('Subcircuit_%d init_meas ='%subcircuit_idx,init_meas)
coefficient = 1
init = list(init_meas[0])
for idx, x in enumerate(init):
if x == 'zero':
continue
elif x == '+zero':
init[idx] = 'zero'
elif x == '+one':
init[idx] = 'one'
elif x == '2plus':
init[idx] = 'plus'
coefficient *= 2
elif x == '-zero':
init[idx] = 'zero'
coefficient *= -1
elif x == '-one':
init[idx] = 'one'
coefficient *= -1
elif x =='2plusI':
init[idx] = 'plusI'
coefficient *= 2
else:
raise Exception('Illegal initilization symbol :',x)
meas = list(init_meas[1])
for idx, x in enumerate(meas):
if x == 'comp':
continue
elif x == '+I':
meas[idx] = 'I'
elif x == '+Z':
meas[idx] = 'Z'
elif x =='+X':
meas[idx] = 'X'
elif x == '+Y':
meas[idx] = 'Y'
else:
raise Exception('Illegal measurement symbol :',x)
init_meas = (tuple(init),tuple(meas))
subcircuit_inst_index = all_indexed_combinations[subcircuit_idx][init_meas]
subcircuit_kron_term.append((coefficient,subcircuit_inst_index))
# print(coefficient,init_meas)
subcircuit_kron_term = tuple(subcircuit_kron_term)
if subcircuit_kron_term not in kronecker_terms[subcircuit_idx]:
subcircuit_kron_index = len(kronecker_terms[subcircuit_idx])
kronecker_terms[subcircuit_idx][subcircuit_kron_term] = subcircuit_kron_index
else:
subcircuit_kron_index = kronecker_terms[subcircuit_idx][subcircuit_kron_term]
# print('Subcircuit_%d kron term %d ='%(subcircuit_idx,subcircuit_kron_index),subcircuit_kron_term)
summation_term[subcircuit_idx] = subcircuit_kron_index
# print('Summation term =',summation_term,'\n')
summation_terms.append(summation_term)
# [print(subcircuit_idx,kronecker_terms[subcircuit_idx]) for subcircuit_idx in kronecker_terms]
return kronecker_terms, summation_terms