U
    ½mœdüU  ã                   @   sp  d dl Z d dlZd dlZd dl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mZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!e j" #deeef¡dd„ ƒZ$e j" %d¡e j" #deeef¡dd„ ƒƒZ&e j" #deeeef¡dd „ ƒZ'd!d"„ Z(e j" #deeeef¡e j" #d#e(ƒ ¡d$d%„ ƒƒZ)e j" #d&eeeef¡d'd(„ ƒZ*e j" #d)d*d+g¡e j" #d,e+d-ƒ¡d.d/„ ƒƒZ,d0d1„ Z-d2d3„ Z.d4d5„ Z/d6d7„ Z0e j" #d8eeeg¡d9d:„ ƒZ1e j" %d;¡e j" #d<d=d>g¡e j" #d8eeeg¡d?d@„ ƒƒƒZ2e j" #dAeeeeg¡dBdC„ ƒZ3e j" #dAeeeeg¡dDdE„ ƒZ4dS )Fé    N)Úassert_array_almost_equalÚassert_array_equalÚassert_allclose)Úload_linnerud)Ú_center_scale_xyÚ(_get_first_singular_vectors_power_methodÚ_get_first_singular_vectors_svdÚ_svd_flip_1d)ÚCCA)ÚPLSSVDÚPLSRegressionÚPLSCanonical)Úmake_regression)Úcheck_random_state)Úsvd_flip)ÚConvergenceWarningc                 C   s(   t  | j| ¡}t|t  t  |¡¡ƒ d S )N)ÚnpÚdotÚTr   Zdiag)ÚMÚK© r   úc/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/cross_decomposition/tests/test_pls.pyÚassert_matrix_orthogonal   s    r   c                  C   s(  t ƒ } | j}| j}t|jd d�}| ||¡ t|jƒ t|jƒ t|j	ƒ t|j
ƒ |j	}|j}|j
}|j}t| ¡ | ¡ dd�\}}	}
}}}t|t ||j¡ƒ t|	t ||j¡ƒ | |¡}t||j	ƒ | ||¡\}}t||j	ƒ t||j
ƒ | |¡}t||ƒ | ||¡\}}t||ƒ d S )Né   ©Ún_componentsT©Úscale)r   ÚdataÚtargetr   ÚshapeÚfitr   Ú
x_weights_Ú
y_weights_Ú	_x_scoresÚ	_y_scoresÚx_loadings_Úy_loadings_r   Úcopyr   r   r   r   Ú	transformZinverse_transform)ÚdÚXÚYÚplsr   ÚPÚUÚQZXcZYcZx_meanÚy_meanZx_stdZy_stdZXtZYtZX_backÚ_ZY_backr   r   r   Útest_pls_canonical_basics   s:    



  ÿ


r4   c                  C   s~  t ƒ } | j}| j}t|jd d�}| ||¡\}}t||jƒ t 	dddgdddgd	d
dgg¡}t 	dddgdddgdddgg¡}t 	dddgdddgdddgg¡}t 	dddgdddgdddgg¡}	t
t |j¡t |¡ƒ t
t |j¡t |¡ƒ t
t |j¡t |	¡ƒ t
t |j¡t |¡ƒ t |j| ¡}
t |j| ¡}t |j| ¡}t |j|	 ¡}t
|
|ƒ t
||ƒ d S )Nr   r   ç,œæ6 ã¿gbxôØù+r¿gºÂõNFé?ç¦;¦0çç¿gÌ&Ÿ¢—Ô¿gfé–_žâ¿çÛÓ@¹ŽmÐ¿g¤<-bLî?g�È£†üÔÈ¿gìHý¨«ã¿gîÿ©ÙtÏ¿gE`Õ å¿g¶tÜ[WmÂ¿gþ¦¨áø�à¿gLŠM3öð?gêŸÅÔ?g+Eú‰!Ó?gñ4Óœ@Ê?gËs¯YO)Û?g¢`{ Ôã?gA¬'ˆôºÈ?gþ«;Ô¾ÒÀ¿gàÒñÝÐ¿gÿý¸áÅ¿)r   r   r    r   r!   Úfit_transformr   Z	x_scores_r   Úarrayr   Úabsr'   r#   r(   r$   Úsign)r+   r,   r-   r.   ÚX_transr3   Úexpected_x_weightsÚexpected_x_loadingsÚexpected_y_weightsÚexpected_y_loadingsÚx_loadings_sign_flipÚx_weights_sign_flipÚy_weights_sign_flipÚy_loadings_sign_flipr   r   r   Ú test_sanity_check_pls_regressionB   sP    ýÿýÿýÿýÿ
rE   c            
      C   sd  t ƒ } | j}| j}d|d d …df< t|jd d�}| ||¡ t dddgddd	gd
