Skip to content

Commit

Permalink
Add OpType.CnRx and OpType.CnRz (#1405)
Browse files Browse the repository at this point in the history
* Add CnRx and CnRz

* Update circuit_test.py

* re clang format

* regen stubs

* Update changelog.rst

* bump version

* Unbump changelog...

oops

* Update ControlledGates.cpp

* split controlled phase gate decomp

* Update circuit_test.py

* Update OpType.hpp
  • Loading branch information
sjdilkes authored May 22, 2024
1 parent ecc9855 commit 7a3cf20
Show file tree
Hide file tree
Showing 33 changed files with 310 additions and 82 deletions.
8 changes: 8 additions & 0 deletions pytket/binders/circuit/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -439,10 +439,18 @@ PYBIND11_MODULE(circuit, m) {
":math:`(\\alpha, \\beta) \\mapsto \\mathrm{PhasedX}(\\alpha, \\beta)"
"^{\\otimes n}` (n-qubit gate composed of identical PhasedX in "
"parallel.")
.value(
"CnRx", OpType::CnRx,
":math:`(\\alpha)` := n-controlled "
":math:`\\mathrm{Rx}(\\alpha)` gate.")
.value(
"CnRy", OpType::CnRy,
":math:`(\\alpha)` := n-controlled "
":math:`\\mathrm{Ry}(\\alpha)` gate.")
.value(
"CnRz", OpType::CnRz,
":math:`(\\alpha)` := n-controlled "
":math:`\\mathrm{Rz}(\\alpha)` gate.")
.value("CnX", OpType::CnX, "n-controlled X gate.")
.value("CnY", OpType::CnY, "n-controlled Y gate.")
.value("CnZ", OpType::CnZ, "n-controlled Z gate.")
Expand Down
2 changes: 1 addition & 1 deletion pytket/binders/passes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ PYBIND11_MODULE(passes, m) {
m.def(
"DecomposeArbitrarilyControlledGates",
&DecomposeArbitrarilyControlledGates,
"Decomposes CCX, CnX, CnY, CnZ, and CnRy gates into "
"Decomposes CCX, CnX, CnY, CnZ, CnRy, CnRz and CnRx gates into "
"CX and single-qubit gates.");
m.def(
"DecomposeBoxes", &DecomposeBoxes,
Expand Down
2 changes: 1 addition & 1 deletion pytket/conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def package(self):
cmake.install()

def requirements(self):
self.requires("tket/1.3.0@tket/stable")
self.requires("tket/1.3.1@tket/stable")
self.requires("tklog/0.3.3@tket/stable")
self.requires("tkrng/0.3.3@tket/stable")
self.requires("tkassert/0.3.4@tket/stable")
Expand Down
4 changes: 4 additions & 0 deletions pytket/docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ Changelog
Unreleased
----------

Features:

* Add ``OpType.CnRx`` and ``OpType.CnRz``.

Fixes:

* Allow barriers when dagger or transpose a circuit.
Expand Down
60 changes: 33 additions & 27 deletions pytket/pytket/_tket/circuit.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -3250,8 +3250,12 @@ class OpType:
NPhasedX : :math:`(\\alpha, \\beta) \\mapsto \\mathrm{PhasedX}(\\alpha, \\beta)^{\\otimes n}` (n-qubit gate composed of identical PhasedX in parallel.
CnRx : :math:`(\\alpha)` := n-controlled :math:`\\mathrm{Rx}(\\alpha)` gate.
CnRy : :math:`(\\alpha)` := n-controlled :math:`\\mathrm{Ry}(\\alpha)` gate.
CnRz : :math:`(\\alpha)` := n-controlled :math:`\\mathrm{Rz}(\\alpha)` gate.
CnX : n-controlled X gate.
CnY : n-controlled Y gate.
Expand Down Expand Up @@ -3319,22 +3323,24 @@ class OpType:
CX: typing.ClassVar[OpType] # value = <OpType.CX: 45>
CY: typing.ClassVar[OpType] # value = <OpType.CY: 46>
CZ: typing.ClassVar[OpType] # value = <OpType.CZ: 47>
CircBox: typing.ClassVar[OpType] # value = <OpType.CircBox: 87>
ClassicalExpBox: typing.ClassVar[OpType] # value = <OpType.ClassicalExpBox: 107>
CircBox: typing.ClassVar[OpType] # value = <OpType.CircBox: 89>
ClassicalExpBox: typing.ClassVar[OpType] # value = <OpType.ClassicalExpBox: 109>
ClassicalTransform: typing.ClassVar[OpType] # value = <OpType.ClassicalTransform: 13>
CnRx: typing.ClassVar[OpType] # value = <OpType.CnRx: 84>
CnRy: typing.ClassVar[OpType] # value = <OpType.CnRy: 83>
CnX: typing.ClassVar[OpType] # value = <OpType.CnX: 84>
CnY: typing.ClassVar[OpType] # value = <OpType.CnY: 86>
CnZ: typing.ClassVar[OpType] # value = <OpType.CnZ: 85>
Conditional: typing.ClassVar[OpType] # value = <OpType.Conditional: 108>
ConjugationBox: typing.ClassVar[OpType] # value = <OpType.ConjugationBox: 106>
CnRz: typing.ClassVar[OpType] # value = <OpType.CnRz: 85>
CnX: typing.ClassVar[OpType] # value = <OpType.CnX: 86>
CnY: typing.ClassVar[OpType] # value = <OpType.CnY: 88>
CnZ: typing.ClassVar[OpType] # value = <OpType.CnZ: 87>
Conditional: typing.ClassVar[OpType] # value = <OpType.Conditional: 110>
ConjugationBox: typing.ClassVar[OpType] # value = <OpType.ConjugationBox: 108>
CopyBits: typing.ClassVar[OpType] # value = <OpType.CopyBits: 16>
CustomGate: typing.ClassVar[OpType] # value = <OpType.CustomGate: 97>
DiagonalBox: typing.ClassVar[OpType] # value = <OpType.DiagonalBox: 105>
DummyBox: typing.ClassVar[OpType] # value = <OpType.DummyBox: 113>
CustomGate: typing.ClassVar[OpType] # value = <OpType.CustomGate: 99>
DiagonalBox: typing.ClassVar[OpType] # value = <OpType.DiagonalBox: 107>
DummyBox: typing.ClassVar[OpType] # value = <OpType.DummyBox: 115>
ECR: typing.ClassVar[OpType] # value = <OpType.ECR: 69>
ESWAP: typing.ClassVar[OpType] # value = <OpType.ESWAP: 78>
ExpBox: typing.ClassVar[OpType] # value = <OpType.ExpBox: 91>
ExpBox: typing.ClassVar[OpType] # value = <OpType.ExpBox: 93>
ExplicitModifier: typing.ClassVar[OpType] # value = <OpType.ExplicitModifier: 19>
ExplicitPredicate: typing.ClassVar[OpType] # value = <OpType.ExplicitPredicate: 18>
FSim: typing.ClassVar[OpType] # value = <OpType.FSim: 79>
Expand All @@ -3347,19 +3353,19 @@ class OpType:
Label: typing.ClassVar[OpType] # value = <OpType.Label: 9>
Measure: typing.ClassVar[OpType] # value = <OpType.Measure: 66>
MultiBit: typing.ClassVar[OpType] # value = <OpType.MultiBit: 20>
MultiplexedRotationBox: typing.ClassVar[OpType] # value = <OpType.MultiplexedRotationBox: 101>
MultiplexedTensoredU2Box: typing.ClassVar[OpType] # value = <OpType.MultiplexedTensoredU2Box: 103>
MultiplexedU2Box: typing.ClassVar[OpType] # value = <OpType.MultiplexedU2Box: 102>
MultiplexorBox: typing.ClassVar[OpType] # value = <OpType.MultiplexorBox: 100>
MultiplexedRotationBox: typing.ClassVar[OpType] # value = <OpType.MultiplexedRotationBox: 103>
MultiplexedTensoredU2Box: typing.ClassVar[OpType] # value = <OpType.MultiplexedTensoredU2Box: 105>
MultiplexedU2Box: typing.ClassVar[OpType] # value = <OpType.MultiplexedU2Box: 104>
MultiplexorBox: typing.ClassVar[OpType] # value = <OpType.MultiplexorBox: 102>
NPhasedX: typing.ClassVar[OpType] # value = <OpType.NPhasedX: 72>
PauliExpBox: typing.ClassVar[OpType] # value = <OpType.PauliExpBox: 92>
PauliExpCommutingSetBox: typing.ClassVar[OpType] # value = <OpType.PauliExpCommutingSetBox: 94>
PauliExpPairBox: typing.ClassVar[OpType] # value = <OpType.PauliExpPairBox: 93>
PauliExpBox: typing.ClassVar[OpType] # value = <OpType.PauliExpBox: 94>
PauliExpCommutingSetBox: typing.ClassVar[OpType] # value = <OpType.PauliExpCommutingSetBox: 96>
PauliExpPairBox: typing.ClassVar[OpType] # value = <OpType.PauliExpPairBox: 95>
Phase: typing.ClassVar[OpType] # value = <OpType.Phase: 21>
PhasePolyBox: typing.ClassVar[OpType] # value = <OpType.PhasePolyBox: 98>
PhasePolyBox: typing.ClassVar[OpType] # value = <OpType.PhasePolyBox: 100>
PhasedISWAP: typing.ClassVar[OpType] # value = <OpType.PhasedISWAP: 82>
PhasedX: typing.ClassVar[OpType] # value = <OpType.PhasedX: 71>
QControlBox: typing.ClassVar[OpType] # value = <OpType.QControlBox: 99>
QControlBox: typing.ClassVar[OpType] # value = <OpType.QControlBox: 101>
RangePredicate: typing.ClassVar[OpType] # value = <OpType.RangePredicate: 17>
Reset: typing.ClassVar[OpType] # value = <OpType.Reset: 68>
Rx: typing.ClassVar[OpType] # value = <OpType.Rx: 34>
Expand All @@ -3371,21 +3377,21 @@ class OpType:
SXdg: typing.ClassVar[OpType] # value = <OpType.SXdg: 32>
Sdg: typing.ClassVar[OpType] # value = <OpType.Sdg: 26>
SetBits: typing.ClassVar[OpType] # value = <OpType.SetBits: 15>
StatePreparationBox: typing.ClassVar[OpType] # value = <OpType.StatePreparationBox: 104>
StatePreparationBox: typing.ClassVar[OpType] # value = <OpType.StatePreparationBox: 106>
Stop: typing.ClassVar[OpType] # value = <OpType.Stop: 12>
Sycamore: typing.ClassVar[OpType] # value = <OpType.Sycamore: 80>
T: typing.ClassVar[OpType] # value = <OpType.T: 27>
TK1: typing.ClassVar[OpType] # value = <OpType.TK1: 43>
TK2: typing.ClassVar[OpType] # value = <OpType.TK2: 44>
Tdg: typing.ClassVar[OpType] # value = <OpType.Tdg: 28>
TermSequenceBox: typing.ClassVar[OpType] # value = <OpType.TermSequenceBox: 95>
ToffoliBox: typing.ClassVar[OpType] # value = <OpType.ToffoliBox: 111>
TermSequenceBox: typing.ClassVar[OpType] # value = <OpType.TermSequenceBox: 97>
ToffoliBox: typing.ClassVar[OpType] # value = <OpType.ToffoliBox: 113>
U1: typing.ClassVar[OpType] # value = <OpType.U1: 39>
U2: typing.ClassVar[OpType] # value = <OpType.U2: 38>
U3: typing.ClassVar[OpType] # value = <OpType.U3: 37>
Unitary1qBox: typing.ClassVar[OpType] # value = <OpType.Unitary1qBox: 88>
Unitary2qBox: typing.ClassVar[OpType] # value = <OpType.Unitary2qBox: 89>
Unitary3qBox: typing.ClassVar[OpType] # value = <OpType.Unitary3qBox: 90>
Unitary1qBox: typing.ClassVar[OpType] # value = <OpType.Unitary1qBox: 90>
Unitary2qBox: typing.ClassVar[OpType] # value = <OpType.Unitary2qBox: 91>
Unitary3qBox: typing.ClassVar[OpType] # value = <OpType.Unitary3qBox: 92>
V: typing.ClassVar[OpType] # value = <OpType.V: 29>
Vdg: typing.ClassVar[OpType] # value = <OpType.Vdg: 30>
WASM: typing.ClassVar[OpType] # value = <OpType.WASM: 14>
Expand All @@ -3397,7 +3403,7 @@ class OpType:
Z: typing.ClassVar[OpType] # value = <OpType.Z: 22>
ZZMax: typing.ClassVar[OpType] # value = <OpType.ZZMax: 73>
ZZPhase: typing.ClassVar[OpType] # value = <OpType.ZZPhase: 76>
__members__: typing.ClassVar[dict[str, OpType]] # value = {'Phase': <OpType.Phase: 21>, 'Z': <OpType.Z: 22>, 'X': <OpType.X: 23>, 'Y': <OpType.Y: 24>, 'S': <OpType.S: 25>, 'Sdg': <OpType.Sdg: 26>, 'T': <OpType.T: 27>, 'Tdg': <OpType.Tdg: 28>, 'V': <OpType.V: 29>, 'Vdg': <OpType.Vdg: 30>, 'SX': <OpType.SX: 31>, 'SXdg': <OpType.SXdg: 32>, 'H': <OpType.H: 33>, 'Rx': <OpType.Rx: 34>, 'Ry': <OpType.Ry: 35>, 'Rz': <OpType.Rz: 36>, 'U1': <OpType.U1: 39>, 'U2': <OpType.U2: 38>, 'U3': <OpType.U3: 37>, 'GPI': <OpType.GPI: 40>, 'GPI2': <OpType.GPI2: 41>, 'AAMS': <OpType.AAMS: 42>, 'TK1': <OpType.TK1: 43>, 'TK2': <OpType.TK2: 44>, 'CX': <OpType.CX: 45>, 'CY': <OpType.CY: 46>, 'CZ': <OpType.CZ: 47>, 'CH': <OpType.CH: 48>, 'CV': <OpType.CV: 49>, 'CVdg': <OpType.CVdg: 50>, 'CSX': <OpType.CSX: 51>, 'CSXdg': <OpType.CSXdg: 52>, 'CS': <OpType.CS: 53>, 'CSdg': <OpType.CSdg: 54>, 'CRz': <OpType.CRz: 55>, 'CRx': <OpType.CRx: 56>, 'CRy': <OpType.CRy: 57>, 'CU1': <OpType.CU1: 58>, 'CU3': <OpType.CU3: 59>, 'CCX': <OpType.CCX: 61>, 'ECR': <OpType.ECR: 69>, 'SWAP': <OpType.SWAP: 62>, 'CSWAP': <OpType.CSWAP: 63>, 'noop': <OpType.noop: 65>, 'Barrier': <OpType.Barrier: 8>, 'Label': <OpType.Label: 9>, 'Branch': <OpType.Branch: 10>, 'Goto': <OpType.Goto: 11>, 'Stop': <OpType.Stop: 12>, 'BRIDGE': <OpType.BRIDGE: 64>, 'Measure': <OpType.Measure: 66>, 'Reset': <OpType.Reset: 68>, 'CircBox': <OpType.CircBox: 87>, 'PhasePolyBox': <OpType.PhasePolyBox: 98>, 'Unitary1qBox': <OpType.Unitary1qBox: 88>, 'Unitary2qBox': <OpType.Unitary2qBox: 89>, 'Unitary3qBox': <OpType.Unitary3qBox: 90>, 'ExpBox': <OpType.ExpBox: 91>, 'PauliExpBox': <OpType.PauliExpBox: 92>, 'PauliExpPairBox': <OpType.PauliExpPairBox: 93>, 'PauliExpCommutingSetBox': <OpType.PauliExpCommutingSetBox: 94>, 'TermSequenceBox': <OpType.TermSequenceBox: 95>, 'QControlBox': <OpType.QControlBox: 99>, 'ToffoliBox': <OpType.ToffoliBox: 111>, 'ConjugationBox': <OpType.ConjugationBox: 106>, 'DummyBox': <OpType.DummyBox: 113>, 'CustomGate': <OpType.CustomGate: 97>, 'Conditional': <OpType.Conditional: 108>, 'ISWAP': <OpType.ISWAP: 70>, 'PhasedISWAP': <OpType.PhasedISWAP: 82>, 'XXPhase': <OpType.XXPhase: 74>, 'YYPhase': <OpType.YYPhase: 75>, 'ZZPhase': <OpType.ZZPhase: 76>, 'XXPhase3': <OpType.XXPhase3: 77>, 'PhasedX': <OpType.PhasedX: 71>, 'NPhasedX': <OpType.NPhasedX: 72>, 'CnRy': <OpType.CnRy: 83>, 'CnX': <OpType.CnX: 84>, 'CnY': <OpType.CnY: 86>, 'CnZ': <OpType.CnZ: 85>, 'ZZMax': <OpType.ZZMax: 73>, 'ESWAP': <OpType.ESWAP: 78>, 'FSim': <OpType.FSim: 79>, 'Sycamore': <OpType.Sycamore: 80>, 'ISWAPMax': <OpType.ISWAPMax: 81>, 'ClassicalTransform': <OpType.ClassicalTransform: 13>, 'WASM': <OpType.WASM: 14>, 'SetBits': <OpType.SetBits: 15>, 'CopyBits': <OpType.CopyBits: 16>, 'RangePredicate': <OpType.RangePredicate: 17>, 'ExplicitPredicate': <OpType.ExplicitPredicate: 18>, 'ExplicitModifier': <OpType.ExplicitModifier: 19>, 'MultiBit': <OpType.MultiBit: 20>, 'ClassicalExpBox': <OpType.ClassicalExpBox: 107>, 'MultiplexorBox': <OpType.MultiplexorBox: 100>, 'MultiplexedRotationBox': <OpType.MultiplexedRotationBox: 101>, 'MultiplexedU2Box': <OpType.MultiplexedU2Box: 102>, 'MultiplexedTensoredU2Box': <OpType.MultiplexedTensoredU2Box: 103>, 'StatePreparationBox': <OpType.StatePreparationBox: 104>, 'DiagonalBox': <OpType.DiagonalBox: 105>}
__members__: typing.ClassVar[dict[str, OpType]] # value = {'Phase': <OpType.Phase: 21>, 'Z': <OpType.Z: 22>, 'X': <OpType.X: 23>, 'Y': <OpType.Y: 24>, 'S': <OpType.S: 25>, 'Sdg': <OpType.Sdg: 26>, 'T': <OpType.T: 27>, 'Tdg': <OpType.Tdg: 28>, 'V': <OpType.V: 29>, 'Vdg': <OpType.Vdg: 30>, 'SX': <OpType.SX: 31>, 'SXdg': <OpType.SXdg: 32>, 'H': <OpType.H: 33>, 'Rx': <OpType.Rx: 34>, 'Ry': <OpType.Ry: 35>, 'Rz': <OpType.Rz: 36>, 'U1': <OpType.U1: 39>, 'U2': <OpType.U2: 38>, 'U3': <OpType.U3: 37>, 'GPI': <OpType.GPI: 40>, 'GPI2': <OpType.GPI2: 41>, 'AAMS': <OpType.AAMS: 42>, 'TK1': <OpType.TK1: 43>, 'TK2': <OpType.TK2: 44>, 'CX': <OpType.CX: 45>, 'CY': <OpType.CY: 46>, 'CZ': <OpType.CZ: 47>, 'CH': <OpType.CH: 48>, 'CV': <OpType.CV: 49>, 'CVdg': <OpType.CVdg: 50>, 'CSX': <OpType.CSX: 51>, 'CSXdg': <OpType.CSXdg: 52>, 'CS': <OpType.CS: 53>, 'CSdg': <OpType.CSdg: 54>, 'CRz': <OpType.CRz: 55>, 'CRx': <OpType.CRx: 56>, 'CRy': <OpType.CRy: 57>, 'CU1': <OpType.CU1: 58>, 'CU3': <OpType.CU3: 59>, 'CCX': <OpType.CCX: 61>, 'ECR': <OpType.ECR: 69>, 'SWAP': <OpType.SWAP: 62>, 'CSWAP': <OpType.CSWAP: 63>, 'noop': <OpType.noop: 65>, 'Barrier': <OpType.Barrier: 8>, 'Label': <OpType.Label: 9>, 'Branch': <OpType.Branch: 10>, 'Goto': <OpType.Goto: 11>, 'Stop': <OpType.Stop: 12>, 'BRIDGE': <OpType.BRIDGE: 64>, 'Measure': <OpType.Measure: 66>, 'Reset': <OpType.Reset: 68>, 'CircBox': <OpType.CircBox: 89>, 'PhasePolyBox': <OpType.PhasePolyBox: 100>, 'Unitary1qBox': <OpType.Unitary1qBox: 90>, 'Unitary2qBox': <OpType.Unitary2qBox: 91>, 'Unitary3qBox': <OpType.Unitary3qBox: 92>, 'ExpBox': <OpType.ExpBox: 93>, 'PauliExpBox': <OpType.PauliExpBox: 94>, 'PauliExpPairBox': <OpType.PauliExpPairBox: 95>, 'PauliExpCommutingSetBox': <OpType.PauliExpCommutingSetBox: 96>, 'TermSequenceBox': <OpType.TermSequenceBox: 97>, 'QControlBox': <OpType.QControlBox: 101>, 'ToffoliBox': <OpType.ToffoliBox: 113>, 'ConjugationBox': <OpType.ConjugationBox: 108>, 'DummyBox': <OpType.DummyBox: 115>, 'CustomGate': <OpType.CustomGate: 99>, 'Conditional': <OpType.Conditional: 110>, 'ISWAP': <OpType.ISWAP: 70>, 'PhasedISWAP': <OpType.PhasedISWAP: 82>, 'XXPhase': <OpType.XXPhase: 74>, 'YYPhase': <OpType.YYPhase: 75>, 'ZZPhase': <OpType.ZZPhase: 76>, 'XXPhase3': <OpType.XXPhase3: 77>, 'PhasedX': <OpType.PhasedX: 71>, 'NPhasedX': <OpType.NPhasedX: 72>, 'CnRx': <OpType.CnRx: 84>, 'CnRy': <OpType.CnRy: 83>, 'CnRz': <OpType.CnRz: 85>, 'CnX': <OpType.CnX: 86>, 'CnY': <OpType.CnY: 88>, 'CnZ': <OpType.CnZ: 87>, 'ZZMax': <OpType.ZZMax: 73>, 'ESWAP': <OpType.ESWAP: 78>, 'FSim': <OpType.FSim: 79>, 'Sycamore': <OpType.Sycamore: 80>, 'ISWAPMax': <OpType.ISWAPMax: 81>, 'ClassicalTransform': <OpType.ClassicalTransform: 13>, 'WASM': <OpType.WASM: 14>, 'SetBits': <OpType.SetBits: 15>, 'CopyBits': <OpType.CopyBits: 16>, 'RangePredicate': <OpType.RangePredicate: 17>, 'ExplicitPredicate': <OpType.ExplicitPredicate: 18>, 'ExplicitModifier': <OpType.ExplicitModifier: 19>, 'MultiBit': <OpType.MultiBit: 20>, 'ClassicalExpBox': <OpType.ClassicalExpBox: 109>, 'MultiplexorBox': <OpType.MultiplexorBox: 102>, 'MultiplexedRotationBox': <OpType.MultiplexedRotationBox: 103>, 'MultiplexedU2Box': <OpType.MultiplexedU2Box: 104>, 'MultiplexedTensoredU2Box': <OpType.MultiplexedTensoredU2Box: 105>, 'StatePreparationBox': <OpType.StatePreparationBox: 106>, 'DiagonalBox': <OpType.DiagonalBox: 107>}
noop: typing.ClassVar[OpType] # value = <OpType.noop: 65>
@staticmethod
def from_name(arg0: str) -> OpType:
Expand Down
2 changes: 1 addition & 1 deletion pytket/pytket/_tket/passes.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ def CustomRoutingPass(arc: pytket._tket.architecture.Architecture, config: typin
"""
def DecomposeArbitrarilyControlledGates() -> BasePass:
"""
Decomposes CCX, CnX, CnY, CnZ, and CnRy gates into CX and single-qubit gates.
Decomposes CCX, CnX, CnY, CnZ, CnRy, CnRz and CnRx gates into CX and single-qubit gates.
"""
def DecomposeBoxes(excluded_types: set[pytket._tket.circuit.OpType] = set(), excluded_opgroups: set[str] = set()) -> BasePass:
"""
Expand Down
16 changes: 16 additions & 0 deletions pytket/tests/circuit_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1536,6 +1536,21 @@ def test_pickle_bit() -> None:
assert b == pickle.loads(pickle.dumps(b))


def test_cnrx_cnrz() -> None:
c1rx = Circuit(2)
c1rx.add_gate(OpType.CnRx, 0.3, [0, 1])
crx = Circuit(2)
crx.add_gate(OpType.CRx, 0.3, [0, 1])

c1rz = Circuit(2)
c1rz.add_gate(OpType.CnRz, 0.3, [0, 1])
crz = Circuit(2)
crz.add_gate(OpType.CRz, 0.3, [0, 1])

assert np.allclose(c1rz.get_unitary(), crz.get_unitary())
assert np.allclose(c1rx.get_unitary(), crx.get_unitary())


if __name__ == "__main__":
test_circuit_gen()
test_symbolic_ops()
Expand All @@ -1551,3 +1566,4 @@ def test_pickle_bit() -> None:
test_multi_controlled_gates()
test_counting_n_qubit_gates()
test_pauliexp_pair_box_serialisation()
test_cnrx_cnrz()
2 changes: 1 addition & 1 deletion tket/conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

class TketConan(ConanFile):
name = "tket"
version = "1.3.0"
version = "1.3.1"
package_type = "library"
license = "Apache 2"
homepage = "https://github.com/CQCL/tket"
Expand Down
4 changes: 4 additions & 0 deletions tket/include/tket/Circuit/CircPool.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,10 @@ Circuit CnX_gray_decomp(unsigned n);

Circuit CnRy_normal_decomp(const Op_ptr op, unsigned arity);

Circuit CnRx_normal_decomp(const Op_ptr op, unsigned arity);

Circuit CnRz_normal_decomp(const Op_ptr op, unsigned arity);

/**
* @brief Given a 2x2 numerical unitary matrix U and the number of control
* qubits n return the decomposed CnU gate
Expand Down
4 changes: 4 additions & 0 deletions tket/include/tket/Gate/GateUnitaryMatrixImplementations.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ struct GateUnitaryMatrixImplementations {
// to have a sparse version.
static Eigen::MatrixXcd CnRy(unsigned int number_of_qubits, double alpha);

static Eigen::MatrixXcd CnRx(unsigned int number_of_qubits, double alpha);

static Eigen::MatrixXcd CnRz(unsigned int number_of_qubits, double alpha);

static Eigen::MatrixXcd CnX(unsigned int number_of_qubits);

static Eigen::MatrixXcd CnZ(unsigned int number_of_qubits);
Expand Down
14 changes: 14 additions & 0 deletions tket/include/tket/OpType/OpType.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,20 @@ enum class OpType {
*/
CnRy,

/**
* Multiply-controlled \ref OpType::Rx
*
* The phase parameter is defined modulo \f$ 4 \f$.
*/
CnRx,

/**
* Multiply-controlled \ref OpType::Rz
*
* The phase parameter is defined modulo \f$ 4 \f$.
*/
CnRz,

/**
* Multiply-controlled \ref OpType::X
*/
Expand Down
2 changes: 1 addition & 1 deletion tket/include/tket/Transformations/Decomposition.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ Transform decomp_CCX();
Transform decomp_controlled_Rys();

// does not use ancillae
// Expects: CCX, CnX, CnY, CnZ, CnRy and any other gates
// Expects: CCX, CnX, CnY, CnZ, CnRy, CnRx, CnRz, and any other gates
// returns CX and single-qubit gate + any previous gates
Transform decomp_arbitrary_controlled_gates();

Expand Down
3 changes: 2 additions & 1 deletion tket/include/tket/Transformations/Replacement.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ Circuit CX_circ_from_multiq(const Op_ptr op);
Circuit CX_ZX_circ_from_op(const Op_ptr op);

/**
* Replace CnRy, CnX, CnZ, CnY with 2-qubit gates and single qubit gates
* Replace CnRy, CnRx, CnRz, CnX, CnZ, CnY with 2-qubit gates and single qubit
* gates
*
* @param op operation
* @param two_q_type whether rebase 2-q gates to CX or TK2
Expand Down
Loading

0 comments on commit 7a3cf20

Please sign in to comment.