Ë
    ÏÍ:jo‘  ã                   ót  — 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mZ ddlmZmZ dd	lmZmZ dd
lmZ ddlmZ d„ Zej6                  d„ «       Zd„ Zd„ Zdd„Zddddej@                   ej@                  fddddddfd„Z!d„ Z"d„ Z#d„ Z$ G d„ d«      Z%ej@                   ej@                  fddfd„Z&y)z'Routines for numerical differentiation.é    N)Únorm)ÚLinearOperatoré   )ÚissparseÚspmatrixÚfindÚ	csc_arrayÚ	csr_arrayÚ
csr_matrixé   )Úgroup_denseÚgroup_sparse)Úarray_namespaceÚxp_result_type)Ú
MapWrapper)Úarray_api_extrac                 óø  — |dk(  rt        j                  |t        ¬«      }nA|dk(  r1t        j                  |«      }t        j                  |t        ¬«      }nt        d«      ‚t        j                  |t         j                   k(  |t         j                  k(  z  «      r||fS ||z  }|j                  «       }| |z
  }	|| z
  }
|dk(  ry| |z   }||k  ||kD  z  }t        j                  |«      t        j                  |	|
«      k  }|||z  xx   dz  cc<   |
|	k\  | z  }|
|   |z  ||<   |
|	k  | z  }|	|    |z  ||<   ||fS |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                      úl/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/scipy/optimize/_numdiff.pyÚ_adjust_scheme_to_boundsr9      sX  € ð> �ÒÜŸ™ 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à�b‘€JØ�b‘€Jà�ÒØ�‰LˆØ˜‘F˜q 2™vÑ&ˆÜ—&‘&˜“/¤R§Z¡Z°
¸JÓ%GÑGˆØ�8˜gÑ%Ó&¨"Ñ,Ó&à Ñ+°¨xÑ7ˆØ(¨Ñ1°IÑ=ˆ
�7ÑØ Ñ+°¨xÑ7ˆØ *¨8Ñ 4Ð4°yÑ@ˆ
�8Ñð& �}Ð$Ð$ð% 
�9Ò	Ø Ñ(¨Z¸7Ñ-BÑCˆà Ñ+°¨xÑ7ˆÜ Ÿj™jØˆg‰J˜˜j¨Ñ1Ñ1°IÑ=ó?ˆ
�7Ñà!%ˆ�gÑà Ñ+°¨xÑ7ˆÜ "§
¡
Øˆh‰K˜˜z¨(Ñ3Ñ3°iÑ?ó!Að  Aˆ
�8Ñà"&ˆ�hÑä—:‘:˜j¨*Ó5¸	ÑAˆØ$˜H¬¯©¨zÓ(:¸hÑ(FÑGÐØ'/Ð0@Ñ'Aˆ
Ð#Ñ$Ø*/ˆÐ&Ñ'à�}Ð$Ð$ó    c                 ó4  — t        j                  t         j                  «      j                  }d}t        j                  | t         j
                  «      r@t        j                  | «      j                  }t        j                  | «      j                  }d}t        j                  |t         j
                  «      rEt        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          r8   Ú_eps_for_methodrM   ]   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Ðäð :ó ;ð 	;r:   c                 óØ  — |dk\  j                  |j                  «      dz  dz
  }t        |j                  |j                  |«      }||z  t        j                  dt        j
                  |«      «      z  j                  |j                  «      }| €|}|S | |z  t        j
                  |«      z  j                  |j                  «      }||z   |z
  }t        j                  |dk(  ||«      }|S )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 : np.array
        The absolute step size, ``h.dtype==x0.dtype``.

    Notes
    -----
    `h` has the same dtype as `x0` because dx is later calculated
    as ``(x0 + h) - x0``, and problems would occur if ``x0.dtype==np.float16``
    with ``h.dtype==np.float64``.
    If `rel_step is None`, then a default relative step is calculated using the
    smallest floating point type of `x0` and `f0`, see _eps_for_method.

    r   r   r   ç      ð?)Úastyper   rM   r   r#   r   Úwhere)	Úrel_stepr%   Úf0rH   Úsign_x0ÚrstepÚdefault_abs_stepÚabs_stepÚdxs	            r8   Ú_compute_absolute_steprY   “   sÞ   € ð< �Q‰w×Ñ˜rŸx™xÓ(¨1Ñ,¨qÑ0€Gä˜BŸH™H b§h¡h°Ó7€Eà�‰œ"Ÿ*™* S¬"¯&©&°«*Ó5Ñ5ß�fˆR�X‰XÓð ð ÐØ#ˆð$ €Oð �wÑ¤§¡¨£Ñ+ß
