Example #1
0
    def apply_on_control(self, cqc: CQCConnection, target_cqc_name: str,
                         control: qubit):
        # Create an EPR pair
        q = cqc.createEPR(target_cqc_name)
        control.cnot(q)

        local_result = q.measure(inplace=True)
        q.reset()

        cqc.sendClassical(name=target_cqc_name, msg=local_result)

        print("\n ")
        print("Alice sent message: ", local_result)

        remote_result = binStrToInt(cqc.recvClassical())

        print("Alice received message: ", remote_result)
        if remote_result == 1:
            control.Z()
Example #2
0
def main():

    input_data = sys.argv[1:]

    # Set node numbers
    node_nr = int(input_data[0])
    tot_nr = int(input_data[1])
    next_node_nr = (node_nr + 1) % tot_nr

    # Initialize the connection
    node = CQCConnection("n" + str(node_nr))

    # Create EPR pairs with previous and next node
    if node_nr == 0:

        # start timer
        t1 = timer()

        qNext = node.createEPR("n" + str(next_node_nr))
        qPrev = node.recvEPR()
    else:
        qPrev = node.recvEPR()
        qNext = node.createEPR("n" + str(next_node_nr))

    if node_nr == 0:  # this is the first node so create qubit

        # Create a qubit to teleport
        q = qubit(node)

        # Prepare the qubit to teleport in |+>
        q.H()

        # ------
        # Qubit is created, send it to next node
        # ------

    else:  # we are node in chain so receive classical corrections

        # Receive info about corrections
        data = node.recvClassical()
        message = list(data)
        a = message[0]
        b = message[1]

        # Apply corrections
        if b == 1:
            qPrev.X()
        if a == 1:
            qPrev.Z()

            # ------
            # Qubit is receive, send it to next node
            # ------

            # Apply the local teleportation operations
    qPrev.cnot(qNext)
    qPrev.H()

    # Measure the qubits
    a = qPrev.measure()
    b = qNext.measure()
    to_print = "App {}: Measurement outcomes are: a={}, b={}".format(
        node.name, a, b)
    print("|" + "-" * (len(to_print) + 2) + "|")
    print("| " + to_print + " |")
    print("|" + "-" * (len(to_print) + 2) + "|")

    # Send corrections to next node
    node.sendClassical("n" + str(next_node_nr), [a, b])

    if node_nr == 0:  # this is first node, so receive again after qubit traversed chain

        # Receive info about corrections
        data = node.recvClassical()
        message = list(data)
        a = message[0]
        b = message[1]

        # Apply corrections
        if b == 1:
            qPrev.X()
        if a == 1:
            qPrev.Z()

            # ------
            # Qubit is receive, so measure it
            # ------

            # measure the qubit, print the outcome and record the time it took
        m = q.measure()
        t2 = timer()
        to_print = "App {}: Measurement outcome is: m={}".format(node.name, m)
        print("|" + "-" * (len(to_print) + 2) + "|")
        print("| " + to_print + " |")
        print("|" + "-" * (len(to_print) + 2) + "|")
        to_print = "App {}: Time elapsed: t={}".format(node.name, t2 - t1)
        print("|" + "-" * (len(to_print) + 2) + "|")
        print("| " + to_print + " |")
        print("|" + "-" * (len(to_print) + 2) + "|")

        with open("times_v2.txt", "a") as f:
            f.write("{}, {}\n".format(tot_nr, t2 - t1))

            # Stop the connection
    node.close()
Example #3
0
def main():

    input_data = sys.argv[1:]

    # Set node numbers
    min_tel = int(input_data[0])
    max_tel = int(input_data[1])
    number = int(input_data[2])

    # Clear file
    with open("times{}_{}_{}.txt".format(min_tel, max_tel, number), "w") as f:
        pass

        # Initialize the connection
    Alice = CQCConnection("Alice")

    times = []

    for n in range(min_tel, max_tel + 1):

        print("========")
        print(n)
        print("========")

        for _ in range(number):

            # start timer
            t1 = timer()

            # Create a qubit to teleport
            q = qubit(Alice)

            # Prepare the qubit to teleport in |+>
            q.H()

            # Start teleporting back and fourth

            for _ in range(n):
                # Make an EPR pair with next node
                qEPR = Alice.createEPR("Bob")

                # Apply the local teleportation operations
                q.cnot(qEPR)
                q.H()

                # Measure the qubits
                a = q.measure()
                b = qEPR.measure()
                to_print = "App {}: Measurement outcomes are: a={}, b={}".format(
                    Alice.name, a, b)
                print("|" + "-" * (len(to_print) + 2) + "|")
                print("| " + to_print + " |")
                print("|" + "-" * (len(to_print) + 2) + "|")

                # Send corrections to other node
                Alice.sendClassical("Bob", [a, b])
                Alice.closeClassicalChannel("Bob")

                # Make an EPR pair with other node
                q = Alice.createEPR("Bob")

                # Receive info about corrections
                data = Alice.recvClassical(timout=3600)
                Alice.closeClassicalServer()
                message = list(data)
                a = message[0]
                b = message[1]

                # Apply corrections
                if b == 1:
                    q.X()
                if a == 1:
                    q.Z()

                    # measure the qubit, print the outcome and record the time it took
            m = q.measure()
            t2 = timer()
            to_print = "App {}: Measurement outcome is: m={}".format(
                Alice.name, m)
            print("|" + "-" * (len(to_print) + 2) + "|")
            print("| " + to_print + " |")
            print("|" + "-" * (len(to_print) + 2) + "|")
            to_print = "App {}: Time elapsed: t={}".format(Alice.name, t2 - t1)
            print("|" + "-" * (len(to_print) + 2) + "|")
            print("| " + to_print + " |")
            print("|" + "-" * (len(to_print) + 2) + "|")

            times.append((n, t2 - t1))

    with open("times{}_{}_{}.txt".format(min_tel, max_tel, number), "a") as f:
        for (n, t) in times:
            f.write("{}, {}\n".format(n, t))

            # Stop the connection
    Alice.close()