|
| 1 | +from mitiq.benchmarks import ( |
| 2 | + generate_ghz_circuit, |
| 3 | + generate_mirror_circuit, |
| 4 | + generate_quantum_volume_circuit, |
| 5 | + generate_rb_circuits, |
| 6 | + generate_w_circuit, |
| 7 | +) |
| 8 | + |
| 9 | +from mitiq.interface import ( |
| 10 | + CircuitConversionError, |
| 11 | + convert_to_mitiq, |
| 12 | + convert_from_mitiq, |
| 13 | +) |
| 14 | + |
| 15 | + |
| 16 | +from ... import Circuit |
| 17 | + |
| 18 | + |
| 19 | +def ghz_circuit(num_qubits): # type: ignore |
| 20 | + cirq = generate_ghz_circuit(num_qubits) |
| 21 | + ideal = {"0" * num_qubits: 0.5, "1" * num_qubits: 0.5} |
| 22 | + qisc = convert_from_mitiq(cirq, "qiskit") |
| 23 | + circuit = Circuit.from_qiskit(qisc, qisc.num_qubits) |
| 24 | + return circuit, ideal |
| 25 | + |
| 26 | + |
| 27 | +def w_circuit(num_qubits): # type: ignore |
| 28 | + # Efficient quantum algorithms for GHZ and W states https://arxiv.org/abs/1807.05572 |
| 29 | + # Werner-state with linear complexity {'1000': 0.25, '0100': 0.25, '0010': 0.25, '0001': 0.25} |
| 30 | + cirq = generate_w_circuit(num_qubits) |
| 31 | + |
| 32 | + ideal = {} |
| 33 | + for i in range(num_qubits): |
| 34 | + bitstring = "0" * i + "1" + "0" * (num_qubits - i - 1) |
| 35 | + ideal[bitstring] = 1 / num_qubits |
| 36 | + |
| 37 | + qisc = convert_from_mitiq(cirq, "qiskit") |
| 38 | + circuit = Circuit.from_qiskit(qisc, qisc.num_qubits) |
| 39 | + return circuit, ideal |
| 40 | + |
| 41 | + |
| 42 | +def rb_circuit(num_qubits, depth): # type: ignore |
| 43 | + # num_qubits limited to 1 or 2 |
| 44 | + cirq = generate_rb_circuits(num_qubits, depth)[0] |
| 45 | + ideal = {"0" * num_qubits: 1.0} |
| 46 | + qisc = convert_from_mitiq(cirq, "qiskit") |
| 47 | + circuit = Circuit.from_qiskit(qisc, qisc.num_qubits) |
| 48 | + return circuit, ideal |
| 49 | + |
| 50 | + |
| 51 | +def mirror_circuit( # type: ignore |
| 52 | + depth, two_qubit_gate_prob, connectivity_graph, seed, two_qubit_gate_name="CNOT" |
| 53 | +): |
| 54 | + # Measuring the Capabilities of Quantum Computers https://arxiv.org/pdf/2008.11294.pdf |
| 55 | + cirq, bitstring_list = generate_mirror_circuit( |
| 56 | + nlayers=depth, |
| 57 | + two_qubit_gate_prob=two_qubit_gate_prob, |
| 58 | + connectivity_graph=connectivity_graph, |
| 59 | + two_qubit_gate_name=two_qubit_gate_name, |
| 60 | + seed=seed, |
| 61 | + ) |
| 62 | + ideal_bitstring = "".join(map(str, bitstring_list)) |
| 63 | + ideal = {ideal_bitstring: 1.0} |
| 64 | + qisc = convert_from_mitiq(cirq, "qiskit") |
| 65 | + circuit = Circuit.from_qiskit(qisc, qisc.num_qubits) |
| 66 | + return circuit, ideal |
| 67 | + |
| 68 | + |
| 69 | +def QAOA_circuit(graph, weight, params): # type: ignore |
| 70 | + nlayers = len(params) |
| 71 | + |
| 72 | + qlist = [] |
| 73 | + for i in range(len(graph)): |
| 74 | + for j in range(2): |
| 75 | + qlist.append(graph[i][j]) |
| 76 | + qlist = list(set(qlist)) |
| 77 | + |
| 78 | + nqubit = max(qlist) + 1 |
| 79 | + |
| 80 | + c = Circuit(nqubit) |
| 81 | + for i in qlist: |
| 82 | + c.h(i) # type: ignore |
| 83 | + |
| 84 | + for i in range(nlayers): |
| 85 | + for e in range(len(graph)): |
| 86 | + c.cnot(graph[e][0], graph[e][1]) # type: ignore |
| 87 | + c.rz(graph[e][1], theta=params[i, 0] * weight[e]) # type: ignore |
| 88 | + c.cnot(graph[e][0], graph[e][1]) # type: ignore |
| 89 | + |
| 90 | + for k in qlist: |
| 91 | + c.rx(k, theta=params[i, 1] * 2) # type: ignore |
| 92 | + |
| 93 | + return c |
0 commit comments