예제 #1
0
def make_accred_system(seed=None):
    """generate accred circuits"""
    # Create a Quantum Register with n_qb qubits.
    q_reg = QuantumRegister(4, 'q')
    # Create a Classical Register with n_qb bits.
    c_reg = ClassicalRegister(4, 's')
    # Create a Quantum Circuit acting on the q register
    target_circuit = QuantumCircuit(q_reg, c_reg)
    target_circuit.h(0)
    target_circuit.h(1)
    target_circuit.h(2)
    target_circuit.h(3)
    target_circuit.cx(0, 1)
    target_circuit.cx(0, 2)
    target_circuit.h(1)
    target_circuit.h(2)
    target_circuit.cx(0, 3)
    target_circuit.cx(1, 2)
    target_circuit.h(1)
    target_circuit.h(2)
    target_circuit.h(3)
    target_circuit.measure(q_reg, c_reg)

    return AccreditationCircuits(target_circuit, seed=seed)
    def test_readout_order(self):
        """Test one circuit, one register, out-of-order readout.
        """
        qr = QuantumRegister(4)
        cr = ClassicalRegister(4)
        circuit = QuantumCircuit(qr, cr)
        circuit.x(qr[0])
        circuit.x(qr[2])
        circuit.measure(qr[0], cr[2])
        circuit.measure(qr[1], cr[0])
        circuit.measure(qr[2], cr[1])
        circuit.measure(qr[3], cr[3])

        qobj_local = assemble(transpile(circuit, backend=self._local_backend))
        result_local = self._local_backend.run(qobj_local).result()

        for remote_backend in self._remote_backends:
            with self.subTest(backend=remote_backend):
                qobj_remote = assemble(
                    transpile(circuit, backend=remote_backend))
                result_remote = remote_backend.run(qobj_remote).result()
                self.assertDictAlmostEqual(result_remote.get_counts(circuit),
                                           result_local.get_counts(circuit),
                                           delta=50)
예제 #3
0
def make_circuit(n: int) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n, "qc")
    prog = QuantumCircuit(input_qubit)
    prog.h(input_qubit[0])  # number=1
    prog.h(input_qubit[1])  # number=2
    prog.h(input_qubit[2])  # number=3
    prog.rx(2.7457519792374794, input_qubit[2])  # number=5
    prog.h(input_qubit[3])  # number=4

    for edge in E:
        k = edge[0]
        l = edge[1]
        prog.cp(-2 * gamma, input_qubit[k - 1], input_qubit[l - 1])
        prog.p(gamma, k)
        prog.p(gamma, l)

    prog.rx(2 * beta, range(len(V)))

    prog.cx(input_qubit[1], input_qubit[0])  # number=6
    prog.cx(input_qubit[1], input_qubit[0])  # number=7
    # circuit end

    return prog
예제 #4
0
    def test_permute_wires_6(self):
        """
         qr0:--(+)-------.--
                |        |
         qr1:---|--------|--
                |
         qr2:---|--------|--
                |        |
         qr3:---.--[H]--(+)-
         Coupling map: [0]--[1]--[2]--[3]
        """
        coupling = CouplingMap([[0, 1], [1, 2], [2, 3]])

        qr = QuantumRegister(4, 'q')
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[3], qr[0])
        circuit.h(qr[3])
        circuit.cx(qr[0], qr[3])
        dag = circuit_to_dag(circuit)

        pass_ = StochasticSwap(coupling, None, 20, 13)
        after = pass_.run(dag)

        self.assertEqual(dag, after)
    def test_non_commutative_circuit_2(self):
        """A simple circuit where no gates commute

        qr0:----.-------------
                |
        qr1:---(+)------.-----
                        |
        qr2:---[H]-----(+)----
        """
        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.h(qr[2])
        circuit.cx(qr[1], qr[2])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)

        expected = {
            'qr[0]': [[1], [7], [2]],
            'qr[1]': [[3], [7], [9], [4]],
            'qr[2]': [[5], [8], [9], [6]]
        }
        self.assertCommutationSet(self.pset["commutation_set"], expected)
예제 #6
0
    def _construct_circuit(x,
                           feature_map,
                           measurement,
                           is_statevector_sim=False):
        """
        If `is_statevector_sim` is True, we only build the circuits for Psi(x1)|0> rather than
        Psi(x2)^dagger Psi(x1)|0>.
        """
        x1, x2 = x
        if len(x1) != len(x2):
            raise ValueError("x1 and x2 must be the same dimension.")

        q = QuantumRegister(feature_map.num_qubits, 'q')
        c = ClassicalRegister(feature_map.num_qubits, 'c')
        qc = QuantumCircuit(q, c)

        # write input state from sample distribution
        qc += feature_map.construct_circuit(x1, q)
        if not is_statevector_sim:
            qc += feature_map.construct_circuit(x2, q).inverse()
            if measurement:
                qc.barrier(q)
                qc.measure(q, c)
        return qc
예제 #7
0
    def test_permute_wires_1(self):
        """All of the test_permute_wires tests are derived
        from the basic mapper tests. In this case, the
        stochastic mapper handles a single
        layer by qubit label permutations so as not to
        introduce additional swap gates. The new
        initial layout is found in pass_.initial_layout.
         q0:-------
         q1:--(+)--
               |
         q2:---.---
         Coupling map: [1]--[0]--[2]
        """
        coupling = CouplingMap([[0, 1], [0, 2]])

        qr = QuantumRegister(3, 'q')
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[1], qr[2])
        dag = circuit_to_dag(circuit)

        pass_ = StochasticSwap(coupling, None, 20, 13)
        after = pass_.run(dag)

        self.assertEqual(dag, after)