ddgg¡}t dddgddd	gdddgg¡}t dddgdddgdddgg¡}tt 	|¡t 	|j
¡ƒ tt 	|¡t 	|j¡ƒ tt 	|j¡t 	|¡ƒ tt 	|j¡t 	|¡ƒ t ||j ¡}t ||j
 ¡}t |dd … |jdd …  ¡}	t||ƒ t|dd … |	ƒ d S )Nr   r   r   gÍ�Oä¿gÀ(¡ñÍ}?g:Fëè?gìíàq›úç¿gqdvúgÄÑ¿g|�¯Nß<ã¿g¨1Æ, Ë¿gç¾7®È½î?g\ªÒ×øÆ¿gCgãÒBä¿g<&.ÁÌ¿g¯ÊBå¿gè5_/E¹¿g—žúQgà¿gç¯ër¥9ð?ç        g‰µø ãÛ?gXZ¡£°¦â?gh†C%dÖË?gV±�”îSÁ¿gù{sÉ‚ÓÏ¿gâ$(ÙE,Ç¿)r   r   r    r   r!   r"   r   r9   r   r:   r#   r'   r(   r$   r;   r   )
r+   r,   r-   r.   r=   r>   r@   rA   rB   rD   r   r   r   Ú2test_sanity_check_pls_regression_constant_column_Y�   sB    ýÿýÿýÿ 
rG   c                  C   s–  t ƒ } | j}| j}t|jd d�}| ||¡ t dddgdddgd	d
dgg¡}t dddgdddgd	ddgg¡}t dddgdddgdddgg¡}t dddgdddgddd gg¡}tt 	|j
¡t 	|¡ƒ tt 	|j¡t 	|¡ƒ tt 	|j¡t 	|¡ƒ tt 	|j¡t 	|¡ƒ t |j
| ¡}t |j| ¡}	t |j| ¡}
t |j| ¡}t||	ƒ t|
|ƒ t|jƒ t|jƒ t|jƒ t|jƒ d S )!Nr   r   r5   gû{cçñdÐ?g£rÙ	«èç¿r6   g§š“öŠ¾?g¿>côîä?r7   gP,"P²î¿gÍº‘@¾¿gù«•CjžÚ?g#õžÊiïã¿g2�Ð©Ô?g‚úrÂè?g·o ê_Žì¿gè¼ç<:àÎ¿g©¨càâ?gD}ÜÈ†?é?gÞ5âüÅ?gâ¼ÍUÒ®è?g‹ºÞOð¡ã¿gÓ©eJo¨Å?g.a#ÿ‚“Î¿gbMá4º ¿gýÎþYVï?gÍ±¼«ðæ?gå¹[åK Ó?gÆ=m¿B§æ¿go·‡1§SÉ?gPŸ.œµ%l¿gq¶–Ñ!î?)r   r   r    r   r!   r"   r   r9   r   r:   Úx_rotations_r#   Zy_rotations_r$   r;   r   r%   r&   )r+   r,   r-   r.   r=   Zexpected_x_rotationsr?   Zexpected_y_rotationsZx_rotations_sign_fliprB   Zy_rotations_sign_fliprC   r   r   r   Útest_sanity_check_pls_canonical³   sV    ýÿýÿýÿýÿ




rI   c                  C   sV  d} d}d}t dƒ}|j| d�}|j| d�}t ||||g¡j}||jd|  d� | df¡ }||jd|  d� | df¡ }tj||j||  d� | |¡fdd�}tj||j||  d� | |¡fdd�}td	d
�}	|	 ||¡ t dddgdddgdddgdddgdddgdddgdddgd d!d"gd#d$d%gd&d'd(gd)d*d+gd,d-d.gd/d0d1gd2d3d4gg¡}
t d5d6d7gd8d9d:gd;d<d=gd>d?d@gdAdBdCgdDdEdFgdGdHdIgdJdKdLgdMdNdOgdPdQdRgdSdTdUgdVdWdXgdYdZd[gd\d]d^gg¡}t d_d`dagdbdcddgdedfdggdhdidjgdkdldmgdndodpgdqdrdsgdtdudvgdwdxdygg	¡}t dzd{d|gd}d~dgd€d�d‚gdƒd„d…gd†d‡dˆgd‰dŠd‹gdŒd�dŽgd�d�d‘gd’d“d”gg	¡}t	t 
|	j¡t 
|¡ƒ t	t 
|	j¡t 
|
¡ƒ t	t 
|	j¡t 
|¡ƒ t	t 
|	j¡t 
|¡ƒ t |	j| ¡}t |	j|
 ¡}t |	j| ¡}t |	j| ¡}t	||ƒ t	||ƒ t|	jƒ t|	jƒ t|	jƒ t|	jƒ d S )•Néô  é
   é   é   )Úsizeé   r   ©Úaxisé   r   gqAS¤å?g¸Ì§–Æ’È?g°š¾	KÝË?gô²ÜˆÝmæ?gr[ÏÎqÁ?gÖŽ  £®Ã¿gÕ¸qjëPÁ?gÛø—Í±öå¿g«‡Sƒ¼Á?g$—$è’Å?gŽ('¹G_å¿gš.›k^ö¿¿g²á~ú®Œ ¿gƒèÿºs¥¿g¶·¬
Ú?gæ‚éjáh½?gÃÏfr½¯¸¿g>u¬Rz¦Ä?gþ$Â¯&‰¨?g	¦	l˜¿gpO/üÅ?g•}Wÿ[±¿g~¶�­‘¿g®ülÃ¬ÀÇ¿gWˆX>Þe¿gj8ŸH@Z¿gË”½Br¾?g´).ùe�¿gw4Dº³¿gˆoP^Ä?gvãzgöqƒ¿g1õGZž¿gë }r5.Ö?gÒzÏ³J¢¿g¥¬•¿1¸?g®¹£ÿåÚÕ?gŸíMãI˜¬?g,)˜­ÌÆ”¿gŠùâ [uâ¿gÚùeÍi­?gòâŠ¬±[Ž¿gQ¿É>áOÆ¿gmÆ«¤üå?g¬Eú£^¦Ç?g0Öõç‹Ã?gB +ø
žå?g,¦©Ð�Ã?gé°i­�·¿gÆiˆ*ü™È?gŒ_í(®å¿gbå#k4¶?g¯*Vh{OË?g×�oÖ}så¿gø+Klž¶¿gˆ‰Ý©F ¿gJ,c")±¿g°#'váÅÛ?g,aŽš†Ä?g9�qb›Á¿gÐSLRWÊ?g]î@[Ö¡?gÑçO~£¿gõÄkE¹?gògpB¾¯¿gã¡R™ ò�?g¹§«;È¿g-ôûÝ¿¢p?g§;O<gx¿g†¥GtKÅ?g$†U\¨n¿gE	Œ³ñ­¿g§²ÅÁçÈ?g@~_ñÏV?g¥,…8½(…¿g.¡í^¢Ô?g)^D_j«¿g2Ðéi¸?gs›6CmÔ?g³.f2¹¤¤?gð­£Ã”¿gRÝu™Ûä¿gð9Mòeš¯?g½ðX¦ã°¿g <ïÛ¿¿gÄONz 'å?gsÑVFŸæÇ?gul-a§7Í?gžÍú0æ?g]”4¢Ç?go¢Ð‘à¶Î¿g:“ô8%ƒÂ?g!¨¿Hå¿g—”Ôl’ÝÅ?g�¯£»5zÌ?g·yã¤0/æ¿gof‘y&,¹¿g˜ì
C²?gÍ¢ÔÌA}?g_ª%_³å?g±žÞµá³?gHÖ†/¸‹…¿g»‚L¶ª:Ü¿gc½IºÈ‚¿g¢$Eà!¦?gâfD«‹Â¹?gº§Ï«�“¿g35èÏ§¯?g`"Ä•sÒ?gþ¿$tý‘?g¶W“e�¨?gY)¶ÝŸÔ?gâ#bJ$ñå?gtd˜nÅ?gx/RƒÄÑ¸?g�
Jn æ?g�×·ÁÊ?gÿÊ�SÏ½¿g½= �°û½?g–N¹üfÆå¿g7ÇjN¹¾?g]wˆ¹ƒÜÆ?g¡á(Ô.Áå¿g^i×Œ%ª¿g}ç�P
°?g¹O3IÑoœ¿gD”'÷Øéç?gh³E-(g·?g§0„Ö¢‰p?g†µçè§nà¿g×Ðz¶–¿gþIñT4Œ¿g‡7Æ©1|¸?gOñ�)åÖ ¿gkp2ÜF$·?gAÌ-ÆcÔ?gÿ &áßó¥?gÜèk¯hçª?g!L¼ÉÐÑ?)r   Únormalr   r9   r   ÚreshapeZconcatenater   r"   r   r:   r'   r#   r(   r$   r;   r   r%   r&   )ÚnZp_noiseZq_noiseÚrngÚl1Úl2Zlatentsr,   r-   r.   r=   r>   r?   r@   rA   rB   rC   rD   r   r   r   Ú&test_sanity_check_pls_canonical_randomñ   sª    &&
òÿòÿ÷ÿ÷ÿ




