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)
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)
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
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)
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)
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)
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)
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
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
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)