Exemple #1
0
def test_polarization_get():
    tl = Timeline()
    tl.seed(0)
    detectors = [{"efficiency": 1}] * 4
    bsm = make_bsm("bsm",
                   tl,
                   encoding_type="polarization",
                   detectors=detectors)
    parent = Parent()
    bsm.attach(parent)

    # get 2 photons in orthogonal states (map to Psi+)
    p1 = Photon("p1", location=1, quantum_state=(complex(1), complex(0)))
    p2 = Photon("p2", location=2, quantum_state=(complex(0), complex(1)))
    bsm.get(p1)
    bsm.get(p2)

    assert len(parent.results) == 1

    # get 2 photons in same state (map to Phi+ / can't measure)
    tl.time = 1e6
    p3 = Photon("p3", location=1, quantum_state=(complex(1), complex(0)))
    p4 = Photon("p4", location=2, quantum_state=(complex(1), complex(0)))
    bsm.get(p3)
    bsm.get(p4)

    assert len(parent.results) == 1
Exemple #2
0
def test_time_bin_update():
    tl = Timeline()
    tl.seed(0)
    detectors = [{}] * 2
    bsm = make_bsm("bsm", tl, encoding_type="time_bin", detectors=detectors)
    parent = Parent()
    bsm.attach(parent)
    detector_list = bsm.detectors

    # test Psi+
    bsm.trigger(detector_list[0], {'time': 0})
    bsm.trigger(detector_list[0], {'time': 0 + time_bin["bin_separation"]})

    assert len(parent.results) == 1
    assert parent.results[0] == 0

    # test Psi-
    bsm.trigger(detector_list[0], {'time': 1e6})
    bsm.trigger(detector_list[1], {'time': 1e6 + time_bin["bin_separation"]})

    assert len(parent.results) == 2
    assert parent.results[1] == 1

    # test invalid time separation
    bsm.trigger(detector_list[0], {'time': 2e6})
    bsm.trigger(detector_list[0], {'time': 2e6})

    assert len(parent.results) == 2

    bsm.trigger(detector_list[0], {'time': 3e6})
    bsm.trigger(detector_list[0], {'time': 4e6})

    assert len(parent.results) == 2
Exemple #3
0
def test_base_get():
    tl = Timeline()
    tl.seed(0)
    photon1 = Photon("", location=1)
    photon2 = Photon("", location=2)
    photon3 = Photon("", location=3)
    photon1_2 = Photon("", location=1)
    detectors = [{}] * 2
    bsm = make_bsm("bsm", tl, encoding_type="time_bin", detectors=detectors)

    bsm.get(photon1)
    assert len(bsm.photons) == 1

    # same location
    bsm.get(photon1_2)
    assert len(bsm.photons) == 1

    # different location
    bsm.get(photon2)
    assert len(bsm.photons) == 2

    # later time
    tl.time = 1
    bsm.get(photon3)
    assert len(bsm.photons) == 1
Exemple #4
0
def test_QSDetectorPolarization_update_detector_params():
    tl = Timeline()
    tl.seed(1)
    qsdetector = QSDetectorPolarization("qsd", tl)
    qsdetector.update_detector_params(0, "dark_count", 99)
    assert qsdetector.detectors[
        0].dark_count == 99 and qsdetector.detectors[1].dark_count != 99
Exemple #5
0
def test_construct_func():
    tl = Timeline()
    tl.seed(0)
    detectors2 = [{}] * 2
    detectors4 = [{}] * 4

    # unknown encoding scheme
    with pytest.raises(Exception):
        bsm = make_bsm("bsm",
                       tl,
                       encoding_type="unknown",
                       detectors=detectors4)

    # implemented encoding schemes
    polar_bsm = make_bsm("bsm",
                         tl,
                         encoding_type="polarization",
                         detectors=detectors4)
    time_bin_bsm = make_bsm("bsm",
                            tl,
                            encoding_type="time_bin",
                            detectors=detectors2)
    atom_bsm = make_bsm("bsm",
                        tl,
                        encoding_type="single_atom",
                        detectors=detectors2)

    assert type(polar_bsm) == PolarizationBSM
    assert type(time_bin_bsm) == TimeBinBSM
    assert type(atom_bsm) == SingleAtomBSM