rY   c               	   C   sJ   t ƒ } | j}| j}t|jd dd�}t t¡� | ||¡ W 5 Q R X d S )Nr   é   ©r   Zmax_iter)	r   r   r    r   r!   ÚpytestÚwarnsr   r"   )r+   r,   r-   Z
pls_nipalsr   r   r   Útest_convergence_failY  s    r^   ÚEstc                    sR   t ƒ }|j}|j}d‰ | ˆ d�}| ||¡ t‡ fdd„|j|jfD ƒƒsNt‚d S )NrZ   r   c                 3   s   | ]}|j d  ˆ kV  qdS )r   N)r!   )Ú.0Úattrr   r   r   Ú	<genexpr>l  s    z(test_attibutes_shapes.<locals>.<genexpr>)r   r   r    r"   Úallr#   r$   ÚAssertionError)r_   r+   r,   r-   r.   r   r   r   Útest_attibutes_shapesc  s    

ÿre   z>ignore:The attribute `coef_` will be transposed in version 1.3c                 C   sr   t ƒ }|j}|j}| dd�}| ||d d …df ¡j}| ||d d …d d…f ¡j}|j|jksdt‚t||ƒ d S )Nr   r   r   )r   r   r    r"   Úcoef_r!   rd   r   )r_   r+   r,   r-   ÚestZone_d_coeffZtwo_d_coeffr   r   r   Útest_univariate_equivalencer  s    
rh   c              	   C   s6  t ƒ }|j}|j}| ¡ }| dd� ||¡}t||ƒ t t¡�" | dd� ||¡ t	||ƒ W 5 Q R X | t
krtd S | ¡ }t t¡�" |j||dd�f t	||ƒ W 5 Q R X | ¡ }t t¡�  |j|dd�f t	||ƒ W 5 Q R X t	|j||dd�|j| ¡ | ¡ dd�ƒ t	|j|dd�|j| ¡ dd�ƒ d S )NT©r)   F)r   r   r    r)   r"   r   r\   Úraisesrd   r   r   r*   Úpredict)r_   r+   r,   r-   ZX_origr.   r   r   r   Ú	test_copy„  s6    
 ÿ ÿrl   c            	      c   s$  t j d¡} d}d}d}|  ||¡}|  ||¡}t  ||¡d|  ||¡  d }|d9 }||fV  tdd�\}}d	|d