예제 #8
0
 def test_unitary(self):
     """Test unitary gate instruction"""
     max_qubits = 4
     x_mat = np.array([[0, 1], [1, 0]])
     # Test 1 to max_qubits for random n-qubit unitary gate
     for i in range(max_qubits):
         num_qubits = i + 1
         # Apply X gate to all qubits
         multi_x = x_mat
         for _ in range(i):
             multi_x = np.kron(multi_x, x_mat)
         # Target counts
         shots = 100
         target_counts = {num_qubits * '1': shots}
         # Test circuit
         qr = QuantumRegister(num_qubits, 'qr')
         cr = ClassicalRegister(num_qubits, 'cr')
         circuit = QuantumCircuit(qr, cr)
         circuit.unitary(multi_x, qr)
         circuit.measure(qr, cr)
         job = execute(circuit, self.backend, shots=shots)
         result = job.result()
         counts = result.get_counts(0)
         self.assertEqual(counts, target_counts)
    def test_iqae_circuits(self, efficient_circuit):
        """Test circuits resulting from iterative amplitude estimation.

        Build the circuit manually and from the algorithm and compare the resulting unitaries.
        """
        prob = 0.5

        for k in range(2, 7):
            qae = IterativeAmplitudeEstimation(0.01, 0.05, a_factory=BernoulliAFactory(prob))
            angle = 2 * np.arcsin(np.sqrt(prob))

            # manually set up the inefficient AE circuit
            q_objective = QuantumRegister(1, 'q')
            circuit = QuantumCircuit(q_objective)

            # A operator
            circuit.ry(angle, q_objective)

            if efficient_circuit:
                qae.q_factory = BernoulliQFactory(qae.a_factory)
                # for power in range(k):
                #    circuit.ry(2 ** power * angle, q_objective[0])
                circuit.ry(2 * k * angle, q_objective[0])

            else:
                q_factory = QFactory(qae.a_factory, i_objective=0)
                for _ in range(k):
                    q_factory.build(circuit, q_objective)

            expected_unitary = self._unitary.execute(circuit).get_unitary()

            actual_circuit = qae.construct_circuit(k, measurement=False)
            actual_unitary = self._unitary.execute(actual_circuit).get_unitary()

            diff = np.sum(np.abs(actual_unitary - expected_unitary))
            self.assertAlmostEqual(diff, 0)
