
    e!hZH                        d dl Z d dlZd dlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZmZ g dZ G d d      Z ee	d	d 
      Z	e	j$                  d        Ze	j(                  d        Z eedd 
      Zej$                  d        Zej*                  d        Zej,                  d        Zej(                  d        Z eedddd       Zej$                  d        Zej.                  d        Zej(                  d        Z eedddd       Zej$                  d        Zej.                  d        Zej*                  d        Zej,                  d        Zej(                  d        Z eedd 
      Zej$                  d         Zej(                  d!        Z eed"d 
      Zej$                  d#        Zej*                  d$        Zej,                  d%        Zej(                  d&        Z ee
d'd(d )      Z
e
j$                  d*        Ze
j(                  d+        Z eed,d(d )      Zej$                  d-        Zej*                  d.        Zej,                  d/        Zej(                  d0        Zy)1    N   _nonneg_int_or_fail)
legendre_passoc_legendre_psph_legendre_p
sph_harm_y)legendre_p_allassoc_legendre_p_allsph_legendre_p_allsph_harm_y_all)r   r   r   r
   r	   r   r   r   c                   T    e Zd ZddddZed        Zd Zd Zd Zd	 Z	d
 Z
d Zd Zy)
MultiUFuncNF)force_complex_outputc                   t        |t        j                        st        |t        j                  j
                        r|j                         }n2t        |t        j                  j                        r|}nt        d      t               }|D ]U  }t        |t        j                        st        d|       |j                  t        d |j                  D                     W t        |      dkD  rt        d      || _        || _        || _        || _        d | _        d | _        d | _        d | _        d | _        y )Nz7ufunc_or_ufuncs should be a ufunc or a ufunc collectionz2All ufuncs must have type `numpy.ufunc`. Received c              3   D   K   | ]  }|j                  d       d     yw)z->r   N)split).0xs     b/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/scipy/special/_multiufuncs.py	<genexpr>z&MultiUFunc.__init__.<locals>.<genexpr>+   s     .UAqwwt}Q/?.Us    r   z*All ufuncs must take the same input types.c                       y)N r   argskwargss     r   <lambda>z%MultiUFunc.__init__.<locals>.<lambda>6   s        c                      i S Nr   r   s     r   r   z%MultiUFunc.__init__.<locals>.<lambda>7   s    R r   )
isinstancenpufunccollectionsabcMappingvaluesIterable
ValueErrorsetadd	frozensettypeslen_ufunc_or_ufuncs_MultiUFunc__doc!_MultiUFunc__force_complex_output_default_kwargs_resolve_out_shapes_finalize_out_key_ufunc_default_args_ufunc_default_kwargs)selfufunc_or_ufuncsdocr   default_kwargsufuncs_iterseen_input_typesr#   s           r   __init__zMultiUFunc.__init__   s%   /2884/;??+B+BC-446O[__-E-EF-  "5 6 6
  #u$ W!%2$ &22A1B&D E E $$Y.U.U%UV	W
 #$q( !MNN /
&:#-#' !	#= %?"r   c                     | j                   S r    )r0   )r8   s    r   __doc__zMultiUFunc.__doc__9   s    zzr   c                     || _         y)z3Set `key` method by decorating a function.
        N)r5   r8   funcs     r   _override_keyzMultiUFunc._override_key=   s     	r   c                     || _         y r    )r6   rB   s     r   _override_ufunc_default_argsz'MultiUFunc._override_ufunc_default_argsB   s
    #' r   c                     || _         y r    )r7   rB   s     r   _override_ufunc_default_kwargsz)MultiUFunc._override_ufunc_default_kwargsE   s
    %)"r   c                 F    |j                   d|_         d|_        || _        y)z9Set `resolve_out_shapes` method by decorating a function.Nz2Resolve to output shapes based on relevant inputs.resolve_out_shapes)r@   __name__r3   rB   s     r   _override_resolve_out_shapesz'MultiUFunc._override_resolve_out_shapesH   s%    <<H L,#' r   c                     || _         y r    )r4   rB   s     r   _override_finalize_outz!MultiUFunc._override_finalize_outP   s
    !r   c                     t        | j                  t        j                        r| j                  S  | j                  di |}| j                  |   S )z.Resolve to a ufunc based on keyword arguments.r   )r!   r/   r"   r#   r5   )r8   r   	ufunc_keys      r   _resolve_ufunczMultiUFunc._resolve_ufuncS   sH     d++RXX6(((DII''	$$Y//r   c                    | j                   |z  }| | j                  di |z  } | j                  di |}||j                   d  D cg c]  }t	        j
                  |       }} | j                  di |}| j                  *t        d |D              } | j                  g |d |j                    ||j                  i |}t        d |D              }	t        |d      r4|	|j                  dz  z   }
|j                  |
      }
|
|j                   d  }nVt	        j                  |	 }t	        j                  |t        j                        st        j                  }|j                  |fz  }| j                   rt        d |D              }t        d t#        ||      D              }||d<    ||i |}| j$                  | j%                  |      }|S c c}w )	Nc              3   F   K   | ]  }t        j                  |        y wr    )r"   shaper   	ufunc_args     r   r   z&MultiUFunc.__call__.<locals>.<genexpr>i   s     $UYRXXi%8$Us   !c              3      K   | ]:  }t        |d       r|j                  nt        j                  t        |             < yw)dtypeN)hasattrrX   r"   typerU   s     r   r   z&MultiUFunc.__call__.<locals>.<genexpr>n   s>      %B)2 9@	78SY__*,((4	?*C&D %Bs   A Aresolve_dtypesr    c              3   H   K   | ]  }t        j                  d |        yw)y              ?N)r"   result_type)r   ufunc_out_dtypes     r   r   z&MultiUFunc.__call__.<locals>.<genexpr>~   s%      )R-< *,O)L )Rs    "c              3   P   K   | ]  \  }}t        j                  ||          yw))rX   N)r"   empty)r   ufunc_out_shaper^   s      r   r   z&MultiUFunc.__call__.<locals>.<genexpr>   s,      D<O_ HH Ds   $&outr   )r2   r6   rQ   ninr"   asarrayr7   r3   tuplenoutrY   r[   r]   
issubdtypeinexactfloat64r1   zipr4   )r8   r   r   r#   arg
ufunc_argsufunc_kwargsufunc_arg_shapesufunc_out_shapesufunc_arg_dtypesufunc_dtypesufunc_out_dtypesr^   rb   s                 r   __call__zMultiUFunc.__call__\   s   %%.(((2622###-f- 26uyyjk1BC#bjjoC
C1t11;F;$$0$$U*$UU7t77  Bk		z9J  B9I BKP:: B:@ B  % %B6@%B  B u.//%**w2FF$33LA#/#= "$..2B"CorzzB&(jjO#(::0B#B **#( )R@P)R $R   D/1ABD DC #&LZ0<0*$$S)C
O Ds   	Gr    )rK   
__module____qualname__r>   propertyr@   rD   rF   rH   rL   rN   rQ   rs   r   r   r   r   r      sI    @&+@@  
(*("0/r   r   a  sph_legendre_p(n, m, theta, *, diff_n=0)

    Spherical Legendre polynomial of the first kind.

    Parameters
    ----------
    n : ArrayLike[int]
        Degree of the spherical Legendre polynomial. Must have ``n >= 0``.
    m : ArrayLike[int]
        Order of the spherical Legendre polynomial.
    theta : ArrayLike[float]
        Input value.
    diff_n : Optional[int]
        A non-negative integer. Compute and return all derivatives up
        to order ``diff_n``. Default is 0.

    Returns
    -------
    p : ndarray or tuple[ndarray]
        Spherical Legendre polynomial with ``diff_n`` derivatives.

    Notes
    -----
    The spherical counterpart of an (unnormalized) associated Legendre polynomial has
    the additional factor

    .. math::

        \sqrt{\frac{(2 n + 1) (n - m)!}{4 \pi (n + m)!}}

    It is the same as the spherical harmonic :math:`Y_{n}^{m}(\theta, \phi)`
    with :math:`\phi = 0`.
    diff_nc                 Z    t        | dd      } d| cxk  rdk  sn t        d|  d      | S Nrx   Fstrictr      Gdiff_n is currently only implemented for orders 0, 1, and 2, received: .r   r)   rw   s    r   _r      B     %@F! $
 	
 Mr   c                 0    t        j                  | dd      S Nr   r"   moveaxisrb   s    r   r   r          ;;sB""r   a|  sph_legendre_p_all(n, m, theta, *, diff_n=0)

    All spherical Legendre polynomials of the first kind up to the
    specified degree ``n`` and order ``m``.

    Output shape is ``(n + 1, 2 * m + 1, ...)``. The entry at ``(j, i)``
    corresponds to degree ``j`` and order ``i`` for all  ``0 <= j <= n``
    and ``-m <= i <= m``.

    See Also
    --------
    sph_legendre_p
    c                 Z    t        | dd      } d| cxk  rdk  sn t        d|  d      | S rz   r   rw   s    r   r   r      r   r   c                     ddgdgz   iS Naxesr   )r   r   r   r   rw   s    r   r   r      s    RDJ<'((r   c                     t        | t        j                        r| dk  rt        d      | dz   dt	        |      z  dz   f|z   |dz   fz   fS )Nr   !n must be a non-negative integer.r   r}   )r!   numbersIntegralr)   abs)nmtheta_shaperf   rx   s        r   r   r      sR    a))*q1u<==UAAJN#k1VaZMACCr   c                 0    t        j                  | dd      S r   r   r   s    r   r   r      r   r   a  assoc_legendre_p(n, m, z, *, branch_cut=2, norm=False, diff_n=0)

    Associated Legendre polynomial of the first kind.

    Parameters
    ----------
    n : ArrayLike[int]
        Degree of the associated Legendre polynomial. Must have ``n >= 0``.
    m : ArrayLike[int]
        order of the associated Legendre polynomial.
    z : ArrayLike[float | complex]
        Input value.
    branch_cut : Optional[ArrayLike[int]]
        Selects branch cut. Must be 2 (default) or 3.
        2: cut on the real axis ``|z| > 1``
        3: cut on the real axis ``-1 < z < 1``
    norm : Optional[bool]
        If ``True``, compute the normalized associated Legendre polynomial.
        Default is ``False``.
    diff_n : Optional[int]
        A non-negative integer. Compute and return all derivatives up
        to order ``diff_n``. Default is 0.

    Returns
    -------
    p : ndarray or tuple[ndarray]
        Associated Legendre polynomial with ``diff_n`` derivatives.

    Notes
    -----
    The normalized counterpart of an (unnormalized) associated Legendre
    polynomial has the additional factor

    .. math::

        \sqrt{\frac{(2 n + 1) (n - m)!}{2 (n + m)!}}
    r}   F
branch_cutnormrx   c                 ^    t        |dd      }d|cxk  rdk  sn t        d| d      ||fS rz   r   r   s      r   r   r     sG     %@F! $
 	
 <r   c                     | fS r    r   r   s      r   r   r   (  
    ;r   c                 0    t        j                  | dd      S r   r   r   s    r   r   r   -  r   r   a  assoc_legendre_p_all(n, m, z, *, branch_cut=2, norm=False, diff_n=0)

    All associated Legendre polynomials of the first kind up to the
    specified degree ``n`` and order ``m``.

    Output shape is ``(n + 1, 2 * m + 1, ...)``. The entry at ``(j, i)``
    corresponds to degree ``j`` and order ``i`` for all  ``0 <= j <= n``
    and ``-m <= i <= m``.

    See Also
    --------
    assoc_legendre_p
    c                     t        |t        j                        r|dk\  st        d| d      d|cxk  rdk  sn t        d| d      ||fS Nr   z1diff_n must be a non-negative integer, received: r   r}   r~   )r!   r   r   r)   r   s      r   r   r   D  sk     0 01!?xqI
 	
 ! $
 	
 <r   c                     | fS r    r   r   s      r   r   r   S  r   r   c                     dddgdgz   iS r   r   r   s      r   r   r   X  s    RH