‰&�—‘Ó
ð 	ð �H‰} Ñ"ˆÜ—8‘8Ø�!‰GØØó
ˆð €Or:   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   óR   K  — | ]  }t        j                  |t        ¬ «      –— Œ! y­w)r   N)r   ÚasarrayÚfloat)Ú.0Úbs     r8   ú	<genexpr>z"_prepare_bounds.<locals>.<genexpr>Ù   s   è ø€ Ò9¨QŒb�j‰j˜¤%×(Ð(Ñ9ùs   ‚%'r   )Úndimr   ÚresizeÚshape)Úboundsr%   r)   r*   s       r8   Ú_prepare_boundsre   Î   sY   € ñ :°&Ô9�F€BˆØ	‡w�w�!‚|Ü�Y‰Y�r˜2Ÿ8™8Ó$ˆà	‡w�w�!‚|Ü�Y‰Y�r˜2Ÿ8™8Ó$ˆàˆrˆ6€Mr:   c                 ó’  — t        | «      rt        | «      } n7t        j                  | «      } | dk7  j	                  t        j
                  «      } | j                  dk7  rt        d«      ‚| j                  \  }}|�t        j                  |«      r1t        j                  j                  |«      }|j                  |«      }n0t        j                  |«      }|j                  |fk7  rt        d«      ‚| dd…|f   } t        | «      r#t        ||| j                  | j                   «      }nt#        ||| «      }|j%                  «       ||<   |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 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_2drP   Úint32ra   r   rc   ÚisscalarÚrandomÚRandomStateÚpermutationr\   r   ÚindicesÚindptrr   r"   )ÚAÚorderÚmÚnÚrngÚgroupss         r8   Úgroup_columnsru   ã   s  € ô< �„{Ü�a‹L‰ä�M‰M˜!ÓˆØ�!‰V�O‰OœBŸH™HÓ%ˆà‡v�v�‚{ÜÐ5Ó6Ð6à�7‰7�D€A€qà€}œŸ™ EÔ*Ü�i‰i×#Ñ# EÓ*ˆØ—‘ Ó"‰ä—
‘
˜5Ó!ˆØ�;‰;˜1˜$ÒÜÐ;Ó<Ð<à	Š!ˆUˆ(‰€Aä�„{Ü˜a  A§I¡I¨q¯x©xÓ8‰ä˜Q  1Ó%ˆà—K‘K“M€Fˆ5�Mà€Mr:   r>   F© c                 ó¶  — |dvrt        d|› d�«      ‚ddi}t        |«      }t        j                  |j	                  |«      d|¬«      }|j
                  }|j                  |j                  d«      r|j                  }|j                  ||«      }|j                  dkD  rt        d	«      ‚t        ||«      \  }}|j                  |j                  k7  s|j                  |j                  k7  rt        d
