U
    -eW                     @   sV  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	m
Z
mZmZ d dlmZ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 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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d+d, Z.d-d. Z/d/d0 Z0d1d2 Z1d3d4 Z2ej&'d5eee	gd6d7 Z3ej&'d8d9d:gej&'d5eee	gd;d< Z4ej&'d=e	e
eegd>d? Z5ej&'d=e	e
eegd@dA Z6dBdC Z7dS )D    N)assert_allcloseassert_array_almost_equalassert_array_equal)CCAPLSSVDPLSCanonicalPLSRegression)_center_scale_xy(_get_first_singular_vectors_power_method_get_first_singular_vectors_svd_svd_flip_1d)load_linnerudmake_regression)VotingRegressor)ConvergenceWarning)LinearRegression)check_random_state)svd_flipc                 C   s(   t | j| }t|t t | d S )N)npdotTr   Zdiag)MK r   k/var/www/html/Darija-Ai-Train/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:    



  


r6   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/   r0   X_transr5   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_regressionC   sP    
rG   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   r;   r   r<   r%   r)   r*   r&   r=   r   )
r-   r.   r/   r0   r?   r@   rB   rC   rD   rF   r   r   r   2test_sanity_check_pls_regression_constant_column_Y   sB     
rI   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   r7   g{cd?gr	r8   g?g>c?r9   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   r;   r   r<   x_rotations_r%   Zy_rotations_r&   r=   r   r'   r(   )r-   r.   r/   r0   r?   Zexpected_x_rotationsrA   Zexpected_y_rotationsZx_rotations_sign_fliprD   Zy_rotations_sign_fliprE   r   r   r   test_sanity_check_pls_canonical   sV    




rK   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   r;   r   reshapeZconcatenater   r$   r   r<   r)   r%   r*   r&   r=   r   r'   r(   )nZp_noiseZq_noiserngl1l2Zlatentsr.   r/   r0   r?   r@   rA   rB   rC   rD   rE   rF   r   r   r   &test_sanity_check_pls_canonical_random   s    &&





r[   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_failZ  s    r`   Estc                    sR   t  }|j}|j}d |  d}||| t fdd|j|jfD sNtd S )Nr\   r   c                 3   s   | ]}|j d   kV  qdS )r   N)r#   ).0attrr   r   r   	<genexpr>m  s    z(test_attibutes_shapes.<locals>.<genexpr>)r   r!   r"   r$   allr%   r&   AssertionError)ra   r-   r.   r/   r0   r   r   r   test_attibutes_shapesd  s    

rg   c                 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#   rf   r   )ra   r-   r.   r/   estZone_d_coeffZtwo_d_coeffr   r   r   test_univariate_equivalencer  s    
rj   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^   raisesrf   r   r   r,   predict)ra   r-   r.   r/   ZX_origr0   r   r   r   	test_copy  s6    
  rn   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  rN   rM   r\   r   T
return_X_yg      ?NrH   g       @g      @g      @g      @g?gɿg?g?g@g@g'@g(@i  i  rQ   rT   )r   randomRandomStaterandnr   r   r;   )	rX   	n_samples	n_targets
n_featuresr3   r/   r.   Zseedsseedr   r   r   +_generate_test_scale_and_stability_datasets  s*     

*"
ry   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	   r:   r   )
ra   r.   r/   ZX_sZY_sr5   ZX_scoreZY_scoreZ	X_s_scoreZ	Y_s_scorer   r   r   test_scale_and_stability  s
    r{   	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   rM   rN   rT   r   zH`n_components` upper bound is .*. Got 10 instead. Reduce `n_components`.matchN)r   rr   rs   rt   r^   rl   
ValueErrorr$   )r|   rX   r.   r/   ri   err_msgr   r   r   test_n_components_upper_bounds  s    
r   zn_samples, n_features)d   rM   )r      c                 C   s~   t | |d|d\}}t||dd\}}}t||\}}	t|| t||	 d}
t||| |
 d t||	|	 |
 d d S )NrN   rv   random_stateT)Znorm_y_weightsMbP?rz   )r   r
   r   r   r   max)ru   rw   global_random_seedr.   r/   u1Zv1r5   u2Zv2rtolr   r   r   test_singular_value_helpers  s       


r   c                 C   s   t ddd| d\}}tdd|||}tdd|||}tdd|||}d}t||| | d t||| | d d S )	Nr   rM   rN   r   r   r   r   rz   )r   r   r$   r,   r   r   r   r   )r   r.   r/   Zsvdreg	canonicalr   r   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   r\   rT   rq   rQ   )r   r;   r   rV   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\}}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      )ru   rw   rv   r   rM   rL   r]   errorr   N)r   r   warningscatch_warningssimplefilterr   r$   r   re   r<   r)   rf   )r   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   rT   z#Y residual is constant at iterationr}   r   N)r   rr   rs   ZrandZzerosr   r^   r_   UserWarningr$   r   rJ   )rX   xr   r0   msgr   r   r   test_pls_constant_y#  s    
r   PLSEstimatorc                 C   sR   t  }|j}|j}| dd||}|jd |jd  }}|jj||fksNtdS )zCheck the shape of `coef_` attribute.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/12410
    Trk   r   N)r   r!   r"   r$   r#   rh   rf   )r   r-   r.   r/   r0   rv   rw   r   r   r   test_pls_coef_shape2  s    r   r    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
 |j  dS )	z/Check the behaviour of the prediction function.T)r+   r    rk   r   rR   r   )rS   ZddofN)r   r!   r"   r$   rm   ZmeanZstdr   Z
intercept_rh   r   )	r   r    r-   r.   r/   r0   ZY_predr4   r>   r   r   r   test_pls_predictionC  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.Tro   c                    s   g | ]}  | qS r   r   )rb   iZclass_name_lowerr   r   
<listcomp>a  s     z.test_pls_feature_names_out.<locals>.<listcomp>r   )ZdtypeN)r   r$   get_feature_names_out__name__lowerr   r;   ranger%   r#   objectr   )r   r.   r/   ri   Z	names_outZexpected_names_outr   r   r   test_pls_feature_names_outW  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)rp   Zas_frame)r,   N)r^   Zimportorskipr   Z
set_outputr$   r,   
isinstancer   Zndarrayrf   Z	DataFramer   columnsr   )r   pdr.   r/   ri   r>   Zy_transr   r   r   test_pls_set_outputg  s    
r   c               	   C   s   t ddgddgddgddgddgd	d
gg} t dd	ddddg}| }t | |}|| }|j|jksttt | |}t	d|fd|fg}|| || }|j|jkstt
|| dS )zrCheck that when fitting with 1d `y`, prediction should also be 1d.

    Non-regression test for Issue #26549.
    r   r\   rQ   rT   	      rN         $      r      r   lrplsrN)r   r;   r+   r   r$   rm   r#   rf   r   r   r   )r.   r   expectedr   Zy_predr   Zvrr   r   r   test_pls_regression_fit_1d_yt  s    .
r   )8r   numpyr   r^   Znumpy.testingr   r   r   Zsklearn.cross_decompositionr   r   r   r   Z sklearn.cross_decomposition._plsr	   r
   r   r   Zsklearn.datasetsr   r   Zsklearn.ensembler   Zsklearn.exceptionsr   Zsklearn.linear_modelr   Zsklearn.utilsr   Zsklearn.utils.extmathr   r   r6   rG   rI   rK   r[   r`   markZparametrizerg   rj   rn   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s\   (?2>h



& 