d
…df< ||fV  t  ddd	gd	ddgdddgdddgg¡}t  ddgddgddgddgg¡}||fV  ddg}|D ]2}t j |¡} |  dd¡}|  dd¡}||fV  qìd
S )z-Generate dataset for test_scale_and_stabilityr   iè  rL   rK   rZ   r   T©Ú
return_X_yg      ð?NéÿÿÿÿrF   g       @g      @g      @g      @çš™™™™™¹?gš™™™™™É¿gÍÌÌÌÌÌì?gš™™™™™ñ?gÍÌÌÌÌÌ@gš™™™™™@gÍÌÌÌÌÌ'@gš™™™™™(@i  iå  rO   rR   )r   ÚrandomÚRandomStateÚrandnr   r   r9   )	rV   Ú	n_samplesÚ	n_targetsÚ
n_featuresr1   r-   r,   ZseedsÚseedr   r   r   Ú+_generate_test_scale_and_stability_datasets«  s*     

*"
rx   zX, Yc           
      C   s\   t ||ƒ^}}}| dd� ||¡\}}| dd� ||¡\}}	t||dd� t|	|dd� dS )zƒscale=True is equivalent to scale=False on centered/scaled data
    This allows to check numerical stability over platforms as wellTr   Fg-Cëâ6?)ZatolN)r   r8   r   )