|+,,r   c                    |d   }t        | t        j                        r| dk  rt        d      t        |t        j                        r|dk  rt        d      | dz   dt	        |      z  dz   ft        j                  ||      z   |dz   fz   fS )Nrx   r   r   z!m must be a non-negative integer.r   r}   r!   r   r   r)   r   r"   broadcast_shapes)r   r   z_shapebranch_cut_shaperf   r   rx   s          r   r   r   ]  s    HFa))*q1u<==a))*q1u<==UAAJN#
G%567:@1*G I Ir   c                 0    t        j                  | dd      S r   r   r   s    r   r   r   j  r   r   a  legendre_p(n, z, *, diff_n=0)

    Legendre polynomial of the first kind.

    Parameters
    ----------
    n : ArrayLike[int]
        Degree of the Legendre polynomial. Must have ``n >= 0``.
    z : ArrayLike[float]
        Input value.
    diff_n : Optional[int]
        A non-negative integer. Compute and return all derivatives up
        to order ``diff_n``. Default is 0.

    Returns
    -------
    p : ndarray or tuple[ndarray]
        Legendre polynomial with ``diff_n`` derivatives.

    See Also
    --------
    legendre

    References
    ----------
    .. [1] Zhang, Shanjie and Jin, Jianming. "Computation of Special
           Functions", John Wiley and Sons, 1996.
           https://people.sc.fsu.edu/~jburkardt/f77_src/special_functions/special_functions.html
    c                     t        | t        j                        r| dk  rt        d|  d      d| cxk  rdk  sn t	        d|  d      | S r   )r!   r   r   r)   NotImplementedErrorrw   s    r   r   r     se    vw//0fqj?xqI
 	
 !! $
 	
 Mr   c                 0    t        j                  | dd      S r   r   r   s    r   r   r     r   r   a  legendre_p_all(n, z, *, diff_n=0)

    All Legendre polynomials of the first kind up to the
    specified degree ``n``.

    Output shape is ``(n + 1, ...)``. The entry at ``j``
    corresponds to degree ``j`` for all  ``0 <= j <= n``.

    See Also
    --------
    legendre_p
    c                 Z    t        | dd      } d| cxk  rdk  sn t        d|  d      | S rz   r   rw   s    r   r   r     r   r   c                     dddgiS )Nr   r   )r   r   r   rw   s    r   r   r     s    RM""r   c                 F    t        | dd      } || dz   f|z   |dz   fz   fz  S )Nr   Fr{   r   r   )r   r   rf   rx   s       r   r   r     s4    As51AAE8g%!5777r   c                 0    t        j                  | dd      S r   r   r   s    r   r   r     r   r   a  sph_harm_y(n, m, theta, phi, *, diff_n=0)

    Spherical harmonics. They are defined as

    .. math::

        Y_n^m(\theta,\phi) = \sqrt{\frac{2 n + 1}{4 \pi} \frac{(n - m)!}{(n + m)!}}
            P_n^m(\cos(\theta)) e^{i m \phi}

    where :math:`P_n^m` are the (unnormalized) associated Legendre polynomials.

    Parameters
    ----------
    n : ArrayLike[int]
        Degree of the harmonic. Must have ``n >= 0``. This is
        often denoted by ``l`` (lower case L) in descriptions of
        spherical harmonics.
    m : ArrayLike[int]
        Order of the harmonic.
    theta : ArrayLike[float]
        Polar (colatitudinal) coordinate; must be in ``[0, pi]``.
    phi : ArrayLike[float]
        Azimuthal (longitudinal) coordinate; must be in ``[0, 2*pi]``.
    diff_n : Optional[int]
        A non-negative integer. Compute and return all derivatives up
        to order ``diff_n``. Default is 0.

    Returns
    -------
    y : ndarray[complex] or tuple[ndarray[complex]]
       Spherical harmonics with ``diff_n`` derivatives.

    Notes
    -----
    There are different conventions for the meanings of the input
    arguments ``theta`` and ``phi``. In SciPy ``theta`` is the
    polar angle and ``phi`` is the azimuthal angle. It is common to
    see the opposite convention, that is, ``theta`` as the azimuthal angle
    and ``phi`` as the polar angle.

    Note that SciPy's spherical harmonics include the Condon-Shortley
    phase [2]_ because it is part of `sph_legendre_p`.

    With SciPy's conventions, the first several spherical harmonics
    are

    .. math::

        Y_0^0(\theta, \phi) &= \frac{1}{2} \sqrt{\frac{1}{\pi}} \\
        Y_1^{-1}(\theta, \phi) &= \frac{1}{2} \sqrt{\frac{3}{2\pi}}
                                    e^{-i\phi} \sin(\theta) \\
        Y_1^0(\theta, \phi) &= \frac{1}{2} \sqrt{\frac{3}{\pi}}
                                 \cos(\theta) \\
        Y_1^1(\theta, \phi) &= -\frac{1}{2} \sqrt{\frac{3}{2\pi}}
                                 e^{i\phi} \sin(\theta).

    References
    ----------
    .. [1] Digital Library of Mathematical Functions, 14.30.
           https://dlmf.nist.gov/14.30
    .. [2] https://en.wikipedia.org/wiki/Spherical_harmonics#Condon.E2.80.93Shortley_phase
    T)r   rx   c                 Z    t        | dd      } d| cxk  rdk  sn t        d|  d      | S rz   r   rw   s    r   r   r     r   r   c                     | j                   d   dk(  r| d   S | j                   d   dk(  r| d   | dddgddgf   fS | j                   d   dk(  r$| d   | dddgddgf   | dddgddggddgddggf   fS y Nr   r   ).r   r   r}   .r      rT   r   s    r   r   r         		"9~		"9~s3AA#6777		"IC!Q!Q$7 8q!fq!f%AA'778: 	: 	r   aX  sph_harm_y_all(n, m, theta, phi, *, diff_n=0)

    All spherical harmonics up to the specified degree ``n`` and order ``m``.

    Output shape is ``(n + 1, 2 * m + 1, ...)``. The entry at ``(j, i)``
    corresponds to degree ``j`` and order ``i`` for all  ``0 <= j <= n``
    and ``-m <= i <= m``.

    See Also
    --------
    sph_harm_y
    c                 Z    t        | dd      } d| cxk  rdk  sn t        d|  d      | S )Nrx   Fr{   r   r}   z=diff_n is currently only implemented for orders 2, received: r   r   rw   s    r   r   r   =  r   r   c                     dddgdgz   iS )Nr   r   )r   r   r   r   rw   s    r   r   r   H  s    RH//00r   c                     |d   }t        | t        j                        r| dk  rt        d      | dz   dt	        |      z  dz   ft        j                  ||      z   |dz   |dz   fz   fS )Nrx   r   r   r   r}   r   )r   r   r   	phi_shaperf   r   rx   s          r   r   r   M  sw    HFa))*q1u<==UAAJN#b&9&9+y&QQ	!VaZ ! # #r   c                     | j                   d   dk(  r| d   S | j                   d   dk(  r| d   | dddgddgf   fS | j                   d   dk(  r$| d   | dddgddgf   | dddgddggddgddggf   fS y r   r   r   s    r   r   r   X  r   r   )r$   r   numpyr"   _input_validationr   _special_ufuncsr   r   r   r	   _gufuncsr
   r   r   r   __all__r   rD   r   rN   rH   rL   rF   r   r   r   <module>r      s      2: :; ;	s sl  @ E#L   &&# '#    $ !! " 22) 3) 00D 1D **# +# $H E!M' T    .. / ((# )# " E! $ ## $ 22 3 44- 5- 22	I 3	I ,,# -# 8 =
D 
 
 ""# ##  "   ..# /# ,,8 -8 &&# '# =z #1@
F   ""	: #	:  #1"   ..1 /1 ,,# -# &&	: '	:r   