Esempio n. 1
0
 def test_empty(self) -> None:
     circuit = Circuit(1)
     assert circuit.get_num_params() == 0
     circuit = Circuit(4)
     assert circuit.get_num_params() == 0
     circuit = Circuit(4, [2, 3, 4, 5])
     assert circuit.get_num_params() == 0
Esempio n. 2
0
 def test_inserting_gate(self) -> None:
     circuit = Circuit(1)
     assert circuit.get_num_params() == 0
     circuit.insert_gate(0, U3Gate(), [0])
     assert circuit.get_num_params() == 3
     circuit.insert_gate(0, U3Gate(), [0])
     assert circuit.get_num_params() == 6
     circuit.insert_gate(0, U3Gate(), [0])
     assert circuit.get_num_params() == 9
Esempio n. 3
0
 def test_adding_gate(self) -> None:
     circuit = Circuit(1)
     assert circuit.get_num_params() == 0
     circuit.append_gate(U3Gate(), [0])
     assert circuit.get_num_params() == 3
     circuit.append_gate(U3Gate(), [0])
     assert circuit.get_num_params() == 6
     circuit.append_gate(U3Gate(), [0])
     assert circuit.get_num_params() == 9
Esempio n. 4
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
Esempio n. 5
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
Esempio n. 6
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)
Esempio n. 7
0
def test_hilbert_schmidt_residuals(r3_qubit_circuit: Circuit) -> None:
    x0 = np.random.random((r3_qubit_circuit.get_num_params(), ))
    cost = HilbertSchmidtResidualsGenerator().gen_cost(
        r3_qubit_circuit,
        r3_qubit_circuit.get_unitary(x0),
    )
    assert cost.get_cost(x0) < 1e-10
Esempio n. 8
0
    def test_2_gate(self) -> None:
        g1 = VariableUnitaryGate(2)
        g2 = VariableUnitaryGate(3)
        g3 = RXGate()
        circuit = Circuit(4)
        circuit.append_gate(g1, [0, 1])
        circuit.append_gate(g2, [1, 2, 3])
        circuit.append_gate(g3, [1])
        utry = circuit.get_unitary(np.random.random(circuit.get_num_params()))
        params = QFactor().instantiate(circuit, utry, circuit.get_params())

        circuit.set_params(params)

        assert np.allclose(
            circuit.get_unitary().get_numpy(),
            utry.get_numpy(),
        )
Esempio n. 9
0
    def gen_starting_points(
        self,
        multistarts: int,
        circuit: Circuit,
        target: UnitaryMatrix | StateVector,
    ) -> list[np.ndarray]:
        """
        Generate `multistarts` starting points for instantiation.

        Args:
            multistarts (int): The number of starting points to generate.

            circuit (Circuit): The circuit to generate the points for.

            target (UnitaryMatrix | StateVector): The target.

        Return:
            (list[np.ndarray]): List of starting inputs for instantiation.

        Raises:
            ValueError: If `multistarts` is not a positive integer.
        """
        if not is_integer(multistarts):
            raise TypeError(
                'Expected int for multistarts, got %s.' % type(multistarts),
            )

        if multistarts <= 0:
            raise ValueError(
                'Expected positive integer for multistarts'
                ', got %d' % multistarts,
            )

        return [  # [ circuit.get_params() ] + [  # TODO: re-evaluate
            np.random.random(circuit.get_num_params())
            for i in range(multistarts)
        ]
Esempio n. 10
0
 def test_count(self, r6_qudit_circuit: Circuit) -> None:
     num_params = r6_qudit_circuit.get_num_params()
     params = r6_qudit_circuit.get_params()
     assert len(params) == num_params
Esempio n. 11
0
 def test_get_num_params(self, simple_circuit: Circuit) -> None:
     assert simple_circuit.get_num_params() == 0
Esempio n. 12
0
 def test_value(self, r6_qudit_circuit: Circuit) -> None:
     assert r6_qudit_circuit.get_num_params() >= 0
Esempio n. 13
0
 def test_type(self, r6_qudit_circuit: Circuit) -> None:
     assert isinstance(r6_qudit_circuit.get_num_params(), int)
Esempio n. 14
0
 def test_get_num_params(self, toffoli_circuit: Circuit) -> None:
     assert toffoli_circuit.get_num_params() == 0
Esempio n. 15
0
def test_gradients_native(r3_qubit_circuit: Circuit) -> None:
    circ = Circ(r3_qubit_circuit)
    check_gradient(circ, r3_qubit_circuit.get_num_params())
Esempio n. 16
0
def test_gradients(r3_qubit_circuit: Circuit) -> None:
    check_gradient(r3_qubit_circuit, r3_qubit_circuit.get_num_params())