示例#1
0
def test_simulator_is_available():
    backend = DummyEngine(save_commands=True)
    eng = MainEngine(backend, [])
    qureg = eng.allocate_qureg(2)
    X | qureg[0]
    S | qureg[0]
    H | qureg[0]
    CNOT | (qureg[0], qureg[1])
    Measure | qureg[0]
    qureg[0].__del__()
    qureg[1].__del__()
    assert len(backend.received_commands) == 9

    # Test that allocate, measure, and deallocate are available.
    sim = StabilizerSimulator(3)
    for cmd in backend.received_commands:
        assert sim.is_available(cmd)

    eng = MainEngine(sim, [])
    qureg = eng.allocate_qureg(3)
    X | qureg[0]
    S | qureg[0]
    H | qureg[0]
    CNOT | (qureg[0], qureg[1])
    All(Measure) | qureg

    with pytest.raises(Exception):
        Toffoli | (qureg[0], qureg[1], qureg[2])
        eng.flush()

    with pytest.raises(Exception):
        with Control(eng, qureg[1:]):
            X | qureg[0]
        eng.flush()
示例#2
0
def test_simulator_flush():
    sim = StabilizerSimulator(2)
    sim._simulator = MockStabilizerSimulatorBackend()

    eng = MainEngine(sim)
    eng.flush()

    assert sim._simulator.run_cnt == 1
示例#3
0
def test_simulator_functional_entangle():
    sim = StabilizerSimulator(6)
    eng = MainEngine(sim, [])
    qubits = eng.allocate_qureg(5)
    # entangle all qubits:
    H | qubits[0]
    for qb in qubits[1:]:
        CNOT | (qubits[0], qb)

    # Check the probabilities
    eng.flush()
    assert eng.backend.get_probability('0' * len(qubits),
                                       qubits) == pytest.approx(0.5)
    assert eng.backend.get_probability('1' * len(qubits),
                                       qubits) == pytest.approx(0.5)

    # Untangle all qubits
    for qb in qubits[-1::-1]:
        CNOT | (qubits[0], qb)
    H | qubits[0]

    # Check the probabilities
    eng.flush()
    assert eng.backend.get_probability('0' * len(qubits),
                                       qubits) == pytest.approx(1.0)
    assert eng.backend.get_probability('1' * len(qubits),
                                       qubits) == pytest.approx(0.0)

    All(Measure) | qubits
示例#4
0
def test_simulator_collapse_wavefunction(mapper):
    sim = StabilizerSimulator(16)
    engine_list = [LocalOptimizer()]
    if mapper is not None:
        engine_list.append(mapper)
    eng = MainEngine(sim, engine_list=engine_list)
    qubits = eng.allocate_qureg(4)
    # unknown qubits: raises
    with pytest.raises(RuntimeError):
        eng.backend.collapse_wavefunction(qubits, [0] * 4)
    eng.flush()
    eng.backend.collapse_wavefunction(qubits, [0] * 4)
    assert pytest.approx(eng.backend.get_probability([0] * 4, qubits)) == 1.
    All(H) | qubits[:-1]
    eng.flush()
    assert pytest.approx(eng.backend.get_probability([0] * 4, qubits)) == .125
    # impossible outcome: raises
    prob = eng.backend.get_probability([1, 0, 1, 0], qubits)
    with pytest.raises(RuntimeError):
        eng.backend.collapse_wavefunction(qubits, [0] * 3 + [1])
    # Make sure nothing the state of the simulator has not changed
    assert pytest.approx(prob) == eng.backend.get_probability([1, 0, 1, 0],
                                                              qubits)
    eng.backend.collapse_wavefunction(qubits[1:], [0, 1, 0])
    probability = eng.backend.get_probability([1, 0, 1, 0], qubits)
    assert probability == pytest.approx(.5)
    eng.backend.set_qubits(qubits, [0] * 3 + [1])
    H | qubits[0]
    CNOT | (qubits[0], qubits[1])
    eng.flush()
    eng.backend.collapse_wavefunction([qubits[0]], [1])
    probability = eng.backend.get_probability([1, 1], qubits[0:2])
    assert probability == pytest.approx(1.)
示例#5
0
def test_simulator_probability(mapper, capsys):
    sim = StabilizerSimulator(6)
    engine_list = [LocalOptimizer()]
    if mapper is not None:
        engine_list.append(mapper)
    eng = MainEngine(sim, engine_list=engine_list)
    qubits = eng.allocate_qureg(6)
    All(H) | qubits
    eng.flush()
    bits = [0, 0, 1, 0, 1, 0]
    for i in range(6):
        assert (eng.backend.get_probability(
            bits[:i], qubits[:i]) == pytest.approx(0.5**i))
    extra_qubit = eng.allocate_qubit()
    with pytest.raises(RuntimeError):
        eng.backend.get_probability([0], extra_qubit)
    del extra_qubit

    All(H) | qubits
    eng.flush()
    assert eng.backend.get_probability('0' * len(qubits),
                                       qubits) == pytest.approx(1.0)
    assert eng.backend.get_probability('1' * len(qubits),
                                       qubits) == pytest.approx(0.0)
    All(Measure) | qubits
示例#6
0
def test_simulator_convert_logical_to_mapped_qubits():
    sim = StabilizerSimulator(2)
    mapper = BasicMapperEngine()

    def receive(command_list):
        pass

    mapper.receive = receive
    eng = MainEngine(sim, [mapper])
    qubit0 = eng.allocate_qubit()
    qubit1 = eng.allocate_qubit()
    mapper.current_mapping = {
        qubit0[0].id: qubit1[0].id,
        qubit1[0].id: qubit0[0].id
    }
    assert (sim._convert_logical_to_mapped_qureg(qubit0 + qubit1) == qubit1 +
            qubit0)
示例#7
0
def test_simulator_no_uncompute_exception():
    sim = StabilizerSimulator(2)
    eng = MainEngine(sim, [])
    qubit = eng.allocate_qubit()
    H | qubit
    with pytest.raises(RuntimeError):
        qubit[0].__del__()
    # If you wanted to keep using the qubit, you shouldn't have deleted it.
    assert qubit[0].id == -1
示例#8
0
def test_simulator_send():
    sim = StabilizerSimulator(2)
    backend = DummyEngine(save_commands=True)

    eng = MainEngine(backend, [sim])

    qubit = eng.allocate_qubit()
    H | qubit
    Measure | qubit
    del qubit
    eng.flush()

    assert len(backend.received_commands) == 5
示例#9
0
def test_simulator_functional_measurement():
    sim = StabilizerSimulator(5)
    eng = MainEngine(sim, [])
    qubits = eng.allocate_qureg(5)
    # entangle all qubits:
    H | qubits[0]
    for qb in qubits[1:]:
        CNOT | (qubits[0], qb)

    All(Measure) | qubits
    eng.flush()

    bit_value_sum = sum([int(qubit) for qubit in qubits])
    assert bit_value_sum == 0 or bit_value_sum == 5
示例#10
0
def test_simulator_measure_mapped_qubit():
    sim = StabilizerSimulator(1)
    eng = MainEngine(sim, [])
    qb1 = WeakQubitRef(engine=eng, idx=1)
    qb2 = WeakQubitRef(engine=eng, idx=2)
    cmd0 = Command(engine=eng, gate=Allocate, qubits=([qb1], ))
    cmd1 = Command(engine=eng, gate=X, qubits=([qb1], ))
    cmd2 = Command(engine=eng,
                   gate=Measure,
                   qubits=([qb1], ),
                   controls=[],
                   tags=[LogicalQubitIDTag(2)])
    with pytest.raises(NotYetMeasuredError):
        int(qb1)
    with pytest.raises(NotYetMeasuredError):
        int(qb2)
    eng.send([cmd0, cmd1, cmd2])
    eng.flush()
    with pytest.raises(NotYetMeasuredError):
        int(qb1)
    assert int(qb2) == 1
示例#11
0
def test_unavailable_methods():
    sim = StabilizerSimulator(2)
    eng = MainEngine(sim, [])
    qureg = eng.allocate_qureg(2)

    with pytest.raises(NotImplementedError):
        op = QubitOperator('Z2')
        eng.backend.apply_qubit_operator(op, qureg)

    with pytest.raises(NotImplementedError):
        op0 = QubitOperator('Z0')
        eng.backend.get_expectation_value(op0, qureg)

    with pytest.raises(NotImplementedError):
        eng.backend.get_amplitude('00', qureg)

    with pytest.raises(NotImplementedError):
        wf = [0., 0., math.sqrt(0.2), math.sqrt(0.8)]
        eng.backend.set_wavefunction(wf, qureg)

    with pytest.raises(NotImplementedError):
        eng.backend.cheat()
