U
    Ãmœd=f  ã                   @   sà  d Z ddlZddlZddlmZ ddlZddlm	Z	 ddl
Z
ddlmZ ddlmZmZmZmZmZmZ ddlmZmZmZmZ ddlmZmZmZ dd	lmZmZ dd
l m!Z! ddl"m#Z# ddl$m%Z% ddl"m&Z& e 'dd„ ¡Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-dd„ Z.dd„ Z/dd„ Z0d d!„ Z1d"d#„ Z2d$d%„ Z3dMd'd(„Z4d)d*„ Z5d+d,„ Z6d-d.„ Z7d/d0„ Z8d1d2„ Z9d3d4„ Z:d5d6„ Z;d7d8„ Z<d9d:„ Z=d;d<„ Z>d=d>„ Z?d?d@„ Z@dAdB„ ZAdCdD„ ZBdEdF„ ZCdGdH„ ZDe
jEjFdIdJ„ ƒZGdKdL„ ZHdS )Nz@
unit test for GAM

Author: Luca Puggini

Created on 08/07/2015
é    N)Úassert_allclose)Ú
block_diag)Úmatrix_sqrt)ÚUnivariatePolynomialSmootherÚPolynomialSmootherÚBSplinesÚGenericSmoothersÚUnivariateCubicSplinesÚCyclicCubicSplines)ÚGLMGamÚLogitGamÚmake_augmented_matrixÚpenalized_wls)ÚMultivariateGAMCVÚMultivariateGAMCVPathÚ_split_train_test_smoothers)ÚUnivariateGamPenaltyÚMultivariateGamPenalty)ÚKFold)ÚGLM)ÚGaussian)Úlmc                 C   s   ddt  |  ¡  S )Nç      ð?)ÚnpÚexp)Úx© r   úW/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/statsmodels/gam/tests/test_gam.pyÚ<lambda>    ó    r   c                  C   sF   d} t  dd| ¡}d|d  | }|| ¡ 8 }dg}t||ƒ}||fS )a’  A polynomial of degree 4

    poly = ax^4 + bx^3 + cx^2 + dx + e
    second der = 12ax^2 + 6bx + 2c
    integral from -1 to 1 of second der^2 is
        (288 a^2)/5 + 32 a c + 8 (3 b^2 + c^2)
    the gradient of the integral is der
        [576*a/5 + 32 * c, 48*b, 32*a + 16*c, 0, 0]

    Returns
    -------
    poly : smoother instance
    y : ndarray
        generated function values, demeaned
    é'  éÿÿÿÿé   é   é   é   )r   ÚlinspaceÚmeanr   )Únr   ÚyÚdegreeÚpolr   r   r   Úpolynomial_sample_data#   s    
r,   c                 C   sL   | \}}}}d|d  d d| |  dd|d  |d    }|d }|S )Ni   r#   é   é    é   r$   r   )ÚparamsÚdÚcÚbÚaÚitgr   r   r   Úintegral>   s    4r6   c                 C   sT   | \}}}}t  d| d d|  d| d| d|  dg¡}|d d d… }|d S )	Ni@  r-   r.   é0   é   r   r!   r#   ©r   Úarray)r0   r1   r2   r3   r4   Úgrdr   r   r   ÚgradE   s    2r<   c              	   C   s:   t  ddddgddddgddddgddddgg¡}|d S )NgÍÌÌÌÌÌ\@r   r.   r7   r8   r#   r9   )r0   Úhessr   r   r   ÚhessianL   s    


ýr>   c           	      C   sF   t  |j| ¡}tƒ }|j |¡}| ||¡}t| ƒ}|||  ||fS ©N)r   ÚdotÚbasisr   ÚlinkZinverseÚlogliker6   )	r0   r+   r)   ÚalphaZlin_predZgaussianZexpvalrC   r5   r   r   r   Úcost_functionU   s    rE   c            	      C   sf   t ƒ \} }| jd }d}t||d�}tdƒD ]4}tj ddd¡}| |¡}t|ƒ}t	||dd	� q,d
S )z>
    test the func method of the gam penalty
    :return:
    r   r"   ©rD   Zunivariate_smootheré
   éþÿÿÿr#   r%   çš™™™™™¹?©ÚatolN)
