§
    fŠtj«!  ã                   ót   — d gZ ddlZddlmZ ddlZddlmZ erddlmZ	 d„ Z
	 dddd	dd
ddedej        f
d„ZdS )Úgeometric_slerpé    N)ÚTYPE_CHECKING)Ú	euclideanc                 ó¢  — t          j        | |g¦  «        }t           j                             |j        ¦  «        \  }}dt          j        |¦  «        dk    z  dz
  }|j        |j        d d …t           j        f         z  }|j        |j        d d …t           j        f         z  }t          j        | |¦  «        }t           j                             |¦  «        }t          j	        ||¦  «        }	|\  } }t          j
        ||	z  ¦  «        }t          j        ||	z  ¦  «        }| |d d …t           j        f         z  ||d d …t           j        f         z  z   S )Né   r   é   )ÚnpÚvstackÚlinalgÚqrÚTÚdiagÚnewaxisÚdotÚdetÚarctan2ÚsinÚcos)
ÚstartÚendÚtÚbasisÚQÚRÚsignsÚcÚsÚomegas
             ú\/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/scipy/spatial/_geometric_slerp.pyÚ_geometric_slerpr       s  € åŒI�u˜c�lÑ#Ô#€EÝŒ9�<Š<˜œÑ Ô �D€A€qØ•”˜‘”˜q’Ñ! AÑ%€EØ	ŒˆeŒg�a�a�a�œ�mÔ$Ñ$€AØ	ŒˆeŒg�a�a�a�œ�mÔ$Ñ$€Aõ 	Œˆu�cÑÔ€AÝ
Œ	�Š�aÑÔ€AÝŒJ�q˜!ÑÔ€Eð �J€Eˆ3Ý
Œˆq�5‰yÑÔ€AÝ
Œˆq�5‰yÑÔ€AØ�1�Q�Q�Q�œ
�]Ô#Ñ# c¨A¨a¨a¨aµ´¨mÔ,<Ñ&<Ñ<Ð<ó    çH¯¼šò×z>r   znpt.ArrayLiker   r   ÚtolÚreturnc                 óÀ  — t          j        | t           j        ¬¦  «        } t          j        |t           j        ¬¦  «        }t          j        |¦  «        }|j        dk    rt	          d¦  «        ‚| j        dk    s|j        dk    rt	          d¦  «        ‚| j        |j        k    rt	          d¦  «        ‚| j        dk     s|j        dk     rt	          d¦  «        ‚t          j        | |¦  «        rt          j        | | |j        ¦  «        S | |fD ]F}t          j        t           j	         
                    |¦  «        dd	d
