Source code for qrisp.jasp.evaluation_tools.catalyst_qjit

"""
********************************************************************************
* Copyright (c) 2025 the Qrisp authors
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License, v. 2.0 are satisfied: GNU General Public License, version 2
* with the GNU Classpath Exception which is
* available at https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
********************************************************************************
"""

from jax.tree_util import tree_flatten, tree_unflatten
from qrisp.jasp.jasp_expression import make_jaspr


[docs] def qjit(function=None, device=None): """ Decorator to leverage the jasp + Catalyst infrastructure to compile the given function to QIR and run it on the Catalyst QIR runtime. Parameters ---------- function : callable A function performing Qrisp code. device : object The `PennyLane device <https://docs.pennylane.ai/projects/catalyst/en/stable/dev/devices.html>`_ to execute the function. The default device is `"lightning.qubit" <https://docs.pennylane.ai/projects/lightning/en/stable/lightning_qubit/device.html>`_, a fast state-vector qubit simulator. Returns ------- callable A function executing the compiled code. Notes ----- Lightning-GPU is compatible with systems featuring NVIDIA Volta (SM 7.0) GPUs or newer. It is specifically optimized for Linux environments on X86-64 or ARM64 architectures running CUDA-12. To install Lightning-GPU with NVIDIA CUDA support, the following packages need to be installed :: pip install custatevec_cu12 pip install pennylane-lightning-gpu Pre-built wheels for Lightning-AMDGPU are available for AMD MI300 series GPUs and systems running ROCm 7.0 or newer. :: pip install pennylane-lightning-amdgpu If the setup uses an older version of ROCm or a different AMD GPU series, Lightning-AMDGPU must be built manually from source. Installation instructions for different platforms are available at `pennylane.ai/install <https://pennylane.ai/install#high-performance-computing-and-gpus>`_. Examples -------- We write a simple function using the QuantumFloat quantum type and execute via ``qjit``: :: from qrisp import * from qrisp.jasp import qjit @qjit def test_fun(i): qv = QuantumFloat(i, -2) with invert(): cx(qv[0], qv[qv.size-1]) h(qv[0]) meas_res = measure(qv) return meas_res + 3 We execute the function a couple of times to demonstrate the randomness >>> test_fun(4) [array(5.25, dtype=float64)] >>> test_fun(5) [array(3., dtype=float64)] >>> test_fun(5) [array(7.25, dtype=float64)] For executing on "lightning.gpu" we specify the device: :: import pennylane as qml from qrisp import * from qrisp.jasp import qjit dev = qml.device("lightning.gpu", wires=0) @qjit(device=dev) def test_fun(i): qv = QuantumFloat(i, -2) with invert(): cx(qv[0], qv[qv.size-1]) h(qv[0]) meas_res = measure(qv) return meas_res + 3 """ if function is None: return lambda x: qjit(x, device=device) def jitted_function(*args): if not hasattr(function, "jaspr_dict"): function.jaspr_dict = {} args = list(args) signature = tuple([type(arg) for arg in args]) if not signature in function.jaspr_dict: function.jaspr_dict[signature] = make_jaspr(function)(*args) return function.jaspr_dict[signature].qjit( *args, function_name=function.__name__, device=device ) return jitted_function