Source code for qrisp.jasp.optimization_tools.optimize
"""
********************************************************************************
* 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 qrisp.jasp.optimization_tools.spsa import spsa
from qrisp.jasp.optimization_tools.cobyla import cobyla
[docs]
def minimize(fun, x0, args=(), method='COBYLA', options={}):
r"""
Minimization of scalar functions of one ore 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
Extra arguments passed to the objective function.
method : str, optional
The solver type. Supported are ``SPSA`` and ``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.
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)\ket{0} + \sin(\theta)\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 ``optimize`` 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)
"""
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."
)