r_   r,   r-   ZX_sZY_sr3   ZX_scoreZY_scoreZ	X_s_scoreZ	Y_s_scorer   r   r   Útest_scale_and_stabilityË  s
    ry   Ú	Estimatorc              	   C   s\   t j d¡}| dd¡}| dd¡}| dd�}d}tjt|d�� | ||¡ W 5 Q R X dS )	zICheck the validation of `n_components` upper bounds for `PLS` regressors.r   rK   rL   rR   r   zH`n_components` upper bound is .*. Got 10 instead. Reduce `n_components`.©ÚmatchN)r   rq   rr   rs   r\   rj   Ú
ValueErrorr"   )rz   rV   r,   r-   rg   Úerr_msgr   r   r   Útest_n_components_upper_boundsÚ  s    
r   zn_samples, n_features)éd   rK   )r€   éÈ   rw   rK   c                 C   sn   t | |d|d�\}}t||dd�\}}}t||ƒ\}}	t||ƒ t||	ƒ d}
t|||
d� t||	|
d� d S )NrL   ©ru   Úrandom_stateT)Znorm_y_weightsrp   ©Úrtol)r   r   r   r	   r   )rt   rv   rw   r,   r-   Úu1Zv1r3   Úu2Zv2r…   r   r   r   Útest_singular_value_helpersæ  s    

rˆ   c                  C   s|   t ddddd�\} }tdd� | |¡ | ¡}tdd� | |¡ | ¡}tdd� | |¡ | ¡}t||dd	� t||dd	� d S )
Nr€   rK   rL   r   r‚   r   r   g{®Gáz„?r„   )r   r   r"   r*   r   r   r   )r,   r-   ZsvdÚregÚ	canonicalr   r   r   Útest_one_component_equivalenceö  s    r‹   c                  C   sˆ   t  dddg¡} t  dddg¡}t|  dd¡| dd¡ƒ\}}t| |ƒ t| | ¡ ƒ t| dddgƒ t|| ¡ ƒ t|dddgƒ d S )	Nr   éüÿÿÿrZ   rR   ro   rO   éþÿÿÿéýÿÿÿ)r   r9   r   rT   r	   r   Zravel)ÚuÚvZ
u_expectedZ
v_expectedr   r   r   Útest_svd_flip_1d  s    
r‘   c               	   C   sj   t ddddd�\} }tddd�}t ¡ � t dt¡ | | |¡ W 5 Q R X t t 	|j
¡dk ¡sft‚d	S )
z8Test that CCA converges. Non-regression test for #19549.r�   é   )rt   rv   ru   rƒ   rK   rJ   r[   Úerrorr   N)r   r
   ÚwarningsÚcatch_warningsÚsimplefilterr   r"   r   rc   r:   r'   rd   )r,   ÚyZccar   r   r   Útest_loadings_converges  s    