r,   Ú	smoothersr   Úranger   ÚrandomÚrandintÚfuncr6   r   )	r+   r)   Úuniv_polrD   ÚgpÚ_r0   Zgp_scorer5   r   r   r   Útest_gam_penaltyc   s    


rT   c            	      C   s†   t j d¡ tƒ \} }d}| jd }t||d�}tdƒD ]H}t j ddd¡}t  ddddg¡}| 	|¡}t
|ƒ}t||ddd	� q8d S )
Nr"   r   rF   rG   rH   r#   r%   ç{®Gáz„?©ÚrtolrK   )r   rN   Úseedr,   rL   r   rM   Úuniformr:   Úderivr<   r   )	r+   r)   rD   ÚsmootherrR   rS   r0   Zgam_gradr;   r   r   r   Útest_gam_gradientt   s    


r\   c            	      C   sˆ   t j d¡ tƒ \} }| jd }d}t||d�}tdƒD ]J}t j ddd¡}| |¡}t	|ƒ}t  
|¡}t  |¡}t||dd	d
� q8d S )Nr"   r   rF   rG   rH   r#   r-   ç‚vIhÂ%<=çü©ñÒMbP?©rK   rW   )r   rN   rX   r,   rL   r   rM   rO   Úderiv2r>   ZflipudZfliplrr   )	r+   r)   rQ   rD   rR   rS   r0   Zgam_der2r=   r   r   r   Útest_gam_hessian†   s    




ra   c            
      C   sŽ   t j d¡ tƒ \} }d}tdƒD ]f}t j ddd¡}t|| ||ƒ\}}}t|| |d�}|j|ddd�}	t	|| |dd� t	|	|d	d� q"d S )
Nr"   rG   r!   r%   ©r[   rD   )ÚscaleZ
pen_weightç»½×Ùß|Û=©rW   rI   )
r   rN   rX   r,   rM   rY   rE   r   rC   r   )
Úpolyr)   rD   rS   r0   ÚcostÚerrr5   Úglm_gamZgam_logliker   r   r   Útest_approximation—   s    
rj   c                  C   sÆ   t j t j t¡¡} t j | dd¡}t |¡}|jj	}|j
j	}dg}dg}t|||dd�}t |j¡}d}	t|||	d�}
|
jd	d
ddd�}t |j|j¡}t |j¡}t||dd� t||dd� d S )NÚresultsúprediction_from_mgcv.csvrG   r$   T©r*   ÚdfZinclude_interceptrI   rb   Úbfgsr   r"   r    ©ÚmethodÚmax_start_irlsÚdispÚmaxiterrd   re   rU   rJ   )ÚosÚpathÚdirnameÚabspathÚ__file__ÚjoinÚpdÚread_csvr   Úvaluesr)   r   r   ZasarrayÚy_estr   Úfitr@   rA   r0   Úfittedvaluesr   )Úcur_dirÚ	file_pathÚdata_from_rr   r)   rn   r*   ÚbsplinesÚy_mgcvrD   ri   Úres_glm_gamZy_gam0Úy_gamr   r   r   Útest_gam_glm¥   s&    
 ÿrˆ   c                  C   s²   t j t j t¡¡} t j | dd¡}t |¡}|jj	}|j
j	}dg}dg}t|||dd�}|j}d}	t|||	d�}
|
jd	d
�}t |j|j¡}t|ƒ}t|ƒ}t||ddd� d S )Nrk   rl   rG   r-   Trm   gñhãˆµøô>©rD   r    )rt   rd   rI   rV   )ru   rv   rw   rx   ry   rz   r{   r|   r   r}   Zybinr   Zybin_estr   r   r   r@   rA   r0   Úsigmoidr   )r�   r‚   rƒ   r   r)   rn   r*   r„   r…   rD   Zlg_gamZ
res_lg_gamr‡   r   r   r   Útest_gam_discreteÆ   s     
	r‹   r"   c           
      C   s€   d}t  dd|¡}t  dd|¡}t  ||g¡j}t j | ¡ || | | t j dd|¡ }d}d	}||g}t||ƒ}	|||	fS )
