/
main.py
90 lines (69 loc) · 2.59 KB
/
main.py
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
import json
from qiskit import QuantumCircuit
from qxx_core import QXXCompiler, QXXInitialMapping
def main():
# Load the circuit
circ = QuantumCircuit.from_qasm_file("./circuits/random0_n5_d5.qasm")
print(circ.draw(output="text", fold=-1))
# Load the coupling map
# name = "./layouts/circle_reg_q5.json"
# name = "./layouts/ibmqx3_q16.json"
name = "./layouts/rect_def_q20.json"
with open(name, 'r') as infile:
temp = json.load(infile)
coupling = []
for ii, kk in temp["coupling_map"].items():
for k in kk:
coupling += [[int(ii), k]]
"""
K7M
"""
gate_costs = {'id': 0, 'u1': 0, 'measure': 0,
'reset': 0, 'barrier': 0,
'u2': 1, 'u3': 1, 'U': 1,
'cx': 10, 'CX': 10,
"rev_cx_edge" : 10, # related to the edge in the coupling
"ok": 0,
# update the costs
"rev_cnot": 4 * 1 + 10, # 4 u2/hadamard + 1 cnot
"swap": 3 * 10 + 4, # 4 u2/hadamard + 3 cnot
'seed': 19} # pass the seed through gate costs
parameters = {
# maximum depth of the search tree
# after this depth, the leafs are evaluated
# and only the path with minimum cost is kept in the tree
# thus, the tree is pruned
"max_depth": circ.n_qubits,
# "max_depth": test_circuit.n_qubits/4,
# maximum number of children of a node
# "max_children": qiskit_coupling_map.size(),
"max_children": 3,
# the first number_of_qubits * this factor the search maximises the cost
# afterwards it minimises it
"opt_max_t_min": False,
"qubit_increase_factor": 3,
"option_skip_cx": False,
"penalty_skip_cx": 20,
"opt_div_by_act": True,
# later changes in the mapping should not affect
# the initial mapping of the circuit
"opt_att": True,
# b \in [0, 10]
"att_b": 0,
# c \in [0, 1]
"att_c": 1,
}
parameters_string = str(parameters)
# the number of qubits in the device
parameters["nisq_qubits"] = temp["qubits"]
# Add the gate costs
parameters["gate_costs"] = gate_costs
# Should the initial mapping be chosen random?
parameters["initial_map"] = QXXInitialMapping.HEURISTIC
parameters["unidirectional_coupling"] = False
parameters["dry_run"] = False
k7m = QXXCompiler(coupling, parameters)
result = k7m.run(circ)
print(result.draw(output="text", fold=-1, idle_wires=False))
if __name__ == '__main__':
main()