Пример #1
0
 def test_qudit(self) -> None:
     circuit = Circuit(3, [2, 3, 3])
     assert len(circuit.get_gate_set()) == 0
     circuit.append_gate(U3Gate(), [0])
     assert len(circuit.get_gate_set()) == 1
     assert U3Gate() in circuit.get_gate_set()
     circuit.append_gate(XGate(), [0])
     assert len(circuit.get_gate_set()) == 2
     assert U3Gate() in circuit.get_gate_set()
     assert XGate() in circuit.get_gate_set()
     circuit.append_gate(ZGate(), [0])
     assert len(circuit.get_gate_set()) == 3
     assert U3Gate() in circuit.get_gate_set()
     assert XGate() in circuit.get_gate_set()
     assert ZGate() in circuit.get_gate_set()
     circuit.append_gate(TGate(), [0])
     assert len(circuit.get_gate_set()) == 4
     assert U3Gate() in circuit.get_gate_set()
     assert XGate() in circuit.get_gate_set()
     assert ZGate() in circuit.get_gate_set()
     assert TGate() in circuit.get_gate_set()
     circuit.append_gate(CSUMGate(), [1, 2])
     assert len(circuit.get_gate_set()) == 5
     assert U3Gate() in circuit.get_gate_set()
     assert XGate() in circuit.get_gate_set()
     assert ZGate() in circuit.get_gate_set()
     assert TGate() in circuit.get_gate_set()
     assert CSUMGate() in circuit.get_gate_set()
Пример #2
0
    def test_random_batch_remove(self) -> None:
        num_gates = 200
        num_q = 10

        circ = Circuit(num_q)
        for _ in range(num_gates):
            a = randint(0, num_q - 1)
            b = randint(0, num_q - 1)
            if a == b:
                b = (b + 1) % num_q
            circ.append_gate(CNOTGate(), [a, b])

        ScanPartitioner(2).run(circ, {})

        points = []
        ops = []
        for cycle, op in circ.operations_with_cycles():
            point = (cycle, op.location[0])
            ops.append(Operation(CNOTGate(), op.location))
            points.append(point)

        circ.batch_replace(points, ops)

        for op in circ:
            assert isinstance(op.gate, CNOTGate)
Пример #3
0
def test_full_pauli_gate() -> None:
    circuit = Circuit(3)
    circuit.append_gate(PauliGate(3), [0, 1, 2])
    cost = HilbertSchmidtResiduals(circuit,
                                   UnitaryMatrix(unitary_group.rvs(8)))
    circuit.minimize(cost)
    assert cost.get_cost(circuit.get_params()) < 1e-6
Пример #4
0
 def test_append_gate_4(self, qudit_index: int) -> None:
     circuit = Circuit(4)
     circuit.append_gate(CNOTGate(), [0, 1])
     circuit.append_gate(CNOTGate(), [1, 2])
     circuit.append_gate(CNOTGate(), [2, 3])
     circuit.append_gate(CNOTGate(), [0, 1])
     circuit.append_gate(CNOTGate(), [1, 2])
     circuit.append_gate(CNOTGate(), [2, 3])
     circuit.append_gate(CNOTGate(), [0, 1])
     circuit.append_gate(CNOTGate(), [1, 2])
     circuit.append_gate(CNOTGate(), [2, 3])
     circuit.pop_qudit(qudit_index)
     assert circuit.get_size() == 3
     assert len(circuit.get_radixes()) == 3
     assert circuit.get_radixes().count(2) == 3
     assert circuit.get_num_operations() == 6
     assert circuit[0, 0].gate == CNOTGate()
     assert circuit[0, 0].location == (0, 1)
     assert circuit[1, 1].gate == CNOTGate()
     assert circuit[1, 1].location == (1, 2)
     assert circuit[2, 0].gate == CNOTGate()
     assert circuit[2, 0].location == (0, 1)
     assert circuit[3, 1].gate == CNOTGate()
     assert circuit[3, 1].location == (1, 2)
     assert circuit[4, 0].gate == CNOTGate()
     assert circuit[4, 0].location == (0, 1)
     assert circuit[5, 1].gate == CNOTGate()
     assert circuit[5, 1].location == (1, 2)
Пример #5
0
 def test_correctness_2(self) -> None:
     circuit = Circuit(2)
     circuit.append_gate(HGate(), [0])
     circuit.append_gate(CNOTGate(), [0, 1])
     assert circuit.get_operation((0, 0)).gate == HGate()
     assert circuit.get_operation((1, 0)).gate == CNOTGate()
     assert circuit.get_operation((1, 1)).gate == CNOTGate()