예제 #10
0
    def test_true_map_in_same_layer(self):
        """ Two CXs distance_qubits 1 to each other, in the same layer
         qr0:--(+)--
                |
         qr1:---.---

         qr2:--(+)--
                |
         qr3:---.---

         CouplingMap map: [0]->[1]->[2]->[3]
        """
        qr = QuantumRegister(4, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.cx(qr[2], qr[3])
        coupling = CouplingMap([(0, 1), (1, 2), (2, 3)])
        dag = circuit_to_dag(circuit)

        pass_ = CheckMap(coupling)
        pass_.run(dag)

        self.assertTrue(pass_.property_set['is_swap_mapped'])
        self.assertTrue(pass_.property_set['is_direction_mapped'])
예제 #11
0
def init_quantum(nhood):
    v=nhood
    a = (v[0][0]+v[0][1]+v[0][2]+v[1][0]+v[1][2]+v[2][0]+v[2][1]+v[2][2])/8
    a = a/np.linalg.norm(a)
    qr = QuantumRegister(3,'qr')
    qc = QuantumCircuit(qr,name='conway')
    counter  = 0
    initial_state = (1/np.sqrt(6))*np.array([2,1,0,1])
    qc.initialize(initial_state,[qr[1],qr[2]])
    qc.initialize(a,[qr[0]])
    qc.cx(qr[0],qr[1])
    qc.initialize(a,[qr[0]])
    qc.cx(qr[0],qr[1])
    qc.cx(qr[0],qr[2])
    qc.cx(qr[1],qr[0])
    qc.cx(qr[2],qr[0])
    job = execute(qc,Aer.get_backend('statevector_simulator'))
    results = job.result().get_statevector()
    del qr
    del qc
    del job
    value = partial_trace(results,[1,2])[0]
    value = np.real(value)
    return value
예제 #12
0
    def test_true_map(self):
        """ Mapped is easy to check

         qr0:--X-[H]-X--
               |     |
         qr1:--X-----|--
                     |
         qr2:--------X--

         CouplingMap map: [1]<-[0]->[2]
        """
        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.swap(qr[0], qr[1])
        circuit.h(qr[0])
        circuit.swap(qr[0], qr[2])
        coupling = CouplingMap([(0, 1), (0, 2)])
        dag = circuit_to_dag(circuit)

        pass_ = CheckMap(coupling)
        pass_.run(dag)

        self.assertTrue(pass_.property_set['is_swap_mapped'])
        self.assertFalse(pass_.property_set['is_direction_mapped'])
    def test_text_pager(self):
        """ The pager breaks the circuit when the drawing does not fit in the console."""
        expected = '\n'.join(["        ┌───┐     »",
                              "q_0: |0>┤ X ├──■──»",
                              "        └─┬─┘┌─┴─┐»",
                              "q_1: |0>──■──┤ X ├»",
                              "             └───┘»",
                              " c_0: 0 ══════════»",
                              "                  »",
                              "«     ┌─┐┌───┐     »",
                              "«q_0: ┤M├┤ X ├──■──»",
                              "«     └╥┘└─┬─┘┌─┴─┐»",
                              "«q_1: ─╫───■──┤ X ├»",
                              "«      ║      └───┘»",
                              "«c_0: ═╩═══════════»",
                              "«                  »",
                              "«     ┌─┐┌───┐     ",
                              "«q_0: ┤M├┤ X ├──■──",
                              "«     └╥┘└─┬─┘┌─┴─┐",
                              "«q_1: ─╫───■──┤ X ├",
                              "«      ║      └───┘",
                              "«c_0: ═╩═══════════",
                              "«                  "])

        qr = QuantumRegister(2, 'q')
        cr = ClassicalRegister(1, 'c')
        circuit = QuantumCircuit(qr, cr)
        circuit.cx(qr[1], qr[0])
        circuit.cx(qr[0], qr[1])
        circuit.measure(qr[0], cr[0])
        circuit.cx(qr[1], qr[0])
        circuit.cx(qr[0], qr[1])
        circuit.measure(qr[0], cr[0])
        circuit.cx(qr[1], qr[0])
        circuit.cx(qr[0], qr[1])
        self.assertEqual(str(_text_circuit_drawer(circuit, line_length=20)), expected)
예제 #14
0
    def test_circuit_count_ops(self):
        """Tet circuit count ops
        """
        size = 6
        q = QuantumRegister(size, 'q')
        qc = QuantumCircuit(q)

        ans = {}
        num_gates = np.random.randint(50)
        # h = 0, x = 1, y = 2, z = 3, cx = 4, ccx = 5
        lookup = {0: 'h', 1: 'x', 2: 'y', 3: 'z', 4: 'cx', 5: 'ccx'}

        for _ in range(num_gates):
            item = np.random.randint(6)
            if item in [0, 1, 2, 3]:
                idx = np.random.randint(size)
                if item == 0:
                    qc.h(q[idx])
                elif item == 1:
                    qc.x(q[idx])
                elif item == 2:
                    qc.y(q[idx])
                elif item == 3:
                    qc.z(q[idx])
            else:
                idx = np.random.permutation(size)
                if item == 4:
                    qc.cx(q[int(idx[0])], q[int(idx[1])])
                elif item == 5:
                    qc.ccx(q[int(idx[0])], q[int(idx[1])], q[int(idx[2])])
            if lookup[item] not in ans.keys():
                ans[lookup[item]] = 1
            else:
                ans[lookup[item]] += 1

            self.assertEqual(ans, qc.count_ops())
예제 #15
0
 def test_3q_schedule(self):
     """Test a schedule that was recommended by David McKay :D """
     backend = FakeOpenPulse3Q()
     inst_map = backend.defaults().circuit_instruction_map
     q = QuantumRegister(3)
     c = ClassicalRegister(3)
     qc = QuantumCircuit(q, c)
     qc.cx(q[0], q[1])
     qc.u2(0.778, 0.122, q[2])
     qc.u3(3.14, 1.57, 0., q[0])
     qc.u2(3.14, 1.57, q[1])
     qc.cx(q[1], q[2])
     qc.u2(0.778, 0.122, q[2])
     sched = schedule(qc, backend)
     expected = Schedule(inst_map.get('cx', [0, 1]),
                         (22, inst_map.get('u2', [1], 3.14, 1.57)),
                         (46, inst_map.get('u2', [2], 0.778, 0.122)),
                         (50, inst_map.get('cx', [1, 2])),
                         (72, inst_map.get('u2', [2], 0.778, 0.122)),
                         (74, inst_map.get('u3', [0], 3.14, 1.57)))
     for actual, expected in zip(sched.instructions, expected.instructions):
         self.assertEqual(actual[0], expected[0])
         self.assertEqual(actual[1].command, expected[1].command)
         self.assertEqual(actual[1].channels, expected[1].channels)
예제 #16
0
def build_circuit(n: int, f: Callable[[str], str]) -> QuantumCircuit:
    # implement the Bernstein-Vazirani circuit
    zero = np.binary_repr(0, n)
    b = f(zero)

    # initial n + 1 bits
    input_qubit = QuantumRegister(n + 1, "qc")
    classicals = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classicals)

    # inverse last one (can be omitted if using O_f^\pm)
    prog.x(input_qubit[n])
    # circuit begin
    prog.h(input_qubit[1])  # number=1
    prog.rx(-0.09738937226128368, input_qubit[2])  # number=2
    prog.h(input_qubit[1])  # number=3

    # apply H to get superposition
    for i in range(n):
        prog.h(input_qubit[i])
    prog.h(input_qubit[n])
    prog.barrier()

    # apply oracle O_f
    oracle = build_oracle(n, f)
    prog.append(oracle.to_gate(),
                [input_qubit[i] for i in range(n)] + [input_qubit[n]])

    # apply H back (QFT on Z_2^n)
    for i in range(n):
        prog.h(input_qubit[i])
    prog.barrier()

    # measure

    return prog
