Ejemplo n.º 1
0
def test_register_gate():
    class _FooGate(Gate):
        def __init__(self):
            super().__init__(qubit_count=1, ascii_symbols=["foo"])

    Gate.register_gate(_FooGate)
    assert Gate._FooGate().name == _FooGate().name
Ejemplo n.º 2
0
def many_layers(n_qubits: int, n_layers: int) -> Circuit:
    """
    Function to return circuit with many layers.

    :param int n_qubits: number of qubits
    :param int n_layers: number of layers
    :return: Constructed easy circuit
    :rtype: Circuit
    """
    qubits = range(n_qubits)
    circuit = Circuit()  # instantiate circuit object
    for q in range(n_qubits):
        circuit.h(q)
    for layer in range(n_layers):
        if (layer + 1) % 100 != 0:
            for qubit in range(len(qubits)):
                angle = np.random.uniform(0, 2 * math.pi)
                gate = np.random.choice(
                    [Gate.Rx(angle), Gate.Ry(angle), Gate.Rz(angle), Gate.H()], 1, replace=True
                )[0]
                circuit.add_instruction(Instruction(gate, qubit))
        else:
            for q in range(0, n_qubits, 2):
                circuit.cnot(q, q + 1)
            for q in range(1, n_qubits - 1, 2):
                circuit.cnot(q, q + 1)
    return circuit
Ejemplo n.º 3
0
def test_add_circuit_with_target_and_non_continuous_qubits():
    widget = Circuit().h(5).h(50).h(100)
    circ = Circuit().add_circuit(widget, target=[1, 3, 5])
    expected = (Circuit().add_instruction(Instruction(
        Gate.H(), 1)).add_instruction(Instruction(
            Gate.H(), 3)).add_instruction(Instruction(Gate.H(), 5)))
    assert circ == expected
Ejemplo n.º 4
0
def test_add_circuit_with_target(bell_pair):
    circ = Circuit().add_circuit(bell_pair, target=[10, 11])
    expected = (Circuit().add_instruction(Instruction(
        Gate.H(),
        10)).add_instruction(Instruction(Gate.CNot(),
                                         [10, 11])).add_result_type(
                                             ResultType.Probability([10, 11])))
    assert circ == expected
Ejemplo n.º 5
0
def test_basis_rotation_instructions_multiple_result_types_same_targets():
    circ = (Circuit().h(0).cnot(0, 1).expectation(
        observable=Observable.H() @ Observable.X(),
        target=[0, 1]).sample(observable=Observable.H() @ Observable.X(),
                              target=[0, 1]).variance(
                                  observable=Observable.H() @ Observable.X(),
                                  target=[0, 1]))
    expected = [Instruction(Gate.Ry(-np.pi / 4), 0), Instruction(Gate.H(), 1)]
    assert circ.basis_rotation_instructions == expected
Ejemplo n.º 6
0
def test_add_verbatim_box_no_preceding():
    circ = Circuit().add_verbatim_box(Circuit().h(0)).cnot(2, 3)
    expected = (Circuit().add_instruction(
        Instruction(compiler_directives.StartVerbatimBox())).add_instruction(
            Instruction(Gate.H(), 0)).add_instruction(
                Instruction(
                    compiler_directives.EndVerbatimBox())).add_instruction(
                        Instruction(Gate.CNot(), [2, 3])))
    assert circ == expected
Ejemplo n.º 7
0
def test_equality():
    gate_1 = Gate(qubit_count=1, ascii_symbols=["foo"])
    gate_2 = Gate(qubit_count=1, ascii_symbols=["bar"])
    other_gate = Gate.Rx(angle=0.34)
    non_gate = "non gate"

    assert gate_1 == gate_2
    assert gate_1 is not gate_2
    assert gate_1 != other_gate
    assert gate_1 != non_gate
def test_equality():
    instr_1 = Instruction(Gate.H(), 0)
    instr_2 = Instruction(Gate.H(), 0)
    other_instr = Instruction(Gate.CNot(), [0, 1])
    non_instr = "non instruction"

    assert instr_1 == instr_2
    assert instr_1 is not instr_2
    assert instr_1 != other_instr
    assert instr_1 != non_instr
Ejemplo n.º 9
0
def test_equality():
    u1 = Gate.Unitary(np.array([[0 + 0j, 1 + 0j], [1 + 0j, 0 + 0j]]))
    u2 = Gate.Unitary(np.array([[0, 1], [1, 0]], dtype=np.float32), display_name=["u2"])
    other_gate = Gate.Unitary(np.array([[1, 0], [0, 1]]))
    non_gate = "non gate"

    assert u1 == u2
    assert u1 is not u2
    assert u1 != other_gate
    assert u1 != non_gate
Ejemplo n.º 10
0
def test_free_param_equality():
    param1 = FreeParameter("theta")
    param2 = FreeParameter("phi")
    rx1 = Gate.Rx(param1)
    rx2 = Gate.Rx(param1)
    other_gate = Gate.Rx(param2)

    assert rx1 == rx2
    assert rx1 is not rx2
    assert rx1 != other_gate
    assert rx1 != param1
