
    HR-eP                     h   d 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mZmZmZ ddlmZ ddlmZmZmZmZ ddlmZ ddlmZ ddlmZmZmZm Z m!Z! dd	l"m#Z#  G d
 de          Z$ej%        &                    e#d          d             Z' G d de          Z( G d de          Z) G d de          Z* G d de          Z+ G d de          Z, G d de          Z- G d de          Z. G d dee(e)e*e+e,e-e.
  
        Z/ G d d e/          Z0 G d! d"e*          Z1 G d# d$ee1          Z2dS )%z+Testing :mod:`astropy.cosmology.flrw.base`.    N)FLRWFlatLambdaCDM	LambdaCDMPlanck18)_COSMOLOGY_CLASSES)_a_B_c2_critdens_const_H0units_to_invsquad)	Parameter)get_redshift_methods)CosmologyTestFlatCosmologyMixinTestParameterTestMixin
invalid_zsvalid_zs)	HAS_SCIPYc                        e Zd Z fdZ xZS )SubFLRWc                 F    t                                          |          S N)superw)selfz	__class__s     Flib/python3.11/site-packages/astropy/cosmology/flrw/tests/test_base.pyr   z	SubFLRW.w'   s    wwyy||    )__name__
__module____qualname__r   __classcell__r   s   @r   r   r   &   s8                r   r   zscipy is installedreasonc                      t          j        t          d          5  t                       ddd           dS # 1 swxY w Y   dS )zATest stand-in functions when optional dependencies not installed.z!No module named 'scipy.integrate'matchN)pytestraisesModuleNotFoundErrorr    r   r   test_optional_deps_functionsr-   0   s     
*2U	V	V	V                   s   8<<c                       e Zd ZdZd Zd ZdS )ParameterH0TestMixina%  Tests for `astropy.cosmology.Parameter` H0 on a Cosmology.

    H0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c                    t          j        d          }t          |j        t                    sJ d|j        j        v sJ |j        j        |k    sJ |j                            |d          d|z  k    sJ |j                            |d|z            d|z  k    sJ t          j	        t          d          5  |j                            |ddg           ddd           n# 1 swxY w Y   |j        |j        u sJ |j        | j        d	         k    sJ t          |j        t           j                  r|j        j        |k    sJ dS )
zTest Parameter ``H0``.z
km/(s Mpc)zHubble constant   
   H0 is a non-scalar quantityr'      NH0)uUnit
isinstancer5   r   __doc__unitvalidater)   r*   
ValueError_H0	_cls_argsQuantity)r   	cosmo_clscosmor:   s       r   test_H0zParameterH0TestMixin.test_H0B   s   vl## ),	22222 IL$88888| D(((( |$$UA..!d(::::|$$UBI66"t)CCCC]:-JKKK 	1 	1L!!%!Q000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 x59$$$$x4>$/////%(AJ//IEHMT4I4I4I4I4I4Is   9C##C'*C'c                     ||j         i |j        }|j        |j        d         k    sJ |j        d         j        |j        d<    ||j         i |j        }|j        j        |j        d         k    sJ t          j        ddgt
          j        t
          j        z  t
          j	        z            |j        d<   t          j        t          d          5   ||j         i |j         ddd           dS # 1 swxY w Y   dS )z)Test initialization for values of ``H0``.r5   F   d   r3   r'   N)argskwargsr5   	argumentsvaluer6   r?   kmsMpcr)   r*   r<   r   r@   barA   s       r   test_init_H0z!ParameterH0TestMixin.test_init_H0V   sB    	270bi00x2<-----  \$/5T	270bi00x~d!33333 ZS	14!#:3EFFT]:-JKKK 	- 	-Irw,"),,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   C22C69C6N)r   r    r!   r9   rB   rO   r,   r   r   r/   r/   :   s?         J J J(- - - - -r   r/   c                       e Zd ZdZd Zd ZdS )ParameterOm0TestMixina'  Tests for `astropy.cosmology.Parameter` Om0 on a Cosmology.

    Om0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c                     t          |j        t                    sJ d|j        j        v sJ |j                            |d          dk    sJ |j                            |dt
          j        z            dk    sJ t          j        t          d          5  |j                            |d           ddd           n# 1 swxY w Y   |j        |j
        u sJ |j        | j        d         k    sJ t          |j        t                    sJ dS )	zTest Parameter ``Om0``.zOmega matterr1   r2   zOm0 cannot be negativer'   NOm0)r8   rT   r   r9   r;   r6   oner)   r*   r<   _Om0r>   floatr   r@   rA   s      r   test_Om0zParameterOm0TestMixin.test_Om0o   sR    )-33333!66666 }%%eQ//14444}%%eR!%Z88B>>>>]:-EFFF 	. 	.M""5"---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. yEJ&&&&yDN511111%)U+++++++   B??CCc                    |j         d         t          j        z  |j         d<    ||j        i |j        }|j        |j         d         k    sJ |j         d         j        |j         d<    ||j        i |j        }|j        |j         d         k    sJ d|j         d<   t          j        t          d          5   ||j        i |j         ddd           dS # 1 swxY w Y   dS )z*Test initialization for values of ``Om0``.rT   gHzGѿzOm0 cannot be negative.r'   N)
