diff --git a/CHANGELOG.md b/CHANGELOG.md index c4479e4d..a5e481e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ * `pennylane-rigetti` no longer supports `python3.7`. A newer python version is required. [(#121)](https://github.com/PennyLaneAI/pennylane-rigetti/pull/121) +* Removed the use of in-place inversion for PennyLane operations. + [(#122)](https://github.com/PennyLaneAI/pennylane-rigetti/pull/122) + ### Improvements ### Documentation diff --git a/pennylane_rigetti/converter.py b/pennylane_rigetti/converter.py index c12174d5..b3b0d832 100644 --- a/pennylane_rigetti/converter.py +++ b/pennylane_rigetti/converter.py @@ -288,7 +288,7 @@ def instantiate(self, parameter_map, qubit_to_wire_map): pl_gate_instance = self.pl_gate(*resolved_params, wires=resolved_wires) if self.is_inverted: - pl_gate_instance.inv() + return qml.adjoint(pl_gate_instance) return pl_gate_instance diff --git a/tests/test_converter.py b/tests/test_converter.py index e6df48da..5a09f2f6 100644 --- a/tests/test_converter.py +++ b/tests/test_converter.py @@ -18,116 +18,152 @@ class TestProgramConverter: [ (g.I(0), qml.Identity(wires=[0])), (g.H(0), qml.Hadamard(0)), - (g.H(0).dagger(), qml.Hadamard(0).inv()), - (g.H(0).dagger().dagger(), qml.Hadamard(0).inv().inv()), + (g.H(0).dagger(), qml.adjoint(qml.Hadamard(0))), + (g.H(0).dagger().dagger(), qml.Hadamard(0)), (g.S(0), qml.S(wires=[0])), - (g.S(0).dagger(), qml.S(wires=[0]).inv()), - (g.S(0).dagger().dagger(), qml.S(wires=[0]).inv().inv()), + (g.S(0).dagger(), qml.adjoint(qml.S(wires=[0]))), + (g.S(0).dagger().dagger(), qml.S(wires=[0])), (g.T(0), qml.T(wires=[0])), - (g.T(0).dagger(), qml.T(wires=[0]).inv()), - (g.T(0).dagger().dagger(), qml.T(wires=[0]).inv().inv()), + (g.T(0).dagger(), qml.adjoint(qml.T(wires=[0]))), + (g.T(0).dagger().dagger(), qml.T(wires=[0])), (g.X(0), qml.PauliX(0)), - (g.X(0).dagger(), qml.PauliX(0).inv()), - (g.X(0).dagger().dagger(), qml.PauliX(0).inv().inv()), + (g.X(0).dagger(), qml.adjoint(qml.PauliX(0))), + (g.X(0).dagger().dagger(), qml.PauliX(0)), (g.X(0).controlled(1), qml.CNOT(wires=[1, 0])), - (g.X(0).controlled(1).dagger(), qml.CNOT(wires=[1, 0]).inv()), - (g.X(0).controlled(1).dagger().dagger(), qml.CNOT(wires=[1, 0]).inv().inv()), + (g.X(0).controlled(1).dagger(), qml.adjoint(qml.CNOT(wires=[1, 0]))), + ( + g.X(0).controlled(1).dagger().dagger(), + qml.CNOT(wires=[1, 0]), + ), (g.X(0).controlled(1).controlled(2), qml.Toffoli(wires=[2, 1, 0])), - (g.X(0).controlled(1).controlled(2).dagger(), qml.Toffoli(wires=[2, 1, 0]).inv()), + ( + g.X(0).controlled(1).controlled(2).dagger(), + qml.adjoint(qml.Toffoli(wires=[2, 1, 0])), + ), ( g.X(0).controlled(1).controlled(2).dagger().dagger(), - qml.Toffoli(wires=[2, 1, 0]).inv().inv(), + qml.Toffoli(wires=[2, 1, 0]), ), (g.Y(0), qml.PauliY(0)), - (g.Y(0).dagger(), qml.PauliY(0).inv()), - (g.Y(0).dagger().dagger(), qml.PauliY(0).inv().inv()), + (g.Y(0).dagger(), qml.adjoint(qml.PauliY(0))), + (g.Y(0).dagger().dagger(), qml.PauliY(0)), (g.Z(0), qml.PauliZ(0)), - (g.Z(0).dagger(), qml.PauliZ(0).inv()), - (g.Z(0).dagger().dagger(), qml.PauliZ(0).inv().inv()), + (g.Z(0).dagger(), qml.adjoint(qml.PauliZ(0))), + (g.Z(0).dagger().dagger(), qml.PauliZ(0)), (g.Z(0).controlled(1), qml.CZ(wires=[1, 0])), - (g.Z(0).controlled(1).dagger(), qml.CZ(wires=[1, 0]).inv()), - (g.Z(0).controlled(1).dagger().dagger(), qml.CZ(wires=[1, 0]).inv().inv()), + (g.Z(0).controlled(1).dagger(), qml.adjoint(qml.CZ(wires=[1, 0]))), + ( + g.Z(0).controlled(1).dagger().dagger(), + qml.CZ(wires=[1, 0]), + ), (g.CNOT(0, 1), qml.CNOT(wires=[0, 1])), - (g.CNOT(0, 1).dagger(), qml.CNOT(wires=[0, 1]).inv()), - (g.CNOT(0, 1).dagger().dagger(), qml.CNOT(wires=[0, 1]).inv().inv()), + (g.CNOT(0, 1).dagger(), qml.adjoint(qml.CNOT(wires=[0, 1]))), + (g.CNOT(0, 1).dagger().dagger(), qml.CNOT(wires=[0, 1])), (g.CNOT(0, 1).controlled(2), qml.Toffoli(wires=[2, 0, 1])), - (g.CNOT(0, 1).controlled(2).dagger(), qml.Toffoli(wires=[2, 0, 1]).inv()), + (g.CNOT(0, 1).controlled(2).dagger(), qml.adjoint(qml.Toffoli(wires=[2, 0, 1]))), ( g.CNOT(0, 1).controlled(2).dagger().dagger(), - qml.Toffoli(wires=[2, 0, 1]).inv().inv(), + qml.Toffoli(wires=[2, 0, 1]), ), (g.SWAP(0, 1), qml.SWAP(wires=[0, 1])), - (g.SWAP(0, 1).dagger(), qml.SWAP(wires=[0, 1]).inv()), - (g.SWAP(0, 1).dagger().dagger(), qml.SWAP(wires=[0, 1]).inv().inv()), + (g.SWAP(0, 1).dagger(), qml.adjoint(qml.SWAP(wires=[0, 1]))), + (g.SWAP(0, 1).dagger().dagger(), qml.SWAP(wires=[0, 1])), (g.SWAP(0, 1).controlled(2), qml.CSWAP(wires=[2, 0, 1])), - (g.SWAP(0, 1).controlled(2).dagger(), qml.CSWAP(wires=[2, 0, 1]).inv()), - (g.SWAP(0, 1).controlled(2).dagger().dagger(), qml.CSWAP(wires=[2, 0, 1]).inv().inv()), + (g.SWAP(0, 1).controlled(2).dagger(), qml.adjoint(qml.CSWAP(wires=[2, 0, 1]))), + ( + g.SWAP(0, 1).controlled(2).dagger().dagger(), + qml.CSWAP(wires=[2, 0, 1]), + ), (g.ISWAP(0, 1), qml.ISWAP(wires=[0, 1])), - (g.ISWAP(0, 1).dagger(), qml.ISWAP(wires=[0, 1]).inv()), - (g.ISWAP(0, 1).dagger().dagger(), qml.ISWAP(wires=[0, 1]).inv().inv()), + (g.ISWAP(0, 1).dagger(), qml.adjoint(qml.ISWAP(wires=[0, 1]))), + (g.ISWAP(0, 1).dagger().dagger(), qml.ISWAP(wires=[0, 1])), (g.PSWAP(0.3, 0, 1), qml.PSWAP(0.3, wires=[0, 1])), - (g.PSWAP(0.3, 0, 1).dagger(), qml.PSWAP(0.3, wires=[0, 1]).inv()), - (g.PSWAP(0.3, 0, 1).dagger().dagger(), qml.PSWAP(0.3, wires=[0, 1]).inv().inv()), + (g.PSWAP(0.3, 0, 1).dagger(), qml.adjoint(qml.PSWAP(0.3, wires=[0, 1]))), + ( + g.PSWAP(0.3, 0, 1).dagger().dagger(), + qml.PSWAP(0.3, wires=[0, 1]), + ), (g.CZ(0, 1), qml.CZ(wires=[0, 1])), - (g.CZ(0, 1).dagger(), qml.CZ(wires=[0, 1]).inv()), - (g.CZ(0, 1).dagger().dagger(), qml.CZ(wires=[0, 1]).inv().inv()), + (g.CZ(0, 1).dagger(), qml.adjoint(qml.CZ(wires=[0, 1]))), + (g.CZ(0, 1).dagger().dagger(), qml.CZ(wires=[0, 1])), (g.PHASE(0.3, 0), qml.PhaseShift(0.3, wires=[0])), - (g.PHASE(0.3, 0).dagger(), qml.PhaseShift(0.3, wires=[0]).inv()), - (g.PHASE(0.3, 0).dagger().dagger(), qml.PhaseShift(0.3, wires=[0]).inv().inv()), + (g.PHASE(0.3, 0).dagger(), qml.adjoint(qml.PhaseShift(0.3, wires=[0]))), + ( + g.PHASE(0.3, 0).dagger().dagger(), + qml.PhaseShift(0.3, wires=[0]), + ), (g.PHASE(0.3, 0).controlled(1), plf.ops.CPHASE(0.3, 3, wires=[1, 0])), - (g.PHASE(0.3, 0).controlled(1).dagger(), plf.ops.CPHASE(0.3, 3, wires=[1, 0]).inv()), + ( + g.PHASE(0.3, 0).controlled(1).dagger(), + qml.adjoint(plf.ops.CPHASE(0.3, 3, wires=[1, 0])), + ), ( g.PHASE(0.3, 0).controlled(1).dagger().dagger(), - plf.ops.CPHASE(0.3, 3, wires=[1, 0]).inv().inv(), + plf.ops.CPHASE(0.3, 3, wires=[1, 0]), ), (g.RX(0.3, 0), qml.RX(0.3, wires=[0])), - (g.RX(0.3, 0).dagger(), qml.RX(0.3, wires=[0]).inv()), - (g.RX(0.3, 0).dagger().dagger(), qml.RX(0.3, wires=[0]).inv().inv()), + (g.RX(0.3, 0).dagger(), qml.adjoint(qml.RX(0.3, wires=[0]))), + (g.RX(0.3, 0).dagger().dagger(), qml.RX(0.3, wires=[0])), (g.RX(0.3, 0).controlled(1), qml.CRX(0.3, wires=[1, 0])), - (g.RX(0.3, 0).controlled(1).dagger(), qml.CRX(0.3, wires=[1, 0]).inv()), - (g.RX(0.3, 0).controlled(1).dagger().dagger(), qml.CRX(0.3, wires=[1, 0]).inv().inv()), + (g.RX(0.3, 0).controlled(1).dagger(), qml.adjoint(qml.CRX(0.3, wires=[1, 0]))), + ( + g.RX(0.3, 0).controlled(1).dagger().dagger(), + qml.CRX(0.3, wires=[1, 0]), + ), (g.RY(0.3, 0), qml.RY(0.3, wires=[0])), - (g.RY(0.3, 0).dagger(), qml.RY(0.3, wires=[0]).inv()), - (g.RY(0.3, 0).dagger().dagger(), qml.RY(0.3, wires=[0]).inv().inv()), + (g.RY(0.3, 0).dagger(), qml.adjoint(qml.RY(0.3, wires=[0]))), + (g.RY(0.3, 0).dagger().dagger(), qml.RY(0.3, wires=[0])), (g.RY(0.3, 0).controlled(1), qml.CRY(0.3, wires=[1, 0])), - (g.RY(0.3, 0).controlled(1).dagger(), qml.CRY(0.3, wires=[1, 0]).inv()), - (g.RY(0.3, 0).controlled(1).dagger().dagger(), qml.CRY(0.3, wires=[1, 0]).inv().inv()), + (g.RY(0.3, 0).controlled(1).dagger(), qml.adjoint(qml.CRY(0.3, wires=[1, 0]))), + ( + g.RY(0.3, 0).controlled(1).dagger().dagger(), + qml.CRY(0.3, wires=[1, 0]), + ), (g.RZ(0.3, 0), qml.RZ(0.3, wires=[0])), - (g.RZ(0.3, 0).dagger(), qml.RZ(0.3, wires=[0]).inv()), - (g.RZ(0.3, 0).dagger().dagger(), qml.RZ(0.3, wires=[0]).inv().inv()), + (g.RZ(0.3, 0).dagger(), qml.adjoint(qml.RZ(0.3, wires=[0]))), + (g.RZ(0.3, 0).dagger().dagger(), qml.RZ(0.3, wires=[0])), (g.RZ(0.3, 0).controlled(1), qml.CRZ(0.3, wires=[1, 0])), - (g.RZ(0.3, 0).controlled(1).dagger(), qml.CRZ(0.3, wires=[1, 0]).inv()), - (g.RZ(0.3, 0).controlled(1).dagger().dagger(), qml.CRZ(0.3, wires=[1, 0]).inv().inv()), + (g.RZ(0.3, 0).controlled(1).dagger(), qml.adjoint(qml.CRZ(0.3, wires=[1, 0]))), + ( + g.RZ(0.3, 0).controlled(1).dagger().dagger(), + qml.CRZ(0.3, wires=[1, 0]), + ), (g.CPHASE(0.3, 0, 1), plf.ops.CPHASE(0.3, 3, wires=[0, 1])), - (g.CPHASE(0.3, 0, 1).dagger(), plf.ops.CPHASE(0.3, 3, wires=[0, 1]).inv()), + (g.CPHASE(0.3, 0, 1).dagger(), qml.adjoint(plf.ops.CPHASE(0.3, 3, wires=[0, 1]))), ( g.CPHASE(0.3, 0, 1).dagger().dagger(), - plf.ops.CPHASE(0.3, 3, wires=[0, 1]).inv().inv(), + plf.ops.CPHASE(0.3, 3, wires=[0, 1]), ), (g.CPHASE00(0.3, 0, 1), plf.ops.CPHASE(0.3, 0, wires=[0, 1])), - (g.CPHASE00(0.3, 0, 1).dagger(), plf.ops.CPHASE(0.3, 0, wires=[0, 1]).inv()), + (g.CPHASE00(0.3, 0, 1).dagger(), qml.adjoint(plf.ops.CPHASE(0.3, 0, wires=[0, 1]))), ( g.CPHASE00(0.3, 0, 1).dagger().dagger(), - plf.ops.CPHASE(0.3, 0, wires=[0, 1]).inv().inv(), + plf.ops.CPHASE(0.3, 0, wires=[0, 1]), ), (g.CPHASE01(0.3, 0, 1), plf.ops.CPHASE(0.3, 1, wires=[0, 1])), - (g.CPHASE01(0.3, 0, 1).dagger(), plf.ops.CPHASE(0.3, 1, wires=[0, 1]).inv()), + (g.CPHASE01(0.3, 0, 1).dagger(), qml.adjoint(plf.ops.CPHASE(0.3, 1, wires=[0, 1]))), ( g.CPHASE01(0.3, 0, 1).dagger().dagger(), - plf.ops.CPHASE(0.3, 1, wires=[0, 1]).inv().inv(), + plf.ops.CPHASE(0.3, 1, wires=[0, 1]), ), (g.CPHASE10(0.3, 0, 1), plf.ops.CPHASE(0.3, 2, wires=[0, 1])), - (g.CPHASE10(0.3, 0, 1).dagger(), plf.ops.CPHASE(0.3, 2, wires=[0, 1]).inv()), + (g.CPHASE10(0.3, 0, 1).dagger(), qml.adjoint(plf.ops.CPHASE(0.3, 2, wires=[0, 1]))), ( g.CPHASE10(0.3, 0, 1).dagger().dagger(), - plf.ops.CPHASE(0.3, 2, wires=[0, 1]).inv().inv(), + plf.ops.CPHASE(0.3, 2, wires=[0, 1]), ), (g.CSWAP(0, 1, 2), qml.CSWAP(wires=[0, 1, 2])), - (g.CSWAP(0, 1, 2).dagger(), qml.CSWAP(wires=[0, 1, 2]).inv()), - (g.CSWAP(0, 1, 2).dagger().dagger(), qml.CSWAP(wires=[0, 1, 2]).inv().inv()), + (g.CSWAP(0, 1, 2).dagger(), qml.adjoint(qml.CSWAP(wires=[0, 1, 2]))), + ( + g.CSWAP(0, 1, 2).dagger().dagger(), + qml.CSWAP(wires=[0, 1, 2]), + ), (g.CCNOT(0, 1, 2), qml.Toffoli(wires=[0, 1, 2])), - (g.CCNOT(0, 1, 2).dagger(), qml.Toffoli(wires=[0, 1, 2]).inv()), - (g.CCNOT(0, 1, 2).dagger().dagger(), qml.Toffoli(wires=[0, 1, 2]).inv().inv()), + (g.CCNOT(0, 1, 2).dagger(), qml.adjoint(qml.Toffoli(wires=[0, 1, 2]))), + ( + g.CCNOT(0, 1, 2).dagger().dagger(), + qml.Toffoli(wires=[0, 1, 2]), + ), ], ) def test_convert_operation(self, pyquil_operation, expected_pl_operation): @@ -353,11 +389,11 @@ def test_convert_program_with_inverses(self): expected_queue = [ qml.Hadamard(0), - qml.RZ(0.34, wires=[1]).inv(), - qml.CNOT(wires=[0, 3]).inv(), + qml.adjoint(qml.RZ(0.34, wires=[1])), + qml.adjoint(qml.CNOT(wires=[0, 3])), qml.Hadamard(2), qml.Hadamard(4), - qml.PauliX(4).inv(), + qml.adjoint(qml.PauliX(4)), qml.PauliX(4), qml.PauliY(1), qml.RZ(0.34, wires=[1]), @@ -453,15 +489,15 @@ def test_convert_program_with_controlled_dagger_operations(self): expected_queue = [ qml.Toffoli(wires=[2, 0, 1]), - qml.Toffoli(wires=[2, 0, 1]).inv(), - qml.Toffoli(wires=[2, 0, 1]).inv(), + qml.adjoint(qml.Toffoli(wires=[2, 0, 1])), + qml.adjoint(qml.Toffoli(wires=[2, 0, 1])), qml.Toffoli(wires=[2, 0, 1]), qml.CRX(0.3, wires=[4, 3]), - qml.CRX(0.2, wires=[4, 3]).inv(), - qml.CRX(0.3, wires=[4, 3]).inv(), + qml.adjoint(qml.CRX(0.2, wires=[4, 3])), + qml.adjoint(qml.CRX(0.3, wires=[4, 3])), qml.CRX(0.2, wires=[4, 3]), qml.Toffoli(wires=[1, 4, 2]), - qml.Toffoli(wires=[1, 4, 0]).inv(), + qml.adjoint(qml.Toffoli(wires=[1, 4, 0])), qml.Toffoli(wires=[1, 4, 0]), ] @@ -784,11 +820,11 @@ def test_convert_complex_program(self): expected_queue = [ qml.Hadamard(0), - qml.RZ(0.34, wires=[1]).inv(), + qml.adjoint(qml.RZ(0.34, wires=[1])), qml.CNOT(wires=[0, 3]), qml.Hadamard(2), qml.QubitUnitary(CS_matrix, wires=[1, 4]), - qml.CNOT(wires=[3, 4]).inv(), + qml.adjoint(qml.CNOT(wires=[3, 4])), qml.PauliY(1), qml.RZ(0.34, wires=[1]), ]