r˜   c               	   C   sb   t j d¡} |  dd¡}t  d¡}tƒ }d}tjt|d�� | 	||¡ W 5 Q R X t
|jdƒ dS )zAChecks warning when y is constant. Non-regression test for #19831é*   r€   rR   z#Y residual is constant at iterationr{   r   N)r   rq   rr   ZrandZzerosr   r\   r]   ÚUserWarningr"   r   rH   )rV   Úxr—   r.   Úmsgr   r   r   Útest_pls_constant_y   s    
r�   ÚPLSEstimatorc              	   C   s¬   t ƒ }|j}|j}| dd� ||¡}d}tjt|d��& |jj|jd |jd fksXt	‚W 5 Q R X t
 ¡ � t
 dt¡ |j W 5 Q R X |jj|jd |jd fks¨t	‚dS )z†Check the shape of `coef_` attribute.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/12410
    Tri   z7The attribute `coef_` will be transposed in version 1.3r{   r   r“   N)r   r   r    r"   r\   r]   ÚFutureWarningrf   r!   rd   r”   r•   r–   Z_coef_)rž   r+   r,   r-   r.   Zwarning_msgr   r   r   Útest_pls_coef_shape/  s    *
r    z/ignore:The attribute `coef_` will be transposedr   TFc           	      C   sŒ   t ƒ }|j}|j}| d|d� ||¡}|j|dd�}|jdd�}||jdd� }|rf||jddd� }t|j|ƒ t|||j	 |j ƒ dS )	z/Check the behaviour of the prediction function.T)r)   r   ri   r   rP   r   )rQ   ZddofN)
r   r   r    r"   rk   ZmeanZstdr   Z
intercept_rf   )	rž   r   r+   r,   r-   r.   ZY_predr2   r<   r   r   r   Útest_pls_predictionL  s    r¡   ÚKlassc                    sd   t dd�\}}| ƒ  ||¡}| ¡ }| j ¡ ‰ tj‡ fdd„t|jj	d ƒD ƒt
d�}t||ƒ dS )z9Check `get_feature_names_out` cross_decomposition module.Trm   c                    s   g | ]}ˆ › |› �‘qS r   r   )r`   Úi©Zclass_name_lowerr   r   Ú
<listcomp>k  s     z.test_pls_feature_names_out.<locals>.<listcomp>r   )ZdtypeN)r   r"   Úget_feature_names_outÚ__name__Úlowerr   r9   Úranger#   r!   Úobjectr   )r¢   r,   r-   rg   Z	names_outZexpected_names_outr   r¤   r   Útest_pls_feature_names_outa  s    
þr«   c                 C   st   t  d¡}tddd�\}}| ƒ jdd� ||¡}| ||¡\}}t|tjƒsPt	‚t||j
ƒs`t	‚t|j| ¡ ƒ dS )z1Check `set_output` in cross_decomposition module.ZpandasT)rn   Zas_frame)r*   N)r\   Zimportorskipr   Z
set_outputr"   r*   Ú
isinstancer   Zndarrayrd   Z	DataFramer   Úcolumnsr¦   )r¢   Úpdr,   r-   rg   r<   Zy_transr   r   r   Útest_pls_set_outputq  s    
r¯   )5r\   r”   Únumpyr   Znumpy.testingr   r   r   Zsklearn.datasetsr   Z sklearn.cross_decomposition._plsr   r   r   r	   Zsklearn.cross_decompositionr
   r   r   r   r   Zsklearn.utilsr   Zsklearn.utils.extmathr   Zsklearn.exceptionsr   r   r4   rE   rG   rI   rY   r^   ÚmarkZparametrizere   Úfilterwarningsrh   rl   rx   ry   r   r©   rˆ   r‹   r‘   r˜   r�   r    r¡   r«   r¯   r   r   r   r   Ú<module>   sd   (?2>h

ÿ
& 