Néè  r!   r"   iöÿÿÿrG   r   rU   r%   r$   )r   r&   ÚvstackÚTrN   rX   Únormalr   )
rX   r(   Úx1Úx2r   r)   Zdegree1Zdegree2Údegreesr+   r   r   r   Úmultivariate_sample_dataê   s     
r“   c               	   C   s–  ddg} ddg}t j d¡ tƒ \}}}t|d d …df |jd d�}t|d d …df |jd d�}t| d |d�}t| d |d�}tjt	dd�� t
|| |d�}	W 5 Q R X td	ƒD ]Ü}
t j d
d|jd j¡}t j d
d|jd j¡}t  ||g¡}| |¡}| |¡}|	 |¡}t||| ddd� | |¡}| |¡}t  ||g¡}|	 |¡}t||ƒ | |¡}| |¡}t||ƒ}|	 |¡}t||ƒ q´d S )Nr"   r#   r   )r*   rF   zweights is currently ignored)Úmatch)Zmultivariate_smootherrD   ÚweightsrG   éýÿÿÿr$   rd   r_   )r   rN   rX   r“   r   r’   r   ÚpytestZwarnsÚUserWarningr   rM   rO   rL   Z	dim_basisÚconcatenaterP   r   rZ   r`   r   )Úalphasr•   r   r)   r+   Z	univ_pol1Z	univ_pol2Zgp1Zgp2ZmgpÚiZparams1Zparams2r0   Úc1Úc2r2   Zd1Zd2Zd12r1   Zh1Zh2Zh12Úhr   r   r   Útest_multivariate_penaltyø   s<    ÿ










rŸ   c            
      C   sh   t ƒ \} }}ddg}ddg}t|j|jƒ}t|||d�}| ¡ }t|||d�}| ¡ }	t|j|	jƒ d S )Nçš™™™™™Ù?gffffffæ?r"   rb   )r“   r   r   rL   r   r   r   r0   )
r   r)   rf   rš   r•   ÚgsÚgam_gsÚ
gam_gs_resZgam_polyZgam_poly_resr   r   r   Útest_generic_smoother  s    r¤   c                  C   s¶   t j t j t¡¡} t j | dd¡}t |¡}|jj	}|j
}dg}dg}t|||d�}|j}dg}	t||	d�}
t|t t|ƒdf¡||	d	�}|jd
dddd�}|j}t||dd� d S )Nrk   rl   rG   r$   ©r*   rn   gZ%XÎüº?r‰   r"   ©Úexogr[   rD   Úpirlsr   r    rp   rU   rJ   )ru   rv   rw   rx   ry   rz   r{   r|   r   r}   r)   r   r~   r   r   r   ÚonesÚlenr   r€   r   )r�   r‚   rƒ   r   r)   rn   r*   r„   r…   rD   rR   ri   r†   r‡   r   r   r   Útest_multivariate_gam_1d_data,  s(    
ÿ ÿr«   c               	   C   s¢   dd„ } t j t j t¡¡}t j |dd¡}t |¡}|jj	}|j
j	}dg}dg}t|||d�}dg}	d	g}	td
ƒ}
t||	d�}t||	t| |d |
d�}| ¡ }d S )Nc                 S   s   t j | | ¡t| ƒ S r?   ©r   ZlinalgZnormrª   )r�   r‘   r   r   r   rg   U  s    z&test_multivariate_gam_cv.<locals>.costrk   rl   rG   r-   r¥   gÝµ„|Ð³™?r#   r$   r‰   ©r[   rš   Úgamrg   Zendogr§   Zcv_iterator)ru   rv   rw   rx   ry   rz   r{   r|   r   r}   r)   r   r   r   r   r   r   )rg   r�   r‚   rƒ   r   r)   rn   r*   r„   rš   ÚcvrR   Úgam_cvÚ
gam_cv_resr   r   r   Útest_multivariate_gam_cvQ  s(    
   ÿr²   c               	   C   s.  dd„ } t j t j t¡¡}t j |dd¡}t |¡}|jj	}|j
j	}|j}|j}dg}dg}	t||	|dd�}
t}t d	d
d¡g}d}t|dd�}tj d¡ t|
||| |d |d�}| ¡ }t||
|jd�}|jdd	ddd�}| |
j¡}t|j|ddd� tj d¡ |j|dd�\}}t||jdd� d S )Nc                 S   s   t j | | ¡t| ƒ S r?   r¬   )Úy1Úy2r   r   r   Úsample_metricp  s    z4test_multivariate_gam_cv_path.<locals>.sample_metricrk   rl   rG   é   Trm   r   r#   r$   )Úk_foldsÚshuffleé{   r­   rb   Zirlsr"   r    rp   rI   r_   )rš   r·   gê-�™—q=re   )ru   rv   rw   rx   ry   rz   r{   r|   r   r}   r)   Úy_est_seZ
y_mgcv_gcvr   r   r   r&   r   rN   rX   r   r   Úalpha_cvÚpredictrA   r   Zselect_penweight_kfold)rµ   r�   r‚   rƒ   r   r)   Úse_from_mgcvr…   rn   r*   r„   r®   rš   Úkr¯   r°   r±   ri   r†   r~   r»   Zres_cvr   r   r   Útest_multivariate_gam_cv_patho  sB    
  þ ÿ
r¿   c            	      C   sô   d} t j| dfd�}tdƒ|d d …df< tddƒ|d d …df< t|ddgd�}ttdƒƒ}ttddƒƒ}t|j|||ƒ\}}d	d	d	d
ddgddddddgddddddgg}t|j|ƒ ddddddgddddddgdd d!d"d#d$gg}t|j|ƒ d S )%Nr¶   r#   ©Úshaper   é   r"   r$   )r’   ç        g      @g      B@g      k@r   g      @g     €H@g     pu@g       @g      @g       @g      P@g      €@g      @g      "@g      ;@g     @T@g     È†@g      0@g      $@g      Y@g     @�@g      @g      9@g     @_@g      &@g     @^@g     Ì”@)	r   ÚzerosrM   r   Úlistr   r   r   rA   )	r(   r   rf   Ztrain_indexZ
test_indexZtrain_smootherZtest_smootherZexpected_train_basisZexpected_test_basisr   r   r   Útest_train_test_smoothers¤  s*    þþþrÆ   c                  C   sV   d} t j d¡ t j dd| df¡}t  |j|¡}t|ƒ}t  |j|¡}t||ƒ d S )NrŒ   r"   r   r$   )r   rN   rX   r�   r@   rŽ   r   r   )r(   r   r‘   Zsqrt_x2Zx2_reconstructionr   r   r   Útest_get_sqrt»  s    rÇ   c                  C   sR  t j d¡ d} t j dd| df¡}t  |j|¡}t  tt| ƒƒ¡}t j dd| ¡}|j	\}}d}t
|||| |ƒ\}}	}
|}t|	|ƒ |}||d |…< t||ƒ |}t|
|ƒ d}t
||||ƒ\}}	}
t|| ƒ}tt  |j|¡|| ƒ t  ||g¡}t|	|ƒ t j|| fd�}||d |…< t||ƒ t j|dg| fdd�}t|
|ƒ d S )Nr"   éô  r!   r$   r   rÀ   )Zaxis)r   rN   rX   rY   r@   rŽ   r:   rÅ   rM   rÁ   r   r   r   r�   rÄ   r™   )r(   r   Úsr)   ÚwZnobsZ	n_columnsrD   Zaug_yZaug_xZaug_wZexpected_aug_xZexpected_aug_yZexpected_aug_wÚrsr   r   r   Útest_make_augmented_matrixÇ  s6    





rÌ   c                  C   sº   t j d¡ d} d}t j dd| df¡}|d d …df |d d …df  t j dd| ¡ }|| ¡ 8 }t j| fd�}t j dd||f¡}t||d| |ƒ}t ||¡ 	¡ }t
|j|jƒ d S )Nr"   é   r$   r   r#   rI   rÀ   )r   rN   rX   r�   r'   r©   r   r   ZOLSr   r   r0   )r(   Úpr   r)   r•   rÉ   Zpen_wls_resZls_resr   r   r   Útest_penalized_wlsë  s    0rÏ   c                  C   s>  t j t j t¡¡} t j | dd¡}t |¡}|ddg j}|d j}|dg j}|ddg j}d	d	g}t	||d
�}ddg}	t
|||	d�}
|
jdd�}t |jd d …|jd f |j|jd  ¡}|| ¡ 8 }t |jd d …|jd f |j|jd  ¡}|| ¡ 8 }t||d d …df dd� t||d d …df dd� d S )Nrk   z"cubic_cyclic_splines_from_mgcv.csvZx0r‘   r)   r~   zs(x0)zs(x2)rG   ©rn   gš™™™™™™?gü©ñÒMb0?rb   r¨   ©rq   r   r"   g{®Gáz”?rJ   g…ëQ¸Õ?)ru   rv   rw   rx   ry   rz   r{   r|   r}   r
   r   r   r   r@   rA   Úmaskr0   r'   r   )r�   r‚   rƒ   r   r)   Z