rH   r6   rU   rF   rG   rT   rI   r)   r*   r<   rM   s       r   test_init_Om0z#ParameterOm0TestMixin.test_init_Om0   s;    !l51QU:U	270bi00yBL///// !l517U	270bi00yBL///// $U]:-FGGG 	- 	-Irw,"),,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   6CCCN)r   r    r!   r9   rY   r\   r,   r   r   rQ   rQ   g   s<         , , ,"- - - - -r   rQ   c                   *    e Zd ZdZd Zd Zd Zd ZdS )ParameterOde0TestMixina)  Tests for `astropy.cosmology.Parameter` Ode0 on a Cosmology.

    Ode0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c                 ^    t          |j        t                    sJ d|j        j        v sJ dS )%Test Parameter ``Ode0`` on the class.zOmega dark energyN)r8   Ode0r   r9   )r   r@   s     r   test_Parameter_Ode0z*ParameterOde0TestMixin.test_Parameter_Ode0   s6    ).)44444"in&<<<<<<<r   c                 \   |j                             |d          dk    sJ |j                             |dt          j        z            dk    sJ t	          j        t          d          5  |j                             |dt          j        z             ddd           dS # 1 swxY w Y   dS )#Test Parameter ``Ode0`` validation.g?r2   g      $@only dimensionlessr'   N)ra   r;   r6   rU   r)   r*   	TypeErrorrJ   rX   s      r   test_Parameter_Ode0_validationz5ParameterOde0TestMixin.test_Parameter_Ode0_validation   s    ~&&uc22c9999~&&ub15j99TAAAA]9,@AAA 	6 	6N##E29555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s   +)B!!B%(B%c                     |j         |j        u sJ |j         | j        d         k    sJ t          |j         t                    sJ dS )rd   ra   N)ra   _Ode0r>   r8   rW   r   rA   s     r   	test_Ode0z ParameterOde0TestMixin.test_Ode0   sQ     zU[((((zT^F33333%*e,,,,,,,r   c                    |j         d         t          j        z  |j         d<    ||j        i |j        }|j        |j         d         k    sJ |j         d         j        |j         d<    ||j        i |j        }|j        |j         d         k    sJ d|j         d<    ||j        i |j        }t          j        |                    g d          g d          sJ t          j        |                    d          d          sJ dt          j	        z  |j         d<   t          j        t          d	          5   ||j        i |j         d
d
d
           d
S # 1 swxY w Y   d
S )+Test initialization for values of ``Ode0``.ra           r   r1   r4      r   r   r   r   r1   r   r2   re   r'   N)rH   r6   rU   rF   rG   ra   rI   allcloseOderJ   r)   r*   rf   rM   s       r   test_init_Ode0z%ParameterOde0TestMixin.test_init_Ode0   s     "|F3qu<V	270bi00zR\&11111  "|F39V	270bi00zR\&11111  #V	270bi00z%))LLL11<<<@@@@@z%))A,,*****  "ADyV]9,@AAA 	- 	-Irw,"),,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   7EEEN)r   r    r!   r9   rb   rg   rk   rt   r,   r   r   r^   r^      sZ         = = =
6 6 6- - -- - - - -r   r^   c                       e Zd ZdZd Zd ZdS )ParameterTcmb0TestMixina+  Tests for `astropy.cosmology.Parameter` Tcmb0 on a Cosmology.

    Tcmb0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c                    t          |j        t                    sJ d|j        j        v sJ |j        j        t
          j        k    sJ |j                            |d          dt
          j        z  k    sJ |j                            |dt
          j        z            dt
          j        z  k    sJ t          j	        t          d          5  |j                            |ddg           ddd           n# 1 swxY w Y   |j        |j        u sJ |j        | j        d         k    sJ t          |j        t
          j                  r|j        j        t
          j        k    sJ dS )	zTest Parameter ``Tcmb0``.zTemperature of the CMBr1   r2   Tcmb0 is a non-scalar quantityr'   r4   NTcmb0)r8   ry   r   r9   r:   r6   Kr;   r)   r*   r<   _Tcmb0
cls_kwargsr?   rX   s      r   
test_Tcmb0z"ParameterTcmb0TestMixin.test_Tcmb0   s    )/955555'9?+BBBBB#qs**** ''q11QW<<<<''rACx88BHDDDD]:-MNNN 	4 	4O$$UQF333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 {el****{dog66666%+qz22Nu{7G137N7N7N7N7N7Ns   C77C;>C;c                     ||j         i |j        }|j        |j        d         k    sJ |j        d         j        |j        d<    ||j         i |j        }|j        j        |j        d         k    sJ t          j        ddgt
          j                  |j        d<   t          j	        t          d          5   ||j         i |j         ddd           dS # 1 swxY w Y   dS )z,Test initialization for values of ``Tcmb0``.ry   rn   r4   rx   r'   N)rF   rG   ry   rH   rI   r6   r?   rz   r)   r*   r<   rM   s       r   test_init_Tcmb0z'ParameterTcmb0TestMixin.test_init_Tcmb0   s6    	270bi00{bl733333 !#W 5 ;W	270bi00{ BL$99999 !"
C8QS 9 9W]:-MNNN 	- 	-Irw,"),,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   8CCCN)r   r    r!   r9   r}   r   r,   r   r   rv   rv      s?         O O O$- - - - -r   rv   c                       e Zd ZdZd Zd ZdS )ParameterNeffTestMixina)  Tests for `astropy.cosmology.Parameter` Neff on a Cosmology.

    Neff is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c                 <   t          |j        t                    sJ d|j        j        v sJ |j                            |d          dk    sJ |j                            |dt
          j        z            dk    sJ t          j        t          d          5  |j                            |d           ddd           n# 1 swxY w Y   |j        |j
        u sJ |j        | j                            dd	          k    sJ t          |j        t                    sJ dS )
