Skip to content

Multi-qubit X gate promoted to TOFFOLI gate and could not be serialized by TFQ. #480

Closed

Description

@we-taper

When a multi-qubit X gate is created by the .controlled method, it maybe automatically promoted to cirq.TOFFOLI gate which isn't supported by TFQ.

Minimal example:

import tensorflow_quantum as tfq
qbs = cirq.GridQubit.rect(4, 1)
circuit = cirq.Circuit(
    cirq.X.controlled(num_controls=3).on(*qbs)
)
try:
  layer([circuit])
except Exception as e:
  print(f"Exception:\n{e}")
# Pinrt:
# Exception:
# Cannot serialize op cirq.TOFFOLI(cirq.GridQubit(1, 0), cirq.GridQubit(2, 0), cirq.GridQubit(3, 0)) of type <class 'cirq.ops.three_qubit_gates.CCXPowGate'>

Currently, the work-around is to use cirq.ControlledGate(sub_gate=cirq.X, num_controls=3).on(*qbs) instead.
Similar problem happen to cirq.Z as well, which is promoted to cirq.CCZ.
Luckily, cirq.Y works because cirq.CCY does not exist.

Activity

  1. MichaelBroughton commented on Feb 22, 2021

    @MichaelBroughton
    Collaborator

    After talking this over with the Cirq people it turns out that this is intended behavior. So we have to turn around and update our serializer functionality to support Toffoli and CCZ.

  2. Danielle-Schuman commented on Mar 13, 2021

    @Danielle-Schuman

    I am having the same issue, but the workaround @we-taper mentioned does not work for me, since I am getting the same error for the ControlledGate. @we-taper: Are you using the regular TFQ version or the nightly one?

  3. we-taper commented on Mar 14, 2021

    @we-taper
    ContributorAuthor

    @Danielle-Schuman I was using the nightly one at the time.

  4. Danielle-Schuman commented on Mar 15, 2021

    @Danielle-Schuman

    Ok, thank you for the answer, @we-taper :). I was using the regular version, so that might have caused the different behaviour. I meanwhile have found a workaround, though. (I just implemented the Toffoli-gate in a decomposed manner, as described in https://en.wikipedia.org/wiki/Toffoli_gate#/media/File:Qcircuit_ToffolifromCNOT.svg , that worked with the regular TFQ version, too.)

  5. we-taper commented on Mar 15, 2021

    @we-taper
    ContributorAuthor

    Thanks! @Danielle-Schuman

    Actually, why not working with the nightly-version? The major benefit is that gates will be implemented natively which means faster execution. So far it has been quite smooth for me to use the nightly version (or to be specific tfq-nightly==0.5.0.dev20210218).

  6. lockwo commented on Jul 6, 2021

    @lockwo
    Contributor

    I see there is a pull request under review to fixing this thread, is there plans to merge that soon? It's not breaking since you can use the techniques presented above to solve the problem, but it's a weird interaction.

  7. added a commit that references this issue on Mar 30, 2023
  8. mhucka commented on Sep 13, 2025

    @mhucka
    Member

    Closing because this issue seems to have been addressed in the past.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions