class_docstr: Test for adjoint_vjp
docstr: Test VJP is correct for multiple parameters and observables
docstr_tok: ["Test","VJP","is","correct","for","multiple","parameters","and","observables"]
code: def test_multi_param_multi_obs(self, cotangents, tol):
      """Test VJP is correct for multiple parameters and observables"""
      x = np.array(0.654)
      y = np.array(1.221)
  
      obs = [
          qml.expval(qml.PauliZ(0)),
          qml.expval(qml.PauliX(0)),
          qml.expval(qml.PauliY(0)),
      ]
      qs = QuantumScript(
          [qml.RY(x, 0), qml.RZ(y, 0)], obs, trainable_params=[0, 1]
      )
  
      actual = adjoint_vjp(qs, cotangents)
      assert isinstance(actual, tuple)
      assert len(actual) == 2
  
      jac = np.array(
          [
              [-np.sin(x), 0],
              [np.cos(x) * np.cos(y), -np.sin(x) * np.sin(y)],
              [np.cos(x) * np.sin(y), np.sin(x) * np.cos(y)],
          ]
      )
      expected = np.array(cotangents) @ jac
      assert np.allclose(actual, expected, atol=tol)
  
imports: import pytest
  import pennylane
  from pennylane.devices.qubit import adjoint_jacobian, adjoint_jvp, adjoint_vjp
  from pennylane.tape import QuantumScript
  import pennylane.numpy
label_desc: Use image node_id 4 for calling the TestAdjointVJP obj's underlying member method code with example usage: obj.test_multi_param_multi_obs(cotangents, tol) without return types