Example #1
0
def test_main_engine_init_failure():
    with pytest.raises(_main.UnsupportedEngineError):
        eng = _main.MainEngine(backend=DummyEngine)
    with pytest.raises(_main.UnsupportedEngineError):
        eng = _main.MainEngine(engine_list=DummyEngine)
    with pytest.raises(_main.UnsupportedEngineError):
        eng = _main.MainEngine(engine_list=[DummyEngine(), DummyEngine])
    with pytest.raises(_main.UnsupportedEngineError):
        engine = DummyEngine()
        eng = _main.MainEngine(backend=engine, engine_list=[engine])
Example #2
0
def test_exceptions_are_forwarded():
    class ErrorEngine(DummyEngine):
        def receive(self, command_list):
            raise TypeError

    eng = _main.MainEngine(backend=ErrorEngine(), engine_list=[])
    with pytest.raises(TypeError):
        eng.allocate_qubit()
    eng2 = _main.MainEngine(backend=ErrorEngine(),
                            engine_list=[],
                            verbose=True)
    with pytest.raises(TypeError):
        eng2.allocate_qubit()
Example #3
0
def test_main_engine_init_mapper():
    class LinearMapper(BasicMapperEngine):
        pass

    mapper1 = LinearMapper()
    mapper2 = BasicMapperEngine()
    engine_list1 = [mapper1]
    eng1 = _main.MainEngine(engine_list=engine_list1)
    assert eng1.mapper == mapper1
    engine_list2 = [mapper2]
    eng2 = _main.MainEngine(engine_list=engine_list2)
    assert eng2.mapper == mapper2
    engine_list3 = [mapper1, mapper2]
    with pytest.raises(_main.UnsupportedEngineError):
        _main.MainEngine(engine_list=engine_list3)
Example #4
0
def test_main_engine_too_many_compiler_engines():
    old = _main._N_ENGINES_THRESHOLD
    _main._N_ENGINES_THRESHOLD = 3

    _main.MainEngine(backend=DummyEngine(),
                     engine_list=[DummyEngine(), DummyEngine()])

    with pytest.raises(ValueError):
        _main.MainEngine(
            backend=DummyEngine(),
            engine_list=[DummyEngine(),
                         DummyEngine(),
                         DummyEngine()])

    _main._N_ENGINES_THRESHOLD = old
Example #5
0
def test_main_engine_get_qubit_id():
    # Test that ids are not identical
    eng = _main.MainEngine()
    ids = []
    for _ in range(10):
        ids.append(eng.get_new_qubit_id())
    assert len(set(ids)) == 10
Example #6
0
def test_exceptions_are_forwarded():
    class ErrorEngine(DummyEngine):
        def receive(self, command_list):
            raise TypeError

    eng = _main.MainEngine(backend=ErrorEngine(), engine_list=[])
    with pytest.raises(TypeError):
        qb = eng.allocate_qubit()  # noqa: F841
    eng2 = _main.MainEngine(backend=ErrorEngine(), engine_list=[])
    with pytest.raises(TypeError):
        qb = eng2.allocate_qubit()  # noqa: F841

    # NB: avoid throwing exceptions when destroying the MainEngine
    eng.next_engine = DummyEngine()
    eng.next_engine.is_last_engine = True
    eng2.next_engine = DummyEngine()
    eng2.next_engine.is_last_engine = True
Example #7
0
def test_main_engine_atexit_with_error():
    sys.last_type = "Something"
    backend = DummyEngine(save_commands=True)
    eng = _main.MainEngine(backend=backend, engine_list=[])
    qb = eng.allocate_qubit()  # noqa: F841
    eng._delfun(weakref.ref(eng))
    assert len(backend.received_commands) == 1
    assert backend.received_commands[0].gate == AllocateQubitGate()
Example #8
0
def test_main_engine_set_and_get_measurement_result():
    eng = _main.MainEngine()
    qubit0 = eng.allocate_qubit()
    qubit1 = eng.allocate_qubit()
    with pytest.raises(_main.NotYetMeasuredError):
        print(int(qubit0))
    eng.set_measurement_result(qubit0[0], True)
    eng.set_measurement_result(qubit1[0], False)
    assert int(qubit0)
    assert not int(qubit1)
Example #9
0
def test_main_engine_del():
    # need engine which caches commands to test that del calls flush
    caching_engine = LocalOptimizer(m=5)
    backend = DummyEngine(save_commands=True)
    eng = _main.MainEngine(backend=backend, engine_list=[caching_engine])
    qubit = eng.allocate_qubit()
    H | qubit
    assert len(backend.received_commands) == 0
    eng.__del__()
    # Allocate, H, and Flush Gate
    assert len(backend.received_commands) == 3
Example #10
0
def test_main_engine_init_defaults():
    eng = _main.MainEngine()
    eng_list = []
    current_engine = eng.next_engine
    while not current_engine.is_last_engine:
        eng_list.append(current_engine)
        current_engine = current_engine.next_engine
    assert isinstance(eng_list[-1].next_engine, Simulator)
    from projectq.setups.default import default_engines
    for engine, expected in zip(eng_list, default_engines()):
        assert type(engine) == type(expected)
Example #11
0
def test_main_engine_atexit_no_error():
    # Clear previous exceptions of other tests
    sys.last_type = None
    del sys.last_type
    backend = DummyEngine(save_commands=True)
    eng = _main.MainEngine(backend=backend, engine_list=[])
    qb = eng.allocate_qubit()  # noqa: F841
    eng._delfun(weakref.ref(eng))
    assert len(backend.received_commands) == 3
    assert backend.received_commands[0].gate == AllocateQubitGate()
    assert backend.received_commands[1].gate == DeallocateQubitGate()
    assert backend.received_commands[2].gate == FlushGate()
Example #12
0
def test_main_engine_del():
    # Clear previous exceptions of other tests
    sys.last_type = None
    del sys.last_type
    # need engine which caches commands to test that del calls flush
    caching_engine = LocalOptimizer(cache_size=5)
    backend = DummyEngine(save_commands=True)
    eng = _main.MainEngine(backend=backend, engine_list=[caching_engine])
    qubit = eng.allocate_qubit()
    H | qubit
    assert len(backend.received_commands) == 0
    eng.__del__()
    # Allocate, H, Deallocate, and Flush Gate
    assert len(backend.received_commands) == 4
Example #13
0
def test_main_engine_flush():
    backend = DummyEngine(save_commands=True)
    eng = _main.MainEngine(backend=backend, engine_list=[DummyEngine()])
    qubit = eng.allocate_qubit()
    H | qubit
    eng.flush()
    assert len(backend.received_commands) == 3
    assert backend.received_commands[0].gate == AllocateQubitGate()
    assert backend.received_commands[1].gate == H
    assert backend.received_commands[2].gate == FlushGate()
    eng.flush(deallocate_qubits=True)
    assert len(backend.received_commands) == 5
    assert backend.received_commands[3].gate == DeallocateQubitGate()
    #keep the qubit alive until at least here
    assert len(str(qubit)) != 0
Example #14
0
def test_main_engine_init():
    ceng1 = DummyEngine()
    ceng2 = DummyEngine()
    test_backend = DummyEngine()
    eng = _main.MainEngine(backend=test_backend, engine_list=[ceng1, ceng2])
    assert id(eng.next_engine) == id(ceng1)
    assert id(eng.main_engine) == id(eng)
    assert not eng.is_last_engine
    assert id(ceng1.next_engine) == id(ceng2)
    assert id(ceng1.main_engine) == id(eng)
    assert not ceng1.is_last_engine
    assert id(ceng2.next_engine) == id(test_backend)
    assert id(ceng2.main_engine) == id(eng)
    assert not ceng2.is_last_engine
    assert test_backend.is_last_engine
    assert id(test_backend.main_engine) == id(eng)
    assert not test_backend.next_engine