Пример #6
0
def swap_circuit() -> Circuit:
    """Provides a swap implemented with 3 cnots as a circuit fixture."""
    circuit = Circuit(2)
    circuit.append_gate(CNOTGate(), [0, 1])
    circuit.append_gate(CNOTGate(), [1, 0])
    circuit.append_gate(CNOTGate(), [0, 1])
    return circuit
Пример #7
0
 def test_example(self) -> None:
     circuit = Circuit(2)
     circuit.append_gate(HGate(), [0])
     assert circuit.find_available_cycle([1]) == 0
     circuit.append_gate(XGate(), [0])
     circuit.append_gate(ZGate(), [1])
     assert circuit.find_available_cycle([1]) == 1
Пример #8
0
 def test_example(self) -> None:
     circuit = Circuit(2)
     circuit.append_gate(HGate(), [0])
     circuit.append_gate(XGate(), [0])
     circuit.append_gate(ZGate(), [1])
     assert not circuit.is_cycle_unoccupied(0, [0])
     assert circuit.is_cycle_unoccupied(1, [1])
Пример #9
0
    def test_two_qubit_2(self) -> None:
        circuit = Circuit(4)
        assert len(circuit.get_coupling_graph()) == 0

        circuit.append_gate(CNOTGate(), [0, 1])
        circuit.append_gate(CNOTGate(), [1, 2])
        circuit.append_gate(CNOTGate(), [2, 3])
        cgraph = circuit.get_coupling_graph()
        assert len(cgraph) == 3
        assert (0, 1) in cgraph
        assert (1, 2) in cgraph
        assert (2, 3) in cgraph

        circuit.append_gate(CNOTGate(), [2, 3])
        circuit.append_gate(CNOTGate(), [1, 2])
        circuit.append_gate(CNOTGate(), [0, 1])
        cgraph = circuit.get_coupling_graph()
        assert len(cgraph) == 3
        assert (0, 1) in cgraph
        assert (1, 2) in cgraph
        assert (2, 3) in cgraph

        circuit.append_gate(CNOTGate(), [0, 2])
        circuit.append_gate(CNOTGate(), [3, 0])
        cgraph = circuit.get_coupling_graph()
        assert len(cgraph) == 5
        assert (0, 1) in cgraph
        assert (1, 2) in cgraph
        assert (2, 3) in cgraph
        assert (0, 2) in cgraph
        assert (0, 3) in cgraph
Пример #10
0
    def gen_initial_layer(
        self,
        target: UnitaryMatrix | StateVector,
        data: dict[str, Any],
    ) -> Circuit:
        """
        Generate the initial layer, see LayerGenerator for more.

        Raises:
            ValueError: If `target` has a radix mismatch with
                `self.initial_layer_gate`.
        """

        if not isinstance(target, (UnitaryMatrix, StateVector)):
            raise TypeError(
                'Expected unitary or state, got %s.' % type(target), )

        for radix in target.get_radixes():
            if radix != self.initial_layer_gate.get_radixes()[0]:
                raise ValueError(
                    'Radix mismatch between target and initial_layer_gate.', )

        init_circuit = Circuit(target.get_size(), target.get_radixes())
        for i in range(init_circuit.get_size()):
            init_circuit.append_gate(self.initial_layer_gate, [i])
        return init_circuit
Пример #11
0
 def test_type_valid_2(self) -> None:
     circuit = Circuit(4, [2, 2, 3, 3])
     try:
         circuit.append_gate(HGate(), [2])
     except TypeError:
         assert False, 'Unexpected TypeError.'
     except BaseException:
         return
Пример #12
0
 def test_type_invalid_2(self, not_an_int: Any) -> None:
     circuit = Circuit(4, [2, 2, 3, 3])
     try:
         circuit.append_gate(not_an_int, not_an_int)
     except TypeError:
         return
     except BaseException:
         assert False, 'Unexpected Exception.'
Пример #13
0
    def test_value(self, gate: Gate) -> None:
        circuit = Circuit(gate.get_size(), gate.get_radixes())
        assert circuit.is_differentiable()

        circuit.append_gate(gate, list(range(gate.get_size())))
        if isinstance(gate, DifferentiableUnitary):
            assert circuit.is_differentiable()
        else:
            assert not circuit.is_differentiable()
Пример #14
0
 def test_invalid_fold(self, points: Sequence[CircuitPointLike]) -> None:
     circuit = Circuit(4)
     wide_gate = IdentityGate(4)
     circuit.append_gate(wide_gate, [0, 1, 2, 3])
     circuit.append_gate(wide_gate, [0, 1, 2, 3])
     circuit.append_gate(wide_gate, [0, 1, 2, 3])
     circuit.append_gate(wide_gate, [0, 1, 2, 3])
     with pytest.raises(ValueError):
         circuit.fold(circuit.get_region(points))