示例#12
0
def run_qecc9():

    #init simulator
    simulator = StabilizerSimulator(12)
    eng = HiQMainEngine(simulator, [])

    #allocate
    qubits = eng.allocate_qureg(12)

    #start
    print("= Encoded the qubit, state is: |0>")
    #circuit
    CNOT | (qubits[0], qubits[3])
    CNOT | (qubits[3], qubits[0])

    CNOT | (qubits[3], qubits[6])
    CNOT | (qubits[3], qubits[9])
    H | qubits[3]
    CNOT | (qubits[3], qubits[4])
    CNOT | (qubits[3], qubits[5])
    H | qubits[6]
    CNOT | (qubits[6], qubits[7])
    CNOT | (qubits[6], qubits[8])
    H | qubits[9]
    CNOT | (qubits[9], qubits[10])
    CNOT | (qubits[9], qubits[11])

    H | qubits[3]
    H | qubits[4]
    H | qubits[5]
    H | qubits[6]
    H | qubits[7]
    H | qubits[8]
    H | qubits[9]
    H | qubits[10]
    H | qubits[11]
    CNOT | (qubits[1], qubits[3])
    CNOT | (qubits[1], qubits[4])
    CNOT | (qubits[1], qubits[5])
    CNOT | (qubits[1], qubits[6])
    CNOT | (qubits[1], qubits[7])
    CNOT | (qubits[1], qubits[8])
    CNOT | (qubits[1], qubits[9])
    CNOT | (qubits[1], qubits[10])
    CNOT | (qubits[1], qubits[11])
    H | qubits[3]
    H | qubits[4]
    H | qubits[5]
    H | qubits[6]
    H | qubits[7]
    H | qubits[8]
    H | qubits[9]
    H | qubits[10]
    H | qubits[11]

    CNOT | (qubits[2], qubits[3])
    CNOT | (qubits[2], qubits[4])
    CNOT | (qubits[2], qubits[5])
    CNOT | (qubits[2], qubits[6])
    CNOT | (qubits[2], qubits[7])
    CNOT | (qubits[2], qubits[8])
    CNOT | (qubits[2], qubits[9])
    CNOT | (qubits[2], qubits[10])
    CNOT | (qubits[2], qubits[11])

    CNOT | (qubits[9], qubits[11])
    CNOT | (qubits[9], qubits[10])
    H | qubits[9]
    CNOT | (qubits[6], qubits[8])
    CNOT | (qubits[6], qubits[7])
    H | qubits[6]
    CNOT | (qubits[3], qubits[5])
    CNOT | (qubits[3], qubits[4])
    H | qubits[3]
    CNOT | (qubits[3], qubits[9])
    CNOT | (qubits[3], qubits[6])

    Measure | qubits[3]
    #flush
    eng.flush()

    print("= Decoded the qubit, state is: |{}>".format(int(qubits[3])))
示例#13
0
def test_compare_simulators():
    num_cycles = 20
    num_qubits = 16
    num_gates = 100
    num_probability_check = 100

    for c in range(num_cycles):
        sim = Simulator()
        eng = MainEngine(sim, [])
        qureg = eng.allocate_qureg(num_qubits)

        sim_stab = StabilizerSimulator(num_qubits)
        eng_stab = MainEngine(sim_stab, [])
        qureg_stab = eng_stab.allocate_qureg(num_qubits)

        for gate in range(num_gates):
            r = random.randint(0, 4)
            qb0 = random.randint(0, num_qubits - 1)
            if r == 0:
                H | qureg[qb0]
                H | qureg_stab[qb0]
            elif r == 1:
                S | qureg[qb0]
                S | qureg_stab[qb0]
            elif r == 1:
                X | qureg[qb0]
                X | qureg_stab[qb0]
            elif r == 1:
                qb1 = random.randint(0, num_qubits - 1)
                CNOT | (qureg[qb0], qureg[qb1])
                CNOT | (qureg_stab[qb0], qureg_stab[qb1])
        eng.flush()
        eng_stab.flush()

        for p in range(num_probability_check):
            qubit_ids = set()
            qubits = []
            qubits_stab = []

            num_qubits_for_check = random.randint(1, num_qubits)
            while len(qubits) < num_qubits_for_check:
                qb = random.randint(0, num_qubits - 1)
                if qb not in qubit_ids:
                    qubit_ids.add(qb)
                    qubits.append(qureg[qb])
                    qubits_stab.append(qureg_stab[qb])

            bitstring = [
                random.choice('01') for _ in range(num_qubits_for_check)
            ]

            prob = eng.backend.get_probability(bitstring, qubits)
            assert pytest.approx(prob) == eng_stab.backend.get_probability(
                bitstring, qubits_stab)

            if prob > 0:
                eng.backend.collapse_wavefunction(qubits, bitstring)
                eng_stab.backend.collapse_wavefunction(qubits, bitstring)
                assert eng.backend.get_probability(bitstring,
                                                   qubits) == pytest.approx(1)
                assert eng_stab.backend.get_probability(
                    bitstring, qubits) == pytest.approx(1)
            else:
                with pytest.raises(RuntimeError):
                    eng.backend.collapse_wavefunction(qubits, bitstring)
                with pytest.raises(RuntimeError):
                    eng_stab.backend.collapse_wavefunction(qubits, bitstring)

        All(Measure) | qureg
        All(Measure) | qureg_stab