Ejemplo n.º 11
0
def test_add_verbatim_box_different_qubits():
    circ = Circuit().h(1).add_verbatim_box(Circuit().h(0)).cnot(3, 4)
    expected = (Circuit().add_instruction(Instruction(
        Gate.H(),
        1)).add_instruction(Instruction(
            compiler_directives.StartVerbatimBox())).add_instruction(
                Instruction(Gate.H(), 0)).add_instruction(
                    Instruction(
                        compiler_directives.EndVerbatimBox())).add_instruction(
                            Instruction(Gate.CNot(), [3, 4])))
    assert circ == expected
Ejemplo n.º 12
0
def test_basis_rotation_instructions_multiple_result_types_tensor_product_hermitian_qubit_count_2(
):
    circ = (Circuit().h(0).cnot(0, 1).cnot(1, 2).expectation(
        observable=Observable.I(), target=[1]).sample(
            observable=Observable.Hermitian(matrix=np.eye(4)) @ Observable.H(),
            target=[0, 1, 2]).variance(observable=Observable.H(),
                                       target=[2]).expectation(
                                           observable=Observable.I(),
                                           target=[0]))
    expected = [
        Instruction(Gate.Unitary(matrix=np.eye(4)), target=[0, 1]),
        Instruction(Gate.Ry(-np.pi / 4), 2),
    ]
    assert circ.basis_rotation_instructions == expected
Ejemplo n.º 13
0
def test_add_verbatim_box_with_target(cnot):
    circ = Circuit().add_verbatim_box(cnot, target=[10, 11])
    expected = (Circuit().add_instruction(
        Instruction(compiler_directives.StartVerbatimBox())).add_instruction(
            Instruction(Gate.CNot(), [10, 11])).add_instruction(
                Instruction(compiler_directives.EndVerbatimBox())))
    assert circ == expected
def test_getters():
    target = [0, 1]
    operator = Gate.CNot()
    instr = Instruction(operator, target)

    assert instr.operator == operator
    assert instr.target == QubitSet([0, 1])
Ejemplo n.º 15
0
def test_subroutine_returns_instruction():
    @circuit.subroutine()
    def foo(target):
        return Instruction(Gate.H(), 0)

    circ = Circuit().add(foo, 0)
    assert circ == Circuit(Instruction(Gate.H(), 0))
Ejemplo n.º 16
0
def test_basis_rotation_instructions_multiple_result_types_different_hermitian_targets(
):
    circ = (Circuit().h(0).cnot(0, 1).sample(
        observable=Observable.Hermitian(matrix=np.array([[1, 0], [0, -1]])),
        target=[1]).expectation(
            observable=Observable.Hermitian(matrix=np.array([[0, 1], [1, 0]])),
            target=[0]))
    expected = [
        Instruction(
            Gate.Unitary(matrix=1.0 / np.sqrt(2.0) *
                         np.array([[1.0, 1.0], [1.0, -1.0]], dtype=complex)),
            target=[0],
        ),
        Instruction(Gate.Unitary(matrix=np.array([[0, 1], [1, 0]])),
                    target=[1]),
    ]
    assert circ.basis_rotation_instructions == expected
Ejemplo n.º 17
0
def test_subroutine_returns_iterable():
    @circuit.subroutine()
    def foo(target):
        for qubit in range(1):
            yield Instruction(Gate.H(), qubit)

    circ = Circuit().add(foo, 0)
    assert circ == Circuit(Instruction(Gate.H(), 0))
Ejemplo n.º 18
0
def test_basis_rotation_instructions_multiple_result_types_tensor_product_probability(
):
    circ = (Circuit().h(0).cnot(0, 1).cnot(1, 2).probability([0, 1]).sample(
        observable=Observable.Z() @ Observable.Z() @ Observable.H(),
        target=[0, 1, 2]).variance(observable=Observable.H(), target=[2]))
    expected = [
        Instruction(Gate.Ry(-np.pi / 4), 2),
    ]
    assert circ.basis_rotation_instructions == expected
Ejemplo n.º 19
0
def test_subroutine_register():
    # register a private method to avoid Sphinx docs picking this up
    @circuit.subroutine(register=True)
    def _foo(target):
        """this docstring will be added to the registered attribute"""
        return Instruction(Gate.H(), target)

    circ = Circuit()._foo(0)
    assert circ == Circuit(Instruction(Gate.H(), 0))
    assert Circuit._foo.__doc__ == _foo.__doc__
Ejemplo n.º 20
0
def test_basis_rotation_instructions_multiple_result_types_same_targets_hermitian(
):
    circ = (Circuit().h(0).cnot(0, 1).sample(
        observable=Observable.Hermitian(matrix=np.array([[1, 0], [0, -1]])),
        target=[1]).expectation(observable=Observable.Hermitian(
            matrix=np.array([[1, 0], [0, -1]])),
                                target=[1]))
    expected = [
        Instruction(Gate.Unitary(matrix=np.array([[0, 1], [1, 0]])),
                    target=[1])
    ]
    assert circ.basis_rotation_instructions == expected
