def test_qpe_Xplus(self, state): """eigenproblem X, |+>""" unitary_circuit = X.to_circuit() if state == 'minus': # prepare |-> state_preparation = X.to_circuit() state_preparation.h(0) else: # prepare |+> state_preparation = H.to_circuit() phase = self.one_phase(unitary_circuit, state_preparation) if state == 'minus': self.assertEqual(phase, 0.5) else: self.assertEqual(phase, 0.0)
def test_to_matrix(self): """to matrix text""" np.testing.assert_array_equal(X.to_matrix(), Operator.from_label("X").data) np.testing.assert_array_equal(Y.to_matrix(), Operator.from_label("Y").data) np.testing.assert_array_equal(Z.to_matrix(), Operator.from_label("Z").data) op1 = Y + H np.testing.assert_array_almost_equal(op1.to_matrix(), Y.to_matrix() + H.to_matrix()) op2 = op1 * 0.5 np.testing.assert_array_almost_equal(op2.to_matrix(), op1.to_matrix() * 0.5) op3 = (4 - 0.6j) * op2 np.testing.assert_array_almost_equal(op3.to_matrix(), op2.to_matrix() * (4 - 0.6j)) op4 = op3.tensor(X) np.testing.assert_array_almost_equal( op4.to_matrix(), np.kron(op3.to_matrix(), X.to_matrix())) op5 = op4.compose(H ^ I) np.testing.assert_array_almost_equal( op5.to_matrix(), np.dot(op4.to_matrix(), (H ^ I).to_matrix())) op6 = op5 + PrimitiveOp(Operator.from_label("+r").data) np.testing.assert_array_almost_equal( op6.to_matrix(), op5.to_matrix() + Operator.from_label("+r").data) param = Parameter("α") m = np.array([[0, -1j], [1j, 0]]) op7 = MatrixOp(m, param) np.testing.assert_array_equal(op7.to_matrix(), m * param) param = Parameter("β") op8 = PauliOp(primitive=Pauli("Y"), coeff=param) np.testing.assert_array_equal(op8.to_matrix(), m * param) param = Parameter("γ") qc = QuantumCircuit(1) qc.h(0) op9 = CircuitOp(qc, coeff=param) m = np.array([[1, 1], [1, -1]]) / np.sqrt(2) np.testing.assert_array_equal(op9.to_matrix(), m * param)
def test_primitive_strings(self): """ get primitives test """ self.assertEqual(X.primitive_strings(), {'Pauli'}) gnarly_op = 3 * (H ^ I ^ Y).compose(X ^ X ^ Z).tensor(T ^ Z) + \ PrimitiveOp(Operator.from_label('+r0IX').data) self.assertEqual(gnarly_op.primitive_strings(), {'QuantumCircuit', 'Matrix'})
def test_io_consistency(self): """ consistency test """ new_op = X ^ Y ^ I label = 'XYI' # label = new_op.primitive.to_label() self.assertEqual(str(new_op.primitive), label) np.testing.assert_array_almost_equal(new_op.primitive.to_matrix(), Operator.from_label(label).data) self.assertEqual(new_op.primitive, Pauli(label)) x_mat = X.primitive.to_matrix() y_mat = Y.primitive.to_matrix() i_mat = np.eye(2, 2) np.testing.assert_array_almost_equal(new_op.primitive.to_matrix(), np.kron(np.kron(x_mat, y_mat), i_mat)) hi = np.kron(H.to_matrix(), I.to_matrix()) hi2 = Operator.from_label('HI').data hi3 = (H ^ I).to_matrix() np.testing.assert_array_almost_equal(hi, hi2) np.testing.assert_array_almost_equal(hi2, hi3) xy = np.kron(X.to_matrix(), Y.to_matrix()) xy2 = Operator.from_label('XY').data xy3 = (X ^ Y).to_matrix() np.testing.assert_array_almost_equal(xy, xy2) np.testing.assert_array_almost_equal(xy2, xy3) # Check if numpy array instantiation is the same as from Operator matrix_op = Operator.from_label('+r') np.testing.assert_array_almost_equal(PrimitiveOp(matrix_op).to_matrix(), PrimitiveOp(matrix_op.data).to_matrix()) # Ditto list of lists np.testing.assert_array_almost_equal(PrimitiveOp(matrix_op.data.tolist()).to_matrix(), PrimitiveOp(matrix_op.data).to_matrix())
def test_evals(self): """ evals test """ # TODO: Think about eval names self.assertEqual(Z.eval('0').eval('0'), 1) self.assertEqual(Z.eval('1').eval('0'), 0) self.assertEqual(Z.eval('0').eval('1'), 0) self.assertEqual(Z.eval('1').eval('1'), -1) self.assertEqual(X.eval('0').eval('0'), 0) self.assertEqual(X.eval('1').eval('0'), 1) self.assertEqual(X.eval('0').eval('1'), 1) self.assertEqual(X.eval('1').eval('1'), 0) self.assertEqual(Y.eval('0').eval('0'), 0) self.assertEqual(Y.eval('1').eval('0'), -1j) self.assertEqual(Y.eval('0').eval('1'), 1j) self.assertEqual(Y.eval('1').eval('1'), 0) with self.assertRaises(ValueError): Y.eval('11') with self.assertRaises(ValueError): (X ^ Y).eval('1111') with self.assertRaises(ValueError): Y.eval((X ^ X).to_matrix_op()) # Check that Pauli logic eval returns same as matrix logic self.assertEqual(PrimitiveOp(Z.to_matrix()).eval('0').eval('0'), 1) self.assertEqual(PrimitiveOp(Z.to_matrix()).eval('1').eval('0'), 0) self.assertEqual(PrimitiveOp(Z.to_matrix()).eval('0').eval('1'), 0) self.assertEqual(PrimitiveOp(Z.to_matrix()).eval('1').eval('1'), -1) self.assertEqual(PrimitiveOp(X.to_matrix()).eval('0').eval('0'), 0) self.assertEqual(PrimitiveOp(X.to_matrix()).eval('1').eval('0'), 1) self.assertEqual(PrimitiveOp(X.to_matrix()).eval('0').eval('1'), 1) self.assertEqual(PrimitiveOp(X.to_matrix()).eval('1').eval('1'), 0) self.assertEqual(PrimitiveOp(Y.to_matrix()).eval('0').eval('0'), 0) self.assertEqual(PrimitiveOp(Y.to_matrix()).eval('1').eval('0'), -1j) self.assertEqual(PrimitiveOp(Y.to_matrix()).eval('0').eval('1'), 1j) self.assertEqual(PrimitiveOp(Y.to_matrix()).eval('1').eval('1'), 0) pauli_op = Z ^ I ^ X ^ Y mat_op = PrimitiveOp(pauli_op.to_matrix()) full_basis = list(map(''.join, itertools.product('01', repeat=pauli_op.num_qubits))) for bstr1, bstr2 in itertools.product(full_basis, full_basis): # print('{} {} {} {}'.format(bstr1, bstr2, pauli_op.eval(bstr1, bstr2), # mat_op.eval(bstr1, bstr2))) np.testing.assert_array_almost_equal(pauli_op.eval(bstr1).eval(bstr2), mat_op.eval(bstr1).eval(bstr2)) gnarly_op = SummedOp([(H ^ I ^ Y).compose(X ^ X ^ Z).tensor(Z), PrimitiveOp(Operator.from_label('+r0I')), 3 * (X ^ CX ^ T)], coeff=3 + .2j) gnarly_mat_op = PrimitiveOp(gnarly_op.to_matrix()) full_basis = list(map(''.join, itertools.product('01', repeat=gnarly_op.num_qubits))) for bstr1, bstr2 in itertools.product(full_basis, full_basis): np.testing.assert_array_almost_equal(gnarly_op.eval(bstr1).eval(bstr2), gnarly_mat_op.eval(bstr1).eval(bstr2))
def test_check_num_iterations(self): """test check for num_iterations greater than zero""" unitary_circuit = X.to_circuit() state_preparation = None with self.assertRaises(ValueError): self.one_phase(unitary_circuit, state_preparation, num_iterations=-1)
def test_qpe_X_plus_minus(self, state_preparation, expected_phase, phase_estimator): """eigenproblem X, (|+>, |->)""" unitary_circuit = X.to_circuit() phase = self.one_phase(unitary_circuit, state_preparation, phase_estimator=phase_estimator) self.assertEqual(phase, expected_phase)
def test_primitive_strings(self): """get primitives test""" self.assertEqual(X.primitive_strings(), {"Pauli"}) gnarly_op = 3 * (H ^ I ^ Y).compose(X ^ X ^ Z).tensor(T ^ Z) + PrimitiveOp( Operator.from_label("+r0IX").data) self.assertEqual(gnarly_op.primitive_strings(), {"QuantumCircuit", "Matrix"})
def test_multi_representation_ops(self): """Test observables with mixed representations""" mixed_ops = ListOp([X.to_matrix_op(), H, H + I, X]) converted_meas = self.expect.convert(~StateFn(mixed_ops)) plus_mean = converted_meas @ Plus sampled_plus = self.sampler.convert(plus_mean) np.testing.assert_array_almost_equal(sampled_plus.eval(), [1, 0.5**0.5, (1 + 0.5**0.5), 1], decimal=1)
def test_qpe_Z1(self, backend_type): """eigenproblem Z, |1>""" backend = qiskit.BasicAer.get_backend(backend_type) unitary_circuit = Z.to_circuit() state_preparation = X.to_circuit() # prepare |1> phase = self.one_phase(unitary_circuit, state_preparation, backend=backend) self.assertEqual(phase, 0.5)
def test_evolved_op_to_instruction(self): """Test calling `to_instruction` on a plain EvolvedOp. Regression test of Qiskit/qiskit-terra#8025. """ op = EvolvedOp(0.5 * X) circuit = op.to_instruction() unitary = scipy.linalg.expm(-0.5j * X.to_matrix()) expected = UnitaryGate(unitary) self.assertEqual(circuit, expected)
def test_single_pauli_op(self): """Two eigenvalues from Pauli sum with X, Y, Z""" hamiltonian = Z state_preparation = None result = self.hamiltonian_pe(hamiltonian, state_preparation, evolution=None) eigv = result.most_likely_eigenvalue with self.subTest("First eigenvalue"): self.assertAlmostEqual(eigv, 1.0, delta=0.001) state_preparation = StateFn(X.to_circuit()) result = self.hamiltonian_pe(hamiltonian, state_preparation, bound=1.05) eigv = result.most_likely_eigenvalue with self.subTest("Second eigenvalue"): self.assertAlmostEqual(eigv, -0.98, delta=0.01)
def test_is_hermitian(self): """Test is_hermitian method.""" with self.subTest("I"): self.assertTrue(I.is_hermitian()) with self.subTest("X"): self.assertTrue(X.is_hermitian()) with self.subTest("Y"): self.assertTrue(Y.is_hermitian()) with self.subTest("Z"): self.assertTrue(Z.is_hermitian()) with self.subTest("XY"): self.assertFalse((X @ Y).is_hermitian()) with self.subTest("CX"): self.assertTrue(CX.is_hermitian()) with self.subTest("T"): self.assertFalse(T.is_hermitian())
class TestPhaseEstimation(QiskitAlgorithmsTestCase): """Evolution tests.""" # pylint: disable=invalid-name def one_phase( self, unitary_circuit, state_preparation=None, backend_type=None, phase_estimator=None, num_iterations=6, ): """Run phase estimation with operator, eigenvalue pair `unitary_circuit`, `state_preparation`. Return the estimated phase as a value in :math:`[0,1)`. """ if backend_type is None: backend_type = "qasm_simulator" backend = qiskit.BasicAer.get_backend(backend_type) qi = qiskit.utils.QuantumInstance(backend=backend, shots=10000) if phase_estimator is None: phase_estimator = IterativePhaseEstimation if phase_estimator == IterativePhaseEstimation: p_est = IterativePhaseEstimation(num_iterations=num_iterations, quantum_instance=qi) elif phase_estimator == PhaseEstimation: p_est = PhaseEstimation(num_evaluation_qubits=6, quantum_instance=qi) else: raise ValueError("Unrecognized phase_estimator") result = p_est.estimate(unitary=unitary_circuit, state_preparation=state_preparation) phase = result.phase return phase @data( (X.to_circuit(), 0.5, "statevector_simulator", IterativePhaseEstimation), (X.to_circuit(), 0.5, "qasm_simulator", IterativePhaseEstimation), (None, 0.0, "qasm_simulator", IterativePhaseEstimation), (X.to_circuit(), 0.5, "qasm_simulator", PhaseEstimation), (None, 0.0, "qasm_simulator", PhaseEstimation), (X.to_circuit(), 0.5, "statevector_simulator", PhaseEstimation), ) @unpack def test_qpe_Z(self, state_preparation, expected_phase, backend_type, phase_estimator): """eigenproblem Z, |0> and |1>""" unitary_circuit = Z.to_circuit() phase = self.one_phase( unitary_circuit, state_preparation, backend_type=backend_type, phase_estimator=phase_estimator, ) self.assertEqual(phase, expected_phase) @data( (H.to_circuit(), 0.0, IterativePhaseEstimation), ((H @ X).to_circuit(), 0.5, IterativePhaseEstimation), (H.to_circuit(), 0.0, PhaseEstimation), ((H @ X).to_circuit(), 0.5, PhaseEstimation), ) @unpack def test_qpe_X_plus_minus(self, state_preparation, expected_phase, phase_estimator): """eigenproblem X, (|+>, |->)""" unitary_circuit = X.to_circuit() phase = self.one_phase(unitary_circuit, state_preparation, phase_estimator=phase_estimator) self.assertEqual(phase, expected_phase) @data( (X.to_circuit(), 0.125, IterativePhaseEstimation), (I.to_circuit(), 0.875, IterativePhaseEstimation), (X.to_circuit(), 0.125, PhaseEstimation), (I.to_circuit(), 0.875, PhaseEstimation), ) @unpack def test_qpe_RZ(self, state_preparation, expected_phase, phase_estimator): """eigenproblem RZ, (|0>, |1>)""" alpha = np.pi / 2 unitary_circuit = QuantumCircuit(1) unitary_circuit.rz(alpha, 0) phase = self.one_phase(unitary_circuit, state_preparation, phase_estimator=phase_estimator) self.assertEqual(phase, expected_phase) def test_check_num_iterations(self): """test check for num_iterations greater than zero""" unitary_circuit = X.to_circuit() state_preparation = None with self.assertRaises(ValueError): self.one_phase(unitary_circuit, state_preparation, num_iterations=-1) def phase_estimation( self, unitary_circuit, state_preparation=None, num_evaluation_qubits=6, backend=None, construct_circuit=False, ): """Run phase estimation with operator, eigenvalue pair `unitary_circuit`, `state_preparation`. Return all results """ if backend is None: backend = qiskit.BasicAer.get_backend("statevector_simulator") qi = qiskit.utils.QuantumInstance(backend=backend, shots=10000) phase_est = PhaseEstimation( num_evaluation_qubits=num_evaluation_qubits, quantum_instance=qi) if construct_circuit: pe_circuit = phase_est.construct_circuit(unitary_circuit, state_preparation) result = phase_est.estimate_from_pe_circuit( pe_circuit, unitary_circuit.num_qubits) else: result = phase_est.estimate(unitary=unitary_circuit, state_preparation=state_preparation) return result @data(True, False) def test_qpe_Zplus(self, construct_circuit): """superposition eigenproblem Z, |+>""" unitary_circuit = Z.to_circuit() state_preparation = H.to_circuit() # prepare |+> result = self.phase_estimation( unitary_circuit, state_preparation, backend=qiskit.BasicAer.get_backend("statevector_simulator"), construct_circuit=construct_circuit, ) phases = result.filter_phases(1e-15, as_float=True) with self.subTest("test phases has correct values"): self.assertEqual(list(phases.keys()), [0.0, 0.5]) with self.subTest("test phases has correct probabilities"): np.testing.assert_allclose(list(phases.values()), [0.5, 0.5]) with self.subTest("test bitstring representation"): phases = result.filter_phases(1e-15, as_float=False) self.assertEqual(list(phases.keys()), ["000000", "100000"])