y_est_mgcvZs_mgcvÚdfsZccsrD   r®   Úgam_resÚs0Ús1r   r   r   Útest_cyclic_cubic_splinesü  s0    
ÿ

ÿÿr×   c                  C   s$  t j d¡ ddlm}  d}t  dd|¡}t  dd|¡d }t  ||g¡j}t  |¡| }|| }|| }|t j 	dd|¡ }|| 
¡ 8 }|| 
¡ 8 }d	d	g}	| |d
d
gdd�}
t|t  |df¡|
|	d�}|jdd�}|j}|| 
¡ 8 }ttd|d ƒƒ}|| }|| }|| }t||dd� d S )Nr   )ÚCubicSplinesrÈ   r–   r$   r"   r#   g333333Ã?r^   rG   Úcenter)rn   Úconstraintsr¦   r¨   rÑ   é2   g{®Gáz¤?rJ   )r   rN   rX   Ústatsmodels.gam.smooth_basisrØ   r&   r�   rŽ   Úsinr�   r'   r   r©   r   r€   rÅ   rM   r   )rØ   r(   r�   r‘   r   r³   r´   Úy0r)   rš   Úcsr®   rÔ   r~   Úindexr   r   r   Útest_multivariate_cubic_splines(  s.    rá   c                  C   sZ  t j d¡ d} t  dd| ¡}t j | ¡}t  ||g¡j}t  |¡| }|| }|| }|t j dd| ¡ }|| 	¡ 8 }|| 	¡ 8 }dgd }dgd }	t
|d	d	gddgd
d�}
t||
|d�}t||
|d�}|jddddd�}|j|jddddd�}| ¡ }t  |
j|j¡}|| 	¡ 8 }t  |
j|j¡}|| 	¡ 8 }t|j|jddd� t||dd� d S )Nr   rÈ   r–   r$   g333333Ó?g      @r#   g333333ó?rG   rÙ   )rn   r*   rÚ   rb   Únmr"   i N  rp   ro   )Zstart_paramsrq   rr   rs   rt   g-Cëâ6
?r_   rJ   )r   rN   rX   r&   Zrandr�   rŽ   rÝ   r�   r'   r   r   r   r0   r@   rA   r   )r(   r�   r‘   r   r³   r´   rÞ   r)   rš   Z
alphas_glmrß   Z	gam_pirlsZgam_glmZgam_res_glmZgam_res_pirlsZ	y_est_glmZy_est_pirlsr   r   r   Útest_glm_pirls_compatibilityQ  sF    

 ÿ  þÿrã   c            	      C   sX   t ƒ \} }}ddg}t|||d�}| ¡ }| ¡ }t||jƒ ¡ }| ¡ }t||ƒ d S )Nr   rb   )r“   r   r   r¼   r   rA   r   )	r   r)   rf   rš   r¢   r£   Z	y_est_gamÚglmr~   r   r   r   Útest_zero_penalty~  s    rå   c                  C   s²   ddddddgddddddgddddddgddddddgddddddgddddddgg} t j d	¡ t j dd	d
