def test_independent_no_graph_mode(self): """In non-graph mode, it is impossible to determine if a parameter is independent or not""" with qml.tape.JacobianTape() as tape: qml.RX(0.543, wires=[0]) qml.RY(-0.654, wires=[1]) qml.expval(qml.PauliY(0)) _gradient_analysis(tape, use_graph=False) assert tape._par_info[0]["grad_method"] == "A" assert tape._par_info[1]["grad_method"] == "A"
def test_independent(self): """Test that an independent variable is properly marked as having a zero gradient""" with qml.tape.JacobianTape() as tape: qml.RX(0.543, wires=[0]) qml.RY(-0.654, wires=[1]) qml.expval(qml.PauliY(0)) _gradient_analysis(tape) assert tape._par_info[0]["grad_method"] == "A" assert tape._par_info[1]["grad_method"] == "0"
def test_non_differentiable(self): """Test that a non-differentiable parameter is correctly marked""" psi = np.array([1, 0, 1, 0]) / np.sqrt(2) with qml.tape.JacobianTape() as tape: qml.QubitStateVector(psi, wires=[0, 1]) qml.RX(0.543, wires=[0]) qml.RY(-0.654, wires=[1]) qml.CNOT(wires=[0, 1]) qml.probs(wires=[0, 1]) _gradient_analysis(tape) assert tape._par_info[0]["grad_method"] is None assert tape._par_info[1]["grad_method"] == "A" assert tape._par_info[2]["grad_method"] == "A"
def test_finite_diff(self, monkeypatch): """If an op has grad_method=F, this should be respected""" monkeypatch.setattr(qml.RX, "grad_method", "F") psi = np.array([1, 0, 1, 0]) / np.sqrt(2) with qml.tape.JacobianTape() as tape: qml.QubitStateVector(psi, wires=[0, 1]) qml.RX(0.543, wires=[0]) qml.RY(-0.654, wires=[1]) qml.CNOT(wires=[0, 1]) qml.probs(wires=[0, 1]) _gradient_analysis(tape) assert tape._par_info[0]["grad_method"] is None assert tape._par_info[1]["grad_method"] == "F" assert tape._par_info[2]["grad_method"] == "A"
def test_analysis_caching(self, mocker): """Test that the gradient analysis is only executed once per tape""" psi = np.array([1, 0, 1, 0]) / np.sqrt(2) with qml.tape.JacobianTape() as tape: qml.QubitStateVector(psi, wires=[0, 1]) qml.RX(0.543, wires=[0]) qml.RY(-0.654, wires=[1]) qml.CNOT(wires=[0, 1]) qml.probs(wires=[0, 1]) spy = mocker.spy(tape, "_grad_method") _gradient_analysis(tape) spy.assert_called() assert tape._par_info[0]["grad_method"] is None assert tape._par_info[1]["grad_method"] == "A" assert tape._par_info[2]["grad_method"] == "A" spy = mocker.spy(tape, "_grad_method") _gradient_analysis(tape) spy.assert_not_called()