Ejemplo n.º 21
0
def test_subroutine_nested():
    @circuit.subroutine()
    def h(target):
        for qubit in target:
            yield Instruction(Gate.H(), qubit)

    @circuit.subroutine()
    def h_nested(target):
        for qubit in target:
            yield h(target)

    circ = Circuit().add(h_nested, [0, 1])
    expected = Circuit(
        [Instruction(Gate.H(), j) for i in range(2) for j in range(2)])
    assert circ == expected
Ejemplo n.º 22
0
def test_basis_rotation_instructions_multiple_result_types_tensor_product_hermitian(
):
    circ = (Circuit().h(0).cnot(0, 1).cnot(1, 2).sample(
        observable=Observable.Hermitian(matrix=np.array([[1, 0], [0, -1]]))
        @ Observable.H(),
        target=[0, 1],
    ).variance(
        observable=Observable.Hermitian(matrix=np.array([[1, 0], [0, -1]]))
        @ Observable.H(),
        target=[0, 1],
    ).expectation(
        observable=Observable.Hermitian(matrix=np.array([[0, 1], [1, 0]])),
        target=[2]))
    expected = [
        Instruction(Gate.Unitary(matrix=np.array([[0, 1], [1, 0]])),
                    target=[0]),
        Instruction(Gate.Ry(-np.pi / 4), 1),
        Instruction(
            Gate.Unitary(matrix=1.0 / np.sqrt(2.0) *
                         np.array([[1.0, 1.0], [1.0, -1.0]], dtype=complex)),
            target=[2],
        ),
    ]
    assert circ.basis_rotation_instructions == expected
Ejemplo n.º 23
0
def test_basis_rotation_instructions_tensor_product():
    circ = (Circuit().h(0).cnot(0, 1).expectation(
        observable=Observable.X() @ Observable.Y() @ Observable.Y(),
        target=[0, 1, 2]))
    expected = [
        Instruction(Gate.H(), 0),
        Instruction(Gate.Z(), 1),
        Instruction(Gate.S(), 1),
        Instruction(Gate.H(), 1),
        Instruction(Gate.Z(), 2),
        Instruction(Gate.S(), 2),
        Instruction(Gate.H(), 2),
    ]
    assert circ.basis_rotation_instructions == expected
Ejemplo n.º 24
0
def test_basis_rotation_instructions_all():
    circ = Circuit().h(0).cnot(0, 1).sample(observable=Observable.Y())
    expected = [
        Instruction(Gate.Z(), 0),
        Instruction(Gate.S(), 0),
        Instruction(Gate.H(), 0),
        Instruction(Gate.Z(), 1),
        Instruction(Gate.S(), 1),
        Instruction(Gate.H(), 1),
    ]
    assert circ.basis_rotation_instructions == expected
Ejemplo n.º 25
0
def test_basis_rotation_instructions_identity():
    circ = (Circuit().h(0).cnot(0, 1).cnot(1, 2).cnot(2, 3).cnot(
        3, 4).expectation(observable=Observable.X(), target=[
            0
        ]).expectation(observable=Observable.I(), target=[2]).expectation(
            observable=Observable.I() @ Observable.Y(),
            target=[1, 3]).expectation(observable=Observable.I(), target=[
                0
            ]).expectation(observable=Observable.X() @ Observable.I(),
                           target=[1,
                                   3]).expectation(observable=Observable.Y(),
                                                   target=[2]))
    expected = [
        Instruction(Gate.H(), 0),
        Instruction(Gate.H(), 1),
        Instruction(Gate.Z(), 2),
        Instruction(Gate.S(), 2),
        Instruction(Gate.H(), 2),
        Instruction(Gate.Z(), 3),
        Instruction(Gate.S(), 3),
        Instruction(Gate.H(), 3),
    ]
    assert circ.basis_rotation_instructions == expected
Ejemplo n.º 26
0
def bell_pair(prob):
    return (Circuit().add_instruction(Instruction(
        Gate.H(),
        0)).add_instruction(Instruction(Gate.CNot(),
                                        [0, 1])).add_result_type(prob))
Ejemplo n.º 27
0
def test_basis_rotation_instructions_target():
    circ = Circuit().h(0).cnot(0, 1).expectation(observable=Observable.X(),
                                                 target=0)
    expected = [Instruction(Gate.H(), 0)]
    assert circ.basis_rotation_instructions == expected
Ejemplo n.º 28
0
def h_instr():
    return Instruction(Gate.H(), 0)
Ejemplo n.º 29
0
def test_unitary_invalid_matrix(matrix):
    Gate.Unitary(matrix=matrix)
Ejemplo n.º 30
0
def h():
    return Circuit().add_instruction(Instruction(Gate.H(), 0))