Пример #15
0
 def test_single_qubit_2(self) -> None:
     circuit = Circuit(4)
     assert len(circuit.get_coupling_graph()) == 0
     for i in range(4):
         circuit.append_gate(U3Gate(), [i])
     assert len(circuit.get_coupling_graph()) == 0
     for j in range(4):
         for i in range(4):
             circuit.append_gate(U3Gate(), [i])
     assert len(circuit.get_coupling_graph()) == 0
Пример #16
0
 def test_type_valid_1(self) -> None:
     circuit = Circuit(1)
     circuit_to_add = Circuit(1)
     circuit_to_add.append_gate(HGate(), [0])
     try:
         circuit.append_circuit(circuit_to_add, [0])
     except TypeError:
         assert False, 'Unexpected TypeError.'
     except BaseException:
         return
Пример #17
0
 def test_r1(self, r3_qubit_circuit: Circuit) -> None:
     start = r3_qubit_circuit.get_num_params()
     r3_qubit_circuit.append_gate(U3Gate(), [0])
     assert r3_qubit_circuit.get_num_params() == start + 3
     r3_qubit_circuit.insert_gate(0, U3Gate(), [1])
     assert r3_qubit_circuit.get_num_params() == start + 6
     r3_qubit_circuit.insert_gate(0, CNOTGate(), [0, 2])
     assert r3_qubit_circuit.get_num_params() == start + 6
     r3_qubit_circuit.remove(U3Gate())
     assert r3_qubit_circuit.get_num_params() == start + 3
Пример #18
0
 def test_index_invalid_2(self, cycle_index: int) -> None:
     circuit = Circuit(4, [2, 2, 3, 3])
     circuit.append_gate(HGate(), [0])
     circuit.append_gate(HGate(), [0])
     circuit.append_gate(HGate(), [0])
     try:
         circuit.pop_cycle(cycle_index)
     except IndexError:
         return
     except BaseException:
         assert False, 'Unexpected Exception.'
Пример #19
0
    def test_invalid_value_2(self) -> None:
        circuit = Circuit(2)
        circuit.append_gate(HGate(), [0])
        circuit.append_gate(CNOTGate(), [0, 1])

        try:
            circuit.point(XGate())
        except ValueError:
            return

        assert False, 'Should not have reached here.'
Пример #20
0
 def test_removing_gate(self) -> None:
     circuit = Circuit(1)
     circuit.append_gate(U3Gate(), [0])
     circuit.append_gate(U3Gate(), [0])
     circuit.append_gate(U3Gate(), [0])
     assert circuit.get_num_params() == 9
     circuit.remove(U3Gate())
     assert circuit.get_num_params() == 6
     circuit.remove(U3Gate())
     assert circuit.get_num_params() == 3
     circuit.remove(U3Gate())
     assert circuit.get_num_params() == 0
Пример #21
0
 def test_removing_gate1(self) -> None:
     circuit = Circuit(1)
     circuit.append_gate(U3Gate(), [0])
     circuit.append_gate(U3Gate(), [0])
     circuit.append_gate(U3Gate(), [0])
     assert circuit.get_depth() == 3
     circuit.remove(U3Gate())
     assert circuit.get_depth() == 2
     circuit.remove(U3Gate())
     assert circuit.get_depth() == 1
     circuit.remove(U3Gate())
     assert circuit.get_depth() == 0
Пример #22
0
 def test_removing_gate(self) -> None:
     circuit = Circuit(1)
     circuit.append_gate(U3Gate(), [0])
     circuit.append_gate(U3Gate(), [0])
     circuit.append_gate(U3Gate(), [0])
     assert circuit.get_num_operations() == 3
     circuit.remove(U3Gate())
     assert circuit.get_num_operations() == 2
     circuit.remove(U3Gate())
     assert circuit.get_num_operations() == 1
     circuit.remove(U3Gate())
     assert circuit.get_num_operations() == 0
Пример #23
0
 def test_r1(self, r3_qubit_circuit: Circuit) -> None:
     assert r3_qubit_circuit.get_num_operations() == 10
     r3_qubit_circuit.append_gate(U3Gate(), [0])
     assert r3_qubit_circuit.get_num_operations() == 11
     r3_qubit_circuit.insert_gate(0, U3Gate(), [1])
     assert r3_qubit_circuit.get_num_operations() == 12
     r3_qubit_circuit.insert_gate(0, CNOTGate(), [0, 2])
     assert r3_qubit_circuit.get_num_operations() == 13
     r3_qubit_circuit.remove(U3Gate())
     assert r3_qubit_circuit.get_num_operations() == 12
     r3_qubit_circuit.remove(CNOTGate())
     assert r3_qubit_circuit.get_num_operations() == 11
