示例#1
0
def test_command_init(main_engine):
    qureg0 = Qureg([Qubit(main_engine, 0)])
    qureg1 = Qureg([Qubit(main_engine, 1)])
    qureg2 = Qureg([Qubit(main_engine, 2)])
    # qureg3 = Qureg([Qubit(main_engine, 3)])
    # qureg4 = Qureg([Qubit(main_engine, 4)])
    gate = BasicGate()
    cmd = _command.Command(main_engine, gate, (qureg0, qureg1, qureg2))
    assert cmd.gate == gate
    assert cmd.tags == []
    expected_tuple = (qureg0, qureg1, qureg2)
    for cmd_qureg, expected_qureg in zip(cmd.qubits, expected_tuple):
        assert cmd_qureg[0].id == expected_qureg[0].id
        # Testing that Qubits are now WeakQubitRef objects
        assert type(cmd_qureg[0]) == WeakQubitRef
    assert cmd._engine == main_engine
    # Test that quregs are ordered if gate has interchangeable qubits:
    symmetric_gate = BasicGate()
    symmetric_gate.interchangeable_qubit_indices = [[0, 1]]
    symmetric_cmd = _command.Command(main_engine, symmetric_gate, (qureg2, qureg1, qureg0))
    assert cmd.gate == gate
    assert cmd.tags == []
    expected_ordered_tuple = (qureg1, qureg2, qureg0)
    for cmd_qureg, expected_qureg in zip(symmetric_cmd.qubits, expected_ordered_tuple):
        assert cmd_qureg[0].id == expected_qureg[0].id
    assert symmetric_cmd._engine == main_engine
示例#2
0
def test_command_get_merged(main_engine):
    qubit = main_engine.allocate_qubit()
    ctrl_qubit = main_engine.allocate_qubit()
    cmd = _command.Command(main_engine, Rx(0.5), (qubit,))
    cmd.tags = ["TestTag"]
    cmd.add_control_qubits(ctrl_qubit)
    # Merge two commands
    cmd2 = _command.Command(main_engine, Rx(0.5), (qubit,))
    cmd2.add_control_qubits(ctrl_qubit)
    cmd2.tags = ["TestTag"]
    merged_cmd = cmd.get_merged(cmd2)
    expected_cmd = _command.Command(main_engine, Rx(1.0), (qubit,))
    expected_cmd.add_control_qubits(ctrl_qubit)
    expected_cmd.tags = ["TestTag"]
    assert merged_cmd == expected_cmd
    # Don't merge commands as different control qubits
    cmd3 = _command.Command(main_engine, Rx(0.5), (qubit,))
    cmd3.tags = ["TestTag"]
    with pytest.raises(NotMergeable):
        cmd.get_merged(cmd3)
    # Don't merge commands as different tags
    cmd4 = _command.Command(main_engine, Rx(0.5), (qubit,))
    cmd4.add_control_qubits(ctrl_qubit)
    with pytest.raises(NotMergeable):
        cmd.get_merged(cmd4)
示例#3
0
def test_command_str():
    qubit = Qureg([Qubit(main_engine, 0)])
    ctrl_qubit = Qureg([Qubit(main_engine, 1)])
    cmd = _command.Command(main_engine, Rx(0.5), (qubit, ))
    cmd.tags = ["TestTag"]
    cmd.add_control_qubits(ctrl_qubit)
    assert str(cmd) == "CRx(0.5) | ( Qureg[1], Qureg[0] )"
    cmd2 = _command.Command(main_engine, Rx(0.5), (qubit, ))
    assert str(cmd2) == "Rx(0.5) | Qureg[0]"
示例#4
0
def test_command_is_identity(main_engine):
    qubit = main_engine.allocate_qubit()
    qubit2 = main_engine.allocate_qubit()
    cmd = _command.Command(main_engine, Rx(0.0), (qubit,))
    cmd2 = _command.Command(main_engine, Rx(0.5), (qubit2,))
    inverse_cmd = cmd.get_inverse()
    inverse_cmd2 = cmd2.get_inverse()
    assert inverse_cmd.gate.is_identity()
    assert cmd.gate.is_identity()
    assert not inverse_cmd2.gate.is_identity()
    assert not cmd2.gate.is_identity()
示例#5
0
def test_command_str(main_engine):
    qubit = Qureg([Qubit(main_engine, 0)])
    ctrl_qubit = Qureg([Qubit(main_engine, 1)])
    cmd = _command.Command(main_engine, Rx(0.5 * math.pi), (qubit,))
    cmd.tags = ["TestTag"]
    cmd.add_control_qubits(ctrl_qubit)
    cmd2 = _command.Command(main_engine, Rx(0.5 * math.pi), (qubit,))
    if sys.version_info.major == 3:
        assert cmd.to_string(symbols=False) == "CRx(1.570796326795) | ( Qureg[1], Qureg[0] )"
        assert str(cmd2) == "Rx(1.570796326795) | Qureg[0]"
    else:
        assert cmd.to_string(symbols=False) == "CRx(1.5707963268) | ( Qureg[1], Qureg[0] )"
        assert str(cmd2) == "Rx(1.5707963268) | Qureg[0]"
