Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)