예제 #17
0
    def test_combine_circuit_extension_instructions(self):
        """Test combining circuits containing barrier, initializer, snapshot
        """
        qr = QuantumRegister(2)
        cr = ClassicalRegister(2)
        qc1 = QuantumCircuit(qr)
        desired_vector = [0.5, 0.5, 0.5, 0.5]
        qc1.initialize(desired_vector, qr)
        qc1.barrier()
        qc2 = QuantumCircuit(qr, cr)
        qc2.snapshot(slot='1')
        qc2.measure(qr, cr)
        new_circuit = qc1 + qc2
        backend = Aer.get_backend('qasm_simulator_py')
        shots = 1024
        result = execute(new_circuit, backend=backend, shots=shots, seed=78).result()
        snapshot_vectors = result.get_snapshot()
        fidelity = state_fidelity(snapshot_vectors[0], desired_vector)
        self.assertGreater(fidelity, 0.99)

        counts = result.get_counts()
        target = {'00': shots/4, '01': shots/4, '10': shots/4, '11': shots/4}
        threshold = 0.04 * shots
        self.assertDictAlmostEqual(counts, target, threshold)
    def test_with_extension(self):
        """There are 2 idle physical bits to extend."""
        layout = Layout([(self.qr3, 0),
                         None,
                         (self.qr3, 1),
                         None,
                         (self.qr3, 2)])

        pass_ = EnlargeWithAncilla(layout)
        after = pass_.run(self.dag)

        final_layout = {0: (QuantumRegister(3, 'qr'), 0), 1: (QuantumRegister(2, 'ancilla'), 0),
                        2: (QuantumRegister(3, 'qr'), 1), 3: (QuantumRegister(2, 'ancilla'), 1),
                        4: (QuantumRegister(3, 'qr'), 2)}

        qregs = list(after.qregs.values())
        self.assertEqual(2, len(qregs))
        self.assertEqual(self.qr3, qregs[0])
        self.assertEqual(QuantumRegister(2, name='ancilla'), qregs[1])
        self.assertEqual(final_layout, pass_.property_set['layout'].get_physical_bits())
예제 #19
0
def make_circuit(n: int, f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n, "qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0])  # number=3
    prog.h(input_qubit[1])  # number=4
    prog.h(input_qubit[2])  # number=5
    prog.h(input_qubit[3])  # number=6
    prog.rx(-0.1602212253330796, input_qubit[1])  # number=36
    prog.h(input_qubit[4])  # number=21

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2**n) * pi / 4)
    for i in range(1):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8

        prog.x(input_qubit[0])  # number=9
        prog.cx(input_qubit[0], input_qubit[1])  # number=28
        prog.h(input_qubit[4])  # number=31
        prog.x(input_qubit[1])  # number=29
        prog.h(input_qubit[1])  # number=37
        prog.cz(input_qubit[0], input_qubit[1])  # number=38
        prog.h(input_qubit[1])  # number=39
        prog.cx(input_qubit[0], input_qubit[2])  # number=22
        prog.cx(input_qubit[0], input_qubit[2])  # number=25
        prog.x(input_qubit[2])  # number=26
        prog.cx(input_qubit[0], input_qubit[2])  # number=27
        prog.cx(input_qubit[0], input_qubit[2])  # number=24
        prog.x(input_qubit[3])  # number=12

        if n >= 2:
            prog.mcu1(pi, input_qubit[1:], input_qubit[0])

        prog.x(input_qubit[0])  # number=13
        prog.x(input_qubit[1])  # number=14
        prog.x(input_qubit[2])  # number=15
        prog.x(input_qubit[3])  # number=16

        prog.h(input_qubit[0])  # number=17
        prog.h(input_qubit[1])  # number=18
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[3])  # number=20
        prog.cx(input_qubit[1], input_qubit[0])  # number=33
        prog.z(input_qubit[1])  # number=34
        prog.cx(input_qubit[1], input_qubit[0])  # number=35

        prog.h(input_qubit[0])
        prog.h(input_qubit[1])
        prog.h(input_qubit[2])
        prog.h(input_qubit[3])

    # circuit end

    for i in range(n):
        prog.measure(input_qubit[i], classical[i])

    return prog
예제 #20
0
def build_circuit(n: int, f: Callable[[str], str]) -> QuantumCircuit:
    # implement the Bernstein-Vazirani circuit
    zero = np.binary_repr(0, n)
    b = f(zero)

    # initial n + 1 bits
    input_qubit = QuantumRegister(n + 1, "qc")
    classicals = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classicals)

    # inverse last one (can be omitted if using O_f^\pm)
    prog.x(input_qubit[n])
    # circuit begin
    prog.h(input_qubit[1])  # number=1
    prog.h(input_qubit[2])  # number=38
    prog.cz(input_qubit[0], input_qubit[2])  # number=39
    prog.h(input_qubit[2])  # number=40
    prog.h(input_qubit[2])  # number=59
    prog.cz(input_qubit[0], input_qubit[2])  # number=60
    prog.h(input_qubit[2])  # number=61
    prog.h(input_qubit[2])  # number=42
    prog.cz(input_qubit[0], input_qubit[2])  # number=43
    prog.h(input_qubit[2])  # number=44
    prog.h(input_qubit[2])  # number=48
    prog.cz(input_qubit[0], input_qubit[2])  # number=49
    prog.h(input_qubit[2])  # number=50
    prog.h(input_qubit[2])  # number=71
    prog.cz(input_qubit[0], input_qubit[2])  # number=72
    prog.h(input_qubit[2])  # number=73
    prog.cx(input_qubit[0], input_qubit[2])  # number=74
    prog.x(input_qubit[2])  # number=75
    prog.cx(input_qubit[0], input_qubit[2])  # number=76
    prog.h(input_qubit[2])  # number=67
    prog.cz(input_qubit[0], input_qubit[2])  # number=68
    prog.h(input_qubit[2])  # number=69
    prog.h(input_qubit[2])  # number=64
    prog.cz(input_qubit[0], input_qubit[2])  # number=65
    prog.h(input_qubit[2])  # number=66
    prog.cx(input_qubit[0], input_qubit[2])  # number=37
    prog.h(input_qubit[2])  # number=51
    prog.cz(input_qubit[0], input_qubit[2])  # number=52
    prog.h(input_qubit[2])  # number=53
    prog.h(input_qubit[2])  # number=25
    prog.cz(input_qubit[0], input_qubit[2])  # number=26
    prog.h(input_qubit[2])  # number=27
    prog.h(input_qubit[1])  # number=7
    prog.cz(input_qubit[2], input_qubit[1])  # number=8
    prog.rx(0.17592918860102857, input_qubit[2])  # number=34
    prog.rx(-0.3989822670059037, input_qubit[1])  # number=30
    prog.h(input_qubit[1])  # number=9
    prog.h(input_qubit[1])  # number=18
    prog.rx(2.3310617489636263, input_qubit[2])  # number=58
    prog.cz(input_qubit[2], input_qubit[1])  # number=19
    prog.h(input_qubit[1])  # number=20
    prog.x(input_qubit[1])  # number=62
    prog.y(input_qubit[1])  # number=14
    prog.h(input_qubit[1])  # number=22
    prog.cz(input_qubit[2], input_qubit[1])  # number=23
    prog.rx(-0.9173450548482197, input_qubit[1])  # number=57
    prog.cx(input_qubit[2], input_qubit[1])  # number=63
    prog.h(input_qubit[1])  # number=24
    prog.z(input_qubit[2])  # number=3
    prog.cx(input_qubit[2], input_qubit[1])  # number=70
    prog.z(input_qubit[1])  # number=41
    prog.x(input_qubit[1])  # number=17
    prog.y(input_qubit[2])  # number=5
    prog.x(input_qubit[2])  # number=21

    # apply H to get superposition
    for i in range(n):
        prog.h(input_qubit[i])
    prog.h(input_qubit[n])
    prog.barrier()

    # apply oracle O_f
    oracle = build_oracle(n, f)
    prog.append(oracle.to_gate(),
                [input_qubit[i] for i in range(n)] + [input_qubit[n]])

    # apply H back (QFT on Z_2^n)
    for i in range(n):
        prog.h(input_qubit[i])
    prog.barrier()

    # measure

    return prog
