U
    3dU                     @   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   N/tmp/pip-unpacked-wheel-zrfo1fqw/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   ,6gbx+rgNF?;0g&Կgf_@mпg<-bL?gȣȿgHgtϿgE` gt[Wm¿ggLM3?g?g+E!?g4Ӝ@?gsYO)?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?gqgqdvgѿg|N<g1, ˿g7Ƚ?g\ƿgCgBg<&.̿gBg5_/EgQggr9?        g ?gXZ?ghC%d?gVSg{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{cd?gr	r6   g?g>c?r7   gP,"Pgͺ@gCj?g#ig2Щ?gr?go _g<:οgc?gD}Ȇ??g5?gUҮ?gOgөeJo?g.a#οgbM4gYV?gͱ?g[K?g=mBgo1S?gP.%lgq!?)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dddgdddgdddgdddgdddgdddgdddg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ոqjP?gͱgS?g$$?g('G_g.k^g~gsg
?gjh?gfrg>uRz?g$¯&?g		lgpO/?g}W[g~glìǿgWX>egj8H@Zg˔Br?g).egw4DgoP^?gvzgqg1GZg}r5.?gzϳJg1?g?gMI?g,)Ɣg [ugei?g⊬[gQ>Oƿgmƫ?gE^?g0?gB+
?g,?gigi*?g_(gb#k4?g*Vh{O?g׍o}sg+KlgݩFgJ,c")g#'v?g,a?g9qbgSLRW?g]@[?gO~gkE?ggpBgR ?g;ȿg-ݿp?g;O<gxgGtK?g$U\ngE	g?g@~_V?g,8(g.^?g)^D_jg2i?gs6Cm?g.f2?ggRug9Me?gX㰿g <ۿgONz '?gsVF?gul-a7?g0?g]4?goБοg:8%?g!Hgl?g5z?gy0/gofy&,g
C?g͢A}?g_%_?g޵?gHֆ/gL:ܿgcIȂg$E!?gfD¹?gϫg35ϧ?g`"ĕs?g$t?gWe?gY)ݟ?g#bJ$?gtdn?gx/RѸ?g
Jn?g׷?gʏSϽg= ?gNfg7jN?g]w?g(.g^i׌%g}P
?gO3IogD'?ghE-(g?g0֢p?gngzgIT4g7Ʃ1|?gO)֠gkp2F$?gA-c?g&?gkh?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  qd
S )z-Generate dataset for test_scale_and_stabilityr   i  rL   rK   rZ   r   T
return_X_yg      ?NrF   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 )zscale=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{Gz?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rand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st	dS )zCheck 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   Z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


& 



