Skip to content

Commit

Permalink
Removed in-place inversion (#122)
Browse files Browse the repository at this point in the history
* Replaced all instances of inv with qml.adjoint()

* Fixed tests

* Updated changelog
  • Loading branch information
mudit2812 committed Feb 10, 2023
1 parent c5637ab commit f6f8dad
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 71 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion pennylane_rigetti/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
176 changes: 106 additions & 70 deletions tests/test_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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]),
Expand Down Expand Up @@ -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]),
]

Expand Down Expand Up @@ -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]),
]
Expand Down

0 comments on commit f6f8dad

Please sign in to comment.