¡}t  ddddg¡}t|dd�}||_| ¡ }t| |dd� d S )Nr   rÃ   gÇº¸�ðV?g-Cëâ6*?g¿é
‹‘R¿gü©ñÒMbP¿gö®û6df?gÏZˆ‚N[?r"   rG   gš™™™™™É?r    g333333ã?gš™™™™™é?r%   rÐ   g»½×Ùß|û=rJ   )	r   rN   rX   r�   r:   r	   ZknotsZ
_splines_sr   )Zspl_s_Rr   Zxkrß   Zspl_sr   r   r   Ú
test_spl_s‹  s    ûræ   c                  C   s   t j d¡ d} t j dd| df¡}|| ¡  }|d d …df |d d …df  t j dd| ¡ }|| ¡ 8 }d}t|dgd dgd d	d
gd�}t|||d�}|jddddd�}t	||j
ƒ}t  |jd j
t  |jd j
¡f¡}|j|d
d�}	| d¡\}
}t|	|
dd� | ¡ dk �st‚d S )Nr   rŒ   r"   r#   rU   rÃ   r$   rG   TFrm   rb   r¨   éˆ  rp   )Z	transformgš™™™™™©?rJ   éd   )r   rN   rX   rY   r'   r�   r   r   r   r   rA   Zcolumn_stackrL   Z
zeros_liker¼   Úpartial_valuesr   ÚminÚAssertionError)r(   r   r)   rD   r„   ri   r†   rä   Úexr~   Zy_partial_estÚser   r   r   Útest_partial_values2ž  s.    0ÿ ÿÿrî   c                  C   sÔ   t j t j t¡¡} t j | dd¡}t |¡}|jj	}|j
j	}|j}dg}dg}t|||dd�}d}	t|||	d�}
|
jd	d
d�}|jd }| d¡\}}t||d ddd� t |j¡d }t||| ddd� d S )Nrk   rl   rG   r¶   Trm   g¾éMozÓ»?rb   r    ro   ©rt   rq   r   r~   gü©ñÒMb€?rV   g¬Zd;ï?)ru   rv   rw   rx   ry   rz   r{   r|   r   r}   r)   rº   r   r   r   rL   ré   r   r   Úsqrtrc   )r�   r‚   rƒ   r   r)   r½   rn   r*   r„   rD   ri   r†   Zuniv_bsplinesÚhat_yrí   Zbug_factr   r   r   Útest_partial_valuesÀ  s"    

rò   c                  C   sÚ   t j t j t¡¡} t j | dd¡}t |¡}|jj	}|j
j	}|j}dg}dg}t|||d�}d}	t|||	d�}
|
jdd	d
�}| d¡}|jd  ¡ d  ¡ \}}t |¡}| d¡\}}t||| ƒ t||| ƒ d S )Nrk   rl   rG   r¶   r¥   g¸…ëQ¸ž?rb   r    ro   rï   r   )ru   rv   rw   rx   ry   rz   r{   r|   r   r}   r)   rº   r   r   r   Zplot_partialZaxesZget_childrenÚget_datar   Zargsortré   r   )r�   r‚   rƒ   r   r)   r½   rn   r*   r„   rD   ri   r†   ZfigZxpZypZsort_idxrñ   rí   r   r   r   Útest_partial_plotß  s$    


rô   c            	      C   sB  t j d¡ d} t j dd| df¡}|| ¡  }|d d …df |d d …df  t j dd| ¡ }|| ¡ 8 }t|dgd dgd dd	�}ddg}t|||d
�}|jddddd�}t	||j
ƒ}| ¡ }t| ¡ | ¡ dd� d}t|||d
�}|jddddd�}t| ¡ | ¡ dd� |jddddd�}t| ¡ | ¡ ddd� d S )Nr   rŒ   r"   r#   rU   r$   rG   rÙ   )r*   rn   rÚ   rb   r¨   rç   rp   g{®Gázd?re   r]   rd   rJ   ro   g-Cëâ6?g:Œ0âŽyE>rV   )r   rN   rX   rY   r'   r�   r   r   r   r   rA   r   Z
cov_params)	r(   r   r)   r„   rD   ri   r†   rä   Zres_glmr   r   r   Útest_cov_params  sF    0 ÿÿ ÿÿ ÿ ÿrõ   )r"   )IÚ__doc__ru   Únumpyr   Znumpy.testingr   Zpandasr{   Zscipy.linalgr   r—   Zstatsmodels.tools.linalgr   rÜ   r   r   r   r   r	   r
   Z*statsmodels.gam.generalized_additive_modelr   r   r   r   Z9statsmodels.gam.gam_cross_validation.gam_cross_validationr   r   r   Zstatsmodels.gam.gam_penaltiesr   r   Z5statsmodels.gam.gam_cross_validation.cross_validatorsr   Z+statsmodels.genmod.generalized_linear_modelr   Z"statsmodels.genmod.families.familyr   r   Z	vectorizerŠ   r,   r6   r<   r>   rE   rT   r\   ra   rj   rˆ   r‹   r“   rŸ   r¤   r«   r²   r¿   rÆ   rÇ   rÌ   rÏ   r×   rá   rã   rå   ræ   rî   rò   ÚmarkZ
matplotlibrô   rõ   r   r   r   r   Ú<module>   s^    	!$
%%5$,)-"
&