def test_generation_expire():
    class DumbBSM():
        def __init__(self):
            pass

        def get(self, qubit):
            pass

    tl = Timeline(1e12)
    e0 = Node("e0", tl)
    e1 = Node("e1", tl)
    m0 = FakeNode("m0", tl)

    qc0 = QuantumChannel("qc_e0m0", tl, 0, 1e3)
    qc1 = QuantumChannel("qc_e1m0", tl, 0, 1e3)
    qc0.set_ends(e0, m0)
    qc1.set_ends(e1, m0)
    cc0 = ClassicalChannel("cc_e0m0", tl, 1e3, delay=1e12)
    cc1 = ClassicalChannel("cc_e1m0", tl, 1e3, delay=1e12)
    cc2 = ClassicalChannel("cc_e0e1", tl, 2e3, delay=1e9)
    cc3 = ClassicalChannel("cc_e1e0", tl, 2e3, delay=1e9)
    cc0.set_ends(e0, m0)
    cc1.set_ends(e1, m0)
    cc2.set_ends(e0, e1)
    cc3.set_ends(e1, e0)

    e0.memory_array = MemoryArray("e0mem", tl, coherence_time=1)
    e1.memory_array = MemoryArray("e1mem", tl, coherence_time=1)
    e0.memory_array.owner = e0
    e1.memory_array.owner = e1
    m0.bsm = DumbBSM()

    tl.init()

    protocol0 = EntanglementGenerationA(e0,
                                        "e0prot",
                                        middle="m0",
                                        other="e1",
                                        memory=e0.memory_array[0])
    protocol1 = EntanglementGenerationA(e1,
                                        "e1prot",
                                        middle="m0",
                                        other="e0",
                                        memory=e1.memory_array[0])
    protocol0.primary = True
    e0.protocols.append(protocol0)
    e1.protocols.append(protocol1)
    protocol0.set_others(protocol1)
    protocol1.set_others(protocol0)

    process = Process(protocol0, "start", [])
    event = Event(0, process)
    tl.schedule(event)
    process = Process(protocol1, "start", [])
    event = Event(0, process)
    tl.schedule(event)

    tl.run()

    assert e0.memory_array[0].expiration_event.time > 1e12
def test_ClassicalChannel_transmit():
    class FakeNode(Node):
        def __init__(self, name, tl, **kwargs):
            Node.__init__(self, name, tl, **kwargs)
            self.msgs = []

        def receive_message(self, src: str, msg: str):
            self.msgs.append([tl.now(), src, msg])

    tl = Timeline()
    cc = ClassicalChannel("cc", tl, 1e3)

    n1 = FakeNode('n1', tl)
    n2 = FakeNode('n2', tl)
    cc.set_ends(n1, n2)

    args = [['1-1', n1, 5], ['1-2', n1, 5]]
    results = [[cc.delay, 'n1', '1-1'], [1 + cc.delay, 'n1', '1-2']]

    for arg in args:
        cc.transmit(arg[0], arg[1], arg[2])
        tl.time += 1

    tl.run()
    assert len(n1.msgs) == 0 and len(n2.msgs) == 2
    for msg, res in zip(n2.msgs, results):
        assert msg == res
Exemple #8
0
def test_QSDetectorPolarization_update_splitter_params():
    fidelity = 0.9
    tl = Timeline()
    tl.seed(1)
    qsdetector = QSDetectorPolarization("qsd", tl)
    qsdetector.update_splitter_params("fidelity", fidelity)

    assert qsdetector.splitter.fidelity == fidelity
def test_init():
    tl = Timeline()
    dummys = [Dummy(str(i), tl) for i in range(100)]
    for d in dummys:
        assert d.flag is False

    tl.init()
    for d in dummys:
        assert d.flag is True
Exemple #10
0
def test_QSDetector_update():
    tl = Timeline()
    tl.seed(1)
    qsdetector = QSDetectorPolarization("qsd", tl)

    args = [[0, 10], [1, 20], [1, 40]]
    for arg in args:
        qsdetector.trigger(qsdetector.detectors[arg[0]], {'time': arg[1]})
        trigger_times = qsdetector.trigger_times
        assert trigger_times[arg[0]][-1] == arg[1]
Exemple #11
0
def test_QSDetectorPolarization_set_basis_list():
    tl = Timeline()
    tl.seed(1)
    qsdetector = QSDetectorPolarization("qsd", tl)
    basis_list = []
    start_time = 0
    frequency = 1e6
    qsdetector.set_basis_list(basis_list, start_time, frequency)
    assert qsdetector.splitter.basis_list == basis_list and \
           qsdetector.splitter.start_time == start_time and \
           qsdetector.splitter.frequency == frequency
Exemple #12
0
def test_MemoryWithRandomCoherenceTime__schedule_expiration():
    NUM_TRIALS = 200
    coherence_period_avg = 1
    coherence_period_stdev = 0.15
    tl = Timeline()
    mem = MemoryWithRandomCoherenceTime(
        "mem",
        tl,
        fidelity=1,
        frequency=0,
        efficiency=1,
        coherence_time=coherence_period_avg,
        coherence_time_stdev=coherence_period_stdev,
        wavelength=500)
    parent = DumbParent(mem)

    times_of_expiration_calculated = [0]
    np.random.seed(2)
    for i in range(NUM_TRIALS):
        times_of_expiration_calculated.append(
            times_of_expiration_calculated[-1] +
            int(mem.coherence_time_distribution() * 1e12))
    times_of_expiration_calculated.pop(0)

    np.random.seed(2)
    process = Process(mem, "update_state",
                      [[complex(math.sqrt(1 / 2)),
                        complex(math.sqrt(1 / 2))]])
    for i in range(NUM_TRIALS):
        event = Event(tl.now(), process)
        tl.schedule(event)
        tl.init()
        tl.run()
        assert times_of_expiration_calculated[i] == tl.now()

    period_sum = times_of_expiration_calculated[0]
    period_squared_sum = times_of_expiration_calculated[0]**2
    for i in range(1, len(times_of_expiration_calculated)):
        period = times_of_expiration_calculated[
            i] - times_of_expiration_calculated[i - 1]
        period_sum += period
        period_squared_sum += period * period

    avg_simulated = period_sum / NUM_TRIALS * 1e-12
    stdev_simulated = np.sqrt(
        (period_squared_sum - period_sum * period_sum * 1.0 / NUM_TRIALS) /
        NUM_TRIALS) * 1e-12

    #check that values in series are different
    assert stdev_simulated > 0.0
    #probability of error below is less then 0.3%
    assert abs(avg_simulated - coherence_period_avg
               ) < 3 * coherence_period_stdev / np.sqrt(NUM_TRIALS)
