Ejemplo n.º 1
0
 def test_init(self, j):
     """Test {j}-qubit automatic dims."""
     dim = 2**j
     op = ScalarOp(dim)
     self.assertEqual(op.dim, (dim, dim))
     self.assertEqual(op.input_dims(), j * (2, ))
     self.assertEqual(op.output_dims(), j * (2, ))
     self.assertEqual(op.coeff, 1)
Ejemplo n.º 2
0
 def test_mul_scalar(self, coeff1, coeff2):
     """Test mul method with two ScalarOp. ({coeff1}, {coeff2})"""
     dims = (3, 2)
     op1 = ScalarOp(dims, coeff=coeff1)
     op2 = ScalarOp(dims, coeff=coeff2)
     val = op1.dot(op2)
     target = coeff1 * coeff2
     self.assertScalarOp(val, dims, target)
Ejemplo n.º 3
0
    def test_subtract(self, coeff1, coeff2):
        """Test add operation with ScalarOp. ({coeff1} - {coeff2})"""
        dims = (3, 2)
        op1 = ScalarOp(dims, coeff=coeff1)
        op2 = ScalarOp(6, coeff=coeff2)

        val = op1 - op2
        target = coeff1 - coeff2
        self.assertScalarOp(val, dims, target)
Ejemplo n.º 4
0
 def test_custom_dims(self):
     """Test custom dims."""
     dims = (2, 3, 4, 5)
     dim = np.product(dims)
     op = ScalarOp(dims)
     self.assertEqual(op.dim, (dim, dim))
     self.assertEqual(op.input_dims(), dims)
     self.assertEqual(op.output_dims(), dims)
     self.assertEqual(op.coeff, 1)
Ejemplo n.º 5
0
 def test_multiply(self, coeff1, coeff2):
     """Test scalar multiplication. ({coeff1}, {coeff2})"""
     dims = (3, 2)
     val = coeff2 * ScalarOp(dims, coeff=coeff1)
     target = coeff1 * coeff2
     self.assertScalarOp(val, dims, target)
     val = ScalarOp(dims, coeff=coeff1) * coeff2
     target = coeff2 * coeff1
     self.assertScalarOp(val, dims, target)
Ejemplo n.º 6
0
    def test_expand_scalar(self, coeff1, coeff2):
        """Test expand method with two ScalarOp ({coeff1}, {coeff2})"""
        dims1 = (3, 2)
        dims2 = (2, 4)
        op1 = ScalarOp(dims1, coeff=coeff1)
        op2 = ScalarOp(dims2, coeff=coeff2)

        val = op1.expand(op2)
        target = coeff1 * coeff2
        self.assertScalarOp(val, dims1 + dims2, target)
Ejemplo n.º 7
0
    def test_tensor_scalar(self, coeff1, coeff2):
        """Test tensor method with two ScalarOp. {coeff1}, {coeff2})"""
        dims1 = (3, 2)
        dims2 = (2, 4)
        op1 = ScalarOp(dims1, coeff=coeff1)
        op2 = ScalarOp(dims2, coeff=coeff2)

        val = op1.tensor(op2)
        target = coeff1 * coeff2
        self.assertScalarOp(val, dims2 + dims1, target)
Ejemplo n.º 8
0
    def test_add(self, coeff1, coeff2):
        """Test add operation with ScalarOp. ({coeff1} + {coeff2})"""
        # Add two ScalarOps
        dims = (3, 2)
        op1 = ScalarOp(dims, coeff=coeff1)
        op2 = ScalarOp(6, coeff=coeff2)

        val = op1 + op2
        target = coeff1 + coeff2
        self.assertScalarOp(val, dims, target)
Ejemplo n.º 9
0
    def test_compose_operator(self, coeff, label):
        """Test compose and dot methods with ScalarOp and Operator."""
        dim = 4
        iden = ScalarOp(dim, coeff=coeff)
        op = Operator.from_label(label)

        with self.subTest(msg=f"{iden}.compose(Operator({label}))"):
            val = iden.compose(op)
            target = iden.to_operator().compose(op)
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg=f"Operator({label}).compose({iden})"):
            val = op.compose(iden)
            target = op.compose(iden.to_operator())
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg=f"{iden}.dot(Operator({label}))"):
            val = iden.dot(op)
            target = iden.to_operator().dot(op)
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg=f"Operator({label}).dot({iden})"):
            val = op.dot(iden)
            target = op.dot(iden.to_operator())
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg=f"{iden} & Operator({label})"):
            val = iden & op
            target = iden.to_operator().compose(op)
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg=f"Operator({label}) & {iden}"):
            val = op & iden
            target = op.compose(iden.to_operator())
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)
Ejemplo n.º 10
0
    def test_subtract_qargs(self, coeff1, coeff2, qargs):
        """Test subtract operation with ScalarOp. ({coeff1} - {coeff2}({qargs}))"""
        # Add two ScalarOps
        full_dims = np.array([2, 3, 4])
        dims1 = tuple(full_dims.tolist())
        dims2 = tuple(full_dims[qargs].tolist())
        op1 = ScalarOp(dims1, coeff=coeff1)
        op2 = ScalarOp(dims2, coeff=coeff2)

        val = op1 - op2(qargs)
        target = coeff1 - coeff2
        self.assertScalarOp(val, dims1, target)
Ejemplo n.º 11
0
    def test_to_operator(self, dims, coeff):
        """Test to_matrix and to_operator methods (dims={dims}, coeff={coeff})"""
        dim = np.product(dims)
        iden = ScalarOp(dims, coeff=coeff)
        target = Operator(coeff * np.eye(dim),
                          input_dims=dims,
                          output_dims=dims)
        with self.subTest(msg="to_operator"):
            self.assertEqual(iden.to_operator(), target)

        with self.subTest(msg="to_matrix"):
            self.assertTrue(np.allclose(iden.to_matrix(), target.data))
Ejemplo n.º 12
0
    def test_tensor_operator(self, coeff, label):
        """Test tensor and expand methods with ScalarOp and Operator. ({coeff}, {label})"""
        dim = 3
        iden = ScalarOp(dim, coeff=coeff)
        op = Operator.from_label(label)

        with self.subTest(msg="{}.expand(Operator({}))".format(iden, label)):
            val = iden.expand(op)
            target = iden.to_operator().expand(op)
            self.assertOperator(val, (3, 2), target)

        with self.subTest(msg="Operator({}).expand({})".format(label, iden)):
            val = op.expand(iden)
            target = op.expand(iden.to_operator())
            self.assertOperator(val, (2, 3), target)

        with self.subTest(msg="{}.tensor(Operator({}))".format(iden, label)):
            val = iden.tensor(op)
            target = iden.to_operator().tensor(op)
            self.assertOperator(val, (2, 3), target)

        with self.subTest(msg="Operator({}).tensor({})".format(label, iden)):
            val = op.tensor(iden)
            target = op.tensor(iden.to_operator())
            self.assertOperator(val, (3, 2), target)
Ejemplo n.º 13
0
 def test_subtract_operator_qargs(self, coeff, qargs):
     """Test qargs subtract operation with Operator (coeff={coeff}, qargs={qargs})"""
     # Get labels for qarg addition
     part_array = np.array(['X', 'Y', 'Z'])[range(len(qargs))]
     label = ''.join(part_array)
     full_array = np.array(3 * ['I'])
     inds = [2 - i for i in reversed(qargs)]
     full_array[inds] = part_array
     full_label = ''.join(full_array)
     dims = 3 * (2, )
     val = ScalarOp(dims, coeff=coeff) - Operator.from_label(label)(qargs)
     target = (coeff * Operator.from_label(3 * 'I')) - Operator.from_label(full_label)
     self.assertOperator(val, dims, target)
Ejemplo n.º 14
0
 def test_add_operator_qargs(self, coeff, qargs):
     """Test qargs add operation with Operator (coeff={coeff}, qargs={qargs})"""
     # Get labels for qarg addition
     part_array = np.array(["X", "Y", "Z"])[range(len(qargs))]
     label = "".join(part_array)
     full_array = np.array(3 * ["I"])
     inds = [2 - i for i in reversed(qargs)]
     full_array[inds] = part_array
     full_label = "".join(full_array)
     dims = 3 * (2, )
     val = ScalarOp(dims, coeff=coeff) + Operator.from_label(label)(qargs)
     target = (coeff * Operator.from_label(
         3 * "I")) + Operator.from_label(full_label)
     self.assertOperator(val, dims, target)
Ejemplo n.º 15
0
    def test_subtract_operator(self, coeff, label):
        """Test subtract operation with Operator (coeff={coeff}, label={label})"""
        dims = (2, 2)
        iden = ScalarOp(4, coeff=coeff)
        op = Operator.from_label(label)
        with self.subTest(msg="{} - Operator({})".format(iden, label)):
            val = iden - op
            target = coeff * Operator.from_label("II") - op
            self.assertOperator(val, dims, target)

        with self.subTest(msg="Operator({}) - {}".format(label, iden)):
            val = op - iden
            target = op - coeff * Operator.from_label("II")
            self.assertOperator(val, dims, target)
Ejemplo n.º 16
0
    def test_add_operator(self, coeff, label):
        """Test add operation with Operator (coeff={coeff}, label={label})"""
        dims = (2, 2)
        iden = ScalarOp(4, coeff=coeff)
        op = Operator.from_label(label)
        with self.subTest(msg="{} + Operator({})".format(iden, label)):
            val = iden + op
            target = coeff * Operator.from_label("II") + op
            self.assertOperator(val, dims, target)

        with self.subTest(msg="Operator({}) + {}".format(label, iden)):
            val = op + iden
            target = coeff * Operator.from_label("II") + op
            self.assertOperator(val, dims, target)
Ejemplo n.º 17
0
    def test_add_operator(self, coeff, label):
        """Test add and subtract operations with Operator (coeff={coeff}, label={label})"""
        dims = (2, 2)
        iden = ScalarOp(4, coeff=coeff)
        op = Operator.from_label(label)
        with self.subTest(msg='{} + Operator({})'.format(iden, label)):
            val = iden + op
            target = coeff * Operator.from_label('II') + op
            self.assertOperator(val, dims, target)

        with self.subTest(msg='Operator({}) + {}'.format(label, iden)):
            val = op + iden
            target = coeff * Operator.from_label('II') + op
            self.assertOperator(val, dims, target)

        with self.subTest(msg='{} - Operator({})'.format(iden, label)):
            val = iden - op
            target = coeff * Operator.from_label('II') - op
            self.assertOperator(val, dims, target)

        with self.subTest(msg='Operator({}) - {}'.format(label, iden)):
            val = op - iden
            target = op - coeff * Operator.from_label('II')
            self.assertOperator(val, dims, target)
Ejemplo n.º 18
0
 def test_complex_coeff(self):
     """Test complex coeff."""
     op = ScalarOp(5, coeff=3j)
     self.assertEqual(op.coeff, 3j)
Ejemplo n.º 19
0
 def test_real_coeff(self):
     """Test real coeff."""
     op = ScalarOp(5, coeff=5.2)
     self.assertEqual(op.coeff, 5.2)
Ejemplo n.º 20
0
    def test_compose_qargs_operator(self, coeff, label):
        """Test qargs compose and dot methods with ScalarOp and Operator."""
        iden = ScalarOp((2, 2), coeff=coeff)
        op = Operator.from_label(label)

        with self.subTest(
                msg="{}.compose(Operator({}), qargs=[0])".format(iden, label)):
            val = iden.compose(op, qargs=[0])
            target = iden.to_operator().compose(op, qargs=[0])
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(
                msg="{}.compose(Operator({}), qargs=[1])".format(iden, label)):
            val = iden.compose(op, qargs=[1])
            target = iden.to_operator().compose(op, qargs=[1])
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(
                msg="{}.dot(Operator({}), qargs=[0])".format(iden, label)):
            val = iden.dot(op, qargs=[0])
            target = iden.to_operator().dot(op, qargs=[0])
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(
                msg="{}.dot(Operator({}), qargs=[1])".format(iden, label)):
            val = iden.dot(op, qargs=[1])
            target = iden.to_operator().dot(op, qargs=[1])
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg="{} & Operator({})([0])".format(iden, label)):
            val = iden & op([0])
            target = iden.to_operator().compose(op, qargs=[0])
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg="{} & Operator({})([1])".format(iden, label)):
            val = iden & op([1])
            target = iden.to_operator().compose(op, qargs=[1])
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg="{} * Operator({})([0])".format(iden, label)):
            val = iden * op([0])
            target = iden.to_operator().dot(op, qargs=[0])
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg="{} * Operator({})([1])".format(iden, label)):
            val = iden * op([1])
            target = iden.to_operator().dot(op, qargs=[1])
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)
Ejemplo n.º 21
0
    def test_compose_qargs_scalar(self, coeff1, coeff2):
        """Test qargs compose and dot methods with two ScalarOp. ({coeff1}, {coeff2})"""
        dims = (2, 3)
        op1 = ScalarOp(dims, coeff=coeff1)
        op2 = ScalarOp(2, coeff=coeff2)
        op3 = ScalarOp(3, coeff=coeff2)

        with self.subTest(msg="{}.compose({}, qargs=[0])".format(op1, op2)):
            val = op1.compose(op2, qargs=[0])
            target = coeff1 * coeff2
            self.assertScalarOp(val, dims, target)

        with self.subTest(msg="{}.compose({}, qargs=[1])".format(op1, op3)):
            val = op1.compose(op3, qargs=[1])
            target = coeff1 * coeff2
            self.assertScalarOp(val, dims, target)

        with self.subTest(msg="{}.dot({}, qargs=[0])".format(op1, op2)):
            val = op1.dot(op2, qargs=[0])
            target = coeff1 * coeff2
            self.assertTrue(isinstance(val, ScalarOp))
            self.assertEqual(val.input_dims(), dims)
            self.assertEqual(val.output_dims(), dims)
            self.assertAlmostEqual(val.coeff, target)

        with self.subTest(msg="{}.dot({}, qargs=[1])".format(op1, op3)):
            val = op1.dot(op3, qargs=[1])
            target = coeff1 * coeff2
            self.assertTrue(isinstance(val, ScalarOp))
            self.assertEqual(val.input_dims(), dims)
            self.assertEqual(val.output_dims(), dims)
            self.assertAlmostEqual(val.coeff, target)

        with self.subTest(msg="{} & {}([0])".format(op1, op2)):
            val = op1 & op2([0])
            target = coeff1 * coeff2
            self.assertTrue(isinstance(val, ScalarOp))
            self.assertEqual(val.input_dims(), dims)
            self.assertEqual(val.output_dims(), dims)
            self.assertAlmostEqual(val.coeff, target)

        with self.subTest(msg="{} & {}([1])".format(op1, op3)):
            val = op1 & op3([1])
            target = coeff1 * coeff2
            self.assertTrue(isinstance(val, ScalarOp))
            self.assertEqual(val.input_dims(), dims)
            self.assertEqual(val.output_dims(), dims)
            self.assertAlmostEqual(val.coeff, target)

        with self.subTest(msg="{} * {}([0])".format(op1, op2)):
            val = op1.dot(op2([0]))
            target = coeff1 * coeff2
            self.assertTrue(isinstance(val, ScalarOp))
            self.assertEqual(val.input_dims(), dims)
            self.assertEqual(val.output_dims(), dims)
            self.assertAlmostEqual(val.coeff, target)

        with self.subTest(msg="{} * {}([1])".format(op1, op3)):
            val = op1.dot(op3([1]))
            target = coeff1 * coeff2
            self.assertTrue(isinstance(val, ScalarOp))
            self.assertEqual(val.input_dims(), dims)
            self.assertEqual(val.output_dims(), dims)
            self.assertAlmostEqual(val.coeff, target)
