Source code for qrisp.jasp.optimization_tools.optimize

# ********************************************************************************
# * Copyright (c) 2026 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
# ********************************************************************************

"""Defines the minimize function, a SciPy-like gradient-free optimizer dispatcher for Jasp."""

from qrisp.jasp.optimization_tools.cobyla import cobyla
from qrisp.jasp.optimization_tools.spsa import spsa


[docs] def minimize(fun, x0, args=(), method="COBYLA", options={}): r"""Minimization of scalar functions of one or more variables via gradient-free solvers. The API for this function matches SciPy with some minor deviations. * Various optional arguments in the SciPy interface have not yet been implemented. * ``maxiter`` defines the maximum number of iterations to perform and not the maximum number of function evaluations. Parameters ---------- fun : callable The objective function to be minimized, ``fun(x, *args) -> float``, where ``x`` is a 1-D array with shape ``(n,)`` and ``args`` is a tuple of parameters needed to specify the function. x0 : jax.Array Initial guess. Array of real elements of size ``(n,)``, where ``n`` is the number of independent variables. args : tuple, optional Extra arguments passed to the objective function. method : str, optional The solver type. Supported are ``SPSA`` and ``COBYLA``. The default is ``COBYLA``. options : dict, optional A dictionary of solver options. All methods accept the following generic options: * maxiter : int Maximum number of iterations to perform. Depending on the method each iteration may use several function evaluations. Additionally, the method-specific keyword arguments of :func:`~qrisp.jasp.cobyla` or :func:`~qrisp.jasp.spsa` may be supplied here, depending on the chosen ``method``. Returns ------- results An `OptimizeResults <https://docs.jax.dev/en/latest/_autosummary/jax.scipy.optimize.OptimizeResults.html#jax.scipy.optimize.OptimizeResults>`_ object. Examples -------- We prepare the state .. math:: \ket{\psi_{\theta}} = \cos(\theta/2)\ket{0} + \sin(\theta/2)\ket{1} :: from qrisp import QuantumFloat, ry from qrisp.jasp import expectation_value, minimize, jaspify import jax.numpy as jnp def state_prep(theta): qv = QuantumFloat(1) ry(theta[0], qv) return qv Next, we define the objective function calculating the expectation value from the prepared state :: def objective(theta, state_prep): return expectation_value(state_prep, shots=100)(theta) Finally, we use ``minimize`` to find the optimal choice of the parameter $\theta_0$ that minimizes the objective function :: @jaspify(terminal_sampling=True) def main(): x0 = jnp.array([1.0]) return minimize(objective, x0, args=(state_prep,)) results = main() print(results.x) print(results.fun) # Yields e.g. # [0.098] # 0.0 """ if method == "SPSA": return spsa(fun, x0, args, **options) elif method == "COBYLA": return cobyla(fun, x0, args, **options) else: raise Exception(f"Optimization method {method} is not available in tracing mode.")