def test_mixed_inversion_with_nested_context(self): """Test that a sequence of operations is properly inverted when a nested context is present. Test that this also works for operations that were not queued.""" X0 = qml.PauliX(0) Z0 = qml.PauliZ(0) with pu.OperationRecorder() as rec1: with pu.OperationRecorder() as rec2: qml.Hadamard(wires=[0]) qml.CNOT(wires=[0, 1]) pu.inv([X0, qml.RX(1, wires=[0]), Z0, qml.RY(2, wires=[0])]) qml.CNOT(wires=[0, 1]) qml.Hadamard(wires=[0]) inv_queue = [ qml.Hadamard(wires=[0]), qml.CNOT(wires=[0, 1]), qml.RY(2, wires=[0]).inv(), qml.PauliZ(0).inv(), qml.RX(1, wires=[0]).inv(), qml.PauliX(0).inv(), qml.CNOT(wires=[0, 1]), qml.Hadamard(wires=[0]), ] for inv_op, exp_op in zip(rec1.queue, inv_queue): assert inv_op.name == exp_op.name assert inv_op.wires == exp_op.wires assert inv_op.params == exp_op.params for inv_op, exp_op in zip(rec2.queue, inv_queue): assert inv_op.name == exp_op.name assert inv_op.wires == exp_op.wires assert inv_op.params == exp_op.params
def test_non_queued_inversion_with_context(self): """Test that a sequence of operations is properly inverted when a context is present. Test that this also works for operations that were not queued.""" inv_ops = [qml.RX(1, wires=[0]), qml.RY(2, wires=[0]), qml.RZ(3, wires=[0])] with pu.OperationRecorder() as rec: qml.Hadamard(wires=[0]) qml.CNOT(wires=[0, 1]) pu.inv(inv_ops) qml.CNOT(wires=[0, 1]) qml.Hadamard(wires=[0]) inv_queue = [ qml.Hadamard(wires=[0]), qml.CNOT(wires=[0, 1]), qml.RZ(3, wires=[0]).inv(), qml.RY(2, wires=[0]).inv(), qml.RX(1, wires=[0]).inv(), qml.CNOT(wires=[0, 1]), qml.Hadamard(wires=[0]), ] for inv_op, exp_op in zip(rec.queue, inv_queue): assert inv_op.name == exp_op.name assert inv_op.wires == exp_op.wires assert inv_op.params == exp_op.params
def test_template_with_return_integration(self): """Tests that the OperationRecorder integrates well with the core behaviour of PennyLane.""" expected_output = ( "Operations\n" + "==========\n" + "RZ(0, wires=[0])\n" + "RZ(3, wires=[0])\n" + "RZ(6, wires=[0])\n" + "RZ(9, wires=[0])\n" + "RZ(12, wires=[0])\n" + "\n" + "Observables\n" + "==========\n" + "var(PauliZ(wires=[0]))\n" + "sample(PauliX(wires=[1]))\n" ) def template(x): for i in range(5): qml.RZ(i * x, wires=0) return qml.var(qml.PauliZ(0)), qml.sample(qml.PauliX(1)) with pu.OperationRecorder() as recorder: template(3) assert str(recorder) == expected_output
def test_inversion_with_context(self): """Test that a sequence of operations is properly inverted when a context is present.""" with pu.OperationRecorder() as rec: qml.Hadamard(wires=[0]) qml.CNOT(wires=[0, 1]) pu.inv([ qml.RX(1, wires=[0]), qml.RY(2, wires=[0]), qml.RZ(3, wires=[0]) ]) qml.CNOT(wires=[0, 1]) qml.Hadamard(wires=[0]) inv_queue = [ qml.Hadamard(wires=[0]), qml.CNOT(wires=[0, 1]), qml.RZ(3, wires=[0]).inv(), qml.RY(2, wires=[0]).inv(), qml.RX(1, wires=[0]).inv(), qml.CNOT(wires=[0, 1]), qml.Hadamard(wires=[0]), ] for inv_op, exp_op in zip(rec.queue, inv_queue): assert inv_op.name == exp_op.name assert inv_op.wires == exp_op.wires assert inv_op.data == exp_op.data
def test_context_switching(self, monkeypatch): """Test that the current QNode context is properly switched.""" monkeypatch.setattr(qml, "_current_context", "Test") assert qml._current_context == "Test" with pu.OperationRecorder() as recorder: assert recorder.old_context == "Test" assert qml._current_context == recorder.rec assert qml._current_context == "Test"
def test_template_integration(self): """Tests that the OperationRecorder integrates well with the core behaviour of PennyLane.""" expected_output = ("Operations\n" + "==========\n" + "RZ(0, wires=[0])\n" + "RZ(3, wires=[0])\n" + "RZ(6, wires=[0])\n" + "RZ(9, wires=[0])\n" + "RZ(12, wires=[0])\n" + "\n" + "Observables\n" + "==========\n") def template(x): for i in range(5): qml.RZ(i * x, wires=0) with pu.OperationRecorder() as recorder: template(3) assert str(recorder) == expected_output
def circuit(a, b, c): qml.RX(a, wires=0) qml.RY(b, wires=1) with pu.OperationRecorder() as recorder: ops = [ qml.PauliY(0), qml.PauliY(1), qml.RZ(c, wires=0), qml.RZ(c, wires=1), qml.CNOT(wires=[0, 1]), ] assert str(recorder) == expected_output assert recorder.queue == ops return qml.expval(qml.PauliZ(0)), qml.expval(qml.PauliZ(1))
def test_template_inversion_with_context(self): """Test that a template is properly inverted when a context is present.""" with pu.OperationRecorder() as rec: qml.Hadamard(wires=[0]) qml.CNOT(wires=[0, 1]) pu.inv(dummy_template([0, 1, 2])) qml.CNOT(wires=[0, 1]) qml.Hadamard(wires=[0]) inv_queue = [ qml.Hadamard(wires=[0]), qml.CNOT(wires=[0, 1]), *inverted_dummy_template_operations([0, 1, 2]), qml.CNOT(wires=[0, 1]), qml.Hadamard(wires=[0]), ] for inv_op, exp_op in zip(rec.queue, inv_queue): assert inv_op.name == exp_op.name assert inv_op.wires == exp_op.wires assert inv_op.params == exp_op.params
def test_context_adding(self, monkeypatch): """Test that the OperationRecorder is added to the list of contexts.""" with pu.OperationRecorder() as recorder: assert recorder in qml.QueuingContext._active_contexts assert recorder not in qml.QueuingContext._active_contexts