Пример #24
0
 def test_freezing_param(self) -> None:
     circuit = Circuit(1)
     circuit.append_gate(U3Gate(), [0])
     circuit.append_gate(U3Gate(), [0])
     circuit.append_gate(U3Gate(), [0])
     assert circuit.get_num_params() == 9
     circuit.freeze_param(0)
     assert circuit.get_num_params() == 8
     circuit.freeze_param(0)
     assert circuit.get_num_params() == 7
     circuit.freeze_param(0)
     assert circuit.get_num_params() == 6
     circuit.freeze_param(0)
Пример #25
0
    def test_no_change(self) -> None:
        u1 = unitary_group.rvs(8)
        g1 = VariableUnitaryGate(3)
        circuit = Circuit(3)
        circuit.append_gate(g1, [0, 1, 2])
        utry_before = circuit.get_unitary()
        # The following call should not make any changes in circuit
        QFactor().instantiate(circuit, u1, circuit.get_params())
        utry_after = circuit.get_unitary()

        assert np.allclose(
            utry_before.get_numpy(),
            utry_after.get_numpy(),
        )
Пример #26
0
    def test_run(self) -> None:
        """Test run with a linear topology."""
        #     0  1  2  3  4        #########
        # 0 --o-----o--P--P--    --#-o---o-#-----#######--
        # 1 --x--o--x--o-----    --#-x-o-x-#######-o---#--
        # 2 -----x--o--x--o-- => --#---x---#---o-#-x-o-#--
        # 3 --o--P--x--P--x--    --#########-o-x-#---x-#--
        # 4 --x-----------P--    ----------#-x---#######--
        #                                  #######

        num_q = 5
        circ = Circuit(num_q)
        circ.append_gate(CNOTGate(), [0, 1])
        circ.append_gate(CNOTGate(), [3, 4])
        circ.append_gate(CNOTGate(), [1, 2])
        circ.append_gate(CNOTGate(), [0, 1])
        circ.append_gate(CNOTGate(), [2, 3])
        circ.append_gate(CNOTGate(), [1, 2])
        circ.append_gate(CNOTGate(), [2, 3])
        utry = circ.get_unitary()
        ScanPartitioner(3).run(circ, {})

        assert len(circ) == 3
        assert all(isinstance(op.gate, CircuitGate) for op in circ)
        placeholder_gate = TaggedGate(IdentityGate(1), '__fold_placeholder__')
        assert all(
            op.gate._circuit.count(placeholder_gate) == 0
            for op in circ)  # type: ignore  # noqa
        assert circ.get_unitary() == utry
        for cycle_index in range(circ.get_num_cycles()):
            assert not circ._is_cycle_idle(cycle_index)
Пример #27
0
    def test_correctness_2(self) -> None:
        circuit = Circuit(2)
        circuit.append_gate(HGate(), [0])
        circuit.append_gate(CNOTGate(), [0, 1])
        assert circuit.point(HGate()) == (0, 0)
        assert circuit.point(CNOTGate()) == (1, 0)
        assert circuit.point(Operation(HGate(), [0])) == (0, 0)
        assert circuit.point(Operation(CNOTGate(), [0, 1])) == (1, 0)

        try:
            circuit.point(Operation(CNOTGate(), [1, 0]))
        except ValueError:
            return
        assert False, 'Should not have reached here.'
Пример #28
0
 def test_return_type_1(
     self,
     valid_int: int,
     location: Sequence[int],
 ) -> None:
     circuit = Circuit(4, [2, 2, 3, 3])
     circuit.append_gate(CNOTGate(), [0, 1])
     assert isinstance(
         circuit.is_cycle_unoccupied(
             valid_int,
             location,
         ),
         (bool, np.bool_),
     )
Пример #29
0
    def test_1_gate(self) -> None:
        u1 = unitary_group.rvs(8)
        g1 = VariableUnitaryGate(3)
        circuit = Circuit(3)
        circuit.append_gate(g1, [0, 1, 2])
        params = QFactor().instantiate(circuit, u1, circuit.get_params())
        circuit.set_params(params)

        g1_params = list(np.reshape(u1, (64, )))
        g1_params = list(np.real(g1_params)) + list(np.imag(g1_params))

        assert np.allclose(
            circuit.get_unitary().get_numpy(),
            g1.get_unitary(g1_params).get_numpy(),
        )
Пример #30
0
def simple_circuit() -> Circuit:
    """Provides a simple circuit fixture."""
    circuit = Circuit(2)
    circuit.append_gate(XGate(), [0])
    circuit.append_gate(CNOTGate(), [0, 1])
    circuit.append_gate(XGate(), [1])
    circuit.append_gate(CNOTGate(), [1, 0])
    return circuit