zTest Parameter ``Neff``.z$Number of effective neutrino speciesr1   r2   zNeff cannot be negativer'   rS   NNeffgRQ@)r8   r   r   r9   r;   r6   rU   r)   r*   r<   _Neffr|   getrW   rX   s      r   	test_Neffz ParameterNeffTestMixin.test_Neff   s]    ).)4444459OOOOO ~&&ua00A5555~&&ub15j99R????]:-FGGG 	/ 	/N##E2...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ zU[((((zT_00>>>>>>%*e,,,,,,,rZ   c                    |j         d         t          j        z  |j         d<    ||j        i |j        }|j        |j         d         k    sJ |j         d         j        |j         d<    ||j        i |j        }|j        |j         d         k    sJ d|j         d<   t          j        t                    5   ||j        i |j         ddd           dS # 1 swxY w Y   dS )z+Test initialization for values of ``Neff``.r   rS   N)
rH   r6   rU   rF   rG   r   rI   r)   r*   r<   rM   s       r   test_init_Neffz%ParameterNeffTestMixin.test_init_Neff	  s3     "|F3qu<V	270bi00zR\&11111  "|F39V	270bi00zR\&11111!V]:&& 	- 	-Irw,"),,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   4CCCN)r   r    r!   r9   r   r   r,   r   r   r   r      s<         - - -"- - - - -r   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )Parameterm_nuTestMixina)  Tests for `astropy.cosmology.Parameter` m_nu on a Cosmology.

    m_nu is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c                    t          |j        t                    sJ d|j        j        v sJ |j        j        t
          j        k    sJ |j        j        t          j                    k    sJ t          j	        |j        g dt
          j        z            sJ |j
        j        dk    r|j        J dS |j        s+t          j	        |j        dt
          j        z            sJ dS | j        dk    r|j        |j        k    sJ dS t          j	        |j        d| j                 dt
          j        z            sJ t          j	        |j        | j                 |j                  sJ dS )zTest Parameter ``m_nu``.zMass of neutrino species)rn   rn   rn   r   N)r8   m_nur   r9   r:   r6   eVequivalenciesmass_energyrr   Tnu0rI   
_massivenu_nmasslessnu_massivenu_massrX   s      r   	test_m_nuz Parameterm_nuTestMixin.test_m_nu"  sh    ).)44444)Y^-CCCCC~"ad****~+q}>>>> z%*ooo&<===== :q  :%%%%%! 	T:ej!ad(3333333!##:!6666666:ej)<4+<)<=q14xHHHHH:ej):;U=RSSSSSSSr   c                     ||j         i |j        }t          j        |j        |j        d         k              sJ |j        rJ |j        j        t          j	        k    sJ |j        d         j
        |j        d<    ||j         i |j        }t          j        |j        j
        |j        d         k              sJ |j        rJ t          j        |          }t          j        g dt          j	                  |j        d<   t          j        t          d          5   ||j         i |j         ddd           dS # 1 swxY w Y   dS )zTest initialization for values of ``m_nu``.

        Note this requires the class to have a property ``has_massive_nu``.
        r   )g333333ӿ皙?皙?invalidr'   N)rF   rG   npallr   rH   has_massive_nur:   r6   r   rI   copyr?   r)   r*   r<   r   r@   rN   rA   tbas        r   test_init_m_nuz%Parameterm_nuTestMixin.test_init_m_nu9  s    	270bi00vejBL$8899999''''z!$&&&&  "|F39V	270bi00vej&",v*>>?????'''' imm !
+;+;+;QT B Bf]:Y777 	/ 	/Isx.3:...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s   D>>EEc                    t          j         |          }d|j        d<   t          j        g dt          j                  |j        d<   t          j        t          d          5   ||j        i |j	         ddd           n# 1 swxY w Y   d|j        d<    ||j        i |j	        }|j
        rJ t          |j                  d	k    sJ |j        j        t          j        k    sJ t          j        |j        dt          j        z            sJ t          j        |                    d
          dd          sJ dt          j        z  |j        d<    ||j        i |j	        }|j
        sJ t          |j                  d	k    sJ |j        j        t          j        k    sJ t          j        |j        g dt          j        z            sJ dS )zTest initialization for values of ``m_nu`` and ``Neff``.

        Note this test requires ``Neff`` as constructor input, and a property
        ``has_massive_nu``.
        g333333@r   )g333333?r   r   r   zunexpected number of neutrinor'   Nr            ?gTX0n?gư>rtolr   )r   r   r   r   )r   rH   r6   r?   r   r)   r*   r<   rF   rG   r   lenr   r:   rr   nu_relative_densityr   r@   rN   r   rA   s        r   test_init_m_nu_and_Neffz.Parameterm_nuTestMixin.test_init_m_nu_and_NeffP  s    imm $f !
+;+;+;QT B Bf]:-LMMM 	/ 	/Isx.3:...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ !"f	382sz22''''5:!####z!$&&&&z%*a!$h/////z%%c**,@t
 
 
 	
 	
 	

 !$ad
