Open
Description
Describe the issue
When using merge_k_qubit_unitaries
followed by optimize_for_target_gateset
, the simulator raises a ValueError: Coefficient is not unitary.
The issue disappears if expand_composite
is applied before merge_k_qubit_unitaries
.
Explain how to reproduce the bug or problem
To reproduce:
import cirq
from cirq.transformers import *
q = cirq.LineQubit.range(6)
circuit = cirq.Circuit()
circuit.append(cirq.H(q[1]).controlled_by(q[2]))
circuit.append(cirq.measure(q, key="m"))
# circuit = expand_composite(circuit)
circuit = merge_k_qubit_unitaries(circuit, k=2)
circuit = optimize_for_target_gateset(circuit)
simulator = cirq.Simulator()
result = simulator.run(circuit, repetitions=1)
print(result.histogram(key='m'))
Traceback (most recent call last):
File "C:\Users\temp_test.py", line 16, in
circuit = optimize_for_target_gateset(circuit)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\transformer_api.py", line 367, in func_with_logging
return _transform_and_log(
^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\transformer_api.py", line 426, in _transform_and_log
transformed_circuit = _run_transformer_on_circuit(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\transformer_api.py", line 412, in _run_transformer_on_circuit
return func(mutable_circuit if mutable_circuit else circuit, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\optimize_for_target_gateset.py", line 138, in optimize_for_target_gateset
return _decompose_operations_to_target_gateset(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\transformer_api.py", line 367, in func_with_logging
return _transform_and_log(
^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\transformer_api.py", line 426, in _transform_and_log
transformed_circuit = _run_transformer_on_circuit(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\transformer_api.py", line 412, in _run_transformer_on_circuit
return func(mutable_circuit if mutable_circuit else circuit, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\optimize_for_target_gateset.py", line 92, in _decompose_operations_to_target_gateset
return transformer_primitives.map_operations_and_unroll(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\transformer_primitives.py", line 273, in map_operations_and_unroll
return _map_operations_impl(
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\transformer_primitives.py", line 192, in _map_operations_impl
mapped_ops = apply_map_func(op, idx)
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\transformer_primitives.py", line 164, in apply_map_func
mapped_ops = [*ops.flatten_to_ops(map_func(op, idx))]
^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\transformers\optimize_for_target_gateset.py", line 81, in map_func
return dp.decompose(
^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\protocols\decompose_protocol.py", line 315, in decompose
return [*_decompose_dfs(val, args)]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\protocols\decompose_protocol.py", line 207, in _decompose_dfs
decomposed = decompose_once(item, default=None, flatten=False, context=args.context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\protocols\decompose_protocol.py", line 375, in decompose_once
decomposed = NotImplemented if method is None else method(*args, **kwargs, context=context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\ops\gate_operation.py", line 157, in _decompose_with_context_
return protocols.decompose_once_with_qubits(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\protocols\decompose_protocol.py", line 456, in decompose_once_with_qubits
return decompose_once(val, default, tuple(qubits), flatten=flatten, context=context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\protocols\decompose_protocol.py", line 378, in decompose_once
decomposed = NotImplemented if method is None else method(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\ops\matrix_gates.py", line 179, in _decompose_
decomposed.append(global_phase_op.global_phase_operation(phase_delta))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\ops\global_phase_op.py", line 131, in global_phase_operation
return GlobalPhaseGate(coefficient, atol)()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\ops\global_phase_op.py", line 35, in __init__
raise ValueError(f'Coefficient is not unitary: {coefficient!r}')
ValueError: Coefficient is not unitary: np.complex128(0.5000000000000002-0.5000000000000001j)
Tell us the version of Cirq where this happens
1.6.0.dev20250702012506