«      ‚|r[t        j                  t        j                  |«      «      r(t        j                  t        j                  |«      «      st        d«      ‚|
€i }
t        | ||	|
«      }dx}}|€ ||«      }d}n/t        j                   |«      }|j                  dkD  rt        d«      ‚t        j"                  ||k  ||kD  z  «      rt        d«      ‚|r7|€!t%        |j                  |j                  |«      }t'        |||||«      \  }}�n¶|€t)        ||||«      }n¯|dk\  j                  |j                  «      dz  dz
  }|}||z   |z
  }t        j*                  |dk(  t%        |j                  |j                  |«      |z  t        j,                  dt        j.                  |«      «      z  |«      }|j                  |j                  «      }|dk(  rt1        ||dd||«      \  }}n |dk(  rt1        ||dd||«      \  }}n|dk(  rd}|xs t2        }t5        |«      5 }|€t7        ||||||«      \  }}nˆt9        |«      st;        |«      dk(  r|\  }}n|}t=        |«      }t9        |«      r|j?                  «       }nt        j@                  |«      }t        j                   |«      }tC        ||||||||«	      \  }}ddd«       |r||z  }||d<   |fS S # 1 sw Y   ŒxY w)u‡,  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))).astype(x0.dtype)``,
        with `rel_step` being selected automatically, see Notes. Otherwise
        ``h = (rel_step * sign(x0) * abs(x0)).astype(x0.dtype)``. 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. `abs_step` is coerced to the dtype of `x0` during calculation.
    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 an 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,).
        `J.dtype` is the promoted type of ``fun(x0)`` and `x0`.

    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 is 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. This 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.
    The calculated absolute step size, `h`, is coerced to have the same dtype as `x0`.

    The floating point precision of `J` is the promoted type of ``fun(x0)``
    and `x0`. If `rel_step` and `abs_step` are None, then the overall accuracy of
    `J` depends on the smallest floating point dtype of `x0` and ``fun(x0)``,
    as that dtype is used to calculate the default step size.

    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   )ra   Ú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   rO   r<   r   r>   r   r=   F)"r   r   ÚxpxÚ
atleast_ndr\   r@   Úisdtyper   rP   ra   re   rc   r   r    ÚisinfÚ_Fun_WrapperÚ
atleast_1dÚanyrM   Ú_linear_operator_differencerY   rQ   r#   r   r9   Úmapr   Ú_dense_differencer   Úlenru   Útocscrg   Ú_sparse_difference)Úfunr%   rH   rR   rW   rS   rd   ÚsparsityÚas_linear_operatorÚargsÚkwargsÚfull_outputÚworkersÚ	info_dictry   Ú_xÚ_dtyper)   r*   Úfun_wrappedrx   Ú_nfevÚJÚ_r&   rT   rX   r+   ÚmfÚ	structurert   s                                  r8   Úapprox_derivativer˜      sÒ  € ðT Ð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 RÓ(�F€Bˆà	‡x�x�2—8‘8Ò˜rŸx™x¨2¯8©8Ò3ÜÐGÓHÐHá¤2§6¡6¬"¯(©(°2«,Ô#7Ü')§v¡v¬b¯h©h°r«lÔ';Üð 9ó :ð 	:ð €~Øˆä˜s B¨¨fÓ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ä*¨;¸Ø+-¨x¸óA‰ˆŠ1ð ÐÜ& x°°R¸Ó@‰Að ˜Q‘w×&Ñ& r§x¡xÓ0°1Ñ4°qÑ8ˆGØˆAð ˜‘6˜R‘-ˆBÜ—‘˜˜q™Ü(¨¯©°2·8±8¸VÓDØ ñ!Ü#%§:¡:¨c´2·6±6¸"³:Ó#>ñ?àóˆAð —‘˜Ÿ™Ó"ˆAà�YÒÜ7Ø�A�q˜) R¨ó -ÑˆA‰}à�yÒ Ü7Ø�A�q˜) R¨ó -ÑˆA‰}à�tŠ^Ø!ˆMð ’.œSˆÜ˜Ó ð 	A BØÐÜ,¨[¸"¸bÀ!Ø)6¸Ø)+ó-‘�‘5ô   Ô)¬c°(«m¸qÒ.@Ø(0Ñ%�I™và (�IÜ*¨8Ó4�Fä˜IÔ&Ø )§¡Ó 1‘Iä "§¡¨iÓ 8�IÜŸ™ vÓ.�Ü-¨k¸2¸rÀ1Ø-:¸IØ-3°V¸RóA‘��5÷#	Añ* Ø�‰ˆØ ˆ	�&ÑØ�)ˆ|Ðàˆ÷5	Að 	Aús   ÌB OÏOc                 óú   ‡ ‡‡‡‡‡— ‰j                   Š‰j                   }t        ‰‰dt        ¬«      Š|dk(  rˆˆ ˆˆˆˆfd„}n)|dk(  r
ˆ ˆˆˆˆfd„}n|dk(  r
ˆ ˆˆˆˆfd„}nt        d	«      ‚t	        ‰|f|‰¬
«      dfS )NT©Úforce_floatingry   r<   c                 óÐ   •— t        j                  | t        j                  | «      «      rt        j                  ‰‰¬«      S ‰t	        | «      z  }‰	|| z  z   } ‰|«      ‰z
  }||z  S )Nr   ©r   Úarray_equalr   Úzerosr   )
ÚprX   r0   ÚdfrS   rˆ   r&   rq   Úresult_dtyper%   s
       €€€€€€r8   Úmatvecz+_linear_operator_difference.<locals>.matvec†  s[   ø€ Ü�~‰~˜a¤§¡¨qÓ!1Ô2Ü—x‘x ¨Ô6Ð6Ø”T˜!“W‘ˆBØ�R˜‘T‘	ˆAÙ�Q“˜"‘ˆBØ˜‘7ˆNr:   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�   )r    rX   Úx1Úx2Úf1Úf2r¡   rˆ   r&   rq   r¢   r%   s          €€€€€r8   r£   z+_linear_operator_difference.<locals>.matvec�  s‚   ø€ Ü�~‰~˜a¤§¡¨qÓ!1Ô2Ü—x‘x ¨Ô6Ð6Ø�1‘”t˜A“w‘ˆBØ�r˜!‘t˜Q‘h‘ˆBØ�r˜!‘t˜Q‘h‘ˆBÙ�R“ˆBÙ�R“ˆBØ�b‘ˆBØ˜‘7ˆNr:   r=   c                 óè   •— t        j                  | t        j                  | «      «      rt        j                  ‰‰¬«      S ‰t	        | «      z  }‰	|| z  dz  z   } ‰|«      }|j
                  }||z  S )Nr   ù              ð?)r   rž   r   rŸ   r   Úimag)
r    rX   r0   r§   r¡   rˆ   r&   rq   r¢   r%   s
        €€€€€r8   r£   z+_linear_operator_difference.<locals>.matvec�  sd   ø€ Ü�~‰~˜a¤§¡¨qÓ!1Ô2Ü—x‘x ¨Ô6Ð6Ø”T˜!“W‘ˆBØ�R˜‘T˜#‘X‘ˆAÙ�Q“ˆBØ—‘ˆBØ˜‘7ˆNr:   úNever be here.)rc   r£   r   r   )Úsizer   r   rE   r   )	rˆ   r%   rS   r&   rH   rr   r£   rq   r¢   s	   ````   @@r8   r‚   r‚   ~  s„   ý€ Ø
�‰€AØ
�‰€Aä! " b¸Ä"ÔE€Là�Ò÷	ò 	ð 
�9Ò	÷		ñ 		ð 
�4Š÷	ñ 	ô Ð+Ó,Ð,ä  A ¨v¸\ÔJÈAÐMÐMr:   c           
      óV  ‡— |j                   }|j                   Šd}t        ||dt        ¬«      }	t        j                  ‰|f|	¬«      }
|dk(  rˆfd„} ||  |||«      «      }t	        ‰«      D �cg c]  }||   ||   z   ||   z
  ‘Œ }}|D �cg c]  }||z
  ‘Œ	 }}t        ||«      D ��cg c]
  \  }}||z  ‘Œ }}}|t        |«      z  }�nƒ|dk(  �rd„ }t         ||  ||||«      «      «      } ||||«      }t        «       }t        «       }t        |«      D ]™  \  }}t        |«      }t        |«      }t        |«      }t        |«      }|r8|j                  ||   ||   z
  «       |j                  d	|z  d
|z  z   |z
  «       Œl|j                  ||   ||   z
  «       |j                  ||z
  «       Œ› t        ||«      D ��cg c]
  \  }}||z  ‘Œ }}}|dt        |«      z  z  }nh|dk(  rXˆfd„}t         ||  |||«      «      «      }t        ||«      D ��cg c]  \  }}|j                  |z  ‘Œ }}}|t        |«      z  }nt        d«      ‚t        |«      D ]
  \  }}||
|<   Œ |dk(  rt        j                  |
«      }
|
j                  |fS c c}w c c}w c c}}w c c}}w c c}}w )Nr   Trš   r   r<   c              3   ó|   •K  — t        ‰«      D ])  }t        j                  | «      }| |   ||   z   ||<   |–— Œ+ y ­w©N)Úranger   r"   )r%   r&   Úir¥   rr   s       €r8   Úx_generator2z'_dense_difference.<locals>.x_generator2¶  sC   øè ø€ Ü˜1“Xò 	�ô —W‘W˜R“[�Ø˜1™  !¡™��1‘Ø“ñ	ùs   ƒ9<r>   c              3   ó  K  — t        |«      D ]u  \  }}t        j                  | «      }t        j                  | «      }|r | |   ||   z   ||<   | |   d||   z  z   ||<   n| |   ||   z
  ||<   | |   ||   z   ||<   |–— |–— Œw y ­w©Nr   )Ú	enumerater   r"   )r%   r&   r+   r²   Ú	one_sidedr¥   r¦   s          r8   Úx_generator3z'_dense_difference.<locals>.x_generator3Ë  s�   è ø€ Ü )¨-Ó 8ò 
‘��9Ü—W‘W˜R“[�Ü—W‘W˜R“[�ÙØ˜q™E A a¡D™L�B�q‘EØ˜q™E A a¨¡d¡F™N�B�q’Eà˜q™E A a¡D™L�B�q‘EØ˜q™E A a¡D™L�B�q‘EØ’Ø“ñ
ùs   ‚BBg      Àé   r   r=   c              3   óŠ   •K  — t        ‰«      D ]0  }| j                  t        d¬«      }||xx   ||   dz  z  cc<   |–— Œ2 y ­w)NT©r"   rª   )r±   rP   Úcomplex)r%   r&   r²   Úxcrr   s       €r8   Úx_generator_csz)_dense_difference.<locals>.x_generator_csí  sG   øè ø€ Ü˜1“Xò �Ø—Y‘Yœw¨T�YÓ2�Ø�1“˜˜1™ ™Ñ#“Ø“ñùs   ƒA Ar¬   r   )r­   r   r   Úemptyr±   Úzipr…   ÚiterÚlistr¶   ÚnextÚappendr«   rE   ÚravelÚT)rˆ   r%   rS   r&   r+   rH   rŽ   rq   rx   Úresult_typeÚJ_transposedr³   Úf_evalsr²   rX   Úf_evalr¡   ÚdelfÚdelxÚdf_dxr¸   Úgenr·   ÚlÚur§   r¨   r¾   ÚhiÚvrr   s                                 @r8   r„   r„   «  s®  ø€ Ø
�‰€AØ
�‰€AØ€Dô !  R¸ÄÔD€Kä—8‘8˜Q ˜F¨+Ô6€Là�Òô
	ñ ˜#™|¨B°Ó2Ó3ˆÜ.3°A«hÖ7¨ˆr�!‰u�q˜‘t‰|˜r !™uÓ$Ð7ˆÐ7Ø(/Ö0˜fˆf�r‹kÐ0ˆÐ0Ü/2°2°r«{×;¡  t�˜“Ð;ˆÑ;Ø”�E“
