def test_contained_parameters(): x = Parameter('x') assert _contained_parameters(x) == {x} y = Parameter('y') assert _contained_parameters(x + y) == {x, y} assert _contained_parameters(x ** y ** sin(x * y * 4)) == {x, y}
def __init__(self, name, matrix, parameters=None): if not isinstance(name, string_types): raise TypeError("Gate name must be a string") if name in RESERVED_WORDS: raise ValueError( "Cannot use {} for a gate name since it's a reserved word". format(name)) if isinstance(matrix, list): rows = len(matrix) if not all([len(row) == rows for row in matrix]): raise ValueError("Matrix must be square.") elif isinstance(matrix, (np.ndarray, np.matrix)): rows, cols = matrix.shape if rows != cols: raise ValueError("Matrix must be square.") else: raise TypeError( "Matrix argument must be a list or NumPy array/matrix") if 0 != rows & (rows - 1): raise ValueError( "Dimension of matrix must be a power of 2, got {0}".format( rows)) self.name = name self.matrix = np.asarray(matrix) if parameters: if not isinstance(parameters, list): raise TypeError("Paramaters must be a list") expressions = [ elem for row in self.matrix for elem in row if isinstance(elem, Expression) ] used_params = { param for exp in expressions for param in _contained_parameters(exp) } if set(parameters) != used_params: raise ValueError( "Parameters list does not match parameters actually used in gate matrix:\n" "Parameters in argument: {}, Parameters in matrix: {}". format(parameters, used_params)) else: is_unitary = np.allclose(np.eye(rows), self.matrix.dot(self.matrix.T.conj())) if not is_unitary: raise ValueError("Matrix must be unitary.") self.parameters = parameters