Qiskit / qiskit

Qiskit is an open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives.
https://www.ibm.com/quantum/qiskit
Apache License 2.0
5.04k stars 2.32k forks source link

An user should have an easy way to verify a circuit is compatible with a target backend #12916

Open nonhermitian opened 1 month ago

nonhermitian commented 1 month ago

What is the expected feature or enhancement?

If I am given a circuit, I would like an easy way to verify if it is, or is not, compatible with a given backend.

Tket has such functionality: https://tket.quantinuum.com/api-docs/backends.html#pytket.backends.Backend.valid_circuit and it would be nice to include it here as well.

Acceptance criteria There is an easy way to verify a circuit will run on a target backend.

yaelbh commented 1 month ago

Sounds like this belongs to Qiskit Core?

jyu00 commented 1 month ago

@1ucian0 do you agree that this should be in Qiskit? Given Target lives in Qiskit, and this could apply to non-IBM target backend as well.

1ucian0 commented 1 month ago

yeap, I agree

On Tue, Jul 30, 2024, 11:33 PM Jessie Yu @.***> wrote:

@1ucian0 https://github.com/1ucian0 do you agree that this should be in Qiskit? Given Target lives in Qiskit, and this could apply to non-IBM target backend as well.

— Reply to this email directly, view it on GitHub https://github.com/Qiskit/qiskit/issues/12916, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAF3FZKP6TJUR2SEMFRZG3LZPABA7AVCNFSM6AAAAABLKVT6E2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENJZGI2DSMJXGY . You are receiving this because you were mentioned.Message ID: @.***>

yaelbh commented 1 month ago

Is there already an issue in qiskit tracking this? I'd like to add some information.

First, FYI @nonhermitian the function https://github.com/Qiskit/qiskit-ibm-runtime/blob/3a9b08ed422e0de52981275537340c0a2af7a75b/qiskit_ibm_runtime/utils/utils.py#L78 I believe this is what you're looking for.

Note that currently the function is suspected to contain a bug, tracked in Qiskit/qiskit-ibm-runtime#1843.

Second, when the function is written in qiskit, I recommend not to write from scratch but to copy from qiskit-ibm-runtime. Although it looks easy, as you see it's not entirely trivial (we've spotted at least two bugs since its first version), so it will be a pity to repeat the same mistakes again in qiskit.

nonhermitian commented 1 month ago

It is a bit confusing calling it an isa check. I don't think the underlying topology is part of the isa.

yaelbh commented 1 month ago

The documentation related to ISA from the beginning has always included connectivity, see for example https://www.ibm.com/quantum/blog/isa-circuits and https://docs.quantum.ibm.com/guides/get-started-with-primitives.

nonhermitian commented 1 month ago

Huh, did not know that. The implication is that every Eagle has a different ISA.

1ucian0 commented 1 month ago

Transfering to Qiskit/qiskit

raynelfss commented 1 month ago

I'll take a look into this. I'm assuming we could evaluate the instructions present in the circuit, as well as the parameters bound to them, with the Target's instruction_supported method.

yaelbh commented 1 month ago

This is what's done in qiskit-ibm-runtime, you can copy from there (up to a potential bug).

jakelishman commented 1 month ago

Fwiw, we have the GatesInBasis transpiler pass, which is most of the logic of the ask here already:

from qiskit.transpiler.passes import GatesInBasis

def is_supported(circuit, target):
    pass_ = GatesInBasis(target=target)
    pass_(circuit)
    return pass_.property_set["all_gates_in_basis"]

(or something like that). Maybe the next step of discussion is whether this can be done purely by documentation, or if there should be a helper function, and if so, what its API should be.

yaelbh commented 1 month ago

Thanks @jakelishman, does the pass take into account also connectivity?

jakelishman commented 1 month ago

Yeah, if the input is a Target we check things precisely. It also handles control-flow ops, etc.

yaelbh commented 3 weeks ago

@jake-lishman I'm not familiar with the DAG representation that the pass is using. In qiskit-ibm-runtime we skip instructions with calibrations: https://github.com/Qiskit/qiskit-ibm-runtime/blob/157233c731433067f6e2860b7795d8fd14efcf0d/qiskit_ibm_runtime/utils/utils.py#L63.

Will the pass do something equivalent?

jakelishman commented 2 weeks ago

Looking at it now, that pass doesn't check calibrations. I'm not entirely familiar with the calibration-level workflows (so maybe there's a reason), but that does feel slightly awkward to me that it doesn't.