f	382sz22####5:!####z!$&&&&z%*&:&:&:QT&ABBBBBBBs   #BB	Bc                    t          j         |          }d|j        d<    ||j        i |j        }|j        J |j        rJ t          j         |          }d|j        d<    ||j        i |j        }|j        J |j        rJ dS )zTest initialization for values of ``m_nu``.

        Note this test requires ``Tcmb0`` as constructor input, and a property
        ``has_massive_nu``.
        r   r   Nry   )r   rH   rF   rG   r   r   r   s        r    test_init_m_nu_override_by_Tcmb0z7Parameterm_nuTestMixin.test_init_m_nu_override_by_Tcmb0q  s     imm !f	270bi00z!!!'''' imm!"g	270bi00z!!!''''''r   N)r   r    r!   r9   r   r   r   r   r,   r   r   r   r     sa         T T T./ / /.C C CB( ( ( ( (r   r   c                       e Zd ZdZd Zd ZdS )ParameterOb0TestMixina'  Tests for `astropy.cosmology.Parameter` Ob0 on a Cosmology.

    Ob0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c                    t          |j        t                    sJ d|j        j        v sJ |j                            |d          J |j                            |d          dk    sJ |j                            |dt
          j        z            dk    sJ t          j        t          d          5  |j                            |d           ddd           n# 1 swxY w Y   t          j        t          d          5  |j                            ||j
        dz              ddd           n# 1 swxY w Y   |j        |j        u sJ |j        d	k    sJ dS )
zTest Parameter ``Ob0``.zOmega baryon;Nr   Ob0 cannot be negativer'   rS   "baryonic density can not be largerr1   Q?)r8   Ob0r   r9   r;   r6   rU   r)   r*   r<   rT   _Ob0rX   s      r   test_Ob0zParameterOb0TestMixin.test_Ob0  s    )-33333)-"77777 }%%eT22:::}%%eS11S8888}%%eS15[99S@@@@]:-EFFF 	. 	.M""5"---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.]:-QRRR 	9 	9M""5%)a-888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 yEJ&&&&yD      s$   4CC #C $D22D69D6c                    t          |j        d         t          j                  sJ  ||j        i |j        }|j        |j        d         k    sJ |j        d         j        |j        d<    ||j        i |j        }|j        |j        d         k    sJ d|j        d<    ||j        i |j        }|j        dk    sJ | j        sXt          j	        |
                    d          d          sJ t          j	        |
                    g d          g d          sJ t          j        |          }d|j        d<   t          j        t          d	          5   ||j        i |j         d
d
d
           n# 1 swxY w Y   |j        d         dz   |j        d<   t          j        t          d	          5   ||j        i |j         d
d
d
           n# 1 swxY w Y   t          j        |          }|j                            dd
            ||j        i |j        }t          j        t                    5  |
                    d           d
d
d
           n# 1 swxY w Y   t          j        t                    5  |                    d           d
d
d
           n# 1 swxY w Y   |j        j        d         j        J d
S )z*Test initialization for values of ``Ob0``.r   rn   r1   r   ro   rq   g{Gzr   r'   NrT   r   r   )r8   rH   r6   r?   rF   rG   r   rI   
abstract_wrr   Obr   r)   r*   r<   popOdm_init_signature
parametersdefaultr   s        r   test_init_Ob0z#ParameterOb0TestMixin.test_init_Ob0  s    ",u-qz:::::	270bi00yBL///// !l517U	270bi00yBL///// "U	270bi00yC 	D:ehhqkk1-----:ehh|||44lllCCCCC imm$e]:-EFFF 	/ 	/Isx.3:...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/  #}U3c9e]:-QRRR 	/ 	/Isx.3:...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ imm%&&&	382sz22]:&& 	 	HHQKKK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ]:&& 	 	IIaLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 (3E:BJJJJJsH   E66E:=E:4GGG8II!I>J  J$'J$N)r   r    r!   r9   r   r   r,   r   r   r   r     sA         ! ! !&+K +K +K +K +Kr   r   c                       e Zd ZdZej         fd            Z ej        d          d             Z	 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 eedd          Zej                            e d          ej                            de          ej                            de          d                                     Z ej                            de!          ej        d                         Z"ej                            de!          d             Z#d Z$ fdZ% fd Z&ej                            dd!          d"             Z'ej                            e d#          d$             Z( xZ)S )%FLRWTestFc                 v   t                                          |            t          dt          j        z  t          j        z  t          j        z  dt          j        z  dt          j        z            | _        t          dt          j	        z  dt          j        z  | j
        j        ddi	          | _        d
S )zSetup for testing.rD   HzG?\(\?)r5   rT   ra         @r   ab)ry   r   namemetaN)r   setup_classdictr6   rJ   rK   rL   rU   r>   rz   r   r   r|   r   r   s    r   r   zFLRWTest.setup_class  s     	D!!! ADy13&D15Ltae|
 
 
 )qu(s	
 
 
r   class)scopec                 $    t          ddd          S )z/A non-flat cosmology used in equivalence tests.rD   g?g?)r   )r   s    r   nonflatcosmozFLRWTest.nonflatcosmo  s     S#&&&r   c                 J    t                                          |           dS )zTest initialization.N)r   	test_initr   r@   r   s     r   r   zFLRWTest.test_init  s!    )$$$$$r   c                    d|j         d<    ||j        i |j        }|j        dk    sJ |j        dk    sJ | j        st          j        |                    d          g d          sJ t          j        |                    g d          g d          sJ t          j        |	                    d          g d          sJ t          j        |	                    g d          g d          sJ dS dS )zTest if setting Tcmb0 parameter to 0 influences other parameters.

        TODO: consider moving this test to ``FLRWTest``
        rn   ry   g      ?rq   ro   N)
rH   rF   rG   Ogamma0Onu0r   r6   rr   OgammaOnurM   s       r   test_init_Tcmb0_zeroingz FLRWTest.test_init_Tcmb0_zeroing  s   
 !$W	270bi00}####zS     	E:ell3//>>>>>:ell<<<88,,,GGGGG:eiinnlll;;;;;:eii55|||DDDDD		E 	E EDr   c                     t          |j        t                    sJ |j        j        J |j        |j        u sJ |j        |j        J dS t          j        |j        |j        |j        z
            sJ dS )zTest property ``Odm0``.N)	r8   Odm0propertyfset_Odm0r   r   rr   rT   rX   s      r   	test_Odm0zFLRWTest.test_Odm0  s     ).(33333~"*** zU[((((9:%%%%%;uz59uy+@AAAAAAAr   c                     t          |j        t                    sJ |j        j        J |j        |j        u sJ t          j        |j        d|j        |j        z   |j	        z   |j
        z   z
            sJ dS )Test property ``Ok0``.Nr   )r8   Ok0r   r   _Ok0r   rr   rT   ra   r   r   rX   s      r   test_Ok0zFLRWTest.test_Ok0  s     )-22222}!))) yEJ&&&&{Isei%*4u}DuzQR
 
 	
 	
 	
 	
 	
r   c                     t          |j        t                    sJ |j        j        J t          |j        t                    sJ |j        t	          |j        dk    o
|j        dk              u sJ dS )zTest property ``is_flat``.Nrn   r   )r8   is_flatr   r   boolr   Otot0rX   s      r   test_is_flatzFLRWTest.test_is_flat(  s}     )+X66666 %--- %-.....}ei3&6%PU[C=O Q QQQQQQQr   c                     t          |j        t                    sJ |j        j        J |j        |j        u sJ |j        j        t          j        k    sJ t          j        |j        d|j	        z  d          sJ dS )zTest property ``Tnu0``.Ngrv}+?gh㈵>r   )
r8   r   r   r   _Tnu0r:   r6   rz   rr   ry   rX   s      r   	test_Tnu0zFLRWTest.test_Tnu02  s     ).(33333~"*** zU[((((z!#%%%%z%*&85;&FTRRRRRRRRr   c                     t          |j        t                    sJ |j        j        J |j        dk    r|j        du sJ dS |j        |j        u sJ dS )z!Test property ``has_massive_nu``.Nr   F)r8   r   r   r   r   r   rX   s      r   test_has_massive_nuzFLRWTest.test_has_massive_nu=  ss     )2H=====',444 :??'5000000'5+;;;;;;;r   c                     t          |j        t                    sJ |j        j        J |j        |j        u sJ t          j        |j        |j        j        dz            sJ dS )zTest property ``h``.Ng      Y@)	r8   hr   r   _hr   rr   r5   rI   rX   s      r   test_hzFLRWTest.test_hI  sm     )+x00000{''' w%(""""{57EHNU$:;;;;;;;r   c                     t          |j        t                    sJ |j        j        J |j        |j        u sJ t          j        |j        d|j        z  t
          j        z            sJ dS )zTest property ``hubble_time``.Nr1   )	r8   hubble_timer   r   _hubble_timer6   rr   r5   GyrrX   s      r   test_hubble_timezFLRWTest.test_hubble_timeS  sv     )/:::::$)111  E$66666z%+a%(lqu-DEEEEEEEr   c                     t          |j        t                    sJ |j        j        J |j        |j        u sJ |j        t
          j        |j        z                      t          j
                  k    sJ dS )z"Test property ``hubble_distance``.N)r8   hubble_distancer   r   _hubble_distanceconstcr=   tor6   rL   rX   s      r   test_hubble_distancezFLRWTest.test_hubble_distance]  s{     )3X>>>>>(-555 $(>>>>>$59)<(@(@(G(GGGGGGGr   c                 4   t          |j        t                    sJ |j        j        J |j        |j        u sJ |j        j        t          j        t          j        dz  z  k    sJ t          |j
        j        t          z  dz  z  }|j        j        |k    sJ dS )z$Test property ``critical_density0``.Nrp   r4   )r8   critical_density0r   r   _critical_density0r:   r6   gcmr	   r5   rI   r
   )r   r@   rA   cd0values       r   test_critical_density0zFLRWTest.test_critical_density0g  s     )5x@@@@@*/777 &%*BBBBB&+qsQT1W}<<<<"ehn7G&GA%MM&,888888r   c                 .   t          |j        t                    sJ |j        j        J |j        |j        u sJ t
          |j        j        dz  z  |j        j        z  }t          j
        |j        |          sJ |j        dk    r|j        dk    sJ dS dS )zTest property ``Ogamma0``.Nr   r   )r8   r   r   r   _Ogamma0r   ry   rI   r   r   rr   )r   r@   rA   expects       r   test_Ogamma0zFLRWTest.test_Ogamma0t  s     )+X66666 %--- }....5;,a//%2I2OO{5=&11111;!=A%%%% %%r   c                    t          |j        t                    sJ |j        j        J |j        |j        u sJ |j        rE|j        |j        |                    d          z  k    sJ |                    d          dk    sJ dS |j        dk    r|j        dk    sJ dS |j        d|j	        z  |j        z  k    sJ t          j        |                    d          d|j	        z            sJ dS )zTest property ``Onu0``.Nr   r1   gC?)r8   r   r   r   _Onu0r   r   r   ry   r   r   rr   rX   s      r   	test_Onu0zFLRWTest.test_Onu0  s%    ).(33333~"*** zU[((((  	:1J1J11M1M!MMMMM ,,Q//1444444[A:?????? :!<u}!LLLLL;))!,,mek.I      r   c                 j    |j         |j        |j        z   |j        z   |j        z   |j        z   k    sJ dS )z*Test :attr:`astropy.cosmology.FLRW.Otot0`.N)r   rT   r   r   ra   r   rj   s     r   
test_Otot0zFLRWTest.test_Otot0  sN     Ky5=(5:5
BUYNO O O O O Or   Tinclude_private
include_z2scipy is not installedr$   z, excmethodc                     t          j        |          5   t          ||          |           ddd           dS # 1 swxY w Y   dS z,Test all the redshift methods for bad input.Nr)   r*   getattrr   rA   r  r   excs        r   test_redshift_method_bad_inputz'FLRWTest.test_redshift_method_bad_input      
 ]3 	& 	&"GE6""1%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&   <A A r   c                     |                     |          }t          j        |          t          j        |          k    sJ t          j        |          j        t          j        k    sJ dS )zTest :meth:`astropy.cosmology.FLRW.w`.

        Since ``w`` is abstract, each test class needs to define further tests.
        N)r   r   shaper6   r?   r:   rU   )r   rA   r   r   s       r   test_wzFLRWTest.test_w  sX     GGAJJx{{bhqkk))))z!}}!QU******r   c                 0   t          j        |                    |          |                    |          |                    |          z   |                    |          z   |                    |          z   |                    |          z             sJ dS ))Test :meth:`astropy.cosmology.FLRW.Otot`.N)r   rr   OtotOmr   r   rs   Ok)r   rA   r   s      r   	test_OtotzFLRWTest.test_Otot  s     {JJqMMHHQKK%,,q//)EIIaLL8599Q<<G%((ST++U
 
 	
 	
 	
 	
 	
r   c                 6   d}t          j        g d          }t          j        |                    |          d|                    |          z            sJ t          j        |                    |          d|                    |          z            sJ dS )zTest that ``efunc`` and ``inv_efunc`` give inverse values.

        Note that the test doesn't need scipy because it doesn't need to call
        ``de_density_scale``.
              ?)r%  r          @g      @r   N)r   arrayrr   efunc	inv_efunc)r   rA   z0r   s       r   test_efunc_vs_invefunczFLRWTest.test_efunc_vs_invefunc  s     H)))**{5;;r??C%//"2E2E,EFFFFF{5;;q>>31C1C+CDDDDDDDr   c                 (   t                                          |           |j                                        }|                    dd           |                    dd            |j        di |}|j        |j        k    sJ ||k    sJ |                    d          }|j        |j        k    sJ |j        |j        dz   k    sJ |j        j	        dk    sJ t          |j                  dhz
  D ]b}t          ||          }||t          ||          u sJ )t          j        |t          ||          dt          |d	d
          z            sJ ct          j        |j        |j                  rJ t          j        |j        |j                  rJ |                    dddt#          d                    }|j        |j        k    sJ |j        dk    sJ |j        j	        dk    sJ |j        j	        dk    sJ |j        i |j        t#          d          k    sJ t          |j                  ddhz
  D ]b}t          ||          }||t          ||          u sJ )t          j        |t          ||          dt          |d	d
          z            sJ ct          j        |j        |j                  rJ t          j        |j        |j                  rJ t          j        |j        j	        |j        j	                  rJ dS )7Test method ``.clone()`` changing a(many) Parameter(s).r   Nr   rE   )r5    (modified)r5   -C6?r:   r1   )atolznew namegffffff@tops)zz)r   r5   ry   r   ry   r,   )r   test_clone_change_param_init_argumentsr   r   cloner   r   r5   rI   set__parameters__r  r6   rr   r   r   r   ry   r   )r   rA   rG   r   nvr   s         r   r3  z FLRWTest.test_clone_change_param  s[   ''... &++--

64   

64   EK!!&!!{eo----Ezzzz KK3K{eo----vm33333tzS    U)**dV3 	 	A1AyGE1-------zwua((tga6K6K/K       :ai77777:afej11111 KKZCsKQQ{eo----v####tzS    w}####v:EJ:$&///:::::U)**dG_< 	 	A1AyGE1-------zwua((tga6K6K/K       :ai77777:afej11111:agmU[->???????r   c                 @   t                                          |           t          |t                    r4|                    t
                    sJ t          j        |          sJ dS |                    t
                    rJ t          j        |          rJ dS )2Test :meth:`astropy.cosmology.FLRW.is_equivalent`.N)r   test_is_equivalentr8   r   is_equivalentr   r   rA   r   s     r   r<  zFLRWTest.test_is_equivalent  s    ""5))) e]++ 	5&&x00000)%0000000**844444-e4444444r   r!  rs   r   de_density_scalec                    t          ||          }t          j        ddd          }|                    dd          }|                    ddd          } ||          }|j        |j        k    sJ  ||          }|j        |j        k    sJ  ||          }	|	j        |j        k    sJ t          j        ||                                          sJ t          j        ||	                                          sJ dS )z,Test distance methods broadcast z correctly.r   r1      r4   rp   N)r  r   linspacereshaper  r6   rr   flatten)
r   rA   r  r   r   z2dz3d
value_flatvalue_2dvalue_3ds
             r   test_distance_broadcastz FLRWTest.test_distance_broadcast  s    E6""KQ""ii1ooii1a  QqTT
17****1S66~****1S66~****z*h&6&6&8&899999z*h&6&6&8&89999999r   scipy required for this test.c                     t          j        g d          } ||i |}t          j        |                    |          |d          sJ dS )zTest :meth:`astropy.cosmology.LambdaCDM.comoving_distance`.

        These do not come from external codes -- they are just internal checks to make
        sure nothing changes if we muck with the distance calculators.
        )r   r&  r   g      @r/  r   N)r   r'  r6   rr   comoving_distance)r   r@   rF   rG   expectedr   rA   s          r   test_comoving_distance_examplez'FLRWTest.test_comoving_distance_example0  s_     H)))**	4*6**z%11!44hTJJJJJJJJr   )*r   r    r!   r   abcabstractmethodr   r)   fixturer   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r   r   _FLRW_redshift_methodsmarkskipifr   parametrizer   r  r   r  r#  r+  r3  r<  rK  rP  r"   r#   s   @r   r   r     s        J
 
 
 
 
 V^'"""' ' #"'% % % % %E E E(B B B

 

 

R R R	S 	S 	S
< 
< 
<< < <F F FH H H9 9 9& & &  4
 
 
 21du   [I.FGG[Xz22[X'=>>& & ?> 32 HG&
 [S(+++ +  ,++ [S(++
 
 ,+
E E E .@ .@ .@ .@ .@`5 5 5 5 5" [X'MNN: : ON:$ [I.MNN	K 	K ON	K 	K 	K 	K 	Kr   r   c                   h    e Zd ZdZdZ fdZ fdZd Zd Zd Z	 e
edd	          d
hz
  Zej                            e d          ej                            de          ej                            de          d                                     Zej                            e d          ej                            dd           fd                        Zej                            e d          ej                            ddddddfg           fd                        Z xZS )TestFLRWz%Test :class:`astropy.cosmology.FLRW`.Tc                     t                                          |            t          t          d<   t          | _        dS )z_
        Setup for testing.
        FLRW is abstract, so tests are done on a subclass.
        r   N)r   r   r   r   clsr   s    r   r   zTestFLRW.setup_classB  s5    
 	D!!! )09%r   c                 t    t                                          |            t          j        dd            d S )Nr   )r   teardown_classr   r   r   s    r   r]  zTestFLRW.teardown_classN  s4    t$$$y$/////r   c                     t          j        t          d          5  |                    d           ddd           dS # 1 swxY w Y   dS )z/Test abstract :meth:`astropy.cosmology.FLRW.w`.znot implementedr'   r1   N)r)   r*   NotImplementedErrorr   rj   s     r   r  zTestFLRW.test_wX  s    ].6GHHH 	 	GGAJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   ?AAc                     t           rt          nt          }t          j        |          5  |                    d          sJ 	 ddd           dS # 1 swxY w Y   dS )r  r1   N)r   r_  r+   r)   r*   r   r   rA   	exceptions      r   r#  zTestFLRW.test_Otot]  s    +4M'':M	]9%% 	! 	!::a==    	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s   AAAc                 6   t           rt          nt          }t          j        |          5  |                    d           ddd           n# 1 swxY w Y   t          j        |          5  |                    d           ddd           dS # 1 swxY w Y   dS )z}
        Test that efunc and inv_efunc give inverse values.
        Here they just fail b/c no ``w(z)`` or no scipy.
        r%  N)r   r_  r+   r)   r*   r(  r)  ra  s      r   r+  zTestFLRW.test_efunc_vs_invefuncc  s   
 ,5M'':M	]9%% 	 	KK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ]9%% 	! 	!OOC   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s#   AAA+BBBFr  r   r  r$   r  r  c                     t          j        |          5   t          ||          |           ddd           dS # 1 swxY w Y   dS r  r  r  s        r   r  z'TestFLRW.test_redshift_method_bad_inputt  r  r  rL  r?  c                     t          j        t                    5  t                                          ||           d d d            d S # 1 swxY w Y   d S r   )r)   r*   r_  r   rK  )r   rA   r  r   s      r   rK  z TestFLRW.test_distance_broadcast  s     ].// 	; 	;GG++E6:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s   #AAA)rF   rG   rO  )rD   r   r   r   r   )ry   r   Nc                     t          j        t                    5  t                                          ||||           d d d            d S # 1 swxY w Y   d S r   )r)   r*   r_  r   rP  )r   r@   rF   rG   rO  r   s        r   rP  z'TestFLRW.test_comoving_distance_example  s     ].// 	V 	VGG229dFHUUU	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	Vs   %AAA)r   r    r!   r9   r   r   r]  r  r#  r+  r   r   rT  r)   rU  rV  r   rW  r   r  rK  rP  r"   r#   s   @r   rY  rY  =  s       //J
 
 
 
 
0 0 0 0 0  
! ! !! ! ! 21du  	 [I.FGG[Xz22[X'=>>& & ?> 32 HG& [I.MNN[X'MNN; ; ; ; ON ON; [I.MNN[&
c$77	>? V V V V	  ON
V V V V Vr   rY  c                   .     e Zd ZdZ fdZd Zd Z xZS )ParameterFlatOde0TestMixina{  Tests for `astropy.cosmology.Parameter` Ode0 on a flat Cosmology.

    This will augment or override some tests in ``ParameterOde0TestMixin``.

    Ode0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c                     t                                          |           |j        j        dt          j        fv sJ dS )r`   TN)r   rb   ra   derivedr   True_r   s     r   rb   z.ParameterFlatOde0TestMixin.test_Parameter_Ode0  s>    ##I...~%$)9999999r   c                 p    |j         |j        u sJ |j         d|j        |j        z   |j        z   z
  k    sJ dS )z"Test no-longer-Parameter ``Ode0``.r   N)ra   ri   rT   r   r   rj   s     r   rk   z$ParameterFlatOde0TestMixin.test_Ode0  sE    zU[((((zSEI$=
$JKKKKKKKr   c                     ||j         i |j        }|j        d|j        |j        z   |j        z   |j        z   z
  k    sJ t          j        t          d          5   ||j         i |j        ddi ddd           dS # 1 swxY w Y   dS )rm   r   ra   r'   r1   N)
rF   rG   ra   rT   r   r   r   r)   r*   rf   rM   s       r   rt   z)ParameterFlatOde0TestMixin.test_init_Ode0  s    	270bi00zSEI$=
$JUY$VWWWWW ]9F333 	5 	5Irw4")44!4444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5s   A??BB)r   r    r!   r9   rb   rk   rt   r"   r#   s   @r   rh  rh    sc         : : : : :
L L L
5 5 5 5 5 5 5r   rh  c                       e Zd ZdZ fdZ fdZ fdZ fdZ fdZe	j
                            de           fd            Ze	j
                            e d	
          e	j
                            de          e	j
                            dej        dhz
             fd                                    Z fdZ fdZd Z xZS )FlatFLRWMixinTestzTests for :class:`astropy.cosmology.FlatFLRWMixin` subclasses.

    E.g to use this class::

        class TestFlatSomeFLRW(FlatFLRWMixinTest, TestSomeFLRW):
            ...
    c                 ~    t                                          |            | j                            d           dS )zSetup for testing.

        Set up as for regular FLRW test class, but remove dark energy component
        since flat cosmologies are forbidden Ode0 as an argument,
        see ``test_init_subclass``.
        ra   N)r   r   r>   r   r   s    r   r   zFlatFLRWMixinTest.setup_class  s9     	D!!!6"""""r   c                    t                                          |           t          j        t          d          5   G d d|          }t          j        |j        d           ddd           dS # 1 swxY w Y   dS )z@Test initializing subclass, mostly that can't have Ode0 in init.zsubclasses ofr'   c                       e Zd Zd ZdS )=FlatFLRWMixinTest.test_init_subclass.<locals>.HASOde0SubClassc                     d S r   r,   )r   ra   s     r   __init__zFFlatFLRWMixinTest.test_init_subclass.<locals>.HASOde0SubClass.__init__  s    Dr   N)r   r    r!   ru  r,   r   r   HASOde0SubClassrs    s#            r   rv  N)r   test_init_subclassr)   r*   rf   r   r   r!   )r   r@   rv  r   s      r   rw  z$FlatFLRWMixinTest.test_init_subclass  s    ""9---]9O<<< 	G 	G    )    "?#?FFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gs   )A44A8;A8c                     t                                          |            || j        i | j        }|j        dk    sJ |j        d|j        |j        z   |j        z   |j        z   z
  k    sJ d S )Nrn   r   )	r   r   cls_argsr|   r   ri   rV   r  r  r   r@   rA   r   s      r   r   zFlatFLRWMixinTest.test_init  s    )$$$	4=<DO<<zS    {cJ'%+5
B
 
 
 
 
 
 
r   c                 f    t                                          ||           |j        dk    sJ dS )r   rn   N)r   r   r   rz  s      r   r   zFlatFLRWMixinTest.test_Ok0  s8    E*** yCr   c                 d    t                                          |           |j        dk    sJ dS )z>Test :attr:`astropy.cosmology.FLRW.Otot0`. Should always be 1.r   N)r   r  r   r>  s     r   r  zFlatFLRWMixinTest.test_Otot0  s6    5!!! {c!!!!!!r   r   c                     t                                          ||           t          j        |                    |          d          sJ dS )z=Test :meth:`astropy.cosmology.FLRW.Otot`. Should always be 1.r   N)r   r#  r6   rr   r   )r   rA   r   r   s      r   r#  zFlatFLRWMixinTest.test_Otot  sI     	%### z%**Q---------r   r  r$   r  r  r   c                 P    t                                          ||||           dS r  )r   r  )r   rA   r  r   r  r   s        r   r  z0FlatFLRWMixinTest.test_redshift_method_bad_input  s)    
 	..ufaEEEEEr   c                    t                                          |           t          j        t                    5  |                    d           ddd           n# 1 swxY w Y   |                    d|j                  }t          ||j                  sJ ||j	        k    sJ |                    dd          }|j        dk    sJ |j
        |j
        dz   k    sJ dS )r-  r1   )ra   NT)
to_nonflatra   r   r.  )r   "test_clone_to_nonflat_change_paramr)   r*   rf   r5  ra   r8   __nonflatclass__nonflatr   )r   rA   ncr   s      r   r  z4FlatFLRWMixinTest.test_clone_to_nonflat_change_param   s   225999 ]9%% 	  	 KKQK	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  [[Duz[::"e455555U]""""[[Dq[11w#~~~~w%*}4444444s   AA#&A#c                    t                                          |           |                    |          rJ |                    |          rJ |j        } || j        ddi| j        }|                    |          rJ |                    |          rJ  || j        dd|j        z
  |j        z
  |j        z
  i| j        }d|_	        |                    |          sJ |                    |          sJ dS )r;  ra   g?r   rn   N)
