Skip to content

optimize_for_target_gateset fails after merge_k_qubit_unitaries with ValueError: "Coefficient is not unitary" #7473

Open
@YaegakiY

Description

@YaegakiY

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions