def writeAsm(id, dic, fileName, reset=True, compress=False):

        Debug.debug("id:" + str(id), DebugLevel.Function)

        path = WriterAsm.getPath(id, dic)

        Debug.debug("path:" + str(path), DebugLevel.Debug)

        if reset:
            file = open(fileName, "w")
        else:
            file = open(fileName, "a")

        if not compress:
            file.write(
                Assembler.comment("Assembler file: " + fileName + " to id: " +
                                  str(id)))
        file.write(Assembler.iniAsm(nQubits=dic.getNQubits()))

        for i in path:
            file.write(dic.getGate(i).getAsm(compress))

        file.write(Assembler.finAsm(nQubits=dic.getNQubits()))

        file.close()

        return len(path)
    def getLimitedPath(id, dic, deepEnd=True, deep=0, autoReference=False):
        Debug.debug(
            "id:" + str(id) + " deep:" + str(deep) + " autoReference:" +
            str(autoReference), DebugLevel.Function)

        if deepEnd and deep == 0:
            if autoReference:
                return [(GateDominio.Open, id), (GateDominio.Close, id)]
            else:
                return [id]

        path = dic.getGate(id).getPath()
        if path is []:
            if autoReference:
                return [(GateDominio.Open, id), (GateDominio.Close, id)]
            else:
                return [id]

        res = []
        if autoReference:
            res.append((GateDominio.Open, id))

        for i in path:
            res += Visualizer.getLimitedPath(i, dic, deepEnd, deep - 1,
                                             autoReference)

        if autoReference:
            res.append((GateDominio.Close, id))

        return res
    def round(npObject, decimals=None):
        Debug.debug(str(npObject) + " ; " + str(decimals), DebugLevel.Function)

        if decimals is not None:
            return np.round(npObject, decimals=decimals)
        else:
            return npObject
Example #4
0
def probeAll(filename, nQubits, index, viewMatrix, compress):
    Debug.debug(
        filename + " ; " + str(nQubits) + " ; " + str(index) + " ; " +
        str(viewMatrix), DebugLevel.Function)

    array = [0, 0, 0]

    for i in range(index + 1):
        print(Colors.BOLD.value +
              "\n\n******************************************\n TEST " +
              str(i) + "\n" + Colors.ENDC.value)
        array[probeMatrix(filename, nQubits, i, viewMatrix, compress)] += 1
        print(Colors.BOLD.value +
              "\n\n******************************************\n END TEST " +
              str(i) + "\n\n" + Colors.ENDC.value)

    print(Colors.BOLD.value +
          "\n\n******************************************\n ALL TEST UNDER " +
          str(index) + "\n" + Colors.ENDC.value)
    print(Colors.GREEN.value + " EQUAL:" + str(array[0]) + "\n" +
          Colors.ENDC.value)
    print(Colors.BLUE.value + " CLOSE:" + str(array[1]) + "\n" +
          Colors.ENDC.value)
    print(Colors.RED.value + " ERROR:" + str(array[2]) + "\n" +
          Colors.ENDC.value)
    print(Colors.BOLD.value +
          "******************************************\n END ALL TEST\n\n" +
          Colors.ENDC.value)
Example #5
0
def generateMatrix(filename, nQubits, index, compress):
    Debug.debug(filename + " ; " + str(nQubits) + " ; " + str(index),
                DebugLevel.Function)

    # inicializa un diccionario para 4 qubits
    dic = DictionarySearcher(nQubits=nQubits)

    # genera una puerta de giro condicionado multiple y las subpuertas necesarias
    #id = AQP.generateMultipleTurn(sources=[0,1,2], target=3, angle=math.pi, turnType=TurnType.Z, dic=dic)
    gate = generateGate(index, nQubits, dic)

    if isinstance(gate, tuple):
        matrix = gate[1]
        gateId = gate[0]
    else:
        gateId = gate

    # genera el fichero .qasm para crear esta puerta
    numberGates = WriterAsm.writeAsm(gateId,
                                     dic,
                                     filename,
                                     reset=True,
                                     compress=compress)

    print(Colors.BOLD.value + "\nAssembler written with " + str(numberGates) +
          " gates\n" + Colors.ENDC.value)

    if gate is tuple:
        return matrix
    else:
        return dic.getGate(gateId).getMatrix()

    return dic.getGate(gateId).getMatrix()
 def getId(self, gateType, params):
     Debug.debug("gateType:" + str(gateType) + " params" + str(params),
                 DebugLevel.Function)
     if gateType in self.stDic.keys():
         return GateDictionary.getIdRecursive(self.stDic[gateType], params)
     else:
         return NO_ID
    def codingQubits(qubits):
        Debug.debug(qubits, DebugLevel.Function)

        code = 0
        for i in qubits:
            code += 2**i

        return code
    def getOracleMatrix(nQubits, targets):
        Debug.debug("nQubits:" + str(nQubits) + " targets:" + str(targets),
                    DebugLevel.Function)

        matrix = np.eye(2**nQubits, dtype=complex)
        for i in targets:
            matrix[i][i] = -1
        return matrix
Example #9
0
def generateGate(index, nQubits, dic):
    Debug.debug(str(index) + " ; " + str(nQubits), DebugLevel.Function)

    array = []
    for i in range(nQubits):
        array.append(i)

    if index == 0:
        return AQP.generateBasic(standarGate=StandarGate.X,
                                 targets=array,
                                 dic=dic)

    elif index == 1:
        return AQP.generateXnot(source=0, target=nQubits - 1, dic=dic)

    elif index == 2:
        return AQP.generateBasicTurn(target=nQubits - 1,
                                     angle=math.pi / 2,
                                     turnType=TurnType.X,
                                     dic=dic)

    elif index == 3:
        return AQP.generateCondTurn(turnType=TurnType.X,
                                    target=nQubits - 1,
                                    source=nQubits - 2,
                                    angle=math.pi / 2,
                                    dic=dic)

    elif index == 4:
        return AQP.generateMultipleTurn(turnType=TurnType.X,
                                        target=nQubits - 1,
                                        sources=array[:-1],
                                        angle=math.pi / 2,
                                        dic=dic)

    elif index == 5:
        return AQP.generateToffoli(target=nQubits - 1,
                                   sources=array[:-1],
                                   dic=dic)

    elif index == 6:
        return AQP.generateSpecialTurn(a=1j, b=-1, dic=dic)

    elif index == 7:
        return AQP.generateRowReverse(target1=1,
                                      target2=2**nQubits - 2,
                                      dic=dic)

    elif index == 8:
        matrix = QuantumMath.getOracleMatrix(
            nQubits=nQubits, targets=[0, nQubits, 2**nQubits - 1])
        return (AQP.generateSpecial(name="oracle", matrix=matrix,
                                    dic=dic), matrix)

    elif index == 9:
        matrix = QuantumMath.getAmplitudAmplifier(nQubits=nQubits)
        return (AQP.generateSpecial(name="aa", matrix=matrix, dic=dic), matrix)
    def getPath(id, dic):
        Debug.debug("id:" + str(id), DebugLevel.Function)

        path = dic.getGate(id).getPath()
        if not path:
            return [id]

        res = []

        for i in path:
            res += WriterAsm.getPath(i, dic)

        return res
Example #11
0
def generateGate(index, rowReverse, nQubits, dic):
    Debug.debug(str(index) + " ; " + str(nQubits), DebugLevel.Function)

    if rowReverse:
        return AQP.generateRowReverse(target1=0, target2=index, dic=dic)

    else:
        matrix = QuantumMath.getOracleMatrix(nQubits=nQubits, targets=[]) #generate a diagonal matrix
        matrix[0,0] = 1/math.sqrt(2)
        matrix[0,index] = 1/math.sqrt(2)
        matrix[index,0] = 1/math.sqrt(2)
        matrix[index,index] = -1/math.sqrt(2)
        return AQP.generateSpecial(name="2superpoitionGate", matrix=matrix, dic=dic)
 def addGate(self, gate, gateType, params):
     idExist = self.getId(gateType, params)
     if idExist != NO_ID:
         return idExist
     else:
         Debug.debug(
             "Adding gate [" + str(self.idActual) + "]<" +
             str(gateType.name) + ">: " + str(params), DebugLevel.Debug)
         gate.setId(self.idActual)
         self.idDic[self.idActual] = gate
         GateDictionary.addGateRecursive(self.idActual, self.stDic,
                                         [gateType] + params)
         self.idActual += 1
         return self.idActual - 1
    def toBinary(number, digits):
        Debug.debug("number:" + str(number) + " digits:" + str(digits),
                    DebugLevel.Function)

        binary = []
        for i in range(digits):
            if number % 2 == 0:
                binary.append(0)
            else:
                binary.append(1)
            number //= 2

        binary.reverse()
        return binary
    def decodingQubits(code):
        Debug.debug(code, DebugLevel.Function)

        ind = 0
        qubits = []

        while code > 0:

            if code % 2 == 1:
                qubits.append(ind)

            code //= 2
            ind += 1

        return qubits
    def printPath(id, dic, deepEnd=True, deep=0, printGate=False):
        Debug.debug(
            "id:" + str(id) + " dic:" + str(dic) + " deepEnd:" + str(deepEnd) +
            " deep:" + str(deep), DebugLevel.Function)

        if deepEnd and deep < 0:
            return ""

        if printGate:
            st = "[" + str(dic.getGate(id)) + ": "
        else:
            st = "[" + str(id) + ": "

        for i in dic.getGate(id).getPath():
            st += Visualizer.printPath(id=i,
                                       dic=dic,
                                       deepEnd=deepEnd,
                                       deep=deep - 1)

        return st + " ]"
Example #16
0
        plt.xticks(_keys, keys) # set labels manually

        plt.show()

    except QISKitError as ex:

        print ("EXCEPCION Error = {}".format(ex))



if __name__ == "__main__":

    np.set_printoptions(precision=2, linewidth=200, suppress=True)

    Debug.startDebug(fileOutputLevel=DebugLevel.Nothing, stdOutputLevel=DebugLevel.Nothing, autoDebugLevel=True, autoTime=True)
    
    if "-h" in sys.argv[1:] or "--help" in sys.argv[1:]:
        print("This script execute QCMD to get a determined circuit, execute this circuit in a QISKit simulator and then compares these results with an execution in a real quantum computer IBM-Q of 5 qubits.")
        print(" Every argument is OPTIONAL and they do not need to be sorted. [-m and -r] should not be active together ")
        print("-n <qubits> : number of qubits (over 3 qubits the result are almost random) -> default = 2")
        print("-f <filename> : filename where the qasm will be generated -> default = 'prueba.qasm'")
        print("-s <shots> : number of shots to execute in the computer -> default = 1000")
        print("[-m or -r] <index> -> default = -r 1")
        print("-m <index>: active: generate a matrix of superposition of two states 0 and i")
        print("-r <index>: genererate a row reverse matrix fomr 0 to i")
        print("-v : active to view the matrix generated")
        print("-c : active to write the qasm in a compress way (compress the out file, not the number of gates)")
        quit()

    if not "-f" in sys.argv[1:]:
 def matrixDot(matrixArray):
     Debug.debug(matrixArray, DebugLevel.Function)
     m = matrixArray[0]
     for i in matrixArray[1:]:
         m = np.dot(m, i)
     return m
 def tensorDot(matrixArray):
     Debug.debug(matrixArray, DebugLevel.Function)
     m = matrixArray[0]
     for i in matrixArray[1:]:
         m = np.kron(m, i)
     return m
    def printCompress(id,
                      dic,
                      deepEnd=True,
                      deep=0,
                      autoReference=False,
                      interLineSpace=False,
                      typed=True):
        Debug.debug(
            "id:" + str(id) + " dic:" + str(dic) + " deepEnd:" + str(deepEnd) +
            " deep:" + str(deep) + " autoReference:" + str(autoReference) +
            " interLineSpace:" + str(interLineSpace) + " typed:" + str(typed),
            DebugLevel.Function)

        nq = dic.getNQubits()
        nSt = []

        for i in range(nq):
            nSt.append("")

        path = Visualizer.getLimitedPath(id, dic, deepEnd, deep, autoReference)

        Debug.debug("path:" + str(path), DebugLevel.Debug)

        for i in path:

            #autoref close
            if autoReference and isinstance(
                    i, (tuple, )) and i[0] == GateDominio.Close:

                stAux = str(i[1])

                nSt[0] += " " + stAux + ")"
                for j in range(nq - 1):
                    for k in range(len(stAux) + 2):
                        nSt[j + 1] += "-"

                continue

            #initial chain
            for j in range(nq):
                nSt[j] += "-"

            #autoref open
            if autoReference and isinstance(
                    i, (tuple, )) and i[0] == GateDominio.Open:

                stAux = str(i[1])

                nSt[0] += "(" + stAux + " "
                for j in range(nq - 1):
                    for k in range(len(stAux) + 2):
                        nSt[j + 1] += "-"

                i = i[1]

            #string
            if typed:
                maxS, l = dic.getGate(i).getStringTypedPerQubit()

                Debug.debug("maxS:" + str(maxS) + " l:" + str(l),
                            DebugLevel.Debug)

                maxS += 2

                for j, value in enumerate(l):
                    type = value[0]

                    if type is QubitStringType.Empty:
                        for k in range(maxS):
                            nSt[j] += "-"

                    elif type is QubitStringType.Source:
                        for k in range((maxS - 1) // 2):
                            nSt[j] += "-"
                        nSt[j] += "O"
                        for k in range((maxS) // 2):
                            nSt[j] += "-"

                    elif type is QubitStringType.Target:
                        nSt[j] += "[" + value[1] + "]"

            else:
                for j, value in enumerate(dic.getGate(i).getStringPerQubit()):
                    nSt[j] += value

            #final chain
            for j in range(nq):
                nSt[j] += "-"

        st = "\n"
        for i in nSt:
            st += i
            if interLineSpace:
                st += "\n"
            st += "\n"

        return st
 def getGate(self, id):
     Debug.debug(id, DebugLevel.Function)
     return self.idDic[id]