def test_compose_front_inplace(self):
        """Test inplace front compose method."""
        matX = np.array([[0, 1], [1, 0]], dtype=complex)
        matY = np.array([[0, -1j], [1j, 0]], dtype=complex)

        matYX = np.dot(matY, matX)
        chan = UnitaryChannel(matY)
        chan.compose(UnitaryChannel(matX), inplace=True, front=True)
        self.assertEqual(chan, UnitaryChannel(matYX))

        matXY = np.dot(matX, matY)
        chan = UnitaryChannel(matX)
        chan.compose(UnitaryChannel(matY), inplace=True, front=True)
        self.assertEqual(chan, UnitaryChannel(matXY))
    def test_compose(self):
        """Test compose method."""
        matX = np.array([[0, 1], [1, 0]], dtype=complex)
        matY = np.array([[0, -1j], [1j, 0]], dtype=complex)

        chan1 = UnitaryChannel(matX)
        chan2 = UnitaryChannel(matY)

        targ = UnitaryChannel(np.dot(matY, matX))
        self.assertEqual(chan1.compose(chan2), targ)
        self.assertEqual(chan1 @ chan2, targ)

        targ = UnitaryChannel(np.dot(matX, matY))
        self.assertEqual(chan2.compose(chan1), targ)
        self.assertEqual(chan2 @ chan1, targ)
    def test_compose_inplace(self):
        """Test inplace compose method."""
        matX = np.array([[0, 1], [1, 0]], dtype=complex)
        matY = np.array([[0, -1j], [1j, 0]], dtype=complex)

        targ = UnitaryChannel(np.dot(matY, matX))
        chan1 = UnitaryChannel(matX)
        chan2 = UnitaryChannel(matY)
        chan1.compose(chan2, inplace=True)
        self.assertEqual(chan1, targ)
        chan1 = UnitaryChannel(matX)
        chan2 = UnitaryChannel(matY)
        chan1 @= chan2
        self.assertEqual(chan1, targ)

        targ = UnitaryChannel(np.dot(matX, matY))
        chan1 = UnitaryChannel(matX)
        chan2 = UnitaryChannel(matY)
        chan2.compose(chan1, inplace=True)
        self.assertEqual(chan2, targ)
        chan1 = UnitaryChannel(matX)
        chan2 = UnitaryChannel(matY)
        chan2 @= chan1
        self.assertEqual(chan2, targ)