예제 #21
0
def make_circuit(n:int,f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n,"qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0]) # number=3
    prog.h(input_qubit[1]) # number=4
    prog.h(input_qubit[0]) # number=57
    prog.cz(input_qubit[4],input_qubit[0]) # number=58
    prog.h(input_qubit[0]) # number=59
    prog.cx(input_qubit[4],input_qubit[0]) # number=66
    prog.z(input_qubit[4]) # number=67
    prog.cx(input_qubit[4],input_qubit[0]) # number=68
    prog.cx(input_qubit[4],input_qubit[0]) # number=56
    prog.h(input_qubit[2]) # number=50
    prog.cz(input_qubit[4],input_qubit[2]) # number=51
    prog.h(input_qubit[2]) # number=52
    prog.h(input_qubit[2]) # number=5
    prog.h(input_qubit[3]) # number=6
    prog.h(input_qubit[4])  # number=21

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2 ** n) * pi / 4)
    for i in range(repeat):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8


        prog.h(input_qubit[0])  # number=28
        prog.cx(input_qubit[3],input_qubit[0]) # number=60
        prog.z(input_qubit[3]) # number=61
        prog.cx(input_qubit[3],input_qubit[0]) # number=62
        prog.cz(input_qubit[1],input_qubit[0])  # number=29
        prog.h(input_qubit[0])  # number=30
        prog.h(input_qubit[0])  # number=43
        prog.cz(input_qubit[1],input_qubit[0])  # number=44
        prog.h(input_qubit[0])  # number=45
        prog.cx(input_qubit[1],input_qubit[0])  # number=35
        prog.cx(input_qubit[1],input_qubit[0])  # number=38
        prog.x(input_qubit[0])  # number=39
        prog.cx(input_qubit[1],input_qubit[0])  # number=40
        prog.cx(input_qubit[1],input_qubit[0])  # number=37
        prog.h(input_qubit[0])  # number=46
        prog.cz(input_qubit[1],input_qubit[0])  # number=47
        prog.h(input_qubit[0])  # number=48
        prog.h(input_qubit[0])  # number=63
        prog.cz(input_qubit[1],input_qubit[0])  # number=64
        prog.h(input_qubit[0])  # number=65
        prog.x(input_qubit[1])  # number=10
        prog.x(input_qubit[2])  # number=11
        prog.x(input_qubit[3])  # number=12

        if n>=2:
            prog.mcu1(pi,input_qubit[1:],input_qubit[0])

        prog.x(input_qubit[0])  # number=13
        prog.cx(input_qubit[0],input_qubit[1])  # number=22
        prog.y(input_qubit[2]) # number=41
        prog.x(input_qubit[1])  # number=23
        prog.cx(input_qubit[0],input_qubit[1])  # number=24
        prog.rx(1.0398671683382215,input_qubit[2]) # number=31
        prog.x(input_qubit[2])  # number=15
        prog.x(input_qubit[3])  # number=16


        prog.h(input_qubit[0])  # number=17
        prog.h(input_qubit[1])  # number=18
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[3])  # number=20


    # circuit end

    for i in range(n):
        prog.measure(input_qubit[i], classical[i])


    return prog
예제 #22
0
def make_circuit(n: int, f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n, "qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0])  # number=3
    prog.h(input_qubit[1])  # number=4
    prog.h(input_qubit[2])  # number=5
    prog.h(input_qubit[3])  # number=6
    prog.h(input_qubit[0])  # number=38
    prog.cz(input_qubit[1], input_qubit[0])  # number=39
    prog.h(input_qubit[0])  # number=40
    prog.h(input_qubit[0])  # number=49
    prog.cz(input_qubit[1], input_qubit[0])  # number=50
    prog.h(input_qubit[0])  # number=51
    prog.cx(input_qubit[1], input_qubit[0])  # number=52
    prog.cx(input_qubit[1], input_qubit[0])  # number=56
    prog.z(input_qubit[1])  # number=57
    prog.cx(input_qubit[1], input_qubit[0])  # number=58
    prog.cx(input_qubit[1], input_qubit[0])  # number=54
    prog.cx(input_qubit[1], input_qubit[0])  # number=47
    prog.h(input_qubit[0])  # number=32
    prog.cz(input_qubit[1], input_qubit[0])  # number=33
    prog.h(input_qubit[0])  # number=34
    prog.x(input_qubit[4])  # number=48
    prog.h(input_qubit[4])  # number=21

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2**n) * pi / 4)
    for i in range(repeat):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8
        prog.cx(input_qubit[3], input_qubit[0])  # number=41
        prog.z(input_qubit[3])  # number=42
        prog.cx(input_qubit[3], input_qubit[0])  # number=43
        prog.cx(input_qubit[1], input_qubit[3])  # number=44

        prog.x(input_qubit[0])  # number=9
        prog.x(input_qubit[1])  # number=10
        prog.x(input_qubit[2])  # number=11
        prog.rx(-2.9845130209103035, input_qubit[4])  # number=55
        prog.cx(input_qubit[0], input_qubit[3])  # number=35
        prog.x(input_qubit[3])  # number=36
        prog.cx(input_qubit[0], input_qubit[3])  # number=37

        if n >= 2:
            prog.mcu1(pi, input_qubit[1:], input_qubit[0])

        prog.cx(input_qubit[1], input_qubit[0])  # number=24
        prog.x(input_qubit[0])  # number=25
        prog.cx(input_qubit[1], input_qubit[0])  # number=26
        prog.x(input_qubit[1])  # number=14
        prog.x(input_qubit[2])  # number=15
        prog.x(input_qubit[3])  # number=16

        prog.h(input_qubit[0])  # number=17
        prog.h(input_qubit[1])  # number=18
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[3])  # number=20

    prog.x(input_qubit[1])  # number=22
    prog.x(input_qubit[1])  # number=23
    # circuit end

    for i in range(n):
        prog.measure(input_qubit[i], classical[i])

    return prog
예제 #23
0
 def __init__(self, nbqbits, *args, **kwargs):
     super().__init__(nbqbits)
     self.qr = QuantumRegister(self.nbqbits, 'qr')
     self.qc = QuantumCircuit(self.qr)
예제 #24
0
def make_circuit(n: int, f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n, "qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0])  # number=3
    prog.h(input_qubit[1])  # number=4
    prog.h(input_qubit[2])  # number=5
    prog.h(input_qubit[3])  # number=6
    prog.h(input_qubit[4])  # number=21
    prog.h(input_qubit[0])  # number=43
    prog.cz(input_qubit[4], input_qubit[0])  # number=44
    prog.h(input_qubit[0])  # number=45
    prog.cx(input_qubit[4], input_qubit[0])  # number=46
    prog.cx(input_qubit[4], input_qubit[0])  # number=52
    prog.z(input_qubit[4])  # number=53
    prog.cx(input_qubit[4], input_qubit[0])  # number=54
    prog.cx(input_qubit[4], input_qubit[0])  # number=48
    prog.h(input_qubit[0])  # number=37
    prog.cz(input_qubit[4], input_qubit[0])  # number=38
    prog.h(input_qubit[0])  # number=39

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2**n) * pi / 4)
    for i in range(repeat):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.rx(-1.0430087609918113, input_qubit[4])  # number=36
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8

        prog.cx(input_qubit[1], input_qubit[0])  # number=40
        prog.x(input_qubit[0])  # number=41
        prog.h(input_qubit[0])  # number=49
        prog.cz(input_qubit[1], input_qubit[0])  # number=50
        prog.h(input_qubit[0])  # number=51
        prog.x(input_qubit[1])  # number=10
        prog.rx(-0.06597344572538572, input_qubit[3])  # number=27
        prog.cx(input_qubit[0], input_qubit[2])  # number=22
        prog.x(input_qubit[2])  # number=23
        prog.h(input_qubit[2])  # number=28
        prog.cz(input_qubit[0], input_qubit[2])  # number=29
        prog.h(input_qubit[2])  # number=30
        prog.x(input_qubit[3])  # number=12

        if n >= 2:
            prog.mcu1(pi, input_qubit[1:], input_qubit[0])

        prog.x(input_qubit[0])  # number=13
        prog.x(input_qubit[1])  # number=14
        prog.x(input_qubit[2])  # number=15
        prog.x(input_qubit[3])  # number=16
        prog.h(input_qubit[4])  # number=35

        prog.h(input_qubit[0])  # number=17
        prog.rx(2.4912829742967055, input_qubit[2])  # number=26
        prog.h(input_qubit[1])  # number=18
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[2])  # number=25
        prog.h(input_qubit[3])  # number=20

    # circuit end

    for i in range(n):
        prog.measure(input_qubit[i], classical[i])

    return prog
