§
    µ³Ùgq  ã            	       ó  — d Z ddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZ ddlmZmZ dd	lmZ dd
lmZ d„ Zej        d„ ¦   «         Zd„ Zd„ Zdd„Zddddej         ej        fddddf	d„Zd„ Zd„ Zd„ Z ej         ej        fddfd„Z!dS )z'Routines for numerical differentiation.é    N)Únorm)ÚLinearOperatoré   )ÚissparseÚ
csc_matrixÚ
csr_matrixÚ
coo_matrixÚfindé   )Úgroup_denseÚgroup_sparse)Úarray_namespace)Úarray_api_extrac                 ó2  — |dk    rt          j        |t          ¬¦  «        }nE|dk    r0t          j        |¦  «        }t          j        |t          ¬¦  «        }nt          d¦  «        ‚t          j        |t           j         k    |t           j        k    z  ¦  «        r||fS ||z  }|                     ¦   «         }| |z
  }	|| z
  }
|dk    r‚| |z   }||k     ||k    z  }t          j        |¦  «        t          j	        |	|
¦  «        k    }|||z  xx         dz  cc<   |
|	k    | z  }|
|         |z  ||<   |
|	k     | z  }|	|          |z  ||<   nÊ|dk    rÄ|	|k    |
|k    z  }|
|	k    | z  }t          j
        ||         d|
|         z  |z  ¦  «        ||<   d||<   |
|	k     | z  }t          j
        ||         d|	|         z  |z  ¦  «         ||<   d||<   t          j
        |
|	¦  «        |z  }| t          j        |¦  «        |k    z  }||         ||<   d||<   ||fS )	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                      úM/granary/edev/quantum/lib/python3.11/site-packages/scipy/optimize/_numdiff.pyÚ_adjust_scheme_to_boundsr6      s�  € ð> �ÒÐÝœ Q­dÐ3Ñ3Ô3ˆˆØ	�9Ò	Ð	ÝŒF�1‰IŒIˆÝœ a­tÐ4Ñ4Ô4ˆˆåÐCÑDÔDÐDå	„vˆr•b”f�WŠ} ¥r¤v¢Ñ.Ñ/Ô/ð  Ø�-ÐÐà�)‰m€GØ—’‘”€Jà�b‘€JØ�b‘€Jà�ÒÐØ�‰LˆØ˜’F˜q 2švÑ&ˆÝ”&˜‘/”/¥R¤Z°
¸JÑ%GÔ%GÒGˆØ�8˜gÑ%Ð&Ð&Ô&¨"Ñ,Ð&Ð&Ñ&à Ò+°¨xÑ7ˆØ(¨Ô1°IÑ=ˆ
�7ÑØ Ò+°¨xÑ7ˆØ *¨8Ô 4Ð4°yÑ@ˆ
�8ÑÐØ	�9Ò	Ð	Ø Ò(¨Z¸7Ò-BÑCˆà Ò+°¨xÑ7ˆÝ œjØˆgŒJ˜˜j¨Ô1Ñ1°IÑ=ñ?ô ?ˆ
�7Ñà!%ˆ�gÑà Ò+°¨xÑ7ˆÝ "¤
ØˆhŒK˜˜z¨(Ô3Ñ3°iÑ?ñ!Aô !Að  Aˆ
�8Ñà"&ˆ�hÑå”:˜j¨*Ñ5Ô5¸	ÑAˆØ$˜H­¬¨zÑ(:Ô(:¸hÒ(FÑGÐØ'/Ð0@Ô'Aˆ
Ð#Ñ$Ø*/ˆÐ&Ñ'à�}Ð$Ð$ó    c                 óæ  — t          j        t           j        ¦  «        j        }d}t          j        | t           j        ¦  «        r4t          j        | ¦  «        j        }t          j        | ¦  «        j        }d}t          j        |t           j        ¦  «        r:t          j        |¦  «        j        }|r||k     rt          j        |¦  «        j        }|dv r|dz  S |dv r|dz  S t          d¦  «        ‚)a¨  
    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          r5   Ú_eps_for_methodrJ   \   sé   € õ< Œ(•2”:Ñ
Ô
Ô
"€Cà€HÝ	„}�X�rœzÑ*Ô*ð åŒh�xÑ Ô Ô$ˆÝ”h˜xÑ(Ô(Ô1ˆØˆå	„}�X�rœzÑ*Ô*ð )Ý”h˜xÑ(Ô(Ô1ˆàð 	)˜ kÒ1Ð1Ý”(˜8Ñ$Ô$Ô(ˆCàÐ"Ð"Ð"Ø�C‰xˆØ	�;Ð	Ð	Ø�S‰zÐåð :ñ ;ô ;ð 	;r7   c           
      ó²  — |dk                          t          ¦  «        dz  dz
  }t          |j        |j        |¦  «        }| €.||z  t	          j        dt	          j        |¦  «        ¦  «        z  }ng| |z  t	          j        |¦  «        z  }||z   |z
  }t	          j        |dk    ||z  t	          j        dt	          j        |¦  «        ¦  «        z  |¦  «        }|S )az  
    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   Nç      ð?)ÚastypeÚfloatrJ   r   r   r    r   Úwhere)Úrel_stepr"   Úf0rE   Úsign_x0ÚrstepÚabs_stepÚdxs           r5   Ú_compute_absolute_steprV   ’   sÎ   € ð6 �QŠw×Ò�uÑ%Ô%¨Ñ)¨AÑ-€Gå˜BœH b¤h°Ñ7Ô7€EàÐØ˜7‘?¥R¤Z°µR´V¸B±Z´ZÑ%@Ô%@Ñ@ˆˆð
 ˜gÑ%­¬¨r©
¬
Ñ2ˆð �H‰} Ñ"ˆÝ”8˜B !šGØ! G™O­b¬j¸½b¼fÀR¹j¼jÑ.IÔ.IÑIØ$ñ&ô &ˆð €Or7   c                 ó¼   — d„ | D ¦   «         \  }}|j         dk    rt          j        ||j        ¦  «        }|j         dk    rt          j        ||j        ¦  «        }||fS )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   óL   K  — | ]}t          j        |t          ¬ ¦  «        V — Œ dS )r   N)r   ÚasarrayrN   )Ú.0Úbs     r5   ú	<genexpr>z"_prepare_bounds.<locals>.<genexpr>Î   s1   è è € Ð9Ð9¨Q�bŒj˜¥%Ð(Ñ(Ô(Ð9Ð9Ð9Ð9Ð9Ð9r7   r   )Úndimr   ÚresizeÚshape)Úboundsr"   r&   r'   s       r5   Ú_prepare_boundsra   Ã   s`   € ð :Ð9°&Ð9Ñ9Ô9�F€BˆØ	„w�!‚|€|ÝŒY�r˜2œ8Ñ$Ô$ˆà	„w�!‚|€|ÝŒY�r˜2œ8Ñ$Ô$ˆàˆrˆ6€Mr7   c                 ó®  — t          | ¦  «        rt          | ¦  «        } n7t          j        | ¦  «        } | dk                         t          j        ¦  «        } | j        dk    rt          d¦  «        ‚| j        \  }}|�t          j	        |¦  «        r5t          j
                             |¦  «        }|                     |¦  «        }n/t          j        |¦  «        }|j        |fk    rt          d¦  «        ‚| dd…|f         } t          | ¦  «        rt          ||| j        | j        ¦  «        }nt#          ||| ¦  «        }|                     ¦   «         ||<   |S )aÊ  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 matrix, 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_2drM   Úint32r]   r   r_   ÚisscalarÚrandomÚRandomStateÚpermutationrY   r   ÚindicesÚindptrr   r   )ÚAÚorderÚmÚnÚrngÚgroupss         r5   Úgroup_columnsrq   Ø   s1  € õ< ��{„{ð &Ý�q‰MŒMˆˆåŒM˜!ÑÔˆØ�!ŠV�OŠO�BœHÑ%Ô%ˆà„v�‚{€{ÝÐ5Ñ6Ô6Ð6àŒ7�D€A€qà€}�œ EÑ*Ô*€}ÝŒi×#Ò# EÑ*Ô*ˆØ—’ Ñ"Ô"ˆˆå”
