Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
we-taper opened this issue Feb 11, 2021 · 6 comments · May be fixed by #487
Open

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

we-taper opened this issue Feb 11, 2021 · 6 comments · May be fixed by #487
Assignees

Comments

@we-taper
Copy link
Contributor

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.

@MichaelBroughton
Copy link
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.

@MichaelBroughton MichaelBroughton linked a pull request Feb 22, 2021 that will close this issue
@MichaelBroughton MichaelBroughton self-assigned this Feb 25, 2021
@Danielle-Schuman
Copy link

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?

@we-taper
Copy link
Contributor Author

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

@Danielle-Schuman
Copy link

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.)

@we-taper
Copy link
Contributor Author

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).

@lockwo
Copy link
Contributor

lockwo commented Jul 6, 2021

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.

jaeyoo pushed a commit to jaeyoo/quantum that referenced this issue Mar 30, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants