o
    \i[                     @   sf  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-d(d) Z.ej&'d*d+d,gd-d. Z/d/d0 Z0d1d2 Z1d3d4 Z2d5d6 Z3ej&'d7eee	gd8d9 Z4ej&'d:d;d<gej&'d7eee	gd=d> Z5ej&'d?e	e
eegd@dA Z6ej&'d?e	e
eegdBdC Z7dDdE Z8dFdG Z9dS )H    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   diag)MK r   /var/www/www-root/data/www/176.119.141.140/sports-predictor/venv/lib/python3.10/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   	transforminverse_transform)dXyplsr   PUQXcycx_meany_meanx_stdy_stdXtytX_back_y_backr   r   r   test_pls_canonical_basics   s6   






rA   c                  C   sf  t  } | j}| j}t|jd d}|||\}}t||j t	g dg dg dg}t	g dg dg dg}t	g d	g d
g dg}t	g d	g d
g d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+rNF?);0g&Կf_)@mпg<-bL?ȣȿ)gHgtϿrC   )gE` gt[Wm¿rE   )ggLM3?rG   )g?g+E!?g4Ӝ@?)gsYO)?g`{?gA'?)g;Ծgпgſ)r   r"   r#   r   r$   fit_transformr   	x_scores_r   arrayr   absr*   r&   r+   r'   sign)r/   r0   r1   r2   X_transr?   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   
rV   c            
      C   sR  t  } | j}| j}d|d d df< t|jd d}||| tg dg dg dg}tg dg dg d	g}tg d
g dg d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(}?:F?)gqgqdvgѿ|N<)g1, ˿g7Ƚ?\ƿ)gCgBg<&.̿rW   )gBg5_/ErX   )gQggr9?rY   )        rZ   rZ   )g ?gXZ?ghC%d?)gVSg{sɂϿg$(E,ǿ)r   r"   r#   r   r$   r%   r   rJ   r   rK   r&   r*   r+   r'   rL   r   )
r/   r0   r1   r2   rN   rO   rQ   rR   rS   rU   r   r   r   2test_sanity_check_pls_regression_constant_column_y   sB    
r[   c                  C   s~  t  } | j}| j}t|jd d}||| tg dg dg dg}tg dg dg dg}tg d	g d
g dg}tg dg dg d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   )rB   g{cd?gr	)rD   g?g>c?)rF   gP,"Pgͺ@)rB   gCj?g#i)rD   g2Щ?gr?)rF   go _g<:ο)c?gD}Ȇ??g5?)UҮ?gOgөeJo?).a#οgbM4gYV?)r\   gͱ?g[K?)r]   g=mBgo1S?)r^   gP.%lgq!?)r   r"   r#   r   r$   r%   r   rJ   r   rK   x_rotations_r&   y_rotations_r'   rL   r   r(   r)   )r/   r0   r1   r2   rN   expected_x_rotationsrP   expected_y_rotationsx_rotations_sign_fliprS   y_rotations_sign_fliprT   r   r   r   test_sanity_check_pls_canonical   sV   




re   c                  C   s  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g dg dg dg dg dg dg dg dg dg dg dg dg dg dg}
tg dg dg dg dg dg dg dg d g d!g d"g d#g d$g d%g d&g}tg d'g d(g d)g d*g d+g d,g d-g d.g d/g	}tg d0g d1g d2g d3g d4g d5g d6g d7g d8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 )9N  
         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 [u)gei?g⊬[gQ>Oƿ)gmƫ?gE^?g0?)gB+
?g,?gi)gi*?g_(gb#k4?)g*Vh{O?g׍o}sg+Kl)gݩ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?gn)gzgIT4g7Ʃ1|?)gO)֠gkp2F$?gA-c?)g&?gkh?g!L?)r   normalr   rJ   r   reshapeconcatenater   r%   r   rK   r*   r&   r+   r'   rL   r   r(   r)   )np_noiseq_noiserngl1l2latentsr0   r1   r2   rN   rO   rP   rQ   rR   rS   rT   rU   r   r   r   &test_sanity_check_pls_canonical_random   s   &&





rz   c                  C   s`   t  } | j}| j}t|jd dd}tt ||| W d    d S 1 s)w   Y  d S )Nr      r   max_iter)	r   r"   r#   r   r$   pytestwarnsr   r%   )r/   r0   r1   
pls_nipalsr   r   r   test_convergence_failZ  s   "r   Estc                    sR   t  }|j}|j}d |  d}||| t fdd|j|jfD s'J 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'   )r   r/   r0   r1   r2   r   r   r   test_attibutes_shapesd  s   

r   c                 C   sr   t  }|j}|j}| dd}|||d d df j}|||d d d df j}|j|jks2J t|| d S )Nr   r   r   )r   r"   r#   r%   coef_r$   r   )r   r/   r0   r1   estone_d_coefftwo_d_coeffr   r   r   test_univariate_equivalencer  s   
r   c                 C   sn  t  }|j}|j}| }| dd||}t|| tt | dd|| t	|| W d    n1 s9w   Y  | t
u rDd S | }tt |j||dd t	|| W d    n1 sew   Y  | }tt |j|dd t	|| W d    n1 sw   Y  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~   raisesAssertionErrorr   r   r-   predict)r   r/   r0   r1   X_origr2   r   r   r   	test_copy  s8   
$r   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 g dg dg dg dg}t ddgddgddgddgg}||fV  ddg}|D ]}t j|} | dd}| dd}||fV  qsd
S )z-Generate dataset for test_scale_and_stabilityr   i  rh   rg   r{   r   T
return_X_y      ?N)rZ   rZ   r   )r   rZ   rZ   )       @r   r   )g      @g      @g      @g?gɿg?g?g@g@g'@g(@i  i  rl   ro   )r   randomRandomStaterandnr   r   rJ   )	rv   	n_samples	n_targets
n_featuresr5   r1   r0   seedsseedr   r   r   +_generate_test_scale_and_stability_datasets  s.    

""
r   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?atolN)r	   rH   r   )
r   r0   r1   X_sy_sr?   X_scorey_score	X_s_score	y_s_scorer   r   r   test_scale_and_stability  s
   r   	Estimatorc                 C   sr   t jd}|dd}|dd}| dd}d}tjt|d ||| W d   dS 1 s2w   Y  dS )	zICheck the validation of `n_components` upper bounds for `PLS` regressors.r   rg   rh   ro   r   zH`n_components` upper bound is .*. Got 10 instead. Reduce `n_components`.matchN)r   r   r   r   r~   r   
ValueErrorr%   )r   rv   r0   r1   r   err_msgr   r   r   test_n_components_upper_bounds  s   
"r   c                  C   sr   t jd} | dd}| dd}tdd}d}tjt|d ||| W d	   d	S 1 s2w   Y  d	S )
zFCheck the validation of `n_components` upper bounds for PLSRegression.r      @   ro      r   zH`n_components` upper bound is 20. Got 30 instead. Reduce `n_components`.r   N)	r   r   r   r   r   r~   r   r   r%   )rv   r0   r1   r   r   r   r   r   %test_n_components_upper_PLSRegression  s   
"r   zn_samples, n_features)d   rg   )r      c                 C   s~   t | |d|d\}}t||dd\}}}t||\}}	t|| t||	 d}
t||| |
 d t||	|	 |
 d d S )Nrh   r   random_stateT)norm_y_weightsMbP?r   )r   r
   r   r   r   max)r   r   global_random_seedr0   r1   u1v1r?   u2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   rg   rh   r   r   r   r   r   )r   r   r%   r-   r   r   r   r   )r   r0   r1   svdreg	canonicalr   r   r   r   test_one_component_equivalence   s   r   c                  C   s   t g d} t g d}t| dd|dd\}}t| | t| |  t| g d t||  t|g d d S )N)r   r{   )r   r{   ro   r   r   )r   rl   )r   r   )r   rJ   r   rq   r   r   ravel)uv
u_expected
v_expectedr   r   r   test_svd_flip_1d  s   
r   c                 C   s~   t ddd| d\}}tddd}t  tdt ||| W d   n1 s+w   Y  tt	|j
d	k s=J dS )
z8Test that CCA converges. Non-regression test for #19549.r   r   )r   r   r   r   rg   rf   r|   errorNr   )r   r   warningscatch_warningssimplefilterr   r%   r   r   rK   r*   )r   r0   r1   ccar   r   r   test_loadings_converges  s   

r   c                  C   sv   t jd} | dd}t d}t }d}tjt|d |	|| W d   n1 s.w   Y  t
|jd dS )zAChecks warning when y is constant. Non-regression test for #19831*   r   ro   z#y residual is constant at iterationr   Nr   )r   r   r   randzerosr   r~   r   UserWarningr%   r   r_   )rv   xr1   r2   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s'J dS )zCheck the shape of `coef_` attribute.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/12410
    Tr   r   N)r   r"   r#   r%   r$   r   )r   r/   r0   r1   r2   r   r   r   r   r   test_pls_coef_shape=  s   r   r!   TFc           	      C   sx   t  }|j}|j}| d|d||}|j|dd}|jdd}||jdd }t|j| t|||jj	 |j  dS )z/Check the behaviour of the prediction function.T)r,   r!   r   r   rm   N)
r   r"   r#   r%   r   meanr   
intercept_r   r   )	r   r!   r/   r0   r1   r2   y_predr9   rM   r   r   r   test_pls_predictionN  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.Tr   c                    s   g | ]}  | qS r   r   )r   iclass_name_lowerr   r   
<listcomp>j  s    z.test_pls_feature_names_out.<locals>.<listcomp>r   )dtypeN)r   r%   get_feature_names_out__name__lowerr   rJ   ranger&   r$   objectr   )r   r0   r1   r   	names_outexpected_names_outr   r   r   test_pls_feature_names_out`  s   
r   c                 C   st   t d}tddd\}}|  jdd||}|||\}}t|tjs(J t||j	s0J t
|j|  dS )z1Check `set_output` in cross_decomposition module.pandasT)r   as_frame)r-   N)r~   importorskipr   
set_outputr%   r-   
isinstancer   ndarray	DataFramer   columnsr   )r   pdr0   r1   r   rM   y_transr   r   r   test_pls_set_outputp  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 g d}| }t | |}|| }|j|jks6J t | |}td|fd|fg}|| || }|j|jksXJ t	|| dS )zrCheck that when fitting with 1d `y`, prediction should also be 1d.

    Non-regression test for Issue #26549.
    r   r{   rl   ro   	      rh         $   )r{   r      r   r   r   lrplsrN)
r   rJ   r,   r   r%   r   r$   r   r   r   )r0   r1   expectedr  r   r  vrr   r   r   test_pls_regression_fit_1d_y}  s   .
r  c                  C   sd   t jd} | jdd}| jddd}||j }tddd	||}t|j	| t|
|| d
S )zCheck that when using `scale=True`, the coefficients are using the std. dev. from
    both `X` and `y`.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/27964
    r   )ro   rh   rj   rg   )r   rh   )r!   rk   rh   T)r   r!   N)r   r   r   uniformrp   r   r   r%   r   r   r   )rv   coefr0   r1   r2   r   r   r    test_pls_regression_scaling_coef  s   
r  ):r   numpyr   r~   numpy.testingr   r   r   sklearn.cross_decompositionr   r   r   r    sklearn.cross_decomposition._plsr	   r
   r   r   sklearn.datasetsr   r   sklearn.ensembler   sklearn.exceptionsr   sklearn.linear_modelr   sklearn.utilsr   sklearn.utils.extmathr   r   rA   rV   r[   re   rz   r   markparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   <module>   sb    (?2>h



& 