示例#6
0
def test_command_all_qubits(main_engine):
    qubit0 = Qureg([Qubit(main_engine, 0)])
    qubit1 = Qureg([Qubit(main_engine, 1)])
    cmd = _command.Command(main_engine, Rx(0.5), (qubit0,))
    cmd.add_control_qubits(qubit1)
    all_qubits = cmd.all_qubits
    assert all_qubits[0][0].id == 1
    assert all_qubits[1][0].id == 0
示例#7
0
def test_commmand_add_control_qubits(main_engine):
    qubit0 = Qureg([Qubit(main_engine, 0)])
    qubit1 = Qureg([Qubit(main_engine, 1)])
    qubit2 = Qureg([Qubit(main_engine, 2)])
    cmd = _command.Command(main_engine, Rx(0.5), (qubit0, ))
    cmd.add_control_qubits(qubit2 + qubit1)
    assert cmd.control_qubits[0].id == 1
    assert cmd.control_qubits[1].id == 2
示例#8
0
def test_commmand_add_control_qubits_two(main_engine, state):
    qubit0 = Qureg([Qubit(main_engine, 0)])
    qubit1 = Qureg([Qubit(main_engine, 1)])
    qubit2 = Qureg([Qubit(main_engine, 2)])
    qubit3 = Qureg([Qubit(main_engine, 3)])
    cmd = _command.Command(main_engine, Rx(0.5), (qubit0,), qubit1)
    cmd.add_control_qubits(qubit2 + qubit3, state)
    assert cmd.control_qubits[0].id == 1
    assert cmd.control_state == '1' + canonical_ctrl_state(state, 2)
示例#9
0
def test_commmand_add_control_qubits_one(main_engine, state):
    qubit0 = Qureg([Qubit(main_engine, 0)])
    qubit1 = Qureg([Qubit(main_engine, 1)])
    cmd = _command.Command(main_engine, Rx(0.5), (qubit0,))
    cmd.add_control_qubits(qubit1, state=state)
    assert cmd.control_qubits[0].id == 1
    assert cmd.control_state == canonical_ctrl_state(state, 1)

    with pytest.raises(ValueError):
        cmd.add_control_qubits(qubit0[0])
示例#10
0
def test_command_engine(main_engine):
    qubit0 = Qureg([Qubit("fake_engine", 0)])
    qubit1 = Qureg([Qubit("fake_engine", 1)])
    cmd = _command.Command("fake_engine", Rx(0.5), (qubit0, ))
    cmd.add_control_qubits(qubit1)
    assert cmd.engine == "fake_engine"
    cmd.engine = main_engine
    assert id(cmd.engine) == id(main_engine)
    assert id(cmd.control_qubits[0].engine) == id(main_engine)
    assert id(cmd.qubits[0][0].engine) == id(main_engine)
示例#11
0
def test_command_comparison(main_engine):
    qubit = Qureg([Qubit(main_engine, 0)])
    ctrl_qubit = Qureg([Qubit(main_engine, 1)])
    cmd1 = _command.Command(main_engine, Rx(0.5), (qubit,))
    cmd1.tags = ["TestTag"]
    cmd1.add_control_qubits(ctrl_qubit)
    # Test equality
    cmd2 = _command.Command(main_engine, Rx(0.5), (qubit,))
    cmd2.tags = ["TestTag"]
    cmd2.add_control_qubits(ctrl_qubit)
    assert cmd2 == cmd1
    # Test not equal because of tags
    cmd3 = _command.Command(main_engine, Rx(0.5), (qubit,))
    cmd3.tags = ["TestTag", "AdditionalTag"]
    cmd3.add_control_qubits(ctrl_qubit)
    assert not cmd3 == cmd1
    # Test not equal because of control qubit
    cmd4 = _command.Command(main_engine, Rx(0.5), (qubit,))
    cmd4.tags = ["TestTag"]
    assert not cmd4 == cmd1
    # Test not equal because of qubit
    qubit2 = Qureg([Qubit(main_engine, 2)])
    cmd5 = _command.Command(main_engine, Rx(0.5), (qubit2,))
    cmd5.tags = ["TestTag"]
    cmd5.add_control_qubits(ctrl_qubit)
    assert cmd5 != cmd1
    # Test not equal because of engine
    cmd6 = _command.Command("FakeEngine", Rx(0.5), (qubit,))
    cmd6.tags = ["TestTag"]
    cmd6.add_control_qubits(ctrl_qubit)
    assert cmd6 != cmd1
