qrisp.jasp.Jaspr.to_catalyst_jaxpr#

Jaspr.to_catalyst_jaxpr() Any[source]#

Compiles the jaspr to the corresponding Catalyst jaxpr.

Requires the Catalyst package to be installed (pip install qrisp[catalyst]).

Returns:
object

A ClosedJaxpr-like object using Catalyst primitives.

Examples

We create a simple script and inspect the Catalyst Jaxpr:

from qrisp import *
from qrisp.jasp import make_jaspr

def example_function(i):

    qv = QuantumFloat(i)
    cx(qv[0], qv[1])
    t(qv[1])
    meas_res = measure(qv)
    meas_res += 1
    return meas_res

jaspr = make_jaspr(example_function)(2)

print(jaspr.to_catalyst_jaxpr())
# Yields
# { lambda ; a:i64[] b:AbstractQreg() c:i64[30] d:i64[]. let
#   ... (bookkeeping: a `while` loop populates a 30-entry index
#        stack `c` via jit-wrapped `_pop`/`_append` helpers,
#        producing the dynamic qubit positions `br`/`bz` used
#        below; `h`/`i` are the (unused past this point) final
#        stack/size outputs) ...
#   ca:AbstractQbit() = qextract b br
#   cb:AbstractQbit() = qextract b bz
#   cc:AbstractQbit() cd:AbstractQbit() = qinst[
#     adjoint=False
#     ctrl_len=0
#     op=CNOT
#     params_len=0
#     qubits_len=2
#   ] ca cb
#   ce:AbstractQreg() = qinsert b br cc
#   cf:AbstractQreg() = qinsert ce bz cd
#   cg:AbstractQbit() = qextract cf bz
#   ch:AbstractQbit() = qinst[
#     adjoint=False
#     ctrl_len=0
#     op=T
#     params_len=0
#     qubits_len=1
#   ] cg
#   ci:AbstractQreg() = qinsert cf bz ch
#   _:i64[] cj:i64[] ck:AbstractQreg() _:i64[1024] _:i64[] = while_loop[
#     body_jaxpr={ lambda ; cl:i64[] cm:i64[] cn:AbstractQreg() co:i64[1024] cp:i64[]. let
#         ...
#         cv:AbstractQbit() = qextract cn cu
#         cw:bool[] cx:AbstractQbit() = measure cv
#         cy:AbstractQreg() = qinsert cn cu cx
#         ...
#       in (dd, dc, cy, co, cp) }
#     body_nconsts=0
#     cond_jaxpr={ lambda ; de:i64[] df:i64[] dg:AbstractQreg() dh:i64[1024] di:i64[]. let
#         dj:bool[] = lt de di
#       in (dj,) }
#     cond_nconsts=0
#     num_implicit_inputs=0
#     preserve_dimensions=True
#   ] 0:i64[] 0:i64[] ci h i
#   dk:f64[] = integer_pow[y=0] 2.0:f64[]
#   dl:f64[] = convert_element_type[new_dtype=float64 weak_type=False] cj
#   dm:f64[] = mul dl dk
#   dn:f64[] = add dm 1.0:f64[]
# in (dn, ck, c, g) }