コード例 #1
0
    def test_from_circuit(self):
        """Test initialization from a circuit."""
        # random unitaries
        u0 = random_unitary(2).data
        u1 = random_unitary(2).data
        # add to circuit
        qr = QuantumRegister(2)
        circ = QuantumCircuit(qr)
        circ.unitary(u0, [qr[0]])
        circ.unitary(u1, [qr[1]])

        # Test decomposition of controlled-H gate
        circuit = QuantumCircuit(2)
        circ.x(0)
        circuit.ch(0, 1)
        target = DensityMatrix.from_label("00").evolve(Operator(circuit))
        rho = DensityMatrix.from_instruction(circuit)
        self.assertEqual(rho, target)

        # Test initialize instruction
        init = Statevector([1, 0, 0, 1j]) / np.sqrt(2)
        target = DensityMatrix(init)
        circuit = QuantumCircuit(2)
        circuit.initialize(init.data, [0, 1])
        rho = DensityMatrix.from_instruction(circuit)
        self.assertEqual(rho, target)

        # Test reset instruction
        target = DensityMatrix([1, 0])
        circuit = QuantumCircuit(1)
        circuit.h(0)
        circuit.reset(0)
        rho = DensityMatrix.from_instruction(circuit)
        self.assertEqual(rho, target)
コード例 #2
0
    def test_reverse_qargs(self):
        """Test reverse_qargs method"""
        circ1 = QFT(5)
        circ2 = circ1.reverse_bits()

        state1 = DensityMatrix.from_instruction(circ1)
        state2 = DensityMatrix.from_instruction(circ2)
        self.assertEqual(state1.reverse_qargs(), state2)
コード例 #3
0
    def tomography_random_circuit(self, n):
        q = QuantumRegister(n)
        qc = QuantumCircuit(q)

        psi = ((2 * np.random.rand(2**n) - 1) + 1j *
               (2 * np.random.rand(2**n) - 1))
        psi /= np.linalg.norm(psi)

        qc.initialize(psi, q)
        rho = DensityMatrix.from_instruction(qc).data

        circ = pairwise_state_tomography_circuits(qc, q)
        job = execute(circ, Aer.get_backend("qasm_simulator"), shots=nshots)
        fitter = PairwiseStateTomographyFitter(job.result(), circ, q)
        result = fitter.fit()
        result_exp = fitter.fit(output='expectation')

        # Compare the tomography matrices with the partial trace of
        # the original state using fidelity
        for (k, v) in result.items():
            trace_qubits = list(range(n))
            trace_qubits.remove(k[0])
            trace_qubits.remove(k[1])
            rhok = partial_trace(rho, trace_qubits)
            try:
                self.check_density_matrix(v, rhok)
            except:
                print("Problem with density matrix:", k)
                raise
            try:
                self.check_pauli_expectaion(result_exp[k], rhok)
            except:
                print("Problem with expectation values:", k)
                raise
コード例 #4
0
 def test_drawings(self):
     """Test draw method"""
     qc1 = QFT(5)
     dm = DensityMatrix.from_instruction(qc1)
     with self.subTest(msg="str(density_matrix)"):
         str(dm)
     for drawtype in ["repr", "text", "latex", "latex_source", "qsphere", "hinton", "bloch"]:
         with self.subTest(msg=f"draw('{drawtype}')"):
             dm.draw(drawtype)
コード例 #5
0
 def test_drawings(self):
     """Test draw method"""
     qc1 = QFT(5)
     dm = DensityMatrix.from_instruction(qc1)
     with self.subTest(msg='str(density_matrix)'):
         str(dm)
     for drawtype in ['repr', 'text', 'latex', 'latex_source',
                      'qsphere', 'hinton', 'bloch']:
         with self.subTest(msg=f"draw('{drawtype}')"):
             dm.draw(drawtype)
コード例 #6
0
    def test_from_circuit(self):
        """Test initialization from a circuit."""
        # random unitaries
        u0 = random_unitary(2).data
        u1 = random_unitary(2).data
        # add to circuit
        qr = QuantumRegister(2)
        circ = QuantumCircuit(qr)
        circ.unitary(u0, [qr[0]])
        circ.unitary(u1, [qr[1]])
        target_vec = Statevector(np.kron(u1, u0).dot([1, 0, 0, 0]))
        target = DensityMatrix(target_vec)
        rho = DensityMatrix.from_instruction(circ)
        self.assertEqual(rho, target)

        # Test tensor product of 1-qubit gates
        circuit = QuantumCircuit(3)
        circuit.h(0)
        circuit.x(1)
        circuit.ry(np.pi / 2, 2)
        target = DensityMatrix.from_label('000').evolve(Operator(circuit))
        rho = DensityMatrix.from_instruction(circuit)
        self.assertEqual(rho, target)

        # Test decomposition of Controlled-u1 gate
        lam = np.pi / 4
        circuit = QuantumCircuit(2)
        circuit.h(0)
        circuit.h(1)
        circuit.cu1(lam, 0, 1)
        target = DensityMatrix.from_label('00').evolve(Operator(circuit))
        rho = DensityMatrix.from_instruction(circuit)
        self.assertEqual(rho, target)

        # Test decomposition of controlled-H gate
        circuit = QuantumCircuit(2)
        circ.x(0)
        circuit.ch(0, 1)
        target = DensityMatrix.from_label('00').evolve(Operator(circuit))
        rho = DensityMatrix.from_instruction(circuit)
        self.assertEqual(rho, target)
コード例 #7
0
 def test_from_circuit(self):
     """Test initialization from a circuit."""
     # random unitaries
     u0 = random_unitary(2).data
     u1 = random_unitary(2).data
     # add to circuit
     qr = QuantumRegister(2)
     circ = QuantumCircuit(qr)
     circ.unitary(u0, [qr[0]])
     circ.unitary(u1, [qr[1]])
     target_vec = Statevector(np.kron(u1, u0).dot([1, 0, 0, 0]))
     target = DensityMatrix(target_vec)
     rho = DensityMatrix.from_instruction(circ)
     self.assertEqual(rho, target)
コード例 #8
0
    def test_meas_qubit_specification(self):
        n = 4

        q = QuantumRegister(n)
        qc = QuantumCircuit(q)

        psi = ((2 * np.random.rand(2**n) - 1) + 1j *
               (2 * np.random.rand(2**n) - 1))
        psi /= np.linalg.norm(psi)

        qc.initialize(psi, q)
        rho = DensityMatrix.from_instruction(qc).data

        measured_qubits = [q[0], q[2], q[3]]
        circ = pairwise_state_tomography_circuits(qc, measured_qubits)
        job = execute(circ, Aer.get_backend("qasm_simulator"), shots=nshots)
        fitter = PairwiseStateTomographyFitter(job.result(), circ,
                                               measured_qubits)
        result = fitter.fit()
        result_exp = fitter.fit(output='expectation')

        # Compare the tomography matrices with the partial trace of
        # the original state using fidelity
        for (k, v) in result.items():
            #TODO: This method won't work if measured_qubits is not ordered in
            # wrt the DensityMatrix object.
            trace_qubits = list(range(n))
            trace_qubits.remove(measured_qubits[k[0]].index)
            trace_qubits.remove(measured_qubits[k[1]].index)
            rhok = partial_trace(rho, trace_qubits)
            try:
                self.check_density_matrix(v, rhok)
            except:
                print("Problem with density matrix:", k)
                raise
            try:
                self.check_pauli_expectaion(result_exp[k], rhok)
            except:
                print("Problem with expectation values:", k)
                raise
コード例 #9
0
    def test_multiple_registers(self):
        n = 4

        q = QuantumRegister(n / 2)
        p = QuantumRegister(n / 2)

        qc = QuantumCircuit(q, p)

        qc.h(q[0])
        qc.rx(np.pi / 4, q[1])
        qc.cx(q[0], p[0])
        qc.cx(q[1], p[1])

        rho = DensityMatrix.from_instruction(qc).data

        measured_qubits = q  #[q[0], q[1], q[2]]
        circ = pairwise_state_tomography_circuits(qc, measured_qubits)
        job = execute(circ, Aer.get_backend("qasm_simulator"), shots=nshots)
        fitter = PairwiseStateTomographyFitter(job.result(), circ,
                                               measured_qubits)
        result = fitter.fit()
        result_exp = fitter.fit(output='expectation')

        # Compare the tomography matrices with the partial trace of
        # the original state using fidelity
        for (k, v) in result.items():
            trace_qubits = list(range(n))
            trace_qubits.remove(measured_qubits[k[0]].index)
            trace_qubits.remove(measured_qubits[k[1]].index)
            rhok = partial_trace(rho, trace_qubits)
            try:
                self.check_density_matrix(v, rhok)
            except:
                print("Problem with density matrix:", k)
                raise
            try:
                self.check_pauli_expectaion(result_exp[k], rhok)
            except:
                print("Problem with expectation values:", k)
                raise
コード例 #10
0
 def test_from_instruction(self):
     """Test initialization from an instruction."""
     target_vec = Statevector(np.dot(HGate().to_matrix(), [1, 0]))
     target = DensityMatrix(target_vec)
     rho = DensityMatrix.from_instruction(HGate())
     self.assertEqual(rho, target)