˜5Ñ!Ô!ˆØŒ;˜1˜$ÒÐÝÐ;Ñ<Ô<Ð<à	ˆ!ˆ!ˆ!ˆUˆ(Œ€Aå��{„{ð &Ý˜a  A¤I¨q¬xÑ8Ô8ˆˆå˜Q  1Ñ%Ô%ˆà—K’K‘M”M€Fˆ5�Mà€Mr7   r;   F© c           
      ó  ‡ ‡‡	‡
‡— |dvrt          d|› d�¦  «        ‚t          ‰¦  «        Št          j        ‰                     ‰¦  «        d‰¬¦  «        }‰j        }‰                     |j        d¦  «        r|j        }‰                     ||¦  «        Š‰j	        dk    rt          d¦  «        ‚t          |‰¦  «        \  }}|j        ‰j        k    s|j        ‰j        k    rt          d¦  «        ‚|r[t          j        t          j        |¦  «        ¦  «        r&t          j        t          j        |¦  «        ¦  «        st          d	¦  «        ‚‰
€i Š
ˆ	ˆ ˆ
ˆˆfd„}|€ |‰¦  «        }n.t          j        |¦  «        }|j	        dk    rt          d¦  «        ‚t          j        ‰|k     ‰|k    z  ¦  «        rt          d¦  «        ‚|r0|€t#          ‰j        |j        |¦  «        }t%          |‰|||¦  «        S |€t'          |‰||¦  «        }nŒ‰dk                         t(          ¦  «        dz  dz
  }|}‰|z   ‰z
  }t          j        |dk    t#          ‰j        |j        |¦  «        |z  t          j        dt          j        ‰¦  «        ¦  «        z  |¦  «        }|dk    rt1          ‰|dd||¦  «        \  }}n&|dk    rt1          ‰|dd||¦  «        \  }}n|dk    rd}|€t3          |‰||||¦  «        S t5          |¦  «        st7          |¦  «        dk    r|\  }}n|}t9          |¦  «        }t5          |¦  «        rt;          |¦  «        }nt          j        |¦  «        }t          j        |¦  «        }t?          |‰||||||¦  «        S )aJ  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 matrix, 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 matrix 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 matrix 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 matrix 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)``.

    Returns
    -------
    J : {ndarray, sparse matrix, 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
        matrix 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_matrix with shape (m, n).
        For sparse matrices 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,).

    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.])
    )r9   r;   r:   zUnknown method 'z'. r   )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.Nc                 óä   •— ‰                      | j        d¦  «        r‰                     | ‰j        ¦  «        } t          j         ‰| g‰¢R i ‰¤Ž¦  «        }|j        dk    rt          d¦  «        ‚|S )Nru   r   z-`fun` return value has more than 1 dimension.)Úisdtyper   rM   r   Ú
atleast_1dr]   rB   )r-   ÚfÚargsÚfunÚkwargsr"   rt   s     €€€€€r5   Úfun_wrappedz&approx_derivative.<locals>.fun_wrappedÔ  s‚   ø€ ð �:Š:�a”g˜Ñ/Ô/ð 	'Ø—	’	˜!˜RœXÑ&Ô&ˆAåŒM˜#˜#˜aÐ1 $Ð1Ð1Ð1¨&Ð1Ð1Ñ2Ô2ˆØŒ6�AŠ:ˆ:Ýð  8ñ 9ô 9ð 9àˆr7   z&`f0` passed has more than 1 dimension.z `x0` violates bound constraints.r   r   rL   r9   r   r;   r   r:   F) r   r   ÚxpxÚ
atleast_ndrY   r=   rw   r   rM   r]   ra   r_   r   r   Úisinfrx   ÚanyrJ   Ú_linear_operator_differencerV   rN   rO   r    r   r6   Ú_dense_differencer   Úlenrq   r   rc   Ú_sparse_difference)r{   r"   rE   rP   rT   rQ   r`   ÚsparsityÚas_linear_operatorrz   r|   Ú_xÚ_dtyper&   r'   r}   r#   rR   rU   r(   Ú	structurerp   rt   s   ``       ``           @r5   Úapprox_derivativer‹     s  øøøøø€ ðF Ð1Ð1Ð1ÝÐ7¨FÐ7Ð7Ð7Ñ8Ô8Ð8å	˜Ñ	Ô	€BÝ	Œ˜Ÿ
š
 2™œ¨Q°2Ð	6Ñ	6Ô	6€BØŒZ€FØ	‡z‚z�"”(˜OÑ,Ô,ð Ø”ˆð 
�Š�2�vÑ	Ô	€Bà	„w�‚{€{ÝÐ>Ñ?Ô?Ð?å˜V RÑ(Ô(�F€Bˆà	„x�2”8ÒÐ˜rœx¨2¬8Ò3Ð3ÝÐGÑHÔHÐHàð :¥2¤6­"¬(°2©,¬,Ñ#7Ô#7ð :Ý')¤v­b¬h°r©l¬lÑ';Ô';ð:åð 9ñ :ô :ð 	:ð €~Øˆð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
€zØˆ[˜‰_Œ_ˆˆåŒ]˜2ÑÔˆØŒ7�QŠ;ˆ;ÝÐEÑFÔFÐFå	„vˆr�BŠw˜2 š7Ñ#Ñ$Ô$ð =ÝÐ;Ñ<Ô<Ð<àð 26ØÐÝ& r¤x°´¸6ÑBÔBˆHå*¨;¸Ø+-¨x¸ñAô Að 	Að ÐÝ& x°°R¸Ñ@Ô@ˆAˆAð ˜Q’w×&Ò&¥uÑ-Ô-°Ñ1°AÑ5ˆGØˆAð ˜‘6˜R‘-ˆBÝ”˜˜qšÝ(¨¬°2´8¸VÑDÔDØ ñ!Ý#%¤:¨cµ2´6¸"±:´:Ñ#>Ô#>ñ?àñô ˆAð
 �YÒÐÝ7Ø�A�q˜) R¨ñ -ô  -ÑˆAˆ}ˆ}à�yÒ Ð Ý7Ø�A�q˜) R¨ñ -ô  -ÑˆAˆ}ˆ}à�tŠ^ˆ^Ø!ˆMàÐÝ$ [°"°b¸!Ø%2°Fñ<ô <ð <õ ˜HÑ%Ô%ð 1­#¨h©-¬-¸1Ò*<Ð*<Ø$,Ñ!�	˜6˜6à$�	Ý& xÑ0Ô0�å˜	Ñ"Ô"ð 5Ý& yÑ1Ô1�	�	åœM¨)Ñ4Ô4�	å”] 6Ñ*Ô*ˆFÝ% k°2°r¸1Ø&3°YØ&,¨fñ6ô 6ð 6r7   c                 óÆ   ‡ ‡‡‡‡— ‰j         Š‰j         }|dk    r
ˆˆ ˆˆˆfd„}n-|dk    r	ˆ ˆˆˆfd„}n|dk    r	ˆ ˆˆˆfd„}nt          d¦  «        ‚t          ‰|f|¦  «        S )Nr9   c                 óÔ   •— t          j        | t          j        | ¦  «        ¦  «        rt          j        ‰¦  «        S ‰t	          | ¦  «        z  }‰|| z  z   } ‰|¦  «        ‰z
  }||z  S )N©r   Úarray_equalr   Úzerosr   )	ÚprU   r-   ÚdfrQ   r{   r#   rm   r"   s	       €€€€€r5   Úmatvecz+_linear_operator_difference.<locals>.matvec$  se   ø€ ÝŒ~˜a¥¤¨qÑ!1Ô!1Ñ2Ô2ð #Ý”x ‘{”{Ð"Ø•T˜!‘W”W‘ˆBØ�R˜‘T‘	ˆAØ��Q‘”˜"‘ˆBØ˜‘7ˆNr7   r;   c                 ó  •— t          j        | t          j        | ¦  «        ¦  «        rt          j        ‰	¦  «        S d‰z  t	          | ¦  «        z  }‰
|dz  | z  z
  }‰
|dz  | z  z   } ‰|¦  «        } ‰|¦  «        }||z
  }||z  S )Nr   rŽ   )r‘   rU   Úx1Úx2Úf1Úf2r’   r{   r#   rm   r"   s          €€€€r5   r“   z+_linear_operator_difference.<locals>.matvec-  s�   ø€ ÝŒ~˜a¥¤¨qÑ!1Ô!1Ñ2Ô2ð #Ý”x ‘{”{Ð"Ø�1‘•t˜A‘w”w‘ˆBØ�r˜!‘t˜Q‘h‘ˆBØ�r˜!‘t˜Q‘h‘ˆBØ��R‘”ˆBØ��R‘”ˆBØ�b‘ˆBØ˜‘7ˆNr7   r:   c                 óâ   •— t          j        | t          j        | ¦  «        ¦  «        rt          j        ‰¦  «        S ‰t	          | ¦  «        z  }‰|| z  dz  z   } ‰|¦  «        }|j        }||z  S )Nù              ð?)r   r�   r   r�   r   Úimag)	r‘   rU   r-   r—   r’   r{   r#   rm   r"   s	        €€€€r5   r“   z+_linear_operator_difference.<locals>.matvec9  sl   ø€ ÝŒ~˜a¥¤¨qÑ!1Ô!1Ñ2Ô2ð #Ý”x ‘{”{Ð"Ø•T˜!‘W”W‘ˆBØ�R˜‘T˜#‘X‘ˆAØ��Q‘”ˆBØ”ˆBØ˜‘7ˆNr7   úNever be here.)ÚsizerB   r   )r{   r"   rQ   r#   rE   rn   r“   rm   s   ````   @r5   r‚   r‚     sé   øøøøø€ Ø
Œ€AØ
Œ€Aà�ÒÐð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 
�9Ò	Ð	ð		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 
�4Šˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ Ð+Ñ,Ô,Ð,å˜1˜a˜& &Ñ)Ô)Ð)r7   c                 ó@  — |j         }|j         }t          j        ||f¦  «        }|                     ¦   «         }	|                     ¦   «         }
|                     t
          d¬¦  «        }t          |j         ¦  «        D �]€}|dk    r7|	|xx         ||         z  cc<   |	|         ||         z
  } | |	¦  «        |z
  }�n#|dk    rm||         re|	|xx         ||         z  cc<   |
|xx         d||         z  z  cc<   |
|         ||         z
  } | |	¦  «        } | |
¦  «        }d|z  d|z  z   |z
  }n°|dk    ra||         sY|	|xx         ||         z  cc<   |
|xx         ||         z  cc<   |
|         |	|         z
  } | |	¦  «        } | |
¦  «        }||z
  }nI|dk    r4||xx         ||         d	z  z  cc<    | |¦  «        }|j        }||         }nt          d
¦  «        ‚||z  ||<   ||         x|	|<   x|
|<   ||<   �Œ‚|dk    rt          j	        |¦  «        }|j
        S )NT)r   r9   r;   r   g      Àé   r:   rš   rœ   r   )r�   r   Úemptyr   rM   ÚcomplexÚranger›   rB   ÚravelÚT)r{   r"   rQ   r#   r(   rE   rm   rn   ÚJ_transposedr•   r–   ÚxcÚirU   r’   r—   r˜   s                    r5   rƒ   rƒ   H  sa  € Ø
Œ€AØ
Œ€AÝ”8˜Q ˜FÑ#Ô#€LØ	�Š‰Œ€BØ	�Š‰Œ€BØ	�Š•7 ˆÑ	&Ô	&€Bå�1”6‰]Œ]ð &ñ &ˆØ�YÒÐØˆqˆEˆEŒE�Q�q”T‰MˆEˆE‰EØ�A”˜˜Aœ‘ˆBØ��R‘”˜2‘ˆB‰BØ�yÒ Ð  ]°1Ô%5Ð ØˆqˆEˆEŒE�Q�q”T‰MˆEˆE‰EØˆqˆEˆEŒE�Q˜˜1œ‘XÑˆEˆE‰EØ�A”˜˜Aœ‘ˆBØ��R‘”ˆBØ��R‘”ˆBØ˜‘˜Q ™VÑ# bÑ(ˆBˆBØ�yÒ Ð ¨°qÔ)9Ð ØˆqˆEˆEŒE�Q�q”T‰MˆEˆE‰EØˆqˆEˆEŒE�Q�q”T‰MˆEˆE‰EØ�A”˜˜Aœ‘ˆBØ��R‘”ˆBØ��R‘”ˆBØ�b‘ˆBˆBØ�tŠ^ˆ^ØˆqˆEˆEŒE�Q�q”T˜C‘ZÑˆEˆE‰EØ��R‘”ˆBØ”ˆBØ�1”ˆBˆBåÐ/Ñ0Ô0Ð0à˜r™'ˆ�Q‰Ø " 1¤Ð%ˆˆ1‰Ð%��1‘˜˜1™™àˆA‚v€vÝ”x Ñ-Ô-ˆàŒ>Ðr7   c                 ó®  — |j         }|j         }	g }
g }g }t          j        |¦  «        dz   }t          |¦  «        D �]¸}t          j        ||¦  «        }||z  }|dk    rU||z   }||z
  } | |¦  «        |z
  }t          j        |¦  «        \  }t          |d d …|f         ¦  «        \  }}}||         }�nò|dk    �r€|                     ¦   «         }|                     ¦   «         }||z  }||xx         ||         z  cc<   ||xx         d||         z  z  cc<   | |z  }||xx         ||         z  cc<   ||xx         ||         z  cc<   t          j        |	¦  «        }||         ||         z
  ||<   ||         ||         z
  ||<    | |¦  «        } | |¦  «        }t          j        |¦  «        \  }t          |d d …|f         ¦  «        \  }}}||         }||         }t          j	        |¦  «        }||         }d||         z  d||         z  z   ||         z
  ||<   ||          }||         ||         z
  ||<   nk|dk    rV | ||dz  z   ¦  «        }|j
        }|}t          j        |¦  «        \  }t          |d d …|f         ¦  «        \  }}}||         }nt          d	¦  «        ‚|
                     |¦  «         |                     |¦  «         |                     ||         ||         z  ¦  «         �Œºt          j        |
¦  «        }
t          j        |¦  «        }t          j        |¦  «        }t          ||
|ff||	f¬
¦  «        } t          | ¦  «        S )Nr   r9   r;   r   éýÿÿÿrŸ   r:   rš   rœ   )r_   )r�   r   Úmaxr¢   ÚequalÚnonzeror
   r   r�   r    r›   r   ÚappendÚhstackr	   r   )!r{   r"   rQ   r#   r(   rŠ   rp   rE   rm   rn   Úrow_indicesÚcol_indicesÚ	fractionsÚn_groupsÚgroupÚeÚh_vecr-   rU   r’   Úcolsr§   ÚjÚ_r•   r–   Úmask_1Úmask_2r—   r˜   ÚmaskÚrowsÚJs!                                    r5   r…   r…   t  s„  € à
Œ€AØ
Œ€AØ€KØ€KØ€IåŒv�f‰~Œ~ Ñ!€HÝ�x‘”ð >(ñ >(ˆåŒH�U˜FÑ#Ô#ˆØ�A‘ˆØ�YÒÐØ�U‘
ˆAØ�R‘ˆBØ��Q‘”˜"‘ˆBõ ”J˜q‘M”M‰EˆDå˜9 Q Q Q¨ WÔ-Ñ.Ô.‰GˆAˆq�!à�Q”ˆA‰AØ�yÒ Ñ ð —’‘”ˆBØ—’‘”ˆBà" QÑ&ˆFØˆvˆJˆJŒJ˜% œ-Ñ'ˆJˆJ‰JØˆvˆJˆJŒJ˜!˜e FœmÑ+Ñ+ˆJˆJ‰Jà#�^ aÑ'ˆFØˆvˆJˆJŒJ˜% œ-Ñ'ˆJˆJ‰JØˆvˆJˆJŒJ˜% œ-Ñ'ˆJˆJ‰Jå”˜!‘”ˆBØ˜Fœ b¨¤jÑ0ˆBˆv‰JØ˜Fœ b¨¤jÑ0ˆBˆv‰Jà��R‘”ˆBØ��R‘”ˆBå”J˜q‘M”M‰EˆDÝ˜9 Q Q Q¨ WÔ-Ñ.Ô.‰GˆAˆq�!Ø�Q”ˆAà  Ô#ˆ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ˆHØ�tŠ^ˆ^Ø��R˜% ™)‘^Ñ$Ô$ˆBØ”ˆBØˆBÝ”J˜q‘M”M‰EˆDÝ˜9 Q Q Q¨ WÔ-Ñ.Ô.‰GˆAˆq�!Ø�Q”ˆAˆAåÐ-Ñ.Ô.Ð.ð 	×Ò˜1ÑÔÐØ×Ò˜1ÑÔÐØ×Ò˜˜Aœ  A¤™Ñ'Ô'Ð'Ñ'å”)˜KÑ(Ô(€KÝ”)˜KÑ(Ô(€KÝ”	˜)Ñ$Ô$€IÝ�I ¨[Ð9Ð:À1ÀaÀ&ÐIÑIÔI€AÝ�a‰=Œ=Ðr7   c           	      ó~  — |€i } ||g|¢R i |¤Ž}t          |¦  «        r¸t          | |||||¬¦  «        }t          |¦  «        }||z
  }t          |¦  «        \  }	}
}t	          j        ||	|
f         ¦  «                             ¦   «         }t	          j        t	          j        |¦  «        t	          j	        dt	          j        |¦  «        ¦  «        z  ¦  «        S t          | ||||¬¦  «        }t	          j        ||z
  ¦  «        }t	          j        |t	          j	        dt	          j        |¦  «        ¦  «        z  ¦  «        S )aT	  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 matrix 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
    N)r`   r†   rz   r|   r   )r`   rz   r|   )
r   r‹   r   r
   r   rY   r£   rª   r   r    )r{   Újacr"   r`   rz   r|   Ú	J_to_testÚJ_diffÚabs_errr§   r·   Úabs_err_dataÚJ_diff_datas                r5   Úcheck_derivativerÅ   Ä  sG  € ðz €~ØˆØ��BÐ(˜Ð(Ð(Ð( Ð(Ð(€IÝ�	ÑÔð ?Ý" 3¨°6ÀIØ(,°Vð=ñ =ô =ˆå˜yÑ)Ô)ˆ	Ø˜fÑ$ˆÝ! '™]œ]Ñˆˆ1ˆlÝ”j ¨¨1¨¤Ñ.Ô.×4Ò4Ñ6Ô6ˆÝŒv•b”f˜\Ñ*Ô*Ý”j ¥B¤F¨;Ñ$7Ô$7Ñ8Ô8ñ9ñ :ô :ð 	:õ # 3¨°6Ø(,°Vð=ñ =ô =ˆå”&˜ VÑ+Ñ,Ô,ˆÝŒv�g¥¤
¨1­b¬f°V©n¬nÑ =Ô =Ñ=Ñ>Ô>Ð>r7   )r   )"Ú__doc__Ú	functoolsÚnumpyr   Únumpy.linalgr   Úscipy.sparse.linalgr   Úsparser   r   r   r	   r
   Ú_group_columnsr   r   Úscipy._lib._array_apir   Ú
scipy._libr   r~   r6   Ú	lru_cacherJ   rV   ra   rq   r   r‹   r‚   rƒ   r…   rÅ   rr   r7   r5   ú<module>rÐ      s»  ðØ -Ð -Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à .Ð .Ð .Ð .Ð .Ð .Ø GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø -Ð -Ð -Ð -Ð -Ð -ðL%ð L%ð L%ð^ Ôð2;ð 2;ñ Ôð2;ðj.ð .ð .ðbð ð ð*:ð :ð :ð :ðz '0¸$ÈØ¨¬ w°´Ð&7À$Ø).°RÀðG6ð G6ð G6ð G6ðT&*ð &*ð &*ðR)ð )ð )ðXMð Mð Mð` -/¬F¨7°B´FÐ*;À"Ø ðM?ð M?ð M?ð M?ð M?ð M?r7   