示例#12
0
def test_command_interchangeable_qubit_indices(main_engine):
    gate = BasicGate()
    gate.interchangeable_qubit_indices = [[0, 4, 5], [1, 2]]
    qubit0 = Qureg([Qubit(main_engine, 0)])
    qubit1 = Qureg([Qubit(main_engine, 1)])
    qubit2 = Qureg([Qubit(main_engine, 2)])
    qubit3 = Qureg([Qubit(main_engine, 3)])
    qubit4 = Qureg([Qubit(main_engine, 4)])
    qubit5 = Qureg([Qubit(main_engine, 5)])
    input_tuple = (qubit4, qubit5, qubit3, qubit2, qubit1, qubit0)
    cmd = _command.Command(main_engine, gate, input_tuple)
    assert (cmd.interchangeable_qubit_indices == [[0, 4, 5], [1, 2]]
            or cmd.interchangeable_qubit_indices == [[1, 2], [0, 4, 5]])
示例#13
0
def test_command_engine(main_engine):
    qubit0 = Qureg([Qubit("fake_engine", 0)])
    qubit1 = Qureg([Qubit("fake_engine", 1)])
    cmd = _command.Command("fake_engine", Rx(0.5), (qubit0,))
    cmd.add_control_qubits(qubit1)
    assert cmd.engine == "fake_engine"
    cmd.engine = main_engine
    assert id(cmd.engine) == id(main_engine)
    assert id(cmd.control_qubits[0].engine) == id(main_engine)
    assert id(cmd.qubits[0][0].engine) == id(main_engine)

    # Avoid raising exception upon Qubit destructions
    qubit0[0].id = -1
    qubit1[0].id = -1
示例#14
0
def test_command_order_qubits(main_engine):
    qubit0 = Qureg([Qubit(main_engine, 0)])
    qubit1 = Qureg([Qubit(main_engine, 1)])
    qubit2 = Qureg([Qubit(main_engine, 2)])
    qubit3 = Qureg([Qubit(main_engine, 3)])
    qubit4 = Qureg([Qubit(main_engine, 4)])
    qubit5 = Qureg([Qubit(main_engine, 5)])
    gate = BasicGate()
    gate.interchangeable_qubit_indices = [[0, 4, 5], [1, 2]]
    input_tuple = (qubit4, qubit5, qubit3, qubit2, qubit1, qubit0)
    expected_tuple = (qubit0, qubit3, qubit5, qubit2, qubit1, qubit4)
    cmd = _command.Command(main_engine, gate, input_tuple)
    for ordered_qubit, expected_qubit in zip(cmd.qubits, expected_tuple):
        assert ordered_qubit[0].id == expected_qubit[0].id
示例#15
0
def test_command_get_inverse(main_engine):
    qubit = main_engine.allocate_qubit()
    ctrl_qubit = main_engine.allocate_qubit()
    cmd = _command.Command(main_engine, Rx(0.5), (qubit,))
    cmd.add_control_qubits(ctrl_qubit)
    cmd.tags = [ComputeTag()]
    inverse_cmd = cmd.get_inverse()
    assert inverse_cmd.gate == Rx(-0.5 + 4 * math.pi)
    assert len(cmd.qubits) == len(inverse_cmd.qubits)
    assert cmd.qubits[0][0].id == inverse_cmd.qubits[0][0].id
    assert id(cmd.qubits[0][0]) != id(inverse_cmd.qubits[0][0])
    assert len(cmd.control_qubits) == len(inverse_cmd.control_qubits)
    assert cmd.control_qubits[0].id == inverse_cmd.control_qubits[0].id
    assert id(cmd.control_qubits[0]) != id(inverse_cmd.control_qubits[0])
    assert cmd.tags == inverse_cmd.tags
    assert id(cmd.tags[0]) != id(inverse_cmd.tags[0])
    assert id(cmd.engine) == id(inverse_cmd.engine)
示例#16
0
def test_command_deepcopy(main_engine):
    qureg0 = Qureg([Qubit(main_engine, 0)])
    qureg1 = Qureg([Qubit(main_engine, 1)])
    gate = BasicGate()
    cmd = _command.Command(main_engine, gate, (qureg0,))
    cmd.add_control_qubits(qureg1)
    cmd.tags.append("MyTestTag")
    copied_cmd = deepcopy(cmd)
    # Test that deepcopy gives same cmd
    assert copied_cmd.gate == gate
    assert copied_cmd.tags == ["MyTestTag"]
    assert len(copied_cmd.qubits) == 1
    assert copied_cmd.qubits[0][0].id == qureg0[0].id
    assert len(copied_cmd.control_qubits) == 1
    assert copied_cmd.control_qubits[0].id == qureg1[0].id
    # Engine should not be deepcopied but a reference:
    assert id(copied_cmd.engine) == id(main_engine)
    # Test that deepcopy is actually a deepcopy
    cmd.tags = ["ChangedTag"]
    assert copied_cmd.tags == ["MyTestTag"]
    cmd.control_qubits[0].id == 10
    assert copied_cmd.control_qubits[0].id == qureg1[0].id
    cmd.gate = "ChangedGate"
    assert copied_cmd.gate == gate