Exemple #13
0
def test_expire():
    tl = Timeline()
    node = FakeNode("node", tl)
    tl.init()
    for info in node.resource_manager.memory_manager:
        info.to_occupied()
    rule = Rule(0, None, None)
    for i in range(6):
        node.memory_array[i].detach(node.memory_array)
    p1 = FakeProtocol("waiting_protocol", [node.memory_array[0]])
    node.memory_array[0].attach(p1)
    p2 = FakeProtocol("pending_protocol", [node.memory_array[1]])
    node.memory_array[1].attach(p2)
    p3 = FakeProtocol("running_protocol", [node.memory_array[2]])
    node.memory_array[2].attach(p3)
    p4 = FakeProtocol("other_waiting_protocol", [node.memory_array[3]])
    node.memory_array[3].attach(p4)
    p5 = FakeProtocol("other_pending_protocol", [node.memory_array[4]])
    node.memory_array[4].attach(p5)
    p6 = FakeProtocol("other_running_protocol", [node.memory_array[5]])
    node.memory_array[5].attach(p6)
    for p in [p1, p2, p3]:
        p.rule = rule
        rule.protocols.append(p)
    node.resource_manager.rule_manager.load(rule)
    for p in [p3, p6]:
        node.protocols.append(p)
    for p in [p2, p5]:
        node.resource_manager.pending_protocols.append(p)
    for p in [p1, p4]:
        node.resource_manager.waiting_protocols.append(p)
    for i in range(6):
        assert node.resource_manager.memory_manager[i].state == "OCCUPIED"
    node.resource_manager.expire(rule)
    assert p1 not in node.resource_manager.waiting_protocols and p4 in node.resource_manager.waiting_protocols
    assert p2 not in node.resource_manager.pending_protocols
    assert p5 in node.resource_manager.pending_protocols
    assert p3 not in node.protocols and p6 in node.protocols
    for i in range(3):
        assert node.resource_manager.memory_manager[i].state == "RAW"

    for i in range(3, 6):
        assert node.resource_manager.memory_manager[i].state == "OCCUPIED"

    for i, memory in enumerate(node.memory_array):
        if i < 3:
            assert len(memory._observers) == 1 and isinstance(
                memory._observers.pop(), MemoryArray)
        elif i < 6:
            assert len(memory._observers) == 1 and isinstance(
                memory._observers.pop(), FakeProtocol)
def create_intf(quantum_state):
    class Receiver():
        def __init__(self, name, timeline):
            self.name = name
            self.timeline = timeline
            self.log = []

        def get(self):
            self.log.append(self.timeline.now())

    tl = Timeline()
    intfm = Interferometer("interferometer", tl, time_bin["bin_separation"])
    d0 = Receiver("d0", tl)
    d1 = Receiver("d1", tl)
    intfm.set_receiver(0, d0)
    intfm.set_receiver(1, d1)
    tl.init()
    for i in range(NUM_TRIALS):
        tl.time = i * 1e6
        photon = Photon(str(i), quantum_state=quantum_state)
        intfm.get(photon)
    tl.time = 0
    tl.run()

    return intfm.receivers[0].log, intfm.receivers[1].log
Exemple #15
0
def test_QuantumChannel_transmit():
    from sequence.components.photon import Photon
    random.seed(1)

    class FakeNode(Node):
        def __init__(self, name, tl):
            Node.__init__(self, name, tl)
            self.log = []

        def receive_qubit(self, src, photon):
            self.log.append((src, self.timeline.now(), photon.name))

    tl = Timeline()
    qc = QuantumChannel("qc", tl, attenuation=0.0002, distance=1e4)
    sender = FakeNode("sender", tl)
    receiver = FakeNode("receiver", tl)
    qc.set_ends(sender, receiver)
    tl.init()

    for i in range(1000):
        photon = Photon(str(i))
        qc.transmit(photon, sender)
        tl.time = tl.time + 1

    for i in range(1000):
        photon = Photon(str(i))
        qc.transmit(photon, receiver)
        tl.time = tl.time + 1

    assert len(sender.log) == len(receiver.log) == 0
    tl.run()

    expect_rate = 1 - qc.loss
    assert abs(len(sender.log) / 1000 - expect_rate) < 0.1
    assert abs(len(receiver.log) / 1000 - expect_rate) < 0.1
Exemple #16
0
def test_QSDetectorTimeBin():
    tl = Timeline()
    tl.seed(1)
    qsdetector = QSDetectorTimeBin("qsd", tl)
    [qsdetector.update_detector_params(i, "efficiency", 1) for i in range(3)]
    frequency = 1e5
    start_time = 0
    basis_list = [random.randint(2) for _ in range(1000)]
    qsdetector.set_basis_list(basis_list, start_time, frequency)

    for i in range(1000):
        tl.time = i * 1e12 / frequency
        basis = basis_list[i]
        bit = random.randint(2)
        photon = Photon(str(i),
                        encoding_type=time_bin,
                        quantum_state=time_bin["bases"][basis][bit])
        qsdetector.get(photon)

    tl.time = 0
    tl.run()

    trigger_times = qsdetector.get_photon_times()
    length = len(trigger_times[0] + trigger_times[1] + trigger_times[2])
    assert abs(length / 1000 - 7 / 8) < 0.1
Exemple #17
0
def test_RandomRequestApp_get_reserve_res():
    tl = Timeline()
    tl.time = 6
    node = FakeNode("n1", tl)
    app = RandomRequestApp(node, ["n2", "n3"], 0)
    app.cur_reserve = ["n3", 10, 20, 5, 0.9]
    reservation = Reservation("n1", "n3", 10, 20, 5, 0.9)
    for i, card in enumerate(node.network_manager.protocol_stack[1].timecards):
        if i < 20:
            card.add(reservation)

    app.request_time = 5
    app.get_reserve_res(reservation, True)
    assert app.get_wait_time()[0] == 5
    assert len(tl.events) == 41 and tl.events.data[0].time == 10

    tl = Timeline()
    tl.time = 6
    node = FakeNode("n1", tl)
    app = RandomRequestApp(node, ["n2", "n3"], 0)
    app.cur_reserve = ["n3", 10, 20, 5, 0.9]
    reservation = Reservation("n1", "n3", 10, 20, 5, 0.9)
    app.request_time = 5
    app.get_reserve_res(reservation, False)
    tl.run()
    assert len(app.get_wait_time()) == 0
    assert app.cur_reserve[0] == "n3"
    assert app.cur_reserve[1] != 10
    assert app.cur_reserve[2] != 20
    assert app.cur_reserve[3] != 5
    assert app.cur_reserve[4] == 0.9
    assert len(node.reserve_log) == 1
Exemple #18
0
def create_switch(basis_list, photons):
    class Receiver():
        def __init__(self, tl):
            self.timeline = tl
            self.log = []

        def get(self, photon=None):
            self.log.append((self.timeline.now(), photon))

    tl = Timeline()
    sw = Switch("sw", tl)
    r1 = Receiver(tl)
    r2 = Receiver(tl)
    sw.set_detector(r1)
    sw.set_interferometer(r2)
    sw.set_basis_list(basis_list, 0, FREQ)

    tl.init()
    for i, photon in enumerate(photons):
        tl.time = 1e12 / FREQ * i
        sw.get(photons[i])
    tl.time = 0
    tl.run()

    return r1.log, r2.log
Exemple #19
0
def test_BB84_time_bin():
    tl = Timeline(1e12)  # stop time is 1 s

    alice = QKDNode("alice", tl, encoding=time_bin, stack_size=1)
    bob = QKDNode("bob", tl, encoding=time_bin, stack_size=1)
    pair_bb84_protocols(alice.protocol_stack[0], bob.protocol_stack[0])

    qc = QuantumChannel("qc", tl, distance=10e3, polarization_fidelity=0.99, attenuation=0.00002)
    qc.set_ends(alice, bob)
    cc = ClassicalChannel("cc", tl, distance=10e3)
    cc.set_ends(alice, bob)

    # Parent
    pa = Parent(alice, 128, "alice")
    pb = Parent(bob, 128, "bob")
    alice.protocol_stack[0].upper_protocols.append(pa)
    pa.lower_protocols.append(alice.protocol_stack[0])
    bob.protocol_stack[0].upper_protocols.append(pb)
    pb.lower_protocols.append(bob.protocol_stack[0])

    process = Process(pa, "push", [])
    event = Event(0, process)
    tl.schedule(event)

    tl.init()
    tl.run()
    assert pa.counter == pb.counter == 10
def test_update_event_time():
    tl = Timeline()
    d1 = Dummy('1', tl)
    event1 = Event(10, Process(d1, 'click', []))
    d2 = Dummy('2', tl)
    event2 = Event(10, Process(d2, 'click', []))

    tl.schedule(event1)
    tl.schedule(event2)
    tl.init()
    assert d1.click_time is None and d2.click_time is None
    tl.update_event_time(event2, 20)
    tl.run()

    assert d1.click_time == 10 and d2.click_time == 20
