Skip to content

Commit

Permalink
Added MSGate to top level (#6466)
Browse files Browse the repository at this point in the history
* add `MSGate` to top level

* mark `MSGate` as `not_yet_serializable`

* Revert "mark `MSGate` as `not_yet_serializable`"

This reverts commit ffdb3de.

* Test json serialization of cirq.MSGate without custom resolver

Not yet passing.

* Use the "cirq" namespace to JSON-serialize `cirq.MSGate`

The namespace-less cirq_type `MSGate` is used by `cirq_ionq.MSGate`.

---------

Co-authored-by: Tanuj Khattar <tanujkhattar@google.com>
Co-authored-by: Pavol Juhas <juhas@google.com>
  • Loading branch information
3 people authored Mar 16, 2024
1 parent 0f4822b commit dadfdcb
Show file tree
Hide file tree
Showing 7 changed files with 15 additions and 10 deletions.
1 change: 1 addition & 0 deletions cirq-core/cirq/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@
MatrixGate,
MixedUnitaryChannel,
M,
MSGate,
measure,
measure_each,
measure_paulistring_terms,
Expand Down
1 change: 1 addition & 0 deletions cirq-core/cirq/json_resolver_cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ def _symmetricalqidpair(qids):
'LineTopology': cirq.LineTopology,
'Linspace': cirq.Linspace,
'ListSweep': cirq.ListSweep,
'cirq.MSGate': cirq.MSGate,
'MatrixGate': cirq.MatrixGate,
'MixedUnitaryChannel': cirq.MixedUnitaryChannel,
'MeasurementKey': cirq.MeasurementKey,
Expand Down
5 changes: 5 additions & 0 deletions cirq-core/cirq/ops/parity_gates.py
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,11 @@ def __repr__(self) -> str:
return 'cirq.ms(np.pi/2)'
return f'cirq.ms({self._exponent!r}*np.pi/2)'

# the default namespace is already occupied by cirq_ionq.MSGate
@classmethod
def _json_namespace_(cls) -> str:
return 'cirq'

def _json_dict_(self) -> Dict[str, Any]:
return protocols.obj_to_dict_helper(self, ["rads"])

Expand Down
12 changes: 2 additions & 10 deletions cirq-core/cirq/ops/parity_gates_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ def test_trace_distance():
def test_ms_arguments():
eq_tester = cirq.testing.EqualsTester()
eq_tester.add_equality_group(
cirq.ms(np.pi / 2), cirq.ops.MSGate(rads=np.pi / 2), cirq.XXPowGate(global_shift=-0.5)
cirq.ms(np.pi / 2), cirq.MSGate(rads=np.pi / 2), cirq.XXPowGate(global_shift=-0.5)
)
eq_tester.add_equality_group(
cirq.ms(np.pi / 4), cirq.XXPowGate(exponent=0.5, global_shift=-0.5)
Expand Down Expand Up @@ -323,15 +323,7 @@ def test_ms_diagrams():


def test_json_serialization():
def custom_resolver(cirq_type: str):
if cirq_type == "MSGate":
return cirq.ops.MSGate
return None

assert cirq.read_json(
json_text=cirq.to_json(cirq.ms(np.pi / 2)), resolvers=[custom_resolver]
) == cirq.ms(np.pi / 2)
assert custom_resolver('X') is None
assert cirq.read_json(json_text=cirq.to_json(cirq.ms(np.pi / 2))) == cirq.ms(np.pi / 2)


@pytest.mark.parametrize('gate_cls', (cirq.XXPowGate, cirq.YYPowGate, cirq.ZZPowGate))
Expand Down
4 changes: 4 additions & 0 deletions cirq-core/cirq/protocols/json_test_data/cirq.MSGate.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"cirq_type": "cirq.MSGate",
"rads": 1.5707963267948966
}
1 change: 1 addition & 0 deletions cirq-core/cirq/protocols/json_test_data/cirq.MSGate.repr
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
cirq.ms(np.pi/2)
1 change: 1 addition & 0 deletions cirq-core/cirq/protocols/json_test_data/spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
name="cirq",
packages=[cirq, cirq.work],
test_data_path=pathlib.Path(__file__).parent,
custom_class_name_to_cirq_type={"MSGate": "cirq.MSGate"},
resolver_cache=_class_resolver_dictionary(),
not_yet_serializable=[
'Alignment',
Expand Down

0 comments on commit dadfdcb

Please sign in to comment.