¬¦  «        st	          d¦  «        ‚ŒGt          |t          ¦  «        st	          d¦  «        ‚t          j        |¦  «        }t          | |¦  «        }t          j        |dd
|¬¦  «        rt          j        dd¬¦  «         t          j        |t           j        ¬¦  «        }|j        d
k    rt          j        d
| j        f¦  «        S |j        d
k    r5t%          | |t          j        |¦  «        ¦  «                             ¦   «         S t%          | ||¦  «        S )aç  
    Geometric spherical linear interpolation.

    The interpolation occurs along a unit-radius
    great circle arc in arbitrary dimensional space.

    Parameters
    ----------
    start : (n_dimensions, ) array-like
        Single n-dimensional input coordinate in a 1-D array-like
        object. `n` must be greater than 1.
    end : (n_dimensions, ) array-like
        Single n-dimensional input coordinate in a 1-D array-like
        object. `n` must be greater than 1.
    t : float or (n_points,) 1D array-like
        A float or 1D array-like of doubles representing interpolation
        parameters. A common approach is to generate the array
        with ``np.linspace(0, 1, n_pts)`` for linearly spaced points.
        Ascending, descending, and scrambled orders are permitted.

        .. versionchanged:: 1.17.0
            Extrapolation is permitted, allowing values below `0`
            and above `1`.
    tol : float
        The absolute tolerance for determining if the start and end
        coordinates are antipodes.

    Returns
    -------
    result : (t.size, D)
        An array of doubles containing the interpolated
        spherical path and including start and
        end when 0 and 1 t are used. The
        interpolated values should correspond to the
        same sort order provided in the t array. The result
        may be 1-dimensional if ``t`` is a float.

    Raises
    ------
    ValueError
        If ``start`` or ``end`` are not on the
        unit n-sphere, or for a variety of degenerate conditions.

    See Also
    --------
    scipy.spatial.transform.Slerp : 3-D Slerp that works with quaternions

    Notes
    -----
    The implementation is based on the mathematical formula provided in [1]_,
    and the first known presentation of this algorithm, derived from study of
    4-D geometry, is credited to Glenn Davis in a footnote of the original
    quaternion Slerp publication by Ken Shoemake [2]_.

    .. versionadded:: 1.5.0

    References
    ----------
    .. [1] https://en.wikipedia.org/wiki/Slerp#Geometric_Slerp
    .. [2] Ken Shoemake (1985) Animating rotation with quaternion curves.
           ACM SIGGRAPH Computer Graphics, 19(3): 245-254.

    Examples
    --------
    Interpolate four linearly-spaced values on the circumference of
    a circle spanning 90 degrees:

    >>> import numpy as np
    >>> from scipy.spatial import geometric_slerp
    >>> import matplotlib.pyplot as plt
    >>> fig = plt.figure()
    >>> ax = fig.add_subplot(111)
    >>> start = np.array([1, 0])
    >>> end = np.array([0, 1])
    >>> t_vals = np.linspace(0, 1, 4)
    >>> result = geometric_slerp(start,
    ...                          end,
    ...                          t_vals)

    The interpolated results should be at 30 degree intervals
    recognizable on the unit circle:

    >>> ax.scatter(result[...,0], result[...,1], c='k')
    >>> circle = plt.Circle((0, 0), 1, color='grey')
    >>> ax.add_artist(circle)
    >>> ax.set_aspect('equal')
    >>> plt.show()

    Attempting to interpolate between antipodes on a circle is
    ambiguous because there are two possible paths, and on a
    sphere there are infinite possible paths on the geodesic surface.
    Nonetheless, one of the ambiguous paths is returned along
    with a warning:

    >>> import warnings
    >>> opposite_pole = np.array([-1, 0])
    >>> with warnings.catch_warnings():
    ...     warnings.simplefilter("ignore", UserWarning)
    ...     geometric_slerp(start,
    ...                     opposite_pole,
    ...                     t_vals)
    array([[ 1.00000000e+00,  0.00000000e+00],
           [ 5.00000000e-01,  8.66025404e-01],
           [-5.00000000e-01,  8.66025404e-01],
           [-1.00000000e+00,  1.22464680e-16]])

    Extend the original example to a sphere and plot interpolation
    points in 3D:

    >>> from mpl_toolkits.mplot3d import proj3d
    >>> fig = plt.figure()
    >>> ax = fig.add_subplot(111, projection='3d')

    Plot the unit sphere for reference (optional):

    >>> u = np.linspace(0, 2 * np.pi, 100)
    >>> v = np.linspace(0, np.pi, 100)
    >>> x = np.outer(np.cos(u), np.sin(v))
    >>> y = np.outer(np.sin(u), np.sin(v))
    >>> z = np.outer(np.ones(np.size(u)), np.cos(v))
    >>> ax.plot_surface(x, y, z, color='y', alpha=0.1)

    Interpolating over a larger number of points
    may provide the appearance of a smooth curve on
    the surface of the sphere, which is also useful
    for discretized integration calculations on a
    sphere surface:

    >>> start = np.array([1, 0, 0])
    >>> end = np.array([0, 0, 1])
    >>> t_vals = np.linspace(0, 1, 200)
    >>> result = geometric_slerp(start,
    ...                          end,
    ...                          t_vals)
    >>> ax.plot(result[...,0],
    ...         result[...,1],
    ...         result[...,2],
    ...         c='k')
    >>> plt.show()

    It is also possible to perform extrapolations outside
    the interpolation interval by using interpolation parameter
    values below 0 or above 1. For example, the above example
    may be adjusted to extrapolate to an antipodal position:

    >>> fig = plt.figure()
    >>> ax = fig.add_subplot(111, projection='3d')
    >>> ax.plot_surface(x, y, z, color='y', alpha=0.1)
    >>> start = np.array([1, 0, 0])
    >>> end = np.array([0, 0, 1])
    >>> t_vals = np.linspace(0, 2, 400)
    >>> result = geometric_slerp(start,
    ...                          end,
    ...                          t_vals)
    >>> ax.plot(result[...,0], result[...,1], result[...,2], c='k')
    >>> plt.show()
    )Údtyper   z:The interpolation parameter value must be one dimensional.z1Start and end coordinates must be one-dimensionalz;The dimensions of start and end must match (have same size)r   zLThe start and end coordinates must both be in at least two-dimensional spaceg      ð?g•Ö&è.>r   )ÚrtolÚatolz(start and end are not on a unit n-sphereztol must be a floatg       @z_start and end are antipodes using the specified tolerance; this may cause ambiguous slerp paths)Ú
