def test_binding_parameters_does_not_change_parameters_without_free_symbols( self): theta = sympy.Symbol("theta") gate = MatrixFactoryGate("V", example_one_qubit_matrix_factory, (1, 2), 1) new_gate = gate.bind({theta: 5.0}) assert new_gate.params == (1, 2)
def test_binding_parameters_with_symbol_outside_of_free_symbols_does_not_raise( self, ): gamma, theta = sympy.symbols("gamma, theta") params = (theta, 2 * theta) gate = MatrixFactoryGate("U", example_one_qubit_matrix_factory, params, 1) new_gate = gate.bind({gamma: 0.5, theta: 1}) assert new_gate.params == (1, 2)
def test_replace_parameters_correctly_gives_instance_with_correctly_set_parameters( self, ): theta = sympy.Symbol("theta") gate = MatrixFactoryGate("V", example_one_qubit_matrix_factory, (1, 2), 1) new_gate = gate.replace_params((theta, 0.5)) assert new_gate == MatrixFactoryGate("V", example_one_qubit_matrix_factory, (theta, 0.5), 1)
def test_binding_parameters_creates_new_instance_with_substituted_free_params( self): gamma, theta, x, y = sympy.symbols("gamma, theta, x, y") params = (theta, x + y) gate = MatrixFactoryGate("U", example_one_qubit_matrix_factory, params, 1) new_gate = gate.bind({theta: 0.5, x: gamma, y: 3}) assert new_gate.name == gate.name assert new_gate.matrix_factory == gate.matrix_factory assert new_gate.num_qubits == gate.num_qubits assert new_gate.params == (0.5, gamma + 3)
def _gate_definition_from_matrix_factory_gate( gate: _gates.MatrixFactoryGate, ) -> _gates.CustomGateDefinition: symbols = tuple( sympy.Symbol(f"theta_{i}") for i in range(len(gate.params))) template_matrix = gate.matrix_factory(*symbols) return _gates.CustomGateDefinition( gate_name=gate.name, matrix=template_matrix, params_ordering=symbols, )
def test_applying_gate_returns_operation_with_correct_gate_and_indices( self): theta = sympy.Symbol("theta") gamma = sympy.Symbol("gamma") gate = MatrixFactoryGate("A", example_two_qubit_matrix_factory, (theta, gamma, 42), 2) operation = gate(4, 1) assert operation.gate == gate assert operation.qubit_indices == (4, 1)
def test_constructs_its_matrix_by_calling_factory_with_bound_parameter( self, params, factory, num_qubits): wrapped_factory = Mock(wraps=factory) gate = MatrixFactoryGate("U", wrapped_factory, params, num_qubits) assert gate.matrix == factory(*params) wrapped_factory.assert_called_once_with(*params)
def test_applying_dagger_and_replacing_parameters_commutes(self): gate = MatrixFactoryGate("V", example_one_qubit_matrix_factory, (1, 0), 1) new_params = (sympy.Symbol("theta"), 4.2) assert (gate.dagger.replace_params(new_params) == gate.replace_params( new_params).dagger)
def test_dagger_of_dagger_is_the_same_as_original_gate(self): gate = MatrixFactoryGate("V", example_one_qubit_matrix_factory, (1, 0), 1) assert gate.dagger.dagger is gate
def test_binding_gates_in_dagger_is_propagated_to_wrapped_gate(self): theta = sympy.Symbol("theta") gate = MatrixFactoryGate("V", example_one_qubit_matrix_factory, (theta, 0), 1) assert gate.dagger.bind({theta: 0.5}) == gate.bind({theta: 0.5}).dagger
def test_dagger_of_hermitian_gate_is_the_same_gate(self): gate = MatrixFactoryGate("V", example_one_qubit_matrix_factory, (1, 0), 1, is_hermitian=True) assert gate.dagger is gate
def test_dagger_has_the_same_params_and_num_qubits_as_wrapped_gate(self): gate = MatrixFactoryGate("U", example_two_qubit_matrix_factory, (0.5, 0.1, sympy.Symbol("a")), 2) assert gate.dagger.num_qubits == gate.num_qubits assert gate.dagger.params == gate.params
def test_daggers_matrix_is_adjoint_of_original_gates_matrix(self): gate = MatrixFactoryGate("V", example_one_qubit_matrix_factory, (1, 2), 1) assert gate.dagger.matrix == gate.matrix.adjoint()