Ejemplo n.º 22
0
 def test_base_operator_power_exp(self, coeff, exp):
     """Test basic class power method (** {exp}, coeff={coeff})"""
     op = ScalarOp(4, coeff=coeff).power(exp)
     target = coeff**exp
     self.assertTrue(isinstance(op, ScalarOp))
     self.assertAlmostEqual(op.coeff, target)
Ejemplo n.º 23
0
 def test_base_operator_transpose(self, coeff):
     """Test basic class transpose method (coeff={coeff})"""
     op = ScalarOp(4, coeff=coeff).transpose()
     self.assertTrue(isinstance(op, ScalarOp))
     self.assertEqual(op.coeff, coeff)
Ejemplo n.º 24
0
 def test_base_operator_power_0(self, coeff):
     """Test basic class power method (** 0, coeff={coeff})"""
     op = ScalarOp(4, coeff=coeff).power(0)
     target = 1
     self.assertTrue(isinstance(op, ScalarOp))
     self.assertAlmostEqual(op.coeff, target)
Ejemplo n.º 25
0
    def test_compose_operator(self, coeff, label):
        """Test compose and dot methods with ScalarOp and Operator."""
        dim = 4
        iden = ScalarOp(dim, coeff=coeff)
        op = Operator.from_label(label)

        with self.subTest(msg='{}.compose(Operator({}))'.format(iden, label)):
            val = iden.compose(op)
            target = iden.to_operator().compose(op)
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg='Operator({}).compose({})'.format(label, iden)):
            val = op.compose(iden)
            target = op.compose(iden.to_operator())
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg='{}.dot(Operator({}))'.format(iden, label)):
            val = iden.dot(op)
            target = iden.to_operator().dot(op)
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg='Operator({}).dot({})'.format(label, iden)):
            val = op.dot(iden)
            target = op.dot(iden.to_operator())
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg='{} @ Operator({})'.format(iden, label)):
            val = iden @ op
            target = iden.to_operator().compose(op)
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg='Operator({}) @ {}'.format(label, iden)):
            val = op @ iden
            target = op.compose(iden.to_operator())
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg='{} * Operator({})'.format(iden, label)):
            val = iden * op
            target = iden.to_operator().dot(op)
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)

        with self.subTest(msg='Operator({}) * {}'.format(label, iden)):
            val = op * iden
            target = op.dot(iden.to_operator())
            self.assertTrue(isinstance(val, Operator))
            self.assertEqual(val.input_dims(), (2, 2))
            self.assertEqual(val.output_dims(), (2, 2))
            self.assertEqual(val, target)
Ejemplo n.º 26
0
 def test_base_operator_conjugate(self, coeff):
     """Test basic class conjugate method (coeff={coeff})"""
     op = ScalarOp(4, coeff=coeff).conjugate()
     target = np.conjugate(coeff)
     self.assertTrue(isinstance(op, ScalarOp))
     self.assertEqual(op.coeff, target)
Ejemplo n.º 27
0
 def test_multiply_negate(self, coeff):
     """Test scalar multiplication. Negate. (coeff={coeff})"""
     dims = (3, 2)
     val = -ScalarOp(dims, coeff=coeff)
     target = -1 * coeff
     self.assertScalarOp(val, dims, target)