stacklevel)r	   ÚasarrayÚfloat64ÚndimÚ
ValueErrorÚsizeÚarray_equalÚlinspaceÚallcloser   ÚnormÚ
isinstanceÚfloatÚfabsr   ÚwarningsÚwarnÚemptyr    Ú
atleast_1dÚravel)r   r   r   r#   ÚcoordÚ
coord_dists         r   r   r   !   s€  € õH ŒJ�u¥B¤JÐ/Ñ/Ô/€EÝ
Œ*�S¥¤
Ð
+Ñ
+Ô
+€CÝ
Œ
�1‰Œ€Aà„v�‚z€zÝð :ñ ;ô ;ð 	;ð „z�Q‚€˜#œ( aš-˜-Ýð 3ñ 4ô 4ð 	4ð „z�S”XÒÐÝð ;ñ <ô <ð 	<ð „z�A‚~€~˜œ Aš˜Ýð !ñ "ô "ð 	"õ 
„~�e˜SÑ!Ô!ð 1ÝŒ{˜5 %¨¬Ñ0Ô0Ð0ð ˜�ð 4ð 4ˆÝŒ{�2œ9Ÿ>š>¨%Ñ0Ô0°#Ø $Ø !ð#ñ #ô #ð 	4õ ð 3ñ 4ô 4ð 4ð	4õ �c�5Ñ!Ô!ð ÝÐ.Ñ/Ô/Ð/åŒg�c‰lŒlˆå˜5 #Ñ&Ô&€Jõ 
„{�:˜s¨°Ð5Ñ5Ô5ð $ÝŒð =ð "#ð	$ñ 	$ô 	$ð 	$õ
 	Œ
�1�BœJÐ'Ñ'Ô'€Aà„v�‚{€{ÝŒx˜˜EœJ˜Ñ(Ô(Ð(à„v�‚{€{Ý Ø #Ý "¤¨aÑ 0Ô 0ñ2ô 2ç27²%±'´'ð	:õ   Ø #Ø !ñ#ô #ð 	#r!   )r"   )Ú__all__r6   Útypingr   Únumpyr	   Úscipy.spatial.distancer   Únumpy.typingÚnptr    r4   Úndarrayr   © r!   r   ú<module>rE      sÓ   ðØÐ
€à €€€Ø  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,àð ØÐÐÐÐÐð=ð =ð =ð0 ð	_#ð _#Øð_#à	ð_#ð ð_#ð 
ð	_#ð
 „Zð_#ð _#ð _#ð _#ð _#ð _#r!   