Skip to content

Adjoint op can handle multiple registers#2147

Closed
paul0403 wants to merge 24 commits into
mainfrom
paul0403/qadjoint_multiple_registers
Closed

Adjoint op can handle multiple registers#2147
paul0403 wants to merge 24 commits into
mainfrom
paul0403/qadjoint_multiple_registers

Conversation

@paul0403

@paul0403 paul0403 commented Oct 23, 2025

Copy link
Copy Markdown
Member

Context:
As part of the work to allow higher order primitives to take in dynamically allocated registers, the underlying quantum.adjoint op needs to be able to take in multiple registers.

I am de-prioritizing this for the moment, as it involves more changes at the mlir layer, and is less important than control flow and subroutines.

Description of the Change:

Benefits:

Possible Drawbacks:

Related GitHub Issues:

[sc-102216]

@paul0403 paul0403 added P2 compiler Pull requests that update the compiler labels Oct 23, 2025
paul0403 added a commit that referenced this pull request Nov 7, 2025
…2130)

**Context:**
Higher order primitives can take in dynamically allocated registers

**Description of the Change:**

- [x] changelog
- [x] remove the restriction from docs
- [x] cond
- [x] for loop
- [x] while loop
- ~[ ] adjoint~ involves changing adjoint op's mlir definition, will do
in another PR #2147
- [x] subroutine
- ~[ ] decomposition?~ decomp wires will always be allocated from within
the scope

Essentially, we need to do the following:
1. The subregion kernels need to parse their arguments not as `*args,
qreg`, but as `*args, *dynamically_allocated_qregs, global_qreg`
2. The subregion's qubit index recorder needs to have the same global
wire indices as the outer interpreter, and the values need to be the
corresponding qreg managers from the subregion's qreg tracer arguments.
We implement this mapping by the new `qreg_map` in the subregion
kernels.
3. The high-order primitives need to be called with the dynamic qregs. 

**Benefits:**
Higher order primitives can take in dynamically allocated registers

**Possible Drawbacks:**
Don't know why, but while other subregions have arg signature `(args,
qreg)`, subroutine has signature `(qreg, args)`, i.e. it has args in
reverse order. This means the subregion wrapper (the thing to be
`make_jaxpr`'d) cannot be reused for subroutines.
This is probably something we can just reorder?

Also, subroutine takes in wire indices through tracer args of the
subroutine, even when the indices are static. This is expected, since
subroutines are really a seperate function call, instead of just a
enclosed subregion. This means its `qreg_map` logic between inner qregs
and outer qregs is different than the others.

**Related GitHub Issues:**
[sc-99734]
Base automatically changed from paul0403/multiple_registers to main November 7, 2025 20:20
@paul0403

Copy link
Copy Markdown
Member Author

closing in favor of #2720

@paul0403 paul0403 closed this Apr 21, 2026
@paul0403 paul0403 deleted the paul0403/qadjoint_multiple_registers branch April 21, 2026 18:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

compiler Pull requests that update the compiler do-not-merge P2

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant