Ë
    &�£jO  ã                   óf  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZ ddlmZ ddlmZmZmZmZ g d¢Z e j*                  ej,                  d	¬
«      Z	 	 dddœd„Z ee«      	 	 dddœd„«       Z	 	 dd„Z ee«      	 	 dd„«       Z	 	 dd„Z ee«      dd„«       Zd„ Zd„ Zdd„Zy)é    N)Ú	overrides)Ú_array_converter)Úadd_docstringé   )Únumeric)Ú
asanyarrayÚnanÚndimÚresult_type)ÚlogspaceÚlinspaceÚ	geomspaceÚnumpy)Úmodule)Údevicec                ó
   — | |fS ©N© )ÚstartÚstopÚnumÚendpointÚretstepÚdtypeÚaxisr   s           ú;C:\FundamentalWorkbench\vendor\numpy\_core\function_base.pyÚ_linspace_dispatcherr      ó   € à�4ˆ=Ðó    c                ó¢  — t        j                  |«      }|dk  rt        d|› d�«      ‚|r|dz
  n|}t        | |«      }	|	j	                  «       \  } }|	j                  d¬«      }
|€|
}d}n$t        j                  |t        j                  «      }t        j                  || t        |
«      ¬«      }t        j                  d||
|¬	«      j                  d
dt        |«      z  z   «      }|dkD  rjt        j                  |«      }||z  }|r|dk(  n%t        j                   |dk(  «      j#                  «       }|r||z  }|r||z  }n||z  }n|r||z  }n||z  }nt$        }||z  }|| z  }|r
|dkD  r||d<   |dk7  rt        j&                  |d|«      }|rt        j(                  ||¬«       |	j+                  |j-                  |d¬«      «      }|r||fS |S )a   
    Return evenly spaced numbers over a specified interval.

    Returns `num` evenly spaced samples, calculated over the
    interval [`start`, `stop`].

    The endpoint of the interval can optionally be excluded.

    .. versionchanged:: 1.20.0
        Values are rounded towards ``-inf`` instead of ``0`` when an
        integer ``dtype`` is specified. The old behavior can
        still be obtained with ``np.linspace(start, stop, num).astype(np.int_)``

    Parameters
    ----------
    start : array_like
        The starting value of the sequence.
    stop : array_like
        The end value of the sequence, unless `endpoint` is set to False.
        In that case, the sequence consists of all but the last of ``num + 1``
        evenly spaced samples, so that `stop` is excluded.  Note that the step
        size changes when `endpoint` is False.
    num : int, optional
        Number of samples to generate. Default is 50. Must be non-negative.
    endpoint : bool, optional
        If True, `stop` is the last sample. Otherwise, it is not included.
        Default is True.
    retstep : bool, optional
        If True, return (`samples`, `step`), where `step` is the spacing
        between samples.
    dtype : dtype, optional
        The type of the output array.  If `dtype` is not given, the data type
        is inferred from `start` and `stop`. The inferred dtype will never be
        an integer; `float` is chosen even if the arguments would produce an
        array of integers.
    axis : int, optional
        The axis in the result to store the samples.  Relevant only if start
        or stop are array-like.  By default (0), the samples will be along a
        new axis inserted at the beginning. Use -1 to get an axis at the end.
    device : str, optional
        The device on which to place the created array. Default: None.
        For Array-API interoperability only, so must be ``"cpu"`` if passed.

        .. versionadded:: 2.0.0

    Returns
    -------
    samples : ndarray
        There are `num` equally spaced samples in the closed interval
        ``[start, stop]`` or the half-open interval ``[start, stop)``
        (depending on whether `endpoint` is True or False).
    step : float, optional
        Only returned if `retstep` is True

        Size of spacing between samples.


    See Also
    --------
    arange : Similar to `linspace`, but uses a step size (instead of the
             number of samples).
    geomspace : Similar to `linspace`, but with numbers spaced evenly on a log
                scale (a geometric progression).
    logspace : Similar to `geomspace`, but with the end points specified as
               logarithms.
    :ref:`how-to-partition`

    Examples
    --------
    >>> import numpy as np
    >>> np.linspace(2.0, 3.0, num=5)
    array([2.  , 2.25, 2.5 , 2.75, 3.  ])
    >>> np.linspace(2.0, 3.0, num=5, endpoint=False)
    array([2. ,  2.2,  2.4,  2.6,  2.8])
    >>> np.linspace(2.0, 3.0, num=5, retstep=True)
    (array([2.  ,  2.25,  2.5 ,  2.75,  3.  ]), 0.25)

    Graphical illustration:

    >>> import matplotlib.pyplot as plt
    >>> N = 8
    >>> y = np.zeros(N)
    >>> x1 = np.linspace(0, 10, N, endpoint=True)
    >>> x2 = np.linspace(0, 10, N, endpoint=False)
    >>> plt.plot(x1, y, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.plot(x2, y + 0.5, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.ylim([-0.5, 1])
    (-0.5, 1)
    >>> plt.show()

    r   zNumber of samples, z, must be non-negative.r   T)Úensure_inexactF)r   )r   r   )éÿÿÿÿ)r   )r"   .)Úout©Úcopy)ÚoperatorÚindexÚ
ValueErrorr   Ú	as_arraysr   Ú_nxÚ
issubdtypeÚintegerÚnpÚsubtractÚtypeÚarangeÚreshaper
   Úisscalarr   Úanyr	   ÚmoveaxisÚfloorÚwrapÚastype)r   r   r   r   r   r   r   r   ÚdivÚconvÚdtÚinteger_dtypeÚdeltaÚyÚ_mult_inplaceÚstepÚany_step_zeros                    r   r   r      sÜ  € ô@ �.‰.˜Ó
€CØ
ˆQ‚wÜØ! # Ð&=Ð>ó
ð 	
ñ  ˆ3�Š7 S€Cä˜E 4Ó(€DØ—.‘.Ó"�K€Eˆ4Ø	×	Ñ	¨Ð	Ó	.€Bà€}ØˆØ‰äŸ™ u¬c¯k©kÓ:ˆô �K‰K˜˜e¬4°«8Ô4€EÜ�
‰
Ø	ˆ3�b ô	ç�gˆe�dœT %›[Ñ(Ñ(Ó)ð ð ˆQ‚wÜŸ™ UÓ+ˆØ�s‰{ˆá&ˆD�AŠI¬C¯N©N¸4À1¹9Ó,E×,IÑ,IÓ,Kð 	áà�‰HˆAÙØ�U‘
‘à˜‘I‘ÙØ�‰I‰Aà�D‘‰Aô ˆà�‰Iˆàˆ�J€Aá�C˜!’GØˆˆ'‰
àˆq‚yÜ�L‰L˜˜A˜tÓ$ˆáÜ�	‰	�!˜Õà�	‰	�!—(‘(˜5 u�(Ó-Ó.€AÙØ�$ˆwˆàˆr   c                 ó   — | ||fS r   r   )r   r   r   r   Úbaser   r   s          r   Ú_logspace_dispatcherrC   ¿   s   € à�4˜ÐÐr   c                 óŒ  ‡— t        |t        t        f«      s_t        j                  |«      rJt        j
                  | ||«      j                  Šˆfd„| ||fD «       \  } }}t        j                  ||¬«      }t        | ||||¬«      }|€t        j                  ||«      S t        j                  ||«      j                  |d¬«      S )a¡  
    Return numbers spaced evenly on a log scale.

    In linear space, the sequence starts at ``base ** start``
    (`base` to the power of `start`) and ends with ``base ** stop``
    (see `endpoint` below).

    .. versionchanged:: 1.25.0
        Non-scalar 'base` is now supported

    Parameters
    ----------
    start : array_like
        ``base ** start`` is the starting value of the sequence.
    stop : array_like
        ``base ** stop`` is the final value of the sequence, unless `endpoint`
        is False.  In that case, ``num + 1`` values are spaced over the
        interval in log-space, of which all but the last (a sequence of
        length `num`) are returned.
    num : integer, optional
        Number of samples to generate.  Default is 50.
    endpoint : boolean, optional
        If true, `stop` is the last sample. Otherwise, it is not included.
        Default is True.
    base : array_like, optional
        The base of the log space. The step size between the elements in
        ``ln(samples) / ln(base)`` (or ``log_base(samples)``) is uniform.
        Default is 10.0.
    dtype : dtype
        The type of the output array.  If `dtype` is not given, the data type
        is inferred from `start` and `stop`. The inferred type will never be
        an integer; `float` is chosen even if the arguments would produce an
        array of integers.
    axis : int, optional
        The axis in the result to store the samples.  Relevant only if start,
        stop, or base are array-like.  By default (0), the samples will be
        along a new axis inserted at the beginning. Use -1 to get an axis at
        the end.

    Returns
    -------
    samples : ndarray
        `num` samples, equally spaced on a log scale.

    See Also
    --------
    arange : Similar to linspace, with the step size specified instead of the
             number of samples. Note that, when used with a float endpoint, the
             endpoint may or may not be included.
    linspace : Similar to logspace, but with the samples uniformly distributed
               in linear space, instead of log space.
    geomspace : Similar to logspace, but with endpoints specified directly.
    :ref:`how-to-partition`

    Notes
    -----
    If base is a scalar, logspace is equivalent to the code

    >>> y = np.linspace(start, stop, num=num, endpoint=endpoint)
    ... # doctest: +SKIP
    >>> power(base, y).astype(dtype)
    ... # doctest: +SKIP

    Examples
    --------
    >>> import numpy as np
    >>> np.logspace(2.0, 3.0, num=4)
    array([ 100.        ,  215.443469  ,  464.15888336, 1000.        ])
    >>> np.logspace(2.0, 3.0, num=4, endpoint=False)
    array([100.        ,  177.827941  ,  316.22776602,  562.34132519])
    >>> np.logspace(2.0, 3.0, num=4, base=2.0)
    array([4.        ,  5.0396842 ,  6.34960421,  8.        ])
    >>> np.logspace(2.0, 3.0, num=4, base=[2.0, 3.0], axis=-1)
    array([[ 4.        ,  5.0396842 ,  6.34960421,  8.        ],
           [ 9.        , 12.98024613, 18.72075441, 27.        ]])

    Graphical illustration:

    >>> import matplotlib.pyplot as plt
    >>> N = 10
    >>> x1 = np.logspace(0.1, 1, N, endpoint=True)
    >>> x2 = np.logspace(0.1, 1, N, endpoint=False)
    >>> y = np.zeros(N)
    >>> plt.plot(x1, y, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.plot(x2, y + 0.5, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.ylim([-0.5, 1])
    (-0.5, 1)
    >>> plt.show()

    c              3   óP   •K  — | ]  }t        j                  |d d‰¬«      –— Œ y ­w)NT)r%   ÚsubokÚndmin)r-   Úarray)Ú.0ÚaÚndmaxs     €r   Ú	<genexpr>zlogspace.<locals>.<genexpr>'  s+   øè ø€ ð 
á(�ô �H‰H�Q˜T¨°U×;Ð;Ù(ùs   ƒ#&)r   )r   r   r   Fr$   )Ú
isinstanceÚfloatÚintr-   r
   Ú	broadcastÚexpand_dimsr   r*   Úpowerr7   )	r   r   r   r   rB   r   r   r=   rK   s	           @r   r   r   Ä   s°   ø€ ô~ �dœU¤C˜LÔ)¬b¯g©g°d¬mô —‘˜U D¨$Ó/×4Ñ4ˆó
à˜T 4Ñ(ó
Ñˆˆt�Tô �~‰~˜d¨Ô.ˆÜ�˜ #°¸tÔD€AØ€}Ü�y‰y˜˜qÓ!Ð!Ü�9‰9�T˜1Ó×$Ñ$ U°Ð$Ó7Ð7r   c                 ó
   — | |fS r   r   )r   r   r   r   r   r   s         r   Ú_geomspace_dispatcherrT   2  r   r   c           	      óÂ  — t        | «      } t        |«      }t        j                  | dk(  «      st        j                  |dk(  «      rt        d«      ‚t	        | |t        |«      t        j                  d|«      «      }|€|}nt        j                  |«      }| j                  |d¬«      } |j                  |d¬«      }t        j                  | «      }| |z  } ||z  }t        j                  | «      }t        j                  |«      }	t        ||	||d|¬«      }
|dkD  r| |
d<   |dkD  r|r||
d	<   |
|z  }
|dk7  rt        j                  |
d|«      }
|
j                  |d
¬«      S )aH  
    Return numbers spaced evenly on a log scale (a geometric progression).

    This is similar to `logspace`, but with endpoints specified directly.
    Each output sample is a constant multiple of the previous.

    Parameters
    ----------
    start : array_like
        The starting value of the sequence.
    stop : array_like
        The final value of the sequence, unless `endpoint` is False.
        In that case, ``num + 1`` values are spaced over the
        interval in log-space, of which all but the last (a sequence of
        length `num`) are returned.
    num : integer, optional
        Number of samples to generate.  Default is 50.
    endpoint : boolean, optional
        If true, `stop` is the last sample. Otherwise, it is not included.
        Default is True.
    dtype : dtype
        The type of the output array.  If `dtype` is not given, the data type
        is inferred from `start` and `stop`. The inferred dtype will never be
        an integer; `float` is chosen even if the arguments would produce an
        array of integers.
    axis : int, optional
        The axis in the result to store the samples.  Relevant only if start
        or stop are array-like.  By default (0), the samples will be along a
        new axis inserted at the beginning. Use -1 to get an axis at the end.

    Returns
    -------
    samples : ndarray
        `num` samples, equally spaced on a log scale.

    See Also
    --------
    logspace : Similar to geomspace, but with endpoints specified using log
               and base.
    linspace : Similar to geomspace, but with arithmetic instead of geometric
               progression.
    arange : Similar to linspace, with the step size specified instead of the
             number of samples.
    :ref:`how-to-partition`

    Notes
    -----
    If the inputs or dtype are complex, the output will follow a logarithmic
    spiral in the complex plane.  (There are an infinite number of spirals
    passing through two points; the output will follow the shortest such path.)

    Examples
    --------
    >>> import numpy as np
    >>> np.geomspace(1, 1000, num=4)
    array([    1.,    10.,   100.,  1000.])
    >>> np.geomspace(1, 1000, num=3, endpoint=False)
    array([   1.,   10.,  100.])
    >>> np.geomspace(1, 1000, num=4, endpoint=False)
    array([   1.        ,    5.62341325,   31.6227766 ,  177.827941  ])
    >>> np.geomspace(1, 256, num=9)
    array([   1.,    2.,    4.,    8.,   16.,   32.,   64.,  128.,  256.])

    Note that the above may not produce exact integers:

    >>> np.geomspace(1, 256, num=9, dtype=np.int_)
    array([  1,   2,   4,   7,  16,  32,  63, 127, 256])
    >>> np.around(np.geomspace(1, 256, num=9)).astype(np.int_)
    array([  1,   2,   4,   8,  16,  32,  64, 128, 256])

    Negative, decreasing, and complex inputs are allowed:

    >>> np.geomspace(1000, 1, num=4)
    array([1000.,  100.,   10.,    1.])
    >>> np.geomspace(-1000, -1, num=4)
    array([-1000.,  -100.,   -10.,    -1.])
    >>> np.geomspace(1j, 1000j, num=4)  # Straight line
    array([0.   +1.j, 0.  +10.j, 0. +100.j, 0.+1000.j])
    >>> np.geomspace(-1+0j, 1+0j, num=5)  # Circle
    array([-1.00000000e+00+1.22464680e-16j, -7.07106781e-01+7.07106781e-01j,
            6.12323400e-17+1.00000000e+00j,  7.07106781e-01+7.07106781e-01j,
            1.00000000e+00+0.00000000e+00j])

    Graphical illustration of `endpoint` parameter:

    >>> import matplotlib.pyplot as plt
    >>> N = 10
    >>> y = np.zeros(N)
    >>> plt.semilogx(np.geomspace(1, 1000, N, endpoint=True), y + 1, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.semilogx(np.geomspace(1, 1000, N, endpoint=False), y + 2, 'o')
    [<matplotlib.lines.Line2D object at 0x...>]
    >>> plt.axis([0.5, 2000, 0, 3])
    [0.5, 2000, 0, 3]
    >>> plt.grid(True, color='0.7', linestyle='-', which='both', axis='both')
    >>> plt.show()

    r   z&Geometric sequence cannot include zeror   Tr$   ç      $@)r   r   rB   r   r   r"   F)r   r*   r3   r(   r   rN   Úzerosr   r7   ÚsignÚlog10r   r4   )r   r   r   r   r   r   r:   Úout_signÚ	log_startÚlog_stopÚresults              r   r   r   7  sQ  € ôH �uÓ€EÜ�dÓ€DÜ
‡w�wˆu˜‰zÔœcŸg™g d¨a¡iÔ0ÜÐAÓBÐBä	�U˜D¤%¨£*¬c¯i©i¸¸EÓ.BÓ	C€BØ€}Ø‰ô —	‘	˜%Ó ˆð
 �L‰L˜ $ˆLÓ'€EØ�;‰;�r ˆ;Ó%€Dô
 �x‰x˜‹€HØ	ˆXÑ€EØ�(‰?€Dä—	‘	˜%Ó €IÜ�y‰y˜‹€HÜ�i ¨sØ'¨d¸"ô>€Fð
 ˆQ‚wØˆˆq‰	Ø�Š7‘xØˆF�2‰Jà
ˆhÑ€Fàˆq‚yÜ—‘˜f a¨Ó.ˆà�=‰=˜ Uˆ=Ó+Ð+r   c                 ó¨   — d}t        | t        j                  t        j                  t        f«      ryt        | t
        «      r| j                  |z  ryy)z¬
    Returns true if the only way to set the docstring of `obj` from python is
    via add_docstring.

    This function errs on the side of being overly conservative.
    i   FT)rM   ÚtypesÚFunctionTypeÚ
MethodTypeÚpropertyr/   Ú	__flags__)ÚobjÚPy_TPFLAGS_HEAPTYPEs     r   Ú_needs_add_docstringrf   È  sF   € ð !Ðä�#œ×*Ñ*¬E×,<Ñ,<¼hÐGÔHØä�#”tÔ §¡Ð1DÒ!DØàr   c                 óÀ   — |r+t        | «      s t        j                  d| › d�t        d¬«       t	        j
                  |«      }	 t        | |«       y # t        $ r Y y w xY w)Nz,add_newdoc was used on a pure-python object z-. Prefer to attach it directly to the source.é   )Ú
stacklevel)rf   ÚwarningsÚwarnÚUserWarningÚinspectÚcleandocr   Ú	Exception)rd   ÚdocÚwarn_on_pythons      r   Ú_add_docstringrr   Ú  sd   € ÙÔ2°3Ô7Ü�‰Ø:¸3¸%ð @:ð :äØõ		ô ×
Ñ
˜3Ó
€CðÜ�c˜3ÕøÜò Ùðús   ÁA Á	AÁAc                 ót  — t        t        | t        «       i |g«      |«      }t        |t        «      r(d|v rt        j                  ||«      }t        |||«       yt        |t        «      r|\  }}t        t        ||«      ||«       yt        |t        «      r"|D ]  \  }}t        t        ||«      ||«       Œ yy)a"  
    Add documentation to an existing object, typically one defined in C

    The purpose is to allow easier editing of the docstrings without requiring
    a re-compile. This exists primarily for internal use within numpy itself.

    Parameters
    ----------
    place : str
        The absolute name of the module to import from
    obj : str | None
        The name of the object to add documentation to, typically a class or
        function name.
    doc : str | tuple[str, str] | list[tuple[str, str]]
        If a string, the documentation to apply to `obj`

        If a tuple, then the first element is interpreted as an attribute
        of `obj` and the second as the docstring to apply -
        ``(method, docstring)``

        If a list, then each element of the list should be a tuple of length
        two - ``[(method1, docstring1), (method2, docstring2), ...]``
    warn_on_python : bool
        If True, the default, emit `UserWarning` if this is used to attach
        documentation to a pure-python object.

    Notes
    -----
    This routine never raises an error if the docstring can't be written, but
    will raise an error if the object being documented does not exist.

    This routine cannot modify read-only docstrings, as appear
    in new-style classes or built-in functions. Because this
    routine never raises an error the caller must check manually
    that the docstrings were changed.

    Since this function grabs the ``char *`` from a c-level str object and puts
    it into the ``tp_doc`` slot of the type of `obj`, it violates a number of
    C-API best-practices, by:

    - modifying a `PyTypeObject` after calling `PyType_Ready`
    - calling `Py_INCREF` on the str and losing the reference, so the str
      will never be released

    If possible it should be avoided.
    z${ARRAY_FUNCTION_LIKE}N)
ÚgetattrÚ
__import__ÚglobalsrM   Ústrr   Úget_array_function_like_docrr   ÚtupleÚlist)Úplacerd   rp   rq   ÚnewÚattrÚ	docstrings          r   Ú
add_newdocr   ê  s¦   € ô^ ”*˜U¤G£I¨r°C°5Ó9¸3Ó
?€CÜ�#”sÔØ# sÑ*Ü×7Ñ7¸¸SÓAˆCÜ�s˜C Õ0Ü	�CœÔ	Ø‰ˆˆiÜ”w˜s DÓ)¨9°nÕEÜ	�CœÔ	Û"‰OˆD�)Üœ7 3¨Ó-¨y¸.ÕIñ  #ð 
r   )NNNNN)é2   TFNr   )r€   TrV   Nr   )NNNN)r€   TNr   )T) Ú	functoolsrm   r&   r_   rj   r   r-   Únumpy._corer   Únumpy._core._multiarray_umathr   Únumpy._core.multiarrayr   Ú r   r*   r   r	   r
   r   Ú__all__ÚpartialÚarray_function_dispatchr   r   rC   r   rT   r   rf   rr   r   r   r   r   Ú<module>r‰      sÿ   ðÛ Û Û Û Û ã Ý !Ý :Ý 0å ß 7Ó 7â
/€ð ,˜)×+Ñ+Ø×%Ñ%¨gô7Ð ð HLØ*.ðØ:>ôñ
 Ð-Ó.ØFJØð`Ø#ó`ó /ð`ðF EIØ*.óñ
 Ð-Ó.ØBFØòj8ó /ðj8ðZ GKØ#óñ
 Ð.Ó/òM,ó 0ðM,ò`ò$ô 9Jr   