ÑŠà	�9Ó	ò	ô ‘w˜s¡L°°Q¸Ó$FÓGÓHˆÙ˜2˜q -Ó0ˆÜ‹VˆÜ‹VˆÜ% mÓ4ò 	#‰LˆAˆyÜ�S“	ˆAÜ�S“	ˆAä�g“ˆBÜ�g“ˆBÙØ—	‘	˜!˜A™$  A¡™,Ô'Ø—	‘	˜$ ™) a¨"¡fÑ,¨rÑ1Õ2à—	‘	˜!˜A™$  1¡™+Ô&Ø—	‘	˜"˜r™'Õ"ð	#ô 03°2°r«{×;¡  t�˜“Ð;ˆÑ;Ø�”C˜“J‘Ñ‰Ø	�4Šô	ô ‘w˜s¡N°2°qÓ$9Ó:Ó;ˆÜ,/°¸«O×<¡& " b�—‘˜2“Ð<ˆÑ<Ø”�E“
Ñ‰äÐ+Ó,Ð,ä˜%Ó ò ‰ˆˆ1Øˆ�QŠðð 	ˆA‚vÜ—x‘x Ó-ˆà�>‰>˜4ÐÐùòu 8ùÚ0ùÛ;ùóF <ùó =s   Á/JÂJÂ*JÇJÈJ%c	                 óö  ‡‡‡‡‡$‡%— |j                   }	‰j                   }
g }g }g }t        ‰|dt        ¬«      }t        j                  ‰«      dz   Š%d}ˆˆ%fd„Š$ˆ$ˆˆfd„}ˆ$ˆˆˆfd„}ˆ$ˆˆfd„}|d	k(  rt	         ||  |«       «      «      } |«       }n@|d
k(  rt	         ||  |«       «      «      } |«       }n|dk(  rt	         ||  |«       «      «      } ‰$«       D �]£  }t        j
                  |«      \  }t        |d d …|f   «      \  }}}||   }|d	k(  r#t        «      ‰z
  }t        «      |z
  }|dz  }�n
|d
k(  rÓt        «      }t        |«      }‰|z  }‰ |z  }t        j                  |
‰j                  ¬«      }||   ‰|   z
  ||<   ||   ||   z
  ||<   t        «      } t        |«      }!|dz  }‰|   }"t        j                  |	|j                  ¬«      }||"   }#d||#   z  d| |#   z  z   |!|#   z
  ||#<   ||"    }#|!|#   | |#   z
  ||#<   n2|dk(  r"t        «      } |dz  }| j                  }‰|z  }nt        d«      ‚|j                  |«       |j                  |«       |j                  ||   ||   z  «       �Œ¦ t        j                  |«      }t        j                  |«      }t        j                  |«      }t        |t         «      rt#        |||ff|	|
