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_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_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())
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 + 0.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))