예제 #1
0
    def test_dot(self):
        """Test dot method."""
        # UnitaryChannel evolution
        chan1 = SuperOp(self.sopX)
        chan2 = SuperOp(self.sopY)
        targ = SuperOp(self.sopZ)
        self.assertEqual(chan1.dot(chan2), targ)
        self.assertEqual(chan1 * chan2, targ)

        # 50% depolarizing channel
        chan1 = SuperOp(self.depol_sop(0.5))
        targ = SuperOp(self.depol_sop(0.75))
        self.assertEqual(chan1.dot(chan1), targ)
        self.assertEqual(chan1 * chan1, targ)

        # Random superoperator
        mat1 = self.rand_matrix(4, 4)
        mat2 = self.rand_matrix(4, 4)
        chan1 = SuperOp(mat1)
        chan2 = SuperOp(mat2)
        targ = SuperOp(np.dot(mat2, mat1))
        self.assertEqual(chan2.dot(chan1), targ)
        self.assertEqual(chan2 * chan1, targ)
        targ = SuperOp(np.dot(mat1, mat2))
        self.assertEqual(chan1 * chan2, targ)

        # Compose different dimensions
        chan1 = SuperOp(self.rand_matrix(16, 4))
        chan2 = SuperOp(self.rand_matrix(4, 16))
        chan = chan1.dot(chan2)
        self.assertEqual(chan.dim, (4, 4))
        chan = chan2.dot(chan1)
        self.assertEqual(chan.dim, (2, 2))
예제 #2
0
    def test_dot_subsystem(self):
        """Test subsystem dot method."""
        # 3-qubit operator
        mat = self.rand_matrix(64, 64)
        mat_a = self.rand_matrix(4, 4)
        mat_b = self.rand_matrix(4, 4)
        mat_c = self.rand_matrix(4, 4)
        iden = SuperOp(np.eye(4))
        op = SuperOp(mat)
        op1 = SuperOp(mat_a)
        op2 = SuperOp(mat_b).tensor(SuperOp(mat_a))
        op3 = SuperOp(mat_c).tensor(SuperOp(mat_b)).tensor(SuperOp(mat_a))

        # op3 qargs=[0, 1, 2]
        full_op = SuperOp(mat_c).tensor(SuperOp(mat_b)).tensor(SuperOp(mat_a))
        targ = np.dot(mat, full_op.data)
        self.assertEqual(op.dot(op3, qargs=[0, 1, 2]), SuperOp(targ))
        self.assertEqual(op * op3([0, 1, 2]), SuperOp(targ))
        # op3 qargs=[2, 1, 0]
        full_op = SuperOp(mat_a).tensor(SuperOp(mat_b)).tensor(SuperOp(mat_c))
        targ = np.dot(mat, full_op.data)
        self.assertEqual(op.dot(op3, qargs=[2, 1, 0]), SuperOp(targ))
        self.assertEqual(op * op3([2, 1, 0]), SuperOp(targ))

        # op2 qargs=[0, 1]
        full_op = iden.tensor(SuperOp(mat_b)).tensor(SuperOp(mat_a))
        targ = np.dot(mat, full_op.data)
        self.assertEqual(op.dot(op2, qargs=[0, 1]), SuperOp(targ))
        self.assertEqual(op * op2([0, 1]), SuperOp(targ))
        # op2 qargs=[2, 0]
        full_op = SuperOp(mat_a).tensor(iden).tensor(SuperOp(mat_b))
        targ = np.dot(mat, full_op.data)
        self.assertEqual(op.dot(op2, qargs=[2, 0]), SuperOp(targ))
        self.assertEqual(op * op2([2, 0]), SuperOp(targ))

        # op1 qargs=[0]
        full_op = iden.tensor(iden).tensor(SuperOp(mat_a))
        targ = np.dot(mat, full_op.data)
        self.assertEqual(op.dot(op1, qargs=[0]), SuperOp(targ))
        self.assertEqual(op * op1([0]), SuperOp(targ))
        # op1 qargs=[1]
        full_op = iden.tensor(SuperOp(mat_a)).tensor(iden)
        targ = np.dot(mat, full_op.data)
        self.assertEqual(op.dot(op1, qargs=[1]), SuperOp(targ))
        self.assertEqual(op * op1([1]), SuperOp(targ))

        # op1 qargs=[2]
        full_op = SuperOp(mat_a).tensor(iden).tensor(iden)
        targ = np.dot(mat, full_op.data)
        self.assertEqual(op.dot(op1, qargs=[2]), SuperOp(targ))
        self.assertEqual(op * op1([2]), SuperOp(targ))