f|¬«      |fS t%        |||ff|	|
f|¬«      |fS )NTrš   r   r   c               3   ó^   •K  — t        ‰«      D ]  } t        j                  | ‰«      –— Œ y ­wr°   )r±   r   Úequal)Úgrouprt   Ún_groupss    €€r8   Úe_generatorz'_sparse_difference.<locals>.e_generator  s+   øè ø€ ä˜8“_ò 	*ˆEÜ—(‘(˜5 &Ó)Ó)ñ	*ùs   ƒ*-c               3   óF   •K  —  ‰«       } | D ]  }‰|z  }‰|z   }|–— Œ y ­wr°   rv   )Úe_genÚeÚh_vecr0   rØ   r&   r%   s       €€€r8   r³   z(_sparse_difference.<locals>.x_generator2  s4   øè ø€ Ù“ˆØò 	ˆAØ˜‘EˆEØ�U‘
ˆAØ‹Gñ	ùs   ƒ!c               3   ó   •K  —  ‰«       } | D ]}  }‰|z  }‰
j                  «       }‰
j                  «       }‰	|z  }||xx   ||   z  cc<   ||xx   d||   z  z  cc<   ‰	 |z  }||xx   ||   z  cc<   ||xx   ||   z  cc<   |–— |–— Œ y ­wrµ   r»   )rÚ   rÛ   rÜ   r¥   r¦   Úmask_1Úmask_2rØ   r&   r+   r%   s          €€€€r8   r¸   z(_sparse_difference.<locals>.x_generator3  s©   øè ø€ Ù“ˆØò 	ˆAØ˜‘EˆEØ—‘“ˆBØ—‘“ˆBà" QÑ&ˆFØˆv‹J˜% ™-Ñ'‹JØˆv‹J˜!˜e F™mÑ+Ñ+‹Jà#�^ aÑ'ˆFØˆv‹J˜% ™-Ñ'‹JØˆv‹J˜% ™-Ñ'‹JØŠHØ‹Hñ	ùs   ƒBBc               3   óH   •K  —  ‰«       } | D ]  }‰|z  }‰|dz  z   –— Œ y ­w)Nrª   rv   )rÚ   rÛ   rÜ   rØ   r&   r%   s      €€€r8   r¾   z*_sparse_difference.<locals>.x_generator_cs+  s5   øè ø€ Ù“ˆØò 	#ˆAØ˜‘EˆEØ�u˜s‘{Ñ"Ó"ñ	#ùs   ƒ"r<   r>   r=   r   r   éýÿÿÿr¹   r¬   )rc   r   )r­   r   r   ÚmaxrÁ   Únonzeror   rÃ   rŸ   r   r¿   r«   r   rÄ   ÚhstackÚ
isinstancer   r   r
   )&rˆ   r%   rS   r&   r+   r—   rt   rH   rŽ   rq   rr   Úrow_indicesÚcol_indicesÚ	fractionsrÇ   rx   r³   r¸   r¾   rÉ   ÚxsrÛ   Úcolsr²   Újr•   rX   r¡   r¥   r¦   rÞ   rß   r§   r¨   ÚmaskÚrowsrØ   r×   s&    ` `` `                             @@r8   r‡   r‡     s1  ý€ à
