
    HR-eg                         d dl mZmZmZmZmZ d dlm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 dd	lmZmZ er	d d
lmZmZ nd Zd ZddgZddgiZ G d de          Z G d dee          ZdS )    )acoscosinfsinsqrt)NumberN)log)aszarr)	HAS_SCIPY   )scalar_inv_efuncs)FLRWFlatFLRWMixin)	ellipkinchyp2f1c                       t          d          NzNo module named 'scipy.special'ModuleNotFoundErrorargskwargss     @lib/python3.11/site-packages/astropy/cosmology/flrw/lambdacdm.pyr   r          !"CDDD    c                       t          d          r   r   r   s     r   r   r      r   r   	LambdaCDMFlatLambdaCDM*scipyc                        e Zd ZdZdej        z  ddej        z  dfddd fdZd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )r   aK  FLRW cosmology with a cosmological constant and curvature.

    This has no additional attributes beyond those of FLRW.

    Parameters
    ----------
    H0 : float or scalar quantity-like ['frequency']
        Hubble constant at z = 0.  If a float, must be in [km/sec/Mpc].

    Om0 : float
        Omega matter: density of non-relativistic matter in units of the
        critical density at z=0.

    Ode0 : float
        Omega dark energy: density of the cosmological constant in units of
        the critical density at z=0.

    Tcmb0 : float or scalar quantity-like ['temperature'], optional
        Temperature of the CMB z=0. If a float, must be in [K]. Default: 0 [K].
        Setting this to zero will turn off both photons and neutrinos
        (even massive ones).

    Neff : float, optional
        Effective number of Neutrino species. Default 3.04.

    m_nu : quantity-like ['energy', 'mass'] or array-like, optional
        Mass of each neutrino species in [eV] (mass-energy equivalency enabled).
        If this is a scalar Quantity, then all neutrino species are assumed to
        have that mass. Otherwise, the mass of each species. The actual number
        of neutrino species (and hence the number of elements of m_nu if it is
        not scalar) must be the floor of Neff. Typically this means you should
        provide three neutrino masses unless you are considering something like
        a sterile neutrino.

    Ob0 : float or None, optional
        Omega baryons: density of baryonic matter in units of the critical
        density at z=0.  If this is set to None (the default), any computation
        that requires its value will raise an exception.

    name : str or None (optional, keyword-only)
        Name for this cosmological object.

    meta : mapping or None (optional, keyword-only)
        Metadata for the cosmology, e.g., a reference.

    Examples
    --------
    >>> from astropy.cosmology import LambdaCDM
    >>> cosmo = LambdaCDM(H0=70, Om0=0.3, Ode0=0.7)

    The comoving distance in Mpc at redshift z:

    >>> z = 0.5
    >>> dc = cosmo.comoving_distance(z)
            RQ@Nnamemetac                4   t                                          |||||||||		  	         | j        j        dk    rYt          j        | _        | j        | j        | j	        f| _
        | j	        dk    r|                                  d S | j        | _        d S | j        s:t          j        | _        | j        | j        | j	        | j        | j        z   f| _
        d S t          j        | _        | j        | j        | j	        | j        | j        | j        | j        f| _
        d S )N	H0Om0Ode0Tcmb0Neffm_nuOb0r%   r&   r   )super__init___Tcmb0valuer   lcdm_inv_efunc_norel_inv_efunc_scalar_Om0_Ode0_Ok0_inv_efunc_scalar_args_optimize_flat_norad _elliptic_comoving_distance_z1z2_comoving_distance_z1z2
_massivenulcdm_inv_efunc_nomnu_Ogamma0_Onu0lcdm_inv_efunc_neff_per_nu_nmasslessnu
_nu_y_list)selfr)   r*   r+   r,   r-   r.   r/   r%   r&   	__class__s             r   r1   zLambdaCDM.__init__Z   s)    	 	 
	
 
	
 
	
 ;!!%6%KD"+/9dj$)*LD'yA~~))+++++/3/T,,, 	%6%KD"	
	
*	+D''' &7%ED"	
	!!+D'''r   c                    | j         dk    r&| j        | _        | j        | _        | j        | _        dS | j         dk    r&| j        | _        | j        | _        | j	        | _        dS | j
        | _        | j        | _        | j        | _        dS )z>Set optimizations for flat LCDM cosmologies with no radiation.r   r   N)r6   _dS_comoving_distance_z1z2r<   _dS_age_age_dS_lookback_time_lookback_time_EdS_comoving_distance_z1z2_EdS_age_EdS_lookback_time&_hypergeometric_comoving_distance_z1z2	_flat_age_flat_lookback_time)rE   s    r   r:   zLambdaCDM._optimize_flat_norad   s     9>>+/+JD(DI"&"8DY!^^+/+KD(DI"&"9D+/+VD(DI"&":Dr   c                 |    t          |          }dt          |d          rt          j        |j                  ndz  S )a  Returns dark energy equation of state at redshift ``z``.

        Parameters
        ----------
        z : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshift.

        Returns
        -------
        w : ndarray or float
            The dark energy equation of state.
            Returns `float` if the input is scalar.

        Notes
        -----
        The dark energy equation of state is defined as
        :math:`w(z) = P(z)/\rho(z)`, where :math:`P(z)` is the pressure at
        redshift z and :math:`\rho(z)` is the density at redshift z, both in
        units where c=1. Here this is :math:`w(z) = -1`.
        g      shape      ?r
   hasattrnponesrT   rE   zs     r   wzLambdaCDM.w   s:    * 1II71g+>+>Grwqw'''CHHr   c                 v    t          |          }t          |d          rt          j        |j                  ndS )a*  Evaluates the redshift dependence of the dark energy density.

        Parameters
        ----------
        z : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshift.

        Returns
        -------
        I : ndarray or float
            The scaling of the energy density of dark energy with redshift.
            Returns `float` if the input is scalar.

        Notes
        -----
        The scaling factor, I, is defined by :math:`\rho(z) = \rho_0 I`,
        and in this case is given by :math:`I = 1`.
        rT   rU   rV   rZ   s     r   de_density_scalezLambdaCDM.de_density_scale   s5    & 1II#*1g#6#6?rwqwC?r   c                 j   	 t          j        ||          \  }}n"# t          $ r}t          d          |d}~ww xY w| j        dk    s| j        dk    s| j        dk    r|                     ||          S d| j        dz  z  | j        z  | j        dz  z  }|t          |          z  }|dk     sd|k     rd }t          ||dz
  z  t          ||dz
  z            z   d	          }d
||d|z  z   z  z   dz  }t          |d|z  dz   z            }	dt          |	          z  }
d|	z  |dd|z  z   z  z   d|	z  z  } || j        | j        |||	|          } || j        | j        |||	|          }nd|k     r|dk     r| j        | j        k    rd }t          t          d|z
            dz            }t          d          t          t          d|z
            dz            z  }d	d
|z   |z   z  }d	d
d|z  z
  z  }d	d
|z   |z
  z  }dt          ||z
            z  }
||z
  ||z
  z  } || j        | j        |||          } || j        | j        |||          }n|                     ||          S | j        t          t          | j                            z  }||
z  t          ||          t          ||          z
  z  S )a  Comoving transverse distance in Mpc between two redshifts.

        This value is the transverse comoving distance at redshift ``z``
        corresponding to an angular separation of 1 radian. This is the same as
        the comoving distance if :math:`\Omega_k` is zero.

        For :math:`\Omega_{rad} = 0` the comoving distance can be directly
        calculated as an elliptic integral [1]_.

        Not valid or appropriate for flat cosmologies (Ok0=0).

        Parameters
        ----------
        z1, z2 : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshifts.

        Returns
        -------
        d : `~astropy.units.Quantity` ['length']
            Comoving distance in Mpc between each input redshift.

        References
        ----------
        .. [1] Kantowski, R., Kao, J., & Thomas, R. (2000). Distance-Redshift
               in Inhomogeneous FLRW. arXiv e-prints, astro-ph/0002334.
        z1 and z2 have different shapesNr   g      +      c                     t          j        |dz   | z  t          |          z  ||z  z   |z
  |dz   | z  t          |          z  ||z  z   |z   z            S NrU   )rX   arccosabs)r*   Ok0kappay1Ar[   s         r   phi_zz9LambdaCDM._elliptic_comoving_distance_z1z2.<locals>.phi_z   sd    y#g_s3xx/%"*<q@C3S1EBJ>BD  r   r   UUUUUU?   c           	          t          j        t          j        ||z
  |dz   | z  t          |          z  |z   z                      S rd   )rX   arcsinr   rf   )r*   rg   ri   y2r[   s        r   rk   z9LambdaCDM._elliptic_comoving_distance_z1z2.<locals>.phi_z  s>    y"r'q3w#oC6PSU6U)V!W!WXXXr   )rX   broadcast_arrays
ValueErrorr6   r7   r8    _integral_comoving_distance_z1z2rf   powr   r   r   r   _hubble_distancer   )rE   z1z2ebrh   rk   v_kri   rj   gk2phi_z1phi_z2ybycrq   y3	prefactors                      r   r;   z*LambdaCDM._elliptic_comoving_distance_z1z2   s   6	G(R00FB 	G 	G 	G>??QF	G
 9>>TZ1__	Q88R@@@$)Q,&3dilBCFF
EEq1uu   eq1uoQ!a%[(9(997CCCua#g..!3BR1r6A:&''ADGGAa%%1q2v:..1q59BU49diArBBFU49diArBBFF !ee!a%%TY%;%;Y Y Y T!a%[[1_%%Ba3tAE{{Q///Bb2gl+Bb1r6k*Bb2gl+BDbMM!Ar'b2g&BU49diR<<FU49diR<<FF88R@@@)DTY,@,@@	1}	&" 5 5	&"8M8M MNN    
:5:c                     	 t          j        ||          \  }}n"# t          $ r}t          d          |d}~ww xY w| j        ||z
  z  S )a  
        Comoving line-of-sight distance in Mpc between objects at redshifts
        ``z1`` and ``z2`` in a flat, :math:`\Omega_{\Lambda}=1` cosmology
        (de Sitter).

        The comoving distance along the line-of-sight between two objects
        remains constant with time for objects in the Hubble flow.

        The de Sitter case has an analytic solution.

        Parameters
        ----------
        z1, z2 : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshifts. Must be 1D or scalar.

        Returns
        -------
        d : `~astropy.units.Quantity` ['length']
            Comoving distance in Mpc between each input redshift.
        r`   NrX   rr   rs   rv   )rE   rw   rx   ry   s       r   rH   z$LambdaCDM._dS_comoving_distance_z1z2  sh    *	G(R00FB 	G 	G 	G>??QF	G $R00r   c                     	 t          j        ||          \  }}n"# t          $ r}t          d          |d}~ww xY wd| j        z  }||dz   dz  |dz   dz  z
  z  S )a  
        Comoving line-of-sight distance in Mpc between objects at redshifts
        ``z1`` and ``z2`` in a flat, :math:`\Omega_M=1` cosmology
        (Einstein - de Sitter).

        The comoving distance along the line-of-sight between two objects
        remains constant with time for objects in the Hubble flow.

        For :math:`\Omega_M=1`, :math:`\Omega_{rad}=0` the comoving distance
        has an analytic solution.

        Parameters
        ----------
        z1, z2 : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshifts. Must be 1D or scalar.

        Returns
        -------
        d : `~astropy.units.Quantity` ['length']
            Comoving distance in Mpc between each input redshift.
        r`   Nra   rU         r   )rE   rw   rx   ry   r   s        r   rM   z%LambdaCDM._EdS_comoving_distance_z1z2:  s    ,	G(R00FB 	G 	G 	G>??QF	G --	R#X84Sh7OOPPr   c                 `   	 t          j        ||          \  }}n"# t          $ r}t          d          |d}~ww xY wd| j        z
  | j        z  dz  }| j        t          j        || j        z            z  }||                     ||dz   z            |                     ||dz   z            z
  z  S )a  
        Comoving line-of-sight distance in Mpc between objects at redshifts
        ``z1`` and ``z2``.

        The comoving distance along the line-of-sight between two objects
        remains constant with time for objects in the Hubble flow.

        For :math:`\Omega_{rad} = 0` the comoving distance can be directly
        calculated as a hypergeometric function [1]_.

        Parameters
        ----------
        z1, z2 : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshifts.

        Returns
        -------
        d : `~astropy.units.Quantity` ['length']
            Comoving distance in Mpc between each input redshift.

        References
        ----------
        .. [1] Baes, M., Camps, P., & Van De Putte, D. (2017). Analytical
               expressions and numerical evaluation of the luminosity distance
               in a flat cosmology. MNRAS, 468(1), 927-930.
        r`   Nr   rl   rU   )rX   rr   rs   r6   rv   r   _T_hypergeometric)rE   rw   rx   ry   sr   s         r   rP   z0LambdaCDM._hypergeometric_comoving_distance_z1z2X  s    6	G(R00FB 	G 	G 	G>??QF	G $)mty(g6)BGA	M,B,BB	""1S>22$$Q"s(^445
 	
r   c                 ^    dt          j        |          z  t          ddd|dz             z  S )a  Compute value using Gauss Hypergeometric function 2F1.

        .. math::

           T(x) = 2 \sqrt(x) _{2}F_{1}\left(\frac{1}{6}, \frac{1}{2};
                                            \frac{7}{6}; -x^3 \right)

        Notes
        -----
        The :func:`scipy.special.hyp2f1` code already implements the
        hypergeometric transformation suggested by Baes et al. [1]_ for use in
        actual numerical evaulations.

        References
        ----------
        .. [1] Baes, M., Camps, P., & Van De Putte, D. (2017). Analytical
           expressions and numerical evaluation of the luminosity distance
           in a flat cosmology. MNRAS, 468(1), 927-930.
        ra   gUUUUUU?g      ?g?rb   )rX   r   r   )rE   xs     r   r   zLambdaCDM._T_hypergeometric  s/    ( 271::~wAqD' J JJJr   c                     t          |t                    rt          n t          j        |t          t
                    }| j        |z  S )a  Age of the universe in Gyr at redshift ``z``.

        The age of a de Sitter Universe is infinite.

        Parameters
        ----------
        z : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshift.

        Returns
        -------
        t : `~astropy.units.Quantity` ['time']
            The age of the universe in Gyr at each input redshift.
        )dtype)
isinstancer   r   rX   	full_likefloat_hubble_time)rE   r[   ts      r   rI   zLambdaCDM._dS_age  s;     a((OCCbl1c.O.O.O 1$$r   c                 B    d| j         z  t          |          dz   dz  z  S )  Age of the universe in Gyr at redshift ``z``.

        For :math:`\Omega_{rad} = 0` (:math:`T_{CMB} = 0`; massless neutrinos)
        the age can be directly calculated as an elliptic integral [1]_.

        Parameters
        ----------
        z : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshift.

        Returns
        -------
        t : `~astropy.units.Quantity` ['time']
            The age of the universe in Gyr at each input redshift.

        References
        ----------
        .. [1] Thomas, R., & Kantowski, R. (2000). Age-redshift relation for
               standard cosmology. PRD, 62(10), 103507.
        UUUUUU?rU   g      )r   r
   rZ   s     r   rN   zLambdaCDM._EdS_age  s&    * 4,,q		CT/JJJr   c                 $   d| j         z  t          j                            d| j        z
            z  }t          j        t          j                            d| j        z  dz
  dz   t          |          dz   dz  z                      }||z  j        S )r   r   r   y                rU   rb   )r   rX   emathr   r6   arcsinhr
   real)rE   r[   r   args       r   rQ   zLambdaCDM._flat_age  s    .  11BHMM!di-4P4PP	jHMM1ty=1,r1fQii#o!5KKLL
 
 C%%r   c                 X    |                      d          |                      |          z
  S )a  Lookback time in Gyr to redshift ``z``.

        The lookback time is the difference between the age of the Universe now
        and the age at redshift ``z``.

        For :math:`\Omega_{rad} = 0` (:math:`T_{CMB} = 0`; massless neutrinos)
        the age can be directly calculated as an elliptic integral.
        The lookback time is here calculated based on the ``age(0) - age(z)``.

        Parameters
        ----------
        z : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshift.

        Returns
        -------
        t : `~astropy.units.Quantity` ['time']
            Lookback time in Gyr to each input redshift.
        r   )rN   rZ   s     r   rO   zLambdaCDM._EdS_lookback_time  s'    ( }}Q$--"2"222r   c                 P    | j         t          t          |          dz             z  S )a  Lookback time in Gyr to redshift ``z``.

        The lookback time is the difference between the age of the Universe now
        and the age at redshift ``z``.

        For :math:`\Omega_{rad} = 0` (:math:`T_{CMB} = 0`; massless neutrinos)
        the age can be directly calculated.

        .. math::

           a = exp(H * t) \  \text{where t=0 at z=0}

           t = (1/H) (ln 1 - ln a) = (1/H) (0 - ln (1/(1+z))) = (1/H) ln(1+z)

        Parameters
        ----------
        z : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshift.

        Returns
        -------
        t : `~astropy.units.Quantity` ['time']
            Lookback time in Gyr to each input redshift.
        rU   )r   r	   r
   rZ   s     r   rK   zLambdaCDM._dS_lookback_time  s$    2  3vayy3#7#777r   c                 X    |                      d          |                      |          z
  S )a  Lookback time in Gyr to redshift ``z``.

        The lookback time is the difference between the age of the Universe now
        and the age at redshift ``z``.

        For :math:`\Omega_{rad} = 0` (:math:`T_{CMB} = 0`; massless neutrinos)
        the age can be directly calculated.
        The lookback time is here calculated based on the ``age(0) - age(z)``.

        Parameters
        ----------
        z : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshift.

        Returns
        -------
        t : `~astropy.units.Quantity` ['time']
            Lookback time in Gyr to each input redshift.
        r   )rQ   rZ   s     r   rR   zLambdaCDM._flat_lookback_time  s'    ( ~~a  4>>!#4#444r   c                     | j         | j        s| j        n| j         |                     |          z  z   }t	          |          dz   }t          j        |dz  ||z  | j        z   |z  | j        z   z  | j	        z             S )  Function used to calculate H(z), the Hubble parameter.

        Parameters
        ----------
        z : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshift.

        Returns
        -------
        E : ndarray or float
            The redshift scaling of the Hubble constant.
            Returns `float` if the input is scalar.
            Defined such that :math:`H(z) = H_0 E(z)`.
        rU   ra   )
r?   r=   r@   nu_relative_densityr
   rX   r   r6   r8   r7   rE   r[   Orzp1s       r   efunczLambdaCDM.efunc#  s    " ]?=DJJ!9!9!!<!<<

 Qii#owFrCx$)+s2TY>?$*L
 
 	
r   c                     | j         | j        s| j        n| j         |                     |          z  z   }t	          |          dz   }|dz  ||z  | j        z   |z  | j        z   z  | j        z   dz  S )  Function used to calculate :math:`\frac{1}{H_z}`.

        Parameters
        ----------
        z : Quantity-like ['redshift'], array-like, or `~numbers.Number`
            Input redshift.

        Returns
        -------
        E : ndarray or float
            The inverse redshift scaling of the Hubble constant.
            Returns `float` if the input is scalar.
            Defined such that :math:`H_z = H_0 / E`.
        rU   ra   r   )r?   r=   r@   r   r
   r6   r8   r7   r   s       r   	inv_efunczLambdaCDM.inv_efunc?  s     ]?=DJJ!9!9!!<!<<

 Qii#oQ28di/36BCdjP
 	
r   )__name__
__module____qualname____doc__uKeVr1   r:   r\   r^   r;   rH   rM   rP   r   rI   rN   rQ   rO   rK   rR   r   r   __classcell__rF   s   @r   r   r   !   s|       6 6z ACi14Z4 4 4 4 4 4 4 4l; ; ;&I I I0@ @ @,KO KO KOZ1 1 18Q Q Q<&
 &
 &
PK K K,% % %$K K K.& & &:3 3 3,8 8 865 5 5,
 
 
8
 
 
 
 
 
 
r   c                   `     e Zd ZdZdej        z  ddej        z  dfddd fdZd Zd Z	 xZ
S )	r   a  FLRW cosmology with a cosmological constant and no curvature.

    This has no additional attributes beyond those of FLRW.

    Parameters
    ----------
    H0 : float or scalar quantity-like ['frequency']
        Hubble constant at z = 0. If a float, must be in [km/sec/Mpc].

    Om0 : float
        Omega matter: density of non-relativistic matter in units of the
        critical density at z=0.

    Tcmb0 : float or scalar quantity-like ['temperature'], optional
        Temperature of the CMB z=0. If a float, must be in [K]. Default: 0 [K].
        Setting this to zero will turn off both photons and neutrinos
        (even massive ones).

    Neff : float, optional
        Effective number of Neutrino species. Default 3.04.

    m_nu : quantity-like ['energy', 'mass'] or array-like, optional
        Mass of each neutrino species in [eV] (mass-energy equivalency enabled).
        If this is a scalar Quantity, then all neutrino species are assumed to
        have that mass. Otherwise, the mass of each species. The actual number
        of neutrino species (and hence the number of elements of m_nu if it is
        not scalar) must be the floor of Neff. Typically this means you should
        provide three neutrino masses unless you are considering something like
        a sterile neutrino.

    Ob0 : float or None, optional
        Omega baryons: density of baryonic matter in units of the critical
        density at z=0.  If this is set to None (the default), any computation
        that requires its value will raise an exception.

    name : str or None (optional, keyword-only)
        Name for this cosmological object.

    meta : mapping or None (optional, keyword-only)
        Metadata for the cosmology, e.g., a reference.

    Examples
    --------
    >>> from astropy.cosmology import FlatLambdaCDM
    >>> cosmo = FlatLambdaCDM(H0=70, Om0=0.3)

    The comoving distance in Mpc at redshift z:

    >>> z = 0.5
    >>> dc = cosmo.comoving_distance(z)

    To get an equivalent cosmology, but of type `astropy.cosmology.LambdaCDM`,
    use :attr:`astropy.cosmology.FlatFLRWMixin.nonflat`.

    >>> cosmo.nonflat
    LambdaCDM(H0=70.0 km / (Mpc s), Om0=0.3, ...
    r"   r#   Nr$   c                   t                                          ||d||||||	  	         | j        j        dk    r:t          j        | _        | j        | j        f| _	        | 
                                 d S | j        s4t          j        | _        | j        | j        | j        | j        z   f| _	        d S t          j        | _        | j        | j        | j        | j        | j        | j        f| _	        d S )Nr"   r(   r   )r0   r1   r2   r3   r   flcdm_inv_efunc_norelr5   r6   r7   r9   r:   r=   flcdm_inv_efunc_nomnur?   r@   flcdm_inv_efuncrB   rC   rD   )
rE   r)   r*   r,   r-   r.   r/   r%   r&   rF   s
            r   r1   zFlatLambdaCDM.__init__  s    	 	 
	
 
	
 
	
 ;!!%6%LD"+/9dj*AD' %%''''' 	%6%LD"	

*+D''' &7%FD"	
!!+D'''r   c                     | j         | j        s| j        n| j         |                     |          z  z   }t	          |          dz   }t          j        |dz  ||z  | j        z   z  | j        z             S )r   rU   rb   )	r?   r=   r@   r   r
   rX   r   r6   r7   r   s       r   r   zFlatLambdaCDM.efunc  st    " ]?=DJJ!9!9!!<!<<

 Qii#owsAvcDI!56CDDDr   c                     | j         | j        s| j        n| j         |                     |          z  z   }t	          |          dz   }|dz  ||z  | j        z   z  | j        z   dz  S )r   rU   rb   r   )r?   r=   r@   r   r
   r6   r7   r   s       r   r   zFlatLambdaCDM.inv_efunc  so     ]?=DJJ!9!9!!<!<<

 Qii#oQ"s(TY./$*<$GGr   )r   r   r   r   r   r   r   r1   r   r   r   r   s   @r   r   r   Z  s        8 8| ACi14Z1 1 1 1 1 1 1 1fE E E4H H H H H H Hr   )mathr   r   r   r   r   numbersr   numpyrX   r	   astropy.unitsunitsr   astropy.cosmology.utilsr
   "astropy.utils.compat.optional_depsr    r   baser   r   scipy.specialr   r   __all____doctest_requires__r   r    r   r   <module>r      s   + * * * * * * * * * * * * *                       * * * * * * 8 8 8 8 8 8       % % % % % % % %  E/////////E E EE E E 
(gY' v
 v
 v
 v
 v
 v
 v
 v
r]H ]H ]H ]H ]HM9 ]H ]H ]H ]H ]Hr   