예제 #25
0
    def construct_circuit(self, x, parameters, q=None):
        """
        Construct the variational form, given its parameters.
        Args:
            parameters (Union(numpy.ndarray, list[Parameter], ParameterVector)): circuit parameters
            q (QuantumRegister): Quantum Register for the circuit.
        Returns:
            QuantumCircuit: a quantum circuit with given `parameters`
        Raises:
            ValueError: the number of parameters is incorrect.
        """
        if len(parameters) != self._num_parameters:
            raise ValueError('The number of parameters has to be {}'.format(
                self._num_parameters))
        print(x)

        if len(x) != 3 * self._num_dis:
            raise ValueError(
                'The length of the bitstring should be num_qubit * 3')

        if q is None:
            q = QuantumRegister(self._num_qubits, name='q')
        if self._initial_state is not None:
            circuit = self._initial_state.construct_circuit('circuit', q)
        else:
            circuit = QuantumCircuit(q)

        mapping = {
            '000': 0,
            '001': 1,
            '010': 2,
            '011': 3,
            '100': 4,
            '101': 5,
            '110': 6,
            '111': 7
        }

        # TE only discrete qubit
        for qubit in range(self._num_dis):
            st = x[qubit * 3:(qubit + 1) * 3]
            circuit.u3(parameters[qubit * 16 + 2 * mapping[st]],
                       parameters[qubit * 16 + 2 * mapping[st] + 1], 0,
                       q[qubit])

        param_idx = 16 * self._num_dis

        # Skip to varform params
        param_idx = self._pre_params

        for qubit in range(self._num_qubits):
            if not self._skip_unentangled_qubits or qubit in self._entangled_qubits:
                circuit.u3(parameters[param_idx], 0.0, 0.0, q[qubit])  # ry
                circuit.u1(parameters[param_idx + 1], q[qubit])  # rz
                param_idx += 2

        for _ in range(self._depth):
            circuit.barrier(q)
            for src, targ in self._entangler_map:
                if self._entanglement_gate == 'cz':
                    circuit.u2(0.0, np.pi, q[targ])  # h
                    circuit.cx(q[src], q[targ])
                    circuit.u2(0.0, np.pi, q[targ])  # h
                else:
                    circuit.cx(q[src], q[targ])
            circuit.barrier(q)
            for qubit in self._entangled_qubits:
                circuit.u3(parameters[param_idx], 0.0, 0.0, q[qubit])  # ry
                circuit.u1(parameters[param_idx + 1], q[qubit])  # rz
                param_idx += 2
        circuit.barrier(q)

        return circuit
예제 #26
0
    def test_mapping_correction(self):
        """Test mapping works in previous failed case.
        """
        backend = FakeRueschlikon()
        qr = QuantumRegister(name='qr', size=11)
        cr = ClassicalRegister(name='qc', size=11)
        circuit = QuantumCircuit(qr, cr)
        circuit.u3(1.564784764685993, -1.2378965763410095, 2.9746763177861713, qr[3])
        circuit.u3(1.2269835563676523, 1.1932982847014162, -1.5597357740824318, qr[5])
        circuit.cx(qr[5], qr[3])
        circuit.u1(0.856768317675967, qr[3])
        circuit.u3(-3.3911273825190915, 0.0, 0.0, qr[5])
        circuit.cx(qr[3], qr[5])
        circuit.u3(2.159209321625547, 0.0, 0.0, qr[5])
        circuit.cx(qr[5], qr[3])
        circuit.u3(0.30949966910232335, 1.1706201763833217, 1.738408691990081, qr[3])
        circuit.u3(1.9630571407274755, -0.6818742967975088, 1.8336534616728195, qr[5])
        circuit.u3(1.330181833806101, 0.6003162754946363, -3.181264980452862, qr[7])
        circuit.u3(0.4885914820775024, 3.133297443244865, -2.794457469189904, qr[8])
        circuit.cx(qr[8], qr[7])
        circuit.u1(2.2196187596178616, qr[7])
        circuit.u3(-3.152367609631023, 0.0, 0.0, qr[8])
        circuit.cx(qr[7], qr[8])
        circuit.u3(1.2646005789809263, 0.0, 0.0, qr[8])
        circuit.cx(qr[8], qr[7])
        circuit.u3(0.7517780502091939, 1.2828514296564781, 1.6781179605443775, qr[7])
        circuit.u3(0.9267400575390405, 2.0526277839695153, 2.034202361069533, qr[8])
        circuit.u3(2.550304293455634, 3.8250017126569698, -2.1351609599720054, qr[1])
        circuit.u3(0.9566260876600556, -1.1147561503064538, 2.0571590492298797, qr[4])
        circuit.cx(qr[4], qr[1])
        circuit.u1(2.1899329069137394, qr[1])
        circuit.u3(-1.8371715243173294, 0.0, 0.0, qr[4])
        circuit.cx(qr[1], qr[4])
        circuit.u3(0.4717053496327104, 0.0, 0.0, qr[4])
        circuit.cx(qr[4], qr[1])
        circuit.u3(2.3167620677708145, -1.2337330260253256, -0.5671322899563955, qr[1])
        circuit.u3(1.0468499525240678, 0.8680750644809365, -1.4083720073192485, qr[4])
        circuit.u3(2.4204244021892807, -2.211701932616922, 3.8297006565735883, qr[10])
        circuit.u3(0.36660280497727255, 3.273119149343493, -1.8003362351299388, qr[6])
        circuit.cx(qr[6], qr[10])
        circuit.u1(1.067395863586385, qr[10])
        circuit.u3(-0.7044917541291232, 0.0, 0.0, qr[6])
        circuit.cx(qr[10], qr[6])
        circuit.u3(2.1830003849921527, 0.0, 0.0, qr[6])
        circuit.cx(qr[6], qr[10])
        circuit.u3(2.1538343756723917, 2.2653381826084606, -3.550087952059485, qr[10])
        circuit.u3(1.307627685019188, -0.44686656993522567, -2.3238098554327418, qr[6])
        circuit.u3(2.2046797998462906, 0.9732961754855436, 1.8527865921467421, qr[9])
        circuit.u3(2.1665254613904126, -1.281337664694577, -1.2424905413631209, qr[0])
        circuit.cx(qr[0], qr[9])
        circuit.u1(2.6209599970201007, qr[9])
        circuit.u3(0.04680566321901303, 0.0, 0.0, qr[0])
        circuit.cx(qr[9], qr[0])
        circuit.u3(1.7728411151289603, 0.0, 0.0, qr[0])
        circuit.cx(qr[0], qr[9])
        circuit.u3(2.4866395967434443, 0.48684511243566697, -3.0069186877854728, qr[9])
        circuit.u3(1.7369112924273789, -4.239660866163805, 1.0623389015296005, qr[0])
        circuit.barrier(qr)
        circuit.measure(qr, cr)

        circuits = transpile(circuit, backend)

        self.assertIsInstance(circuits, QuantumCircuit)
