def expand_inputs(g, n): size = g.get_size() mat = g.get_matrix() newmat = sympy.zeros((2 ** (n + size), 2 ** (n + size))) for i in range(0, 2 ** n): k = 2 ** size newmat[i*k:(i+1)*k, i*k:(i+1)*k] = mat return gate.arbitrary_gate(n + size, newmat)
def compose_gates(first, second): if first is None: return second if second is None: return first if first.get_size() != second.get_size(): return mat1 = first.get_matrix() mat2 = second.get_matrix() result = mat2 * mat1 return gate.arbitrary_gate(first.get_size(), result)
def map_inputs(g, new_size, inputs): old_size = g.get_size() if new_size > old_size: g = expand_inputs(g, new_size - old_size) for i in range(old_size, new_size): for j in range(0, new_size): if inputs.count(j) == 0: inputs.insert(0, j) elif new_size < old_size: return mat1 = permute_inputs(new_size, inputs) mat2 = mat1.inv() return gate.arbitrary_gate(new_size, mat2 * (g.get_matrix()) * mat1)