From 22dbb8cc83c264a9a19d7c4436e664a9de4e42b1 Mon Sep 17 00:00:00 2001 From: Doug Strain Date: Tue, 9 Nov 2021 13:01:01 -0800 Subject: [PATCH] Fix FSim serialization for zeros and ints (#4646) * Fix FSim serialization for zeros and ints - Conversion of float args changes 0.0 to a int of 0, so this fails validation, since the current code checks isinstance float. - This PR adds ints to the type checking to fix this. --- .../serialization/circuit_serializer.py | 4 ++- .../serialization/circuit_serializer_test.py | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/cirq-google/cirq_google/serialization/circuit_serializer.py b/cirq-google/cirq_google/serialization/circuit_serializer.py index 58a3ae44e91..6f942fac3bf 100644 --- a/cirq-google/cirq_google/serialization/circuit_serializer.py +++ b/cirq-google/cirq_google/serialization/circuit_serializer.py @@ -528,7 +528,9 @@ def _deserialize_gate_op( arg_function_language=arg_function_language, required_arg_name=None, ) - if isinstance(theta, (float, sympy.Basic)) and isinstance(phi, (float, sympy.Basic)): + if isinstance(theta, (int, float, sympy.Basic)) and isinstance( + phi, (int, float, sympy.Basic) + ): op = cirq.FSimGate(theta=theta, phi=phi)(*qubits) else: raise ValueError('theta and phi must be specified for FSimGate') diff --git a/cirq-google/cirq_google/serialization/circuit_serializer_test.py b/cirq-google/cirq_google/serialization/circuit_serializer_test.py index 76a96013f98..e8d21ebeb6e 100644 --- a/cirq-google/cirq_google/serialization/circuit_serializer_test.py +++ b/cirq-google/cirq_google/serialization/circuit_serializer_test.py @@ -217,6 +217,23 @@ def circuit_proto(json: Dict, qubits: List[str]): } ), ), + ( + cirq.FSimGate(theta=2 + sympy.Symbol('a'), phi=1)(Q0, Q1), + op_proto( + { + 'fsimgate': { + 'theta': { + 'func': { + 'type': 'add', + 'args': [{'arg_value': {'float_value': 2.00}}, {'symbol': 'a'}], + } + }, + 'phi': {'float_value': 1.0}, + }, + 'qubit_constant_index': [0, 1], + } + ), + ), ( cirq.FSimGate(theta=0.5, phi=0.25)(Q0, Q1), op_proto( @@ -226,6 +243,24 @@ def circuit_proto(json: Dict, qubits: List[str]): } ), ), + ( + cirq.FSimGate(theta=0.5, phi=0.0)(Q0, Q1), + op_proto( + { + 'fsimgate': {'theta': {'float_value': 0.5}, 'phi': {'float_value': 0.0}}, + 'qubit_constant_index': [0, 1], + } + ), + ), + ( + cirq.FSimGate(theta=2, phi=1)(Q0, Q1), + op_proto( + { + 'fsimgate': {'theta': {'float_value': 2.0}, 'phi': {'float_value': 1.0}}, + 'qubit_constant_index': [0, 1], + } + ), + ), ( cirq.WaitGate(duration=cirq.Duration(nanos=15))(Q0), op_proto(