예제 #27
0
from qiskit import ClassicalRegister, QuantumRegister, QuantumCircuit, execute, Aer
from qiskit import IBMQ
IBMQ.load_account()
S_simulator = Aer.backends(name='statevector_simulator')[0]
M_simulator = Aer.backends(name='qasm_simulator')[0]

q = QuantumRegister(2)
c = ClassicalRegister(2)
qc = QuantumCircuit(q, c)

qc.h(q[0])
qc.h(q[1])
qc.measure(q[0], c[0])

job = execute(qc, M_simulator, shots=1000)
result = job.result()
result.get_counts(qc)
예제 #28
0
# -*- coding: utf-8 -*-
# @Time    : 2019/1/7 9:36
# @Author  : Tan Zhijie
# @Email   : [email protected]
# @File    : testOffice01.py
# @Software: PyCharm

import numpy as np
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit import execute

# Create a Quantum Register with 3 qubits.
q = QuantumRegister(3, 'q')

# Create a Quantum Circuit acting on the q register
circ = QuantumCircuit(q)

# Add a H gate on qubit 0, putting this qubit in superposition.
circ.h(q[0])
# Add a CX (CNOT) gate on control qubit 0 and target qubit 1, putting
# the qubits in a Bell state.
circ.cx(q[0], q[1])
# Add a CX (CNOT) gate on control qubit 0 and target qubit 2, putting
# the qubits in a GHZ state.
circ.cx(q[0], q[2])

circ.draw()

# Import Aer
from qiskit import BasicAer
예제 #29
0
def cx_gate_circuits_deterministic(final_measure=True):
    """CX-gate test circuits with deterministic counts."""
    circuits = []
    qr = QuantumRegister(2)
    if final_measure:
        cr = ClassicalRegister(2)
        regs = (qr, cr)
    else:
        regs = (qr, )

    # CX01, |00> state
    circuit = QuantumCircuit(*regs)
    circuit.cx(qr[0], qr[1])
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # CX10, |00> state
    circuit = QuantumCircuit(*regs)
    circuit.cx(qr[1], qr[0])
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # CX01.(X^I), |10> state
    circuit = QuantumCircuit(*regs)
    circuit.x(qr[1])
    circuit.barrier(qr)
    circuit.cx(qr[0], qr[1])
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # CX10.(I^X), |01> state
    circuit = QuantumCircuit(*regs)
    circuit.x(qr[0])
    circuit.barrier(qr)
    circuit.cx(qr[1], qr[0])
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # CX01.(I^X), |11> state
    circuit = QuantumCircuit(*regs)
    circuit.x(qr[0])
    circuit.barrier(qr)
    circuit.cx(qr[0], qr[1])
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # CX10.(X^I), |11> state
    circuit = QuantumCircuit(*regs)
    circuit.x(qr[1])
    circuit.barrier(qr)
    circuit.cx(qr[1], qr[0])
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # CX01.(X^X), |01> state
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.barrier(qr)
    circuit.cx(qr[0], qr[1])
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # CX10.(X^X), |10> state
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.barrier(qr)
    circuit.cx(qr[1], qr[0])
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    return circuits
    def test_circuit_sampler2(self, method):
        """Test the probability gradient with the circuit sampler

        dp0/da = cos(a)sin(b) / 2
        dp1/da = - cos(a)sin(b) / 2
        dp0/db = sin(a)cos(b) / 2
        dp1/db = - sin(a)cos(b) / 2
        """

        a = Parameter("a")
        b = Parameter("b")
        params = [a, b]

        q = QuantumRegister(1)
        qc = QuantumCircuit(q)
        qc.h(q)
        qc.rz(params[0], q[0])
        qc.rx(params[1], q[0])

        op = CircuitStateFn(primitive=qc, coeff=1.0)

        shots = 8000
        if method == "fin_diff":
            np.random.seed(8)
            prob_grad = Gradient(grad_method=method,
                                 epsilon=shots**(-1 / 6.0)).convert(
                                     operator=op, params=params)
        else:
            prob_grad = Gradient(grad_method=method).convert(operator=op,
                                                             params=params)
        values_dict = [
            {
                a: [np.pi / 4],
                b: [0]
            },
            {
                params[0]: [np.pi / 4],
                params[1]: [np.pi / 4]
            },
            {
                params[0]: [np.pi / 2],
                params[1]: [np.pi]
            },
        ]
        correct_values = [
            [[0, 0], [1 / (2 * np.sqrt(2)), -1 / (2 * np.sqrt(2))]],
            [[1 / 4, -1 / 4], [1 / 4, -1 / 4]],
            [[0, 0], [-1 / 2, 1 / 2]],
        ]

        backend = BasicAer.get_backend("qasm_simulator")
        q_instance = QuantumInstance(backend=backend, shots=shots)

        for i, value_dict in enumerate(values_dict):
            sampler = CircuitSampler(backend=q_instance).convert(
                prob_grad, params=value_dict)
            result = sampler.eval()[0]
            self.assertTrue(
                np.allclose(result[0].toarray(),
                            correct_values[i][0],
                            atol=0.1))
            self.assertTrue(
                np.allclose(result[1].toarray(),
                            correct_values[i][1],
                            atol=0.1))