r   r<  r=  r  ry  r|   rT   r   r   r   )r   rA   r   nonflat_cosmo_clsr  flatr   s         r   r<  z$FlatFLRWMixinTest.test_is_equivalent  s4   ""5))) &&|44444--e44444 "2 $#T]PPPP((/////&&w///// ! ]
uy5=05:=
 o
 

 	!!%(((((""4(((((((r   c                 d    t                               | ||           dt          |          vsJ dS )z
        Test method ``.__repr__()``. Skip non-flat superclass test.
        e.g. `TestFlatLambdaCDDM` -> `FlatFLRWMixinTest`
        vs   `TestFlatLambdaCDDM` -> `TestLambdaCDDM` -> `FlatFLRWMixinTest`
        ra   N)r   	test_reprreprrX   s      r   r  zFlatFLRWMixinTest.test_repr.  s;     	4E222 T%[[((((((r   )r   r    r!   r9   r   rw  r   r   r  r)   rU  rW  r   r#  rV  r   r   r   rT  r  r  r<  r  r"   r#   s   @r   ro  ro    s        # # # # # 
G 
G 
G 
G 
G
 
 
 
 
         " " " " " [S(++. . . . ,+. [I.FGG[Xz22[Xx'F&'QRRF F F F SR 32 HGF5 5 5 5 5&) ) ) ) )6	) 	) 	) 	) 	) 	) 	)r   ro  )3r9   rQ  r   numpyr   r)   astropy.constants	constantsr   astropy.unitsunitsr6   astropy.cosmologyr   r   r   r   astropy.cosmology.corer   astropy.cosmology.flrw.baser   r	   r
   r   astropy.cosmology.parameterr   astropy.cosmology.tests.helperr   !astropy.cosmology.tests.test_corer   r   r   r   r   "astropy.utils.compat.optional_depsr   r   rU  rV  r-   r/   rQ   r^   rv   r   r   r   r   rY  rh  ro  r,   r   r   <module>r     s   2 1 


       ! ! ! ! ! !       F F F F F F F F F F F F 5 5 5 5 5 5 X X X X X X X X X X X X 1 1 1 1 1 1 ? ? ? ? ? ?              9 8 8 8 8 8    d    I&:;;  <;*- *- *- *- *-- *- *- *-Z(- (- (- (- (-. (- (- (-V0- 0- 0- 0- 0-/ 0- 0- 0-f(- (- (- (- (-0 (- (- (-V'- '- '- '- '-/ '- '- '-Ti( i( i( i( i(/ i( i( i(XFK FK FK FK FK. FK FK FKRkK kK kK kK kKkK kK kK\OV OV OV OV OVx OV OV OVj5 5 5 5 5!7 5 5 5<G) G) G) G) G).0J G) G) G) G) G)r   