ó
    Eñiñ‹  ã                   óv  • S r SSKrSSKrSSKJr  SSKJr  SSKJ	r	J
r
JrJrJrJr  SSKJrJr  SS	KJr  SS
KJr  SSKJr  S r\R4                  S 5       rS rS rSS jrSSSS\R>                  * \R>                  4SSSSSS4S jr S r!S r"S r# " S S5      r$\R>                  * \R>                  4SS4S jr%g)z'Routines for numerical differentiation.é    N)Únorm)ÚLinearOperatoré   )ÚissparseÚ
isspmatrixÚfindÚ	csc_arrayÚ	csr_arrayÚ
csr_matrixé   )Úgroup_denseÚgroup_sparse)Úarray_namespace)Ú
MapWrapper)Úarray_api_extrac                 óÖ  • US:X  a  [         R                  " U[        S9nOAUS:X  a0  [         R                  " U5      n[         R                  " U[        S9nO[        S5      e[         R                  " U[         R                  * :H  U[         R                  :H  -  5      (       a  X4$ X-  nUR                  5       nX-
  n	XP-
  n
US:X  ao  X-   nX´:  Xµ:„  -  n[         R                  " U5      [         R                  " Xš5      :*  nXŒU-  ==   S-  ss'   X©:¬  U) -  nX®   U-  XŽ'   X©:  U) -  nXŸ   * U-  X�'   X†4$ US:X  a«  X—:¬  X§:¬  -  nX©:¬  U) -  n[         R                  " X   SX®   -  U-  5      XŽ'   SXn'   X©:  U) -  n[         R                  " X   SXŸ   -  U-  5      * X�'   SXo'   [         R                  " X©5      U-  nU) [         R                  " U5      U:*  -  nUU   UU'   SUU'   X†4$ )	a<  Adjust final difference scheme to the presence of bounds.

Parameters
----------
x0 : ndarray, shape (n,)
    Point at which we wish to estimate derivative.
h : ndarray, shape (n,)
    Desired absolute finite difference steps.
num_steps : int
    Number of `h` steps in one direction required to implement finite
    difference scheme. For example, 2 means that we need to evaluate
    f(x0 + 2 * h) or f(x0 - 2 * h)
scheme : {'1-sided', '2-sided'}
    Whether steps in one or both directions are required. In other
    words '1-sided' applies to forward and backward schemes, '2-sided'
    applies to center schemes.
lb : ndarray, shape (n,)
    Lower bounds on independent variables.
ub : ndarray, shape (n,)
    Upper bounds on independent variables.

Returns
-------
h_adjusted : ndarray, shape (n,)
    Adjusted absolute step sizes. Step size decreases only if a sign flip
    or switching to one-sided scheme doesn't allow to take a full step.
use_one_sided : ndarray of bool, shape (n,)
    Whether to switch to one-sided scheme. Informative only for
    ``scheme='2-sided'``.
ú1-sided©Údtypeú2-sidedz(`scheme` must be '1-sided' or '2-sided'.éÿÿÿÿç      à?TF)ÚnpÚ	ones_likeÚboolÚabsÚ
zeros_likeÚ
ValueErrorÚallÚinfÚcopyÚmaximumÚminimum)Úx0ÚhÚ	num_stepsÚschemeÚlbÚubÚuse_one_sidedÚh_totalÚ
h_adjustedÚ
lower_distÚ
upper_distÚxÚviolatedÚfittingÚforwardÚbackwardÚcentralÚmin_distÚadjusted_centrals                      ÚT/home/mande/repo/quber/.venv/lib/python3.13/site-packages/scipy/optimize/_numdiff.pyÚ_adjust_scheme_to_boundsr8      s  € ð> �ÓÜŸš Q¬dÑ3‰Ø	�9Ó	Ü�FŠF�1‹IˆÜŸš a¬tÑ4‰äÐCÓDÐDä	‡v‚vˆr”b—f‘f�W‰} ¤r§v¡v¡Ñ.×/Ñ/ØÐÐà‰m€GØ—‘“€Jà‘€JØ‘€Jà�ÓØ‰LˆØ‘F˜q™vÑ&ˆÜ—&’&˜“/¤R§Z¢Z°
Ó%GÑGˆØ˜gÑ%Ó&¨"Ñ,Ó&àÑ+°¨xÑ7ˆØ(Ñ1°IÑ=ˆ
ÑØÑ+°¨xÑ7ˆØ *Ñ 4Ð4°yÑ@ˆ
Ñð& Ð$Ð$ð% 
�9Ó	ØÑ(¨ZÑ-BÑCˆàÑ+°¨xÑ7ˆÜ ŸjšjØ‰J˜˜jÑ1Ñ1°IÑ=ó?ˆ
Ñà!%ˆÑàÑ+°¨xÑ7ˆÜ "§
¢
Ø‰K˜˜zÑ3Ñ3°iÑ?ó!Að  Aˆ
Ñà"&ˆÑä—:’:˜jÓ5¸	ÑAˆØ$˜H¬¯ª¨zÓ(:¸hÑ(FÑGÐØ'/Ð0@Ñ'Aˆ
Ð#Ñ$Ø*/ˆÐ&Ñ'àÐ$Ð$ó    c                 ój  • [         R                  " [         R                  5      R                  nSn[         R                  " U [         R
                  5      (       aB  [         R                  " U 5      R                  n[         R                  " U 5      R                  nSn[         R                  " U[         R
                  5      (       aM  [         R                  " U5      R                  nU(       a&  UW:  a   [         R                  " U5      R                  nUS;   a  US-  $ US;   a  US-  $ [        S5      e)aX  
Calculates relative EPS step to use for a given data type
and numdiff step method.

Progressively smaller steps are used for larger floating point types.

Parameters
----------
f0_dtype: np.dtype
    dtype of function evaluation

x0_dtype: np.dtype
    dtype of parameter vector

method: {'2-point', '3-point', 'cs'}

Returns
-------
EPS: float
    relative step size. May be np.float16, np.float32, np.float64

Notes
-----
The default relative step will be np.float64. However, if x0 or f0 are
smaller floating point types (np.float16, np.float32), then the smallest
floating point type is chosen.
FT)ú2-pointÚcsr   )ú3-pointgUUUUUUÕ?zBUnknown step method, should be one of {'2-point', '3-point', 'cs'})	r   ÚfinfoÚfloat64ÚepsÚ
issubdtypeÚinexactr   ÚitemsizeÚRuntimeError)Úx0_dtypeÚf0_dtypeÚmethodÚEPSÚx0_is_fpÚx0_itemsizeÚf0_itemsizes          r7   Ú_eps_for_methodrL   ]   sà   € ô< �(Š(”2—:‘:Ó
×
"Ñ
"€Cà€HÜ	‡}‚}�XœrŸz™z×*Ñ*ä�hŠh�xÓ ×$Ñ$ˆÜ—h’h˜xÓ(×1Ñ1ˆØˆä	‡}‚}�XœrŸz™z×*Ñ*Ü—h’h˜xÓ(×1Ñ1ˆæ˜ kÓ1Ü—(’(˜8Ó$×(Ñ(ˆCàÐ"Ó"Ø�C‰xˆØ	�;Ó	Ø�S‰zÐäð :ó ;ð 	;r9   c           
      óÄ  • US:¬  R                  [        5      S-  S-
  n[        UR                  UR                  U5      nU c2  XT-  [        R
                  " S[        R                  " U5      5      -  nU$ X-  [        R                  " U5      -  nX-   U-
  n[        R                  " US:H  XT-  [        R
                  " S[        R                  " U5      5      -  U5      nU$ )a*  
Computes an absolute step from a relative step for finite difference
calculation.

Parameters
----------
rel_step: None or array-like
    Relative step for the finite difference calculation
x0 : np.ndarray
    Parameter vector
f0 : np.ndarray or scalar
method : {'2-point', '3-point', 'cs'}

Returns
-------
h : float
    The absolute step size

Notes
-----
`h` will always be np.float64. However, if `x0` or `f0` are
smaller floating point dtypes (e.g. np.float32), then the absolute
step size will be calculated from the smallest floating point size.
r   r   r   ç      ð?)ÚastypeÚfloatrL   r   r   r"   r   Úwhere)Úrel_stepr$   Úf0rG   Úsign_x0ÚrstepÚabs_stepÚdxs           r7   Ú_compute_absolute_steprX   “   sÄ   € ð6 �Q‰w×ÑœuÓ%¨Ñ)¨AÑ-€Gä˜BŸH™H b§h¡h°Ó7€EàÑØ‘?¤R§Z¢Z°´R·V²V¸B³ZÓ%@Ñ@ˆð €Oð Ñ%¬¯ª¨r«
Ñ2ˆð ‰} Ñ"ˆÜ—8’8˜B !™GØ!™O¬b¯jªj¸¼b¿fºfÀR»jÓ.IÑIØ$ó&ˆð €Or9   c                 óÞ   • S U  5       u  p#UR                   S:X  a   [        R                  " X!R                  5      nUR                   S:X  a   [        R                  " X1R                  5      nX#4$ )aA  
Prepares new-style bounds from a two-tuple specifying the lower and upper
limits for values in x0. If a value is not bound then the lower/upper bound
will be expected to be -np.inf/np.inf.

Examples
--------
>>> _prepare_bounds([(0, 1, 2), (1, 2, np.inf)], [0.5, 1.5, 2.5])
(array([0., 1., 2.]), array([ 1.,  2., inf]))
c              3   óT   #   • U  H  n[         R                  " U[        S 9v •  M      g7f)r   N)r   ÚasarrayrP   )Ú.0Úbs     r7   Ú	<genexpr>Ú"_prepare_bounds.<locals>.<genexpr>Ï   s   é € Ð9²&¨QŒb�jŠj˜¤%Ö(²&ùs   ‚&(r   )Úndimr   ÚresizeÚshape)Úboundsr$   r(   r)   s       r7   Ú_prepare_boundsrd   Ä   sQ   € ñ :±&Ó9�F€BØ	‡w�w�!ƒ|Ü�YŠY�rŸ8™8Ó$ˆà	‡w�w�!ƒ|Ü�YŠY�rŸ8™8Ó$ˆàˆ6€Mr9   c                 ó´  • [        U 5      (       a  [        U 5      n O8[        R                  " U 5      n U S:g  R	                  [        R
                  5      n U R                  S:w  a  [        S5      eU R                  u  p#Ub  [        R                  " U5      (       a1  [        R                  R                  U5      nUR                  U5      nO2[        R                  " U5      nUR                  U4:w  a  [        S5      eU SS2U4   n [        U 5      (       a"  [        X#U R                  U R                   5      nO[#        X#U 5      nUR%                  5       XQ'   U$ )ai  Group columns of a 2-D matrix for sparse finite differencing [1]_.

Two columns are in the same group if in each row at least one of them
has zero. A greedy sequential algorithm is used to construct groups.

Parameters
----------
A : array_like or sparse array, shape (m, n)
    Matrix of which to group columns.
order : int, iterable of int with shape (n,) or None
    Permutation array which defines the order of columns enumeration.
    If int or None, a random permutation is used with `order` used as
    a random seed. Default is 0, that is use a random permutation but
    guarantee repeatability.

Returns
-------
groups : ndarray of int, shape (n,)
    Contains values from 0 to n_groups-1, where n_groups is the number
    of found groups. Each value ``groups[i]`` is an index of a group to
    which ith column assigned. The procedure was helpful only if
    n_groups is significantly less than n.

References
----------
.. [1] A. Curtis, M. J. D. Powell, and J. Reid, "On the estimation of
       sparse Jacobian matrices", Journal of the Institute of Mathematics
       and its Applications, 13 (1974), pp. 117-120.
r   r   z`A` must be 2-dimensional.Nz`order` has incorrect shape.)r   r	   r   Ú
atleast_2drO   Úint32r`   r   rb   ÚisscalarÚrandomÚRandomStateÚpermutationr[   r   ÚindicesÚindptrr   r!   )ÚAÚorderÚmÚnÚrngÚgroupss         r7   Úgroup_columnsrt   Ù   s  € ô< �‡{�{Ü�a‹L‰ä�MŠM˜!ÓˆØ�!‰V�O‰OœBŸH™HÓ%ˆà‡v�v�ƒ{ÜÐ5Ó6Ð6à�7‰7�D€Aà�}œŸš E×*Ñ*Ü�i‰i×#Ñ# EÓ*ˆØ—‘ Ó"‰ä—
’
˜5Ó!ˆØ�;‰;˜1˜$ÓÜÐ;Ó<Ð<à	Š!ˆUˆ(‰€Aä�‡{�{Ü˜a A§I¡I¨q¯x©xÓ8‰ä˜Q 1Ó%ˆà—K‘K“M€F�Mà€Mr9   r=   F© c                 ó  • US;  a  [        SU S35      eSS0n[        U5      n[        R                  " UR	                  U5      SUS9nUR
                  nUR                  UR                  S5      (       a  UR                  nUR                  UU5      nUR                  S:”  a  [        S	5      e[        Xa5      u  nnUR                  UR                  :w  d  UR                  UR                  :w  a  [        S
5      eU(       ai  [        R                  " [        R                  " U5      5      (       a/  [        R                  " [        R                  " U5      5      (       d  [        S5      eU
c  0 n
[        XXš5      nS=nnUc  U" U5      nSnO1[        R                   " U5      nUR                  S:”  a  [        S5      e[        R"                  " UU:  UU:„  -  5      (       a  [        S5      eU(       a7  Uc!  [%        UR                  UR                  U5      n['        UUXSU5      u  nnGO«Uc  [)        X1XR5      nO‘US:¬  R                  [*        5      S-  S-
  nUnUU-   U-
  n[        R,                  " US:H  [%        UR                  UR                  U5      U-  [        R.                  " S[        R0                  " U5      5      -  U5      nUS:X  a  [3        UUSSUU5      u  nnO"US:X  a  [3        UUSSUU5      u  nnOUS:X  a  SnU=(       d    [4        n[7        U5       nUc  [9        UXUWUU5      u  nnO”[;        U5      (       d  [=        U5      S:X  a  Uu  nnOUn[?        U5      n[;        U5      (       a  URA                  5       nO[        RB                  " U5      n[        R                   " U5      n[E        UXUWUUUU5	      u  nnSSS5        U(       a  UU-  nUUS'   WU4$ W$ ! , (       d  f       N%= f)uJ'  Compute finite difference approximation of the derivatives of a
vector-valued function.

If a function maps from R^n to R^m, its derivatives form m-by-n matrix
called the Jacobian, where an element (i, j) is a partial derivative of
f[i] with respect to x[j].

Parameters
----------
fun : callable
    Function of which to estimate the derivatives. The argument x
    passed to this function is ndarray of shape (n,) (never a scalar
    even if n=1). It must return 1-D array_like of shape (m,) or a scalar.
x0 : array_like of shape (n,) or float
    Point at which to estimate the derivatives. Float will be converted
    to a 1-D array.
method : {'3-point', '2-point', 'cs'}, optional
    Finite difference method to use:
        - '2-point' - use the first order accuracy forward or backward
                      difference.
        - '3-point' - use central difference in interior points and the
                      second order accuracy forward or backward difference
                      near the boundary.
        - 'cs' - use a complex-step finite difference scheme. This assumes
                 that the user function is real-valued and can be
                 analytically continued to the complex plane. Otherwise,
                 produces bogus results.
rel_step : None or array_like, optional
    Relative step size to use. If None (default) the absolute step size is
    computed as ``h = rel_step * sign(x0) * max(1, abs(x0))``, with
    `rel_step` being selected automatically, see Notes. Otherwise
    ``h = rel_step * sign(x0) * abs(x0)``. For ``method='3-point'`` the
    sign of `h` is ignored. The calculated step size is possibly adjusted
    to fit into the bounds.
abs_step : array_like, optional
    Absolute step size to use, possibly adjusted to fit into the bounds.
    For ``method='3-point'`` the sign of `abs_step` is ignored. By default
    relative steps are used, only if ``abs_step is not None`` are absolute
    steps used.
f0 : None or array_like, optional
    If not None it is assumed to be equal to ``fun(x0)``, in this case
    the ``fun(x0)`` is not called. Default is None.
bounds : tuple of array_like, optional
    Lower and upper bounds on independent variables. Defaults to no bounds.
    Each bound must match the size of `x0` or be a scalar, in the latter
    case the bound will be the same for all variables. Use it to limit the
    range of function evaluation. Bounds checking is not implemented
    when `as_linear_operator` is True.
sparsity : {None, array_like, sparse array, 2-tuple}, optional
    Defines a sparsity structure of the Jacobian matrix. If the Jacobian
    matrix is known to have only few non-zero elements in each row, then
    it's possible to estimate its several columns by a single function
    evaluation [3]_. To perform such economic computations two ingredients
    are required:

    * structure : array_like or sparse array of shape (m, n). A zero
      element means that a corresponding element of the Jacobian
      identically equals to zero.
    * groups : array_like of shape (n,). A column grouping for a given
      sparsity structure, use `group_columns` to obtain it.

    A single array or a sparse array is interpreted as a sparsity
    structure, and groups are computed inside the function. A tuple is
    interpreted as (structure, groups). If None (default), a standard
    dense differencing will be used.

    Note, that sparse differencing makes sense only for large Jacobian
    matrices where each row contains few non-zero elements.
as_linear_operator : bool, optional
    When True the function returns an `scipy.sparse.linalg.LinearOperator`.
    Otherwise it returns a dense array or a sparse array depending on
    `sparsity`. The linear operator provides an efficient way of computing
    ``J.dot(p)`` for any vector ``p`` of shape (n,), but does not allow
    direct access to individual elements of the matrix. By default
    `as_linear_operator` is False.
args, kwargs : tuple and dict, optional
    Additional arguments passed to `fun`. Both empty by default.
    The calling signature is ``fun(x, *args, **kwargs)``.
full_output : bool, optional
    If True then the function also returns a dictionary with extra information
    about the calculation.
workers : int or map-like callable, optional
    Supply a map-like callable, such as
    `multiprocessing.Pool.map` for evaluating the population in parallel.
    This evaluation is carried out as ``workers(fun, iterable)``.
    Alternatively, if `workers` is an int the task is subdivided into `workers`
    sections and the fun evaluated in parallel
    (uses `multiprocessing.Pool <multiprocessing>`).
    Supply -1 to use all available CPU cores.
    It is recommended that a map-like be used instead of int, as repeated
    calls to `approx_derivative` will incur large overhead from setting up
    new processes.

Returns
-------
J : {ndarray, sparse array, LinearOperator}
    Finite difference approximation of the Jacobian matrix.
    If `as_linear_operator` is True returns a LinearOperator
    with shape (m, n). Otherwise it returns a dense array or sparse
    array depending on how `sparsity` is defined. If `sparsity`
    is None then a ndarray with shape (m, n) is returned. If
    `sparsity` is not None returns a csr_array or csr_matrix with
    shape (m, n) following the array/matrix type of the incoming structure.
    For sparse arrays and linear operators it is always returned as
    a 2-D structure. For ndarrays, if m=1 it is returned
    as a 1-D gradient array with shape (n,).

info_dict : dict
    Dictionary containing extra information about the calculation. The
    keys include:

    - `nfev`, number of function evaluations. If `as_linear_operator` is True
       then `fun` is expected to track the number of evaluations itself.
       This is because multiple calls may be made to the linear operator which
       are not trackable here.

See Also
--------
check_derivative : Check correctness of a function computing derivatives.

Notes
-----
If `rel_step` is not provided, it assigned as ``EPS**(1/s)``, where EPS is
determined from the smallest floating point dtype of `x0` or `fun(x0)`,
``np.finfo(x0.dtype).eps``, s=2 for '2-point' method and
s=3 for '3-point' method. Such relative step approximately minimizes a sum
of truncation and round-off errors, see [1]_. Relative steps are used by
default. However, absolute steps are used when ``abs_step is not None``.
If any of the absolute or relative steps produces an indistinguishable
difference from the original `x0`, ``(x0 + dx) - x0 == 0``, then a
automatic step size is substituted for that particular entry.

A finite difference scheme for '3-point' method is selected automatically.
The well-known central difference scheme is used for points sufficiently
far from the boundary, and 3-point forward or backward scheme is used for
points near the boundary. Both schemes have the second-order accuracy in
terms of Taylor expansion. Refer to [2]_ for the formulas of 3-point
forward and backward difference schemes.

For dense differencing when m=1 Jacobian is returned with a shape (n,),
on the other hand when n=1 Jacobian is returned with a shape (m, 1).
Our motivation is the following: a) It handles a case of gradient
computation (m=1) in a conventional way. b) It clearly separates these two
different cases. b) In all cases np.atleast_2d can be called to get 2-D
Jacobian with correct dimensions.

References
----------
.. [1] W. H. Press et. al. "Numerical Recipes. The Art of Scientific
       Computing. 3rd edition", sec. 5.7.

.. [2] A. Curtis, M. J. D. Powell, and J. Reid, "On the estimation of
       sparse Jacobian matrices", Journal of the Institute of Mathematics
       and its Applications, 13 (1974), pp. 117-120.

.. [3] B. Fornberg, "Generation of Finite Difference Formulas on
       Arbitrarily Spaced Grids", Mathematics of Computation 51, 1988.

Examples
--------
>>> import numpy as np
>>> from scipy.optimize._numdiff import approx_derivative
>>>
>>> def f(x, c1, c2):
...     return np.array([x[0] * np.sin(c1 * x[1]),
...                      x[0] * np.cos(c2 * x[1])])
...
>>> x0 = np.array([1.0, 0.5 * np.pi])
>>> approx_derivative(f, x0, args=(1, 2))
array([[ 1.,  0.],
       [-1.,  0.]])

Bounds can be used to limit the region of function evaluation.
In the example below we compute left and right derivative at point 1.0.

>>> def g(x):
...     return x**2 if x >= 1 else x
...
>>> x0 = 1.0
>>> approx_derivative(g, x0, bounds=(-np.inf, 1.0))
array([ 1.])
>>> approx_derivative(g, x0, bounds=(1.0, np.inf))
array([ 2.])

We can also parallelize the derivative calculation using the workers
keyword.

>>> from multiprocessing import Pool
>>> import time
>>> def fun2(x):       # import from an external file for use with multiprocessing
...     time.sleep(0.002)
...     return rosen(x)

>>> rng = np.random.default_rng()
>>> x0 = rng.uniform(high=10, size=(2000,))
>>> f0 = rosen(x0)

>>> %timeit approx_derivative(fun2, x0, f0=f0)     # may vary
10.5 s Â± 5.91 ms per loop (mean Â± std. dev. of 7 runs, 1 loop each)

>>> elapsed = []
>>> with Pool() as workers:
...     for i in range(10):
...         t = time.perf_counter()
...         approx_derivative(fun2, x0, workers=workers.map, f0=f0)
...         et = time.perf_counter()
...         elapsed.append(et - t)
>>> np.mean(elapsed)    # may vary
np.float64(1.442545195999901)

Create a map-like vectorized version. `x` is a generator, so first of all
a 2-D array, `xx`, is reconstituted. Here `xx` has shape `(Y, N)` where `Y`
is the number of function evaluations to perform and `N` is the dimensionality
of the objective function. The underlying objective function is `rosen`, which
requires `xx` to have shape `(N, Y)`, so a transpose is required.

>>> def fun(f, x, *args, **kwds):
...     xx = np.r_[[xs for xs in x]]
...     return f(xx.T)
>>> %timeit approx_derivative(fun2, x0, workers=fun, f0=f0)    # may vary
91.8 ms Â± 755 Î¼s per loop (mean Â± std. dev. of 7 runs, 10 loops each)

)r;   r=   r<   zUnknown method 'z'. ÚnfevNr   )r`   Úxpúreal floatingz#`x0` must have at most 1 dimension.z,Inconsistent shapes between bounds and `x0`.z7Bounds not supported when `as_linear_operator` is True.r   z&`f0` passed has more than 1 dimension.z `x0` violates bound constraints.r   rN   r;   r   r=   r   r<   F)#r   r   ÚxpxÚ
atleast_ndr[   r?   Úisdtyper   rO   r`   rd   rb   r   r   ÚisinfÚ_Fun_WrapperÚ
atleast_1dÚanyrL   Ú_linear_operator_differencerX   rP   rQ   r"   r   r8   Úmapr   Ú_dense_differencer   Úlenrt   Útocscrf   Ú_sparse_difference)Úfunr$   rG   rR   rV   rS   rc   ÚsparsityÚas_linear_operatorÚargsÚkwargsÚfull_outputÚworkersÚ	info_dictrx   Ú_xÚ_dtyper(   r)   Úfun_wrappedrw   Ú_nfevÚJÚ_r%   rT   rW   r*   ÚmfÚ	structurers   s                                  r7   Úapprox_derivativer—     s³  € ðF Ð1Ó1ÜÐ+¨F¨8°3Ð7Ó8Ð8à˜�€Iä	˜Ó	€BÜ	�Š˜Ÿ
™
 2›¨Q°2Ñ	6€BØ�Z‰Z€FØ	‡z�z�"—(‘(˜O×,Ñ,Ø—‘ˆð 
�‰�2�vÓ	€Bà	‡w�w�ƒ{ÜÐ>Ó?Ð?ä˜VÓ(�F€Bˆà	‡x�x�2—8‘8Ó˜rŸx™x¨2¯8©8Ó3ÜÐGÓHÐHæ¤2§6¢6¬"¯(ª(°2«,×#7Ñ#7Ü')§v¢v¬b¯hªh°r«l×';Ñ';Üð 9ó :ð 	:ð �~Øˆä˜s¨Ó5€Kð Ð€Dˆ5à	�zÙ˜‹_ˆØ‰ä�]Š]˜2ÓˆØ�7‰7�Q‹;ÜÐEÓFÐFä	‡v‚vˆr�B‰w˜2 ™7Ñ#×$Ñ$ÜÐ;Ó<Ð<æØÑÜ& r§x¡x°·±¸6ÓBˆHä*¨;¸Ø+-¸óA‰ˆŠ1ð ÑÜ& x°RÓ@‰Að ˜Q‘w×&Ñ&¤uÓ-°Ñ1°AÑ5ˆGØˆAð ˜‘6˜R‘-ˆBÜ—’˜˜q™Ü(¨¯©°2·8±8¸VÓDØ ñ!Ü#%§:¢:¨c´2·6²6¸"³:Ó#>ñ?àóˆAð
 �YÓÜ7Ø�A�q˜) R¨ó -ÑˆA‰}à�yÓ Ü7Ø�A�q˜) R¨ó -ÑˆA‰}à�t‹^Ø!ˆMð —.œSˆÜ˜Ô  BØÑÜ,¨[¸"À!Ø)6¸Ø)+ó-‘�‘5ô   ×)Ñ)¬c°(«m¸qÓ.@Ø(0Ñ%�I™và (�IÜ*¨8Ó4�Fä˜I×&Ñ&Ø )§¡Ó 1‘Iä "§¢¨iÓ 8�IÜŸš vÓ.�Ü-¨k¸2À1Ø-:¸IØ-3°V¸RóA‘��5÷# !ö* Ø�‰ˆØ ˆ	�&ÑØ�)ˆ|Ðàˆ÷5 !Õ ús   Ì%B,O0Ï0
O>c                 óÔ   ^ ^^^^• TR                   mTR                   nUS:X  a  UU UUU4S jnO+US:X  a
  U UUU4S jnOUS:X  a
  U UUU4S jnO[        S5      e[        TU4U5      S4$ )	Nr;   c                 óØ   >• [         R                  " U [         R                  " U 5      5      (       a  [         R                  " T5      $ T[	        U 5      -  nTX-  -   nT" U5      T-
  nX1-  $ ©N©r   Úarray_equalr   Úzerosr   )	ÚprW   r/   ÚdfrS   r‡   r%   rp   r$   s	       €€€€€r7   ÚmatvecÚ+_linear_operator_difference.<locals>.matvecr  sW   ø€ Ü�~Š~˜a¤§¢¨qÓ!1×2Ñ2Ü—x’x “{Ð"Ø”T˜!“W‘ˆBØ�R‘T‘	ˆAÙ�Q“˜"‘ˆBØ‘7ˆNr9   r=   c                 ó  >• [         R                  " U [         R                  " U 5      5      (       a  [         R                  " T	5      $ ST-  [	        U 5      -  nT
US-  U -  -
  nT
US-  U -  -   nT" U5      nT" U5      nXT-
  nXa-  $ ©Nr   r›   )rž   rW   Úx1Úx2Úf1Úf2rŸ   r‡   r%   rp   r$   s          €€€€r7   r    r¡   |  s~   ø€ Ü�~Š~˜a¤§¢¨qÓ!1×2Ñ2Ü—x’x “{Ð"Ø�1‘”t˜A“w‘ˆBØ�r˜!‘t˜Q‘h‘ˆBØ�r˜!‘t˜Q‘h‘ˆBÙ�R“ˆBÙ�R“ˆBØ‘ˆBØ‘7ˆNr9   r<   c                 óð   >• [         R                  " U [         R                  " U 5      5      (       a  [         R                  " T5      $ T[	        U 5      -  nTX-  S-  -   nT" U5      nUR
                  nXA-  $ ©Nù              ð?)r   rœ   r   r�   r   Úimag)	rž   rW   r/   r¦   rŸ   r‡   r%   rp   r$   s	        €€€€r7   r    r¡   ‰  s`   ø€ Ü�~Š~˜a¤§¢¨qÓ!1×2Ñ2Ü—x’x “{Ð"Ø”T˜!“W‘ˆBØ�R‘T˜#‘X‘ˆAÙ�Q“ˆBØ—‘ˆBØ‘7ˆNr9   úNever be here.r   )ÚsizerD   r   )r‡   r$   rS   r%   rG   rq   r    rp   s   ````   @r7   r�   r�   l  sr   ü€ Ø
�‰€AØ
�‰€Aà�Ó÷	ò 	ð 
�9Ó	÷		ñ 		ð 
�4‹÷	ñ 	ô Ð+Ó,Ð,ä˜1˜a˜& &Ó)¨1Ð,Ð,r9   c           
      óR  ^• UR                   nUR                   m[        R                  " TU45      nSn	US:X  a‚  U4S jn
U" X
" X5      5      n[        T5       Vs/ s H  oÁU   X<   -   X   -
  PM     nnU Vs/ s H  oîU-
  PM	     nn[	        Xý5       VVs/ s H  u  nnUU-  PM     nnnU	[        U5      -  n	GOŽUS:X  Ga  S n[        U" U U" XU5      5      5      nU" XU5      n[        5       n[        5       n[        U5       HŸ  u  nn[        U5      n[        U5      n[        U5      n[        U5      nU(       a8  UR                  UU   X   -
  5        UR                  SU-  SU-  -   U-
  5        Mq  UR                  UU   UU   -
  5        UR                  UU-
  5        M¡     [	        Xý5       VVs/ s H  u  nnUU-  PM     nnnU	S[        U5      -  -  n	OkUS	:X  aZ  U4S
 jn[        U" U U" X5      5      5      n[	        X³5       VVs/ s H  u  nnUR                  U-  PM     nnnU	[        U5      -  n	O[        S5      e[        U5       H
  u  nnUXŒ'   M     US:X  a  [        R                  " U5      nUR                  U	4$ s  snf s  snf s  snnf s  snnf s  snnf )Nr   r;   c              3   ó|   >#   • [        T5       H(  n[        R                  " U 5      nX   X   -   X2'   Uv •  M*     g 7frš   )Úranger   r!   )r$   r%   Úir¤   rq   s       €r7   Úx_generator2Ú'_dense_difference.<locals>.x_generator2ž  s7   øé € Ü˜1–X�ô —W’W˜R“[�Ø™ ¡™�‘Ø”ò ùs   ƒ9<r=   c              3   ó
  #   • [        U5       Hp  u  p4[        R                  " U 5      n[        R                  " U 5      nU(       a  X   X   -   XS'   X   SX   -  -   Xc'   OX   X   -
  XS'   X   X   -   Xc'   Uv •  Uv •  Mr     g 7fr£   )Ú	enumerater   r!   )r$   r%   r*   r±   Ú	one_sidedr¤   r¥   s          r7   Úx_generator3Ú'_dense_difference.<locals>.x_generator3³  s}   é € Ü )¨-Ö 8‘�Ü—W’W˜R“[�Ü—W’W˜R“[�ÞØ™E A¡D™L�B‘EØ™E A a¡d¡F™N�B’Eà™E A¡D™L�B‘EØ™E A¡D™L�B‘EØ’Ø”ò !9ùs   ‚BBg      Àé   r   r<   c              3   ó„   >#   • [        T5       H,  nU R                  [        SS9nX2==   X   S-  -  ss'   Uv •  M.     g 7f)NT©r!   rª   )r°   rO   Úcomplex)r$   r%   r±   Úxcrq   s       €r7   Úx_generator_csÚ)_dense_difference.<locals>.x_generator_csÕ  s=   øé € Ü˜1–X�Ø—Y‘Yœw¨T�YÐ2�Ø“˜™ ™Ñ#“Ø”ò ùs   ƒ=A r¬   r   )r­   r   Úemptyr°   Úzipr„   ÚiterÚlistrµ   ÚnextÚappendr«   rD   ÚravelÚT)r‡   r$   rS   r%   r*   rG   r�   rp   ÚJ_transposedrw   r²   Úf_evalsr±   rW   Úf_evalrŸ   ÚdelfÚdelxÚdf_dxr·   Úgenr¶   ÚlÚur¦   r§   r¾   ÚhiÚvrq   s                                @r7   rƒ   rƒ   —  s{  ø€ Ø
�‰€AØ
�‰€AÜ—8’8˜Q ˜FÓ#€LØ€Dà�Óõ
	ñ ˜#˜|¨BÓ2Ó3ˆÜ.3°A¬hÓ7ªh¨�!‰u�q‘t‰|˜r™uÔ$©hˆÐ7Ù(/Ó0ª˜f�rŒk©ˆÐ0Ü/2°2¬{Ô;ª{¡  t�˜”©{ˆÑ;Ø”�E“
ÑŠà	�9Ô	ò	ô ‘w˜s¡L°¸Ó$FÓGÓHˆÙ˜2 -Ó0ˆÜ‹VˆÜ‹VˆÜ% mÖ4‰LˆAˆyÜ�S“	ˆAÜ�S“	ˆAä�g“ˆBÜ�g“ˆBÞØ—	‘	˜!˜A™$ ¡™,Ô'Ø—	‘	˜$ ™) a¨"¡fÑ,¨rÑ1Ö2à—	‘	˜!˜A™$  1¡™+Ô&Ø—	‘	˜"˜r™'Ö"ñ 5ô 03°2¬{Ô;ª{¡  t�˜”©{ˆÑ;Ø�”C˜“J‘Ñ‰Ø	�4‹õ	ô ‘w˜s¡N°2Ó$9Ó:Ó;ˆÜ,/°¬OÔ<ªO¡& " b�—‘˜2”©OˆÑ<Ø”�E“
Ñ‰äÐ+Ó,Ð,ä˜%Ö ‰ˆˆ1Øˆ‹ñ !ð 	ˆAƒvÜ—x’x Ó-ˆà�>‰>˜4ÐÐùòu 8ùÚ0ùÛ;ùóF <ùó =s   ÁJÁ9JÂJÆ8JÈJ#c	                 óª  ^^^^^#^$• UR                   n	TR                   n
/ n/ n/ n[        R                  " T5      S-   m$SnUU$4S jm#U#UU4S jnU#UUU4S jnU#UU4S jnUS:X  a  [        U" X" 5       5      5      nU" 5       nOBUS:X  a  [        U" U U" 5       5      5      nU" 5       nOUS	:X  a  [        U" U U" 5       5      5      nT#" 5        GH‘  n[        R                  " U5      u  n[        US S 2U4   5      u  nnnUU   nUS:X  a"  [        W5      T-
  n[        W5      U-
  nUS-  nOöUS:X  a½  [        W5      n[        U5      nTU-  nT) U-  n[        R                  " U
5      nUU   TU   -
  UU'   UU   UU   -
  UU'   [        W5      n[        U5      n US
-  nTU   n![        R                  " U	5      nUU!   n"SUU"   -  SUU"   -  -   U U"   -
  UU"'   UU!)    n"U U"   UU"   -
  UU"'   O3US	:X  a"  [        W5      nUS-  nUR                  nTU-  nO[        S5      eUR                  U5        UR                  U5        UR                  UU   UU   -  5        GM”     [        R                  " U5      n[        R                  " U5      n[        R                  " U5      n[        U5      (       a  [        XÛU44Xš4S9U4$ [        XÛU44Xš4S9U4$ )Nr   r   c               3   ód   >#   • [        T5       H  n [        R                  " U T5      v •  M     g 7frš   )r°   r   Úequal)Úgrouprs   Ún_groupss    €€r7   Úe_generatorÚ'_sparse_difference.<locals>.e_generatorõ  s%   øé € ä˜8–_ˆEÜ—(’(˜5 &Ó)Ô)ò %ùs   ƒ-0c               3   óJ   >#   • T" 5       n U  H  nTU-  nTU-   nUv •  M     g 7frš   ru   )Úe_genÚeÚh_vecr/   rØ   r%   r$   s       €€€r7   r²   Ú(_sparse_difference.<locals>.x_generator2ú  s.   øé € Ù“ˆÛˆAØ˜‘EˆEØ�U‘
ˆAØŒGò ùs   ƒ #c               3   ó  >#   • T" 5       n U  Hv  nTU-  nT
R                  5       nT
R                  5       nT	U-  nX5==   X%   -  ss'   XE==   SX%   -  -  ss'   T	) U-  nX6==   X&   -  ss'   XF==   X&   -  ss'   Uv •  Uv •  Mx     g 7fr£   r»   )rÛ   rÜ   rÝ   r¤   r¥   Úmask_1Úmask_2rØ   r%   r*   r$   s          €€€€r7   r·   Ú(_sparse_difference.<locals>.x_generator3  s“   øé € Ù“ˆÛˆAØ˜‘EˆEØ—‘“ˆBØ—‘“ˆBà" QÑ&ˆFØ‹J˜%™-Ñ'‹JØ‹J˜!˜e™mÑ+Ñ+‹Jà#�^ aÑ'ˆFØ‹J˜%™-Ñ'‹JØ‹J˜%™-Ñ'‹JØŠHØŒHò ùs   ƒBBc               3   óL   >#   • T" 5       n U  H  nTU-  nTUS-  -   v •  M     g 7fr©   ru   )rÛ   rÜ   rÝ   rØ   r%   r$   s      €€€r7   r¾   Ú*_sparse_difference.<locals>.x_generator_cs  s/   øé € Ù“ˆÛˆAØ˜‘EˆEØ�u˜s‘{Ñ"Ô"ò ùs   ƒ!$r;   r=   r<   r   éýÿÿÿr¹   r¬   )rb   )r­   r   ÚmaxrÂ   Únonzeror   rÄ   r�   rÀ   r«   r   rÅ   Úhstackr   r   r
   )%r‡   r$   rS   r%   r*   r–   rs   rG   r�   rp   rq   Úrow_indicesÚcol_indicesÚ	fractionsrw   r²   r·   r¾   rÉ   ÚxsrÜ   Úcolsr±   Újr”   rW   rŸ   r¤   r¥   rà   rá   r¦   r§   ÚmaskÚrowsrØ   r×   s%    ` `` `                            @@r7   r†   r†   ê  sï  ý€ à
�‰€AØ
�‰€AØ€KØ€KØ€Iä�vŠv�f‹~ Ñ!€HØ€Dö*÷
÷ð ÷"#ð �ÓÜ‘w˜s L£NÓ3Ó4ˆÙ‹^‰Ø	�9Ó	Ü‘w˜s¡L£NÓ3Ó4ˆÙ‹^‰Ø	�4‹Ü‘w˜s¡NÓ$4Ó5Ó6ˆá�]ˆô —
’
˜1“‰ˆä�y¢ D Ñ)Ó*‰ˆˆ1ˆaà�‰Gˆà�YÓÜ�b“˜B‘ˆBÜ�g“ Ñ#ˆBØ�A‰I‰DØ�yÓ ô �b“ˆBÜ�b“ˆBà" QÑ&ˆFØ#�^ aÑ'ˆFä—’˜!“ˆBØ˜F™ b¨¡jÑ0ˆBˆv‰JØ˜F™ b¨¡jÑ0ˆBˆv‰Jä�g“ˆBÜ�g“ˆBØ�A‰IˆDà  Ñ#ˆDÜ—’˜!“ˆBà�T‘7ˆDØ˜B˜t™H‘} q¨2¨d©8¡|Ñ3°b¸±hÑ>ˆBˆt‰Hà�d�U‘8ˆDØ˜$‘x " T¡(Ñ*ˆBˆtŠHØ�t‹^Ü�g“ˆBØ�A‰IˆDØ—‘ˆBØ�Q‘‰BäÐ-Ó.Ð.ð 	×Ñ˜1ÔØ×Ñ˜1ÔØ×Ñ˜˜A™  A¡™×'ñe ôh —)’)˜KÓ(€KÜ—)’)˜KÓ(€KÜ—	’	˜)Ó$€Iä�)×ÑÜ˜9°KÐ&@ÐAÈ!ÈÑPÐRVÐVÐVÜ�i¨{Ð!;Ð<ÀQÀFÑKÈTÐQÐQr9   c                   ó    • \ rS rSrS rS rSrg)r~   i_  c                 ó4   • Xl         X l        X0l        X@l        g rš   )r‡   r$   rŠ   r‹   )Úselfr‡   r$   rŠ   r‹   s        r7   Ú__init__Ú_Fun_Wrapper.__init__a  s   € ØŒØŒØŒ	Ø�r9   c                 ón  • [        U R                  5      nUR                  UR                  S5      (       a%  UR	                  XR                  R                  5      n[
        R                  " U R                  " U/U R                  Q70 U R                  D65      nUR                  S:”  a  [        S5      eU$ )Nry   r   z-`fun` return value has more than 1 dimension.)r   r$   r|   r   rO   r   r   r‡   rŠ   r‹   r`   rD   )ró   r/   rx   Úfs       r7   Ú__call__Ú_Fun_Wrapper.__call__g  sˆ   € ô ˜TŸW™WÓ%ˆà�:‰:�a—g‘g˜×/Ñ/Ø—	‘	˜!ŸW™WŸ]™]Ó+ˆAä�MŠM˜$Ÿ(š( 1Ð@ t§y¡yÒ@°D·K±KÑ@ÓAˆØ�6‰6�A‹:Üð  8ó 9ð 9àˆr9   )rŠ   r‡   r‹   r$   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rô   rø   Ú__static_attributes__ru   r9   r7   r~   r~   _  s   † òõr9   r~   c           	      óZ  • Uc  0 nU" U/UQ70 UD6n[        U5      (       a¦  [        XX6XES9n[        U5      nXg-
  n[        U5      u  pšn[        R
                  " XyU
4   5      R                  5       n[        R                  " [        R                  " U5      [        R                  " S[        R                  " U5      5      -  5      $ [        XUXES9n[        R                  " Xg-
  5      n[        R                  " U[        R                  " S[        R                  " U5      5      -  5      $ )a{  Check correctness of a function computing derivatives (Jacobian or
gradient) by comparison with a finite difference approximation.

Parameters
----------
fun : callable
    Function of which to estimate the derivatives. The argument x
    passed to this function is ndarray of shape (n,) (never a scalar
    even if n=1). It must return 1-D array_like of shape (m,) or a scalar.
jac : callable
    Function which computes Jacobian matrix of `fun`. It must work with
    argument x the same way as `fun`. The return value must be array_like
    or sparse array with an appropriate shape.
x0 : array_like of shape (n,) or float
    Point at which to estimate the derivatives. Float will be converted
    to 1-D array.
bounds : 2-tuple of array_like, optional
    Lower and upper bounds on independent variables. Defaults to no bounds.
    Each bound must match the size of `x0` or be a scalar, in the latter
    case the bound will be the same for all variables. Use it to limit the
    range of function evaluation.
args, kwargs : tuple and dict, optional
    Additional arguments passed to `fun` and `jac`. Both empty by default.
    The calling signature is ``fun(x, *args, **kwargs)`` and the same
    for `jac`.

Returns
-------
accuracy : float
    The maximum among all relative errors for elements with absolute values
    higher than 1 and absolute errors for elements with absolute values
    less or equal than 1. If `accuracy` is on the order of 1e-6 or lower,
    then it is likely that your `jac` implementation is correct.

See Also
--------
approx_derivative : Compute finite difference approximation of derivative.

Examples
--------
>>> import numpy as np
>>> from scipy.optimize._numdiff import check_derivative
>>>
>>>
>>> def f(x, c1, c2):
...     return np.array([x[0] * np.sin(c1 * x[1]),
...                      x[0] * np.cos(c2 * x[1])])
...
>>> def jac(x, c1, c2):
...     return np.array([
...         [np.sin(c1 * x[1]),  c1 * x[0] * np.cos(c1 * x[1])],
...         [np.cos(c2 * x[1]), -c2 * x[0] * np.sin(c2 * x[1])]
...     ])
...
>>>
>>> x0 = np.array([1.0, 0.5 * np.pi])
>>> check_derivative(f, jac, x0, args=(1, 2))
2.4492935982947064e-16
)rc   rˆ   rŠ   r‹   r   )rc   rŠ   r‹   )
r   r—   r
   r   r   r[   rÆ   ræ   r   r"   )r‡   Újacr$   rc   rŠ   r‹   Ú	J_to_testÚJ_diffÚabs_errr±   rî   Úabs_err_dataÚJ_diff_datas                r7   Úcheck_derivativer  v  sÿ   € ðz �~ØˆÙ�BÐ(˜Ò( Ñ(€IÜ�	×ÑÜ" 3°6Ø(,ñ=ˆä˜iÓ(ˆ	ØÑ$ˆÜ! '›]ÑˆˆlÜ—j’j ¨1¨¡Ó.×4Ñ4Ó6ˆÜ�vŠv”b—f’f˜\Ó*Ü—j’j ¤B§F¢F¨;Ó$7Ó8ñ9ó :ð 	:ô # 3°6Ø(,ñ=ˆä—&’&˜Ñ+Ó,ˆÜ�vŠv�g¤§
¢
¨1¬b¯fªf°V«nÓ =Ñ=Ó>Ð>r9   )r   )&Ú__doc__Ú	functoolsÚnumpyr   Únumpy.linalgr   Úscipy.sparse.linalgr   Úsparser   r   r   r	   r
   r   Ú_group_columnsr   r   Úscipy._lib._array_apir   Úscipy._lib._utilr   Ú
scipy._libr   rz   r8   Ú	lru_cacherL   rX   rd   rt   r    r—   r�   rƒ   r†   r~   r  ru   r9   r7   Ú<module>r     sÉ   ðÙ -Û Û Ý å .ß Q× Qß 5Ý 1Ý 'Ý -òL%ð^ ×Ññ2;ó ð2;òj.òbô*:ðz '0¸$ÈØ¨¯© w°·±Ð&7À$Ø).°RÀØ"'°ôSòl
(-òVP òfrR÷jñ ð. -/¯F©F¨7°B·F±FÐ*;À"Ø õM?r9   