Exemple #21
0
def test_RandomRequestApp_get_other_reservation():
    tl = Timeline()
    node = FakeNode("fake", tl)
    reservation = Reservation("initiator", "fake", 10, 100, 10, 0.9)
    counter = 0
    for card in node.network_manager.protocol_stack[1].timecards:
        if counter >= 10:
            break
        card.add(reservation)
        counter += 1

    app = RandomRequestApp(node, [], 0)
    app.get_other_reservation(reservation)
    assert len(app.memo_to_reserve) == 0
    tl.stop_time = 11
    tl.run()
    assert len(app.memo_to_reserve) == 10

    info = node.resource_manager.memory_manager[0]
    info.memory.entangled_memory = {"node_id": "initiator", "memo_id": "memo"}
    info.memory.fidelity = 1
    info.to_entangled()
    app.get_memory(info)
    assert info.state == "RAW" and info.memory.entangled_memory[
        "node_id"] is None

    info = node.resource_manager.memory_manager[10]
    info.memory.entangled_memory = {"node_id": "initiator", "memo_id": "memo"}
    info.memory.fidelity = 1
    info.to_entangled()
    app.get_memory(info)
    assert info.state == "ENTANGLED"

    info = node.resource_manager.memory_manager[0]
    info.memory.entangled_memory = {"node_id": "initiator", "memo_id": "memo"}
    info.memory.fidelity = 0.8
    info.to_entangled()
    app.get_memory(info)
    assert info.state == "ENTANGLED"

    info = node.resource_manager.memory_manager[1]
    info.memory.entangled_memory = {"node_id": "x", "memo_id": "memo"}
    info.memory.fidelity = 1
    info.to_entangled()
    app.get_memory(info)
    assert info.state == "ENTANGLED"

    tl.stop_time = 101
    tl.run()

    print(app.memo_to_reserve)
    assert len(app.memo_to_reserve) == 0
    info = node.resource_manager.memory_manager[0]
    info.memory.entangled_memory = {"node_id": "initiator", "memo_id": "memo"}
    info.memory.fidelity = 1
    info.to_entangled()
    app.get_memory(info)
    assert info.state == "ENTANGLED"
Exemple #22
0
def create_detector(efficiency=0.9, dark_count=0, count_rate=25e6, time_resolution=150):
    class Parent():
        def __init__(self, tl):
            self.timeline = tl
            self.log = []

        def trigger(self, detector, msg):
            self.log.append((self.timeline.now(), msg['time'], detector))

    tl = Timeline()
    tl.seed(1)
    detector = Detector("", tl, efficiency=efficiency, dark_count=dark_count,
                        count_rate=count_rate, time_resolution=time_resolution)
    parent = Parent(tl)
    detector.attach(parent)
    return detector, parent, tl
Exemple #23
0
def test_MemoryArray_init():
    tl = Timeline()
    ma = MemoryArray("ma", tl, num_memories=10)

    assert len(ma.memories) == 10
    for m in ma.memories:
        assert type(m) == Memory
Exemple #24
0
def test_RandomRequestApp_update_last_rsvp_metrics():
    tl = Timeline()
    node = QuantumRouter("n1", tl)
    app = RandomRequestApp(node, [], 0)
    app._update_last_rsvp_metrics()
    assert len(app.get_throughput()) == 0
    app.cur_reserve = ["n2", 1e13, 2e13, 5, 0.9]
    app.reserves.append(app.cur_reserve)
    app.memory_counter = 10
    tl.time = 20
    assert app.request_time == 0
    app._update_last_rsvp_metrics()
    assert len(app.get_throughput()) == 1 and app.get_throughput()[0] == 1
    assert app.cur_reserve == []
    assert app.request_time == 20
    assert app.memory_counter == 0
def test_log():
    open(filename, 'w').close()

    assert file_len(filename) == 0

    tl = Timeline()
    de = DumbEntity()

    lg.set_logger(__name__, tl, filename)
    lg.set_logger_level("DEBUG")
    lg.track_module(__name__)

    tl.init()
    de.log()

    # TODO: fix (should be 1)
    assert file_len(filename) == 2
Exemple #26
0
def test_add_node():
    tl = Timeline()
    topo = Topology("test_topo", tl)

    n1 = Node("n1", tl)
    topo.add_node(n1)
    assert len(topo.nodes) == 1
    assert topo.nodes["n1"] == n1
Exemple #27
0
def test_RandomRequestApp_get_memory():
    tl = Timeline(1)
    node = FakeNode("n1", tl)
    app = RandomRequestApp(node, ["n2", "n3"], 0)
    app.cur_reserve = ["n2", 0, 100, 2, 0.85]
    reservation = Reservation("n1", "n2", 0, 100, 2, 0.85)
    counter = 0
    for card in node.network_manager.protocol_stack[1].timecards:
        card.add(reservation)
        counter += 1
        if counter > 2:
            break
    app.get_other_reservation(reservation)

    tl.run()

    node.memory_array[0].entangled_memory["node_id"] = "n2"
    node.memory_array[0].entangled_memory["memo_id"] = "1"
    node.memory_array[0].fidelity = 0.9
    node.resource_manager.update(None, node.memory_array[0], "ENTANGLED")
    app.get_memory(node.resource_manager.memory_manager[0])
    assert node.resource_manager.memory_manager[0].state == "RAW"
    assert node.memory_array[0].entangled_memory["node_id"] == None
    assert node.memory_array[0].fidelity == 0

    node.memory_array[1].entangled_memory["node_id"] = "n3"
    node.memory_array[1].entangled_memory["memo_id"] = "1"
    node.memory_array[1].fidelity = 0.9
    node.resource_manager.update(None, node.memory_array[1], "ENTANGLED")
    app.get_memory(node.resource_manager.memory_manager[1])
    assert node.resource_manager.memory_manager[1].state == "ENTANGLED"

    node.memory_array[2].entangled_memory["node_id"] = "n2"
    node.memory_array[2].entangled_memory["memo_id"] = "1"
    node.memory_array[2].fidelity = 0.84
    node.resource_manager.update(None, node.memory_array[2], "ENTANGLED")
    app.get_memory(node.resource_manager.memory_manager[2])
    assert node.resource_manager.memory_manager[2].state == "ENTANGLED"

    node.memory_array[3].entangled_memory["node_id"] = "n2"
    node.memory_array[3].entangled_memory["memo_id"] = "1"
    node.memory_array[3].fidelity = 0.9
    node.resource_manager.update(None, node.memory_array[3], "ENTANGLED")
    app.get_memory(node.resource_manager.memory_manager[3])
    assert node.resource_manager.memory_manager[3].state == "ENTANGLED"
def create_scenario(state1, state2, seed):
    tl = Timeline()
    tl.seed(seed)
    a1 = FakeNode("a1", tl)
    a2 = FakeNode("a2", tl)
    a3 = FakeNode("a3", tl)
    cc0 = ClassicalChannel("a2-a1", tl, 0, 1e5)
    cc1 = ClassicalChannel("a2-a3", tl, 0, 1e5)
    cc0.set_ends(a2, a1)
    cc1.set_ends(a2, a3)
    tl.init()

    memo1 = Memory("a1.0", timeline=tl, fidelity=0.9, frequency=0, efficiency=1, coherence_time=1, wavelength=500)
    memo2 = Memory("a2.0", tl, 0.9, 0, 1, 1, 500)
    memo3 = Memory("a2.1", tl, 0.9, 0, 1, 1, 500)
    memo4 = Memory("a3.0", tl, 0.9, 0, 1, 1, 500)

    memo1.fidelity = memo2.fidelity = memo3.fidelity = memo4.fidelity = 1
    memo1.entangled_memory = {'node_id': 'a2', 'memo_id': memo2.name}
    memo2.entangled_memory = {'node_id': 'a1', 'memo_id': memo1.name}
    memo3.entangled_memory = {'node_id': 'a3', 'memo_id': memo4.name}
    memo4.entangled_memory = {'node_id': 'a2', 'memo_id': memo3.name}

    tl.quantum_manager.set([memo1.qstate_key, memo2.qstate_key], state1)
    tl.quantum_manager.set([memo3.qstate_key, memo4.qstate_key], state2)

    es1 = EntanglementSwappingB(a1, "a1.ESb0", memo1)
    a1.protocols.append(es1)
    es2 = EntanglementSwappingA(a2, "a2.ESa0", memo2, memo3)
    a2.protocols.append(es2)
    es3 = EntanglementSwappingB(a3, "a3.ESb1", memo4)
    a3.protocols.append(es3)

    es1.set_others(es2)
    es3.set_others(es2)
    es2.set_others(es1)
    es2.set_others(es3)

    es2.start()

    tl.run()

    ket1, ket2, ket3, ket4 = map(tl.quantum_manager.get,
                                 [memo1.qstate_key, memo2.qstate_key, memo3.qstate_key, memo4.qstate_key])

    assert id(ket1) == id(ket4)
    assert id(ket2) != id(ket3)
    assert len(ket1.keys) == 2 and memo1.qstate_key in ket1.keys and memo4.qstate_key in ket1.keys
    assert len(ket2.keys) == 1

    assert memo2.entangled_memory == memo3.entangled_memory == {'node_id': None, 'memo_id': None}
    assert memo1.entangled_memory["node_id"] == "a3" and memo4.entangled_memory["node_id"] == "a1"
    assert a1.resource_manager.log[-1] == (memo1, "ENTANGLED")
    assert a3.resource_manager.log[-1] == (memo4, "ENTANGLED")
    return ket1, ket2, ket3, ket4, a3
Exemple #29
0
def test_NetworkManager_push():
    tl = Timeline()
    node = FakeNode("node", tl)
    node.send_out = False
    assert len(node.send_log) == 0
    node.network_manager.push(dst="dst", msg="msg")
    assert len(node.send_log) == 1
    assert node.send_log[0][0] == "dst" and isinstance(node.send_log[0][1],
                                                       NetworkManagerMessage)
Exemple #30
0
def test_Memory_expire():
    class FakeProtocol(EntanglementProtocol):
        def __init__(self, name):
            super().__init__(None, name)
            self.is_expire = False

        def set_others(self, other: "EntanglementProtocol") -> None:
            pass

        def start(self) -> None:
            pass

        def is_ready(self) -> bool:
            pass

        def memory_expire(self, memory) -> None:
            self.is_expire = True

        def received_message(self, src: str, msg: "Message"):
            pass

        def expire(self, memory: Memory):
            self.memory_expire(memory)

    tl = Timeline()
    mem = Memory("mem",
                 tl,
                 fidelity=1,
                 frequency=0,
                 efficiency=1,
                 coherence_time=-1,
                 wavelength=500)
    parent = DumbParent(mem)
    protocol = FakeProtocol("upper_protocol")
    mem.attach(protocol)
    mem.update_state([math.sqrt(1 / 2), math.sqrt(1 / 2)])
    entangled_memory = {"node_id": "node", "memo_id": 0}
    mem.entangled_memory = entangled_memory

    # expire when the protocol controls memory
    mem.detach(parent)
    assert len(parent.pop_log) == 0 and protocol.is_expire is False
    mem.expire()
    assert (tl.quantum_manager.get(mem.qstate_key).state == np.array(
        [1, 0])).all  # check if collapsed to |0> state
    assert mem.entangled_memory == {"node_id": None, "memo_id": None}
    assert len(parent.pop_log) == 0 and protocol.is_expire is True

    # expire when the resource manager controls memory
    mem.attach(parent)
    mem.detach(protocol)
    mem.update_state([math.sqrt(1 / 2), math.sqrt(1 / 2)])
    entangled_memory = {"node_id": "node", "memo_id": 0}
    mem.entangled_memory = entangled_memory
    mem.expire()
    assert len(parent.pop_log) == 1