def test_multiply(self) -> None:
        dimension = 2
        identity = Unitary.identity(dimension)

        product = Unitary(dimension)
        product = product.left_multiply(UnitaryDefinitions.sigmax())
        assert product.close_to(UnitaryDefinitions.sigmax())

        product = product.right_multiply(UnitaryDefinitions.sigmay())
        assert product.close_to(UnitaryDefinitions.sigmaz())

        product = product.left_multiply(UnitaryDefinitions.sigmaz())
        assert product.close_to(identity)
    def test_inverse_fixed(self) -> None:
        dimension = 2
        operation_name = 'U'
        unitary = Unitary(dimension,
                          np.array([[np.exp(1j * np.pi / 4), 0], [0, 1j]]),
                          operation_name)
        inverse = unitary.inverse()

        assert unitary.left_multiply(inverse).close_to(np.identity(dimension))
        assert unitary.right_multiply(inverse).close_to(np.identity(dimension))

        assert inverse.get_display_name() == 'U†'
        double_inverse = inverse.inverse()
        assert double_inverse.get_display_name() == 'U'
        assert unitary.close_to(double_inverse)
    def test_default(self) -> None:
        dimension = 4
        unitary = Unitary(dimension)

        assert unitary.get_dimension() == dimension
        assert unitary.close_to(np.identity(dimension))