�‰€AØ
�‰€AØ€KØ€KØ€IÜ   R¸ÄÔD€Kä�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ˆá‹]ó 2(ˆô —
‘
˜1“‰ˆä�y¢ D Ñ)Ó*‰ˆˆ1ˆaà�‰Gˆà�YÒÜ�b“˜B‘ˆBÜ�g“ Ñ#ˆBØ�A‰IŠDØ�yÒ ô �b“ˆBÜ�b“ˆBà" QÑ&ˆFØ#�^ aÑ'ˆFä—‘˜! 2§8¡8Ô,ˆBØ˜F™ b¨¡jÑ0ˆBˆv‰JØ˜F™ b¨¡jÑ0ˆBˆv‰Jä�g“ˆBÜ�g“ˆBØ�A‰IˆDà  Ñ#ˆDÜ—‘˜! 2§8¡8Ô,ˆ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2(ôh —)‘)˜KÓ(€KÜ—)‘)˜KÓ(€KÜ—	‘	˜)Ó$€Iä�)œXÔ&ÜØ˜ kÐ2Ð3Ø�a�&Øô
ð ð	ð 	ô
 Ø	�[ +Ð.Ð/Ø�!ˆfØôð ð	ð r:   c                   ó   — e Zd Zd„ Zd„ Zy)r   c                 ó<   — || _         || _        || _        || _        y r°   )rˆ   r%   r‹   rŒ   )Úselfrˆ   r%   r‹   rŒ   s        r8   Ú__init__z_Fun_Wrapper.__init__‚  s   € ØˆŒØˆŒØˆŒ	Øˆ�r:   c                 ób  — t        | j                  «      }|j                  |j                  d«      r&|j	                  || j                  j                  «      }t        j                   | j                  |g| j                  ¢­i | j                  ¤Ž«      }|j                  dkD  rt        d«      ‚|S )Nrz   r   z-`fun` return value has more than 1 dimension.)r   r%   r}   r   rP   r   r€   rˆ   r‹   rŒ   ra   rE   )rð   r0   ry   Úfs       r8   Ú__call__z_Fun_Wrapper.__call__ˆ  s‰   € ô ˜TŸW™WÓ%ˆà�:‰:�a—g‘g˜Ô/Ø—	‘	˜!˜TŸW™WŸ]™]Ó+ˆAä�M‰M˜(˜$Ÿ(™( 1Ð@ t§y¡yÒ@°D·K±KÑ@ÓAˆØ�6‰6�AŠ:Üð  8ó 9ð 9àˆr:   N)Ú__name__Ú
__module__Ú__qualname__rñ   rô   rv   r:   r8   r   r   €  s   „ òór:   r   c           	      óZ  — |€i } ||g|¢­i |¤Ž}t        |«      rªt        | |||||¬«      }t        |«      }||z
  }t        |«      \  }	}
}t	        j
                  ||	|
f   «      j                  «       }t	        j                  t	        j                  |«      t	        j                  dt	        j                  |«      «      z  «      S t        | ||||¬«      }t	        j                  ||z
  «      }t	        j                  |t	        j                  dt	        j                  |«      «      z  «      S )aS	  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
    )rd   r‰   r‹   rŒ   r   )rd   r‹   rŒ   )
r   r˜   r
   r   r   r\   rÅ   râ   r   r#   )rˆ   Újacr%   rd   r‹   rŒ   Ú	J_to_testÚJ_diffÚabs_errr²   rë   Úabs_err_dataÚJ_diff_datas                r8   Úcheck_derivativerÿ   —  s  € ðz €~ØˆÙ�BÐ(˜Ò( Ñ(€IÜ�	ÔÜ" 3¨°6ÀIØ(,°Vô=ˆä˜iÓ(ˆ	Ø˜fÑ$ˆÜ! '›]Ñˆˆ1ˆlÜ—j‘j ¨¨1¨¡Ó.×4Ñ4Ó6ˆÜ�v‰v”b—f‘f˜\Ó*Ü—j‘j ¤B§F¡F¨;Ó$7Ó8ñ9ó :ð 	:ô # 3¨°6Ø(,°Vô=ˆä—&‘&˜ VÑ+Ó,ˆÜ�v‰v�g¤§
¡
¨1¬b¯f©f°V«nÓ =Ñ=Ó>Ð>r:   )r   )'Ú__doc__Ú	functoolsÚnumpyr   Únumpy.linalgr   Úscipy.sparse.linalgr   Úsparser   r   r   r	   r
   r   Ú_group_columnsr   r   Úscipy._lib._array_apir   r   Úscipy._lib._utilr   Úscipy._externalr   r{   r9   Ú	lru_cacherM   rY   re   ru   r!   r˜   r‚   r„   r‡   r   rÿ   rv   r:   r8   ú<module>r     sÉ   ðÙ -Û Û Ý å .ß O× Oß 5ß AÝ 'Ý 2òL%ð^ ×Ññ2;ó ð2;òj8òvó*:ðz '0¸$ÈØ¨¯© w°·±Ð&7À$Ø).°RÀØ"'°ó[ò|
*NòZT òn{÷|ñ ð. -/¯F©F¨7°B·F±FÐ*;À"Ø ôM?r:   