1 from squander.partitioning.partition
import PartitionCircuitQasm, kahn_partition, translate_param_order
4 from qiskit
import QuantumCircuit
5 from qiskit.transpiler
import PassManager
6 from qiskit.transpiler.passes
import CollectMultiQBlocks, ConsolidateBlocks
7 from squander
import utils
10 from bqskit
import Circuit
12 from bqskit.passes.partitioning.quick
import QuickPartitioner
13 from bqskit.passes.partitioning.greedy
import GreedyPartitioner
14 from bqskit.passes.partitioning.cluster
import ClusteringPartitioner
15 from bqskit.passes.partitioning.scan
import ScanPartitioner
17 bqs_to_squander = {bqskit.ir.gates.constant.cx.CNOTGate:
"CNOT",
18 bqskit.ir.gates.constant.t.TGate:
"T",
19 bqskit.ir.gates.constant.h.HGate:
"H",
20 bqskit.ir.gates.constant.tdg.TdgGate:
"TDG",
21 bqskit.ir.gates.constant.x.XGate:
"X",
22 bqskit.ir.gates.constant.y.YGate:
"Y",
23 bqskit.ir.gates.constant.z.ZGate:
"Z",
24 bqskit.ir.gates.constant.sx.SXGate:
"SX",
25 bqskit.ir.gates.constant.ch.CHGate:
"CH",
26 bqskit.ir.gates.constant.cz.CZGate:
"CZ",
27 bqskit.ir.gates.parameterized.cry.CRYGate:
"CRY",
28 bqskit.ir.gates.parameterized.u3.U3Gate:
"U3",
29 bqskit.ir.gates.parameterized.rz.RZGate:
"RZ",
30 bqskit.ir.gates.parameterized.ry.RYGate:
"RY",
31 bqskit.ir.gates.parameterized.rx.RXGate:
"RX",}
35 CollectMultiQBlocks(max_block_size=max_partition_size),
38 blocks = pm.property_set[
'block_list']
39 L = [{(frozenset(qc.find_bit(x)[0]
for x
in dagop.qargs), dagop.name.upper().replace(
"CX",
"CNOT"))
for dagop
in block}
for block
in blocks]
40 assert len(qc.data) == sum(map(len, blocks))
44 circ, parameters, qc = utils.qasm_to_squander_circuit(filename,
True)
47 return partitioned_circ, param_reordered
50 if partitioner ==
"Quick":
51 partitioner = QuickPartitioner(block_size=max_partition_size)
52 elif partitioner ==
"Scan":
53 partitioner = ScanPartitioner(block_size=max_partition_size)
54 elif partitioner ==
"Greedy":
55 partitioner = GreedyPartitioner(block_size=max_partition_size)
56 elif partitioner ==
"Cluster":
57 partitioner = ClusteringPartitioner(block_size=max_partition_size)
58 bq_circuit = Circuit.from_file(filename)
59 asyncio.run(partitioner.run(bq_circuit,
None))
61 circ, parameters, qc = utils.qasm_to_squander_circuit(filename,
True)
62 L = [{(frozenset(curloc.location[x]
for x
in op.location), bqs_to_squander[
type(op.gate)])
for op
in curloc.gate._circuit.operations()}
for curloc
in bq_circuit.operations()]
65 max_partition_size = 4
66 files = glob.glob(
"benchmarks/partitioning/test_circuit/*.qasm")
67 print(
"Total QASM:", len(files))
69 for filename
in files:
70 qc = QuantumCircuit.from_qasm_file(filename)
71 num_gates = len(qc.data)
72 fname = os.path.basename(filename)
73 print(f
"{fname} qubits {qc.num_qubits} gates {num_gates}")
78 res[
"Greedy"] = len(partitioned_circuit.get_Gates())
80 partitioned_circuit_ilp, parameters_ilp =
PartitionCircuitQasm( filename, max_partition_size,
True )
81 res[
"ILP"] = len(partitioned_circuit_ilp.get_Gates())
83 for name
in (
"Quick",
"Greedy",
"Scan",
"Cluster"):
86 allfiles[fname] = (qc.num_qubits, num_gates, res)
87 print(fname, allfiles[fname])
89 import matplotlib.pyplot
as plt
90 sorted_items = sorted(allfiles.items(), key=
lambda item: (item[1][0], item[1][1]))
91 circuits_sorted = [name
for name, _
in sorted_items]
92 markers = [
"o",
"*",
"D",
"s"]
93 for i, strat
in enumerate((
"Greedy",
"ILP",
"Qiskit",
"BQSKit-Quick")):
94 y = [allfiles[name][2][strat]
for name
in circuits_sorted]
95 plt.plot(circuits_sorted, y, marker=markers[i], label=strat)
96 plt.xlabel(
"Circuit (sorted by qubits, gates)")
97 plt.ylabel(
"Partition Count")
98 plt.title(
"Partition Count per Circuit by Strategy")
99 plt.xticks(rotation=45, ha=
"right")
103 plt.savefig(
"partition_counts.svg", format=
"svg", transparent=
True)
105 if __name__ ==
"__main__":
def translate_param_order
def do_get_qiskit_partitions(filename, max_partition_size)
def get_bqskit_partitions(filename, partitioner, max_partition_size)
def get_qiskit_partitions(circ, qc, max_partition_size)
def kahn_partition(c, max_qubit, preparts=None)