o
    tBhiW                  	   @   s  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fe j"#d&d e*d'fd(e*d)fd*e+d+fgd,d- Z,e j"#d&d e*d'fd.e*d/fd*e+d+fgd0d1 Z-e j"#d2d3d4ge j"#d5e.d6d7d8 Z/d9d: Z0d;d< Z1d=d> Z2d?d@ Z3e j"#dAeeegdBdC Z4e j"%dDe j"#dEdFdGge j"#dAeeegdHdI Z5e j"#dJeeeegdKdL Z6dS )M    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   diag)MK r   /var/www/html/riverr-enterprise-integrations-main/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   






r?   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ϿrA   )gE` gt[Wm¿rC   )ggLM3?rE   )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-   r.   r/   r0   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_regressionB   sP   
rT   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<&.̿rU   )gBg5_/ErV   )gQggr9?rW   )        rX   rX   )g ?gXZ?ghC%d?)gVSg{sɂϿg$(E,ǿ)r   r    r!   r   r"   r#   r   rH   r   rI   r$   r(   r)   r%   rJ   r   )
r-   r.   r/   r0   rL   rM   rO   rP   rQ   rS   r   r   r   2test_sanity_check_pls_regression_constant_column_Y   sB    
rY   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   )r@   g{cd?gr	)rB   g?g>c?)rD   gP,"Pgͺ@)r@   gCj?g#i)rB   g2Щ?gr?)rD   go _g<:ο)c?gD}Ȇ??g5?)UҮ?gOgөeJo?).a#οgbM4gYV?)rZ   gͱ?g[K?)r[   g=mBgo1S?)r\   gP.%lgq!?)r   r    r!   r   r"   r#   r   rH   r   rI   x_rotations_r$   y_rotations_r%   rJ   r   r&   r'   )r-   r.   r/   r0   rL   expected_x_rotationsrN   expected_y_rotationsx_rotations_sign_fliprQ   y_rotations_sign_fliprR   r   r   r   test_sanity_check_pls_canonical   sV   




rc   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   rH   r   reshapeconcatenater   r#   r   rI   r(   r$   r)   r%   rJ   r   r&   r'   )np_noiseq_noiserngl1l2latentsr.   r/   r0   rL   rM   rN   rO   rP   rQ   rR   rS   r   r   r   &test_sanity_check_pls_canonical_random   s   &&





rw   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-   r.   r/   
pls_nipalsr   r   r   test_convergence_failY  s   "r~   Estc                    sR   t  }|j}|j}d |  d}||| t fdd|j|jfD s'J d S )Nrx   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%   )r   r-   r.   r/   r0   r   r   r   test_attibutes_shapesc  s   

r   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s2J t|| d S )Nr   r   r   )r   r    r!   r#   coef_r"   r   )r   r-   r.   r/   estone_d_coefftwo_d_coeffr   r   r   test_univariate_equivalencer  s   
r   c                 C   sr  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f t	|| W d    n1 sfw   Y  | }tt |j|ddf 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-   r.   r/   X_origr0   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  rf   re   rx   r   T
return_X_y      ?N)rX   rX   r   )r   rX   rX   )       @r   r   )g      @g      @g      @皙?gɿg?g?g@g@g'@g(@i  i  ri   rl   )r   randomRandomStaterandnr   r   rH   )	rs   	n_samples	n_targets
n_featuresr3   r/   r.   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   rF   r   )
r   r.   r/   X_sY_sr=   X_scoreY_score	X_s_score	Y_s_scorer   r   r   test_scale_and_stability  s
   r   zn_components, err_type, err_msgz n_components == 0, must be >= 1.ri   z n_components == 4, must be <= 3.r   z'n_components must be an instance of intc                 C   sn   t jd}|dd}|dd}| |d}tj||d ||| W d   dS 1 s0w   Y  dS )z<Check the validation of `n_components` for `PLS` regressors.r   re   rf   rl   r   matchN)r   r   r   r   r{   r   r#   )r   r   err_typeerr_msgrs   r.   r/   r   r   r   r   test_n_components_bounds  s   
"r      z n_components == 6, must be <= 5.c                 C   sn   t jd}|dd}|dd}t| d}tj||d ||| W d   dS 1 s0w   Y  dS )z;Check the validation of `n_components` for `PLSRegression`.r   re   rf   rl   r   r   N)r   r   r   r   r   r{   r   r#   )r   r   r   rs   r.   r/   r   r   r   r   'test_n_components_bounds_pls_regression  s   
"r   zn_samples, n_features)d   re   )r      r   re   c                 C   sn   t | |d|d\}}t||dd\}}}t||\}}	t|| t||	 d}
t|||
d t||	|
d d S )Nrf   r   random_stateT)norm_y_weightsr   rtol)r   r   r   r	   r   )r   r   r   r.   r/   u1v1r=   u2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   re   rf   r   r   r   r   g{Gz?r   )r   r   r#   r+   r   r   r   )r.   r/   svdreg	canonicalr   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   rx   )r   rx   rl   r   r   )r   ri   )r   r   )r   rH   r   rn   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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   re   rd   ry   errorNr   )r   r
   warningscatch_warningssimplefilterr   r#   r   r   rI   r(   )r.   yccar   r   r   test_loadings_converges2  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   rl   z#Y residual is constant at iterationr   Nr   )r   r   r   randzerosr   r{   r|   UserWarningr#   r   r]   )rs   xr   r0   msgr   r   r   test_pls_constant_yA  s   
r   PLSEstimatorc                 C   s   t  }|j}|j}| dd||}d}tjt|d |jj|jd |jd fks,J W d   n1 s6w   Y  t	
  t	dt |j W d   n1 sSw   Y  |jj|jd |jd fkshJ dS )zCheck the shape of `coef_` attribute.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/12410
    Tr   z7The attribute `coef_` will be transposed in version 1.3r   r   Nr   )r   r    r!   r#   r{   r|   FutureWarningr   r"   r   r   r   _coef_)r   r-   r.   r/   r0   warning_msgr   r   r   test_pls_coef_shapeP  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 }|r3||jddd }t|j| t|||j	 |j  dS )	z/Check the behaviour of the prediction function.T)r*   r   r   r   rj   r   )rk   ddofN)
r   r    r!   r#   r   meanstdr   
intercept_r   )	r   r   r-   r.   r/   r0   Y_predr7   rK   r   r   r   test_pls_predictionm  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>  s    z.test_pls_feature_names_out.<locals>.<listcomp>r   )dtypeN)r   r#   get_feature_names_out__name__lowerr   rH   ranger$   r"   objectr   )r   r.   r/   r   	names_outexpected_names_outr   r   r   test_pls_feature_names_out  s   
r   )7r{   r   numpyr   numpy.testingr   r   r   sklearn.datasetsr    sklearn.cross_decomposition._plsr   r   r   r	   sklearn.cross_decompositionr
   r   r   r   r   sklearn.utilsr   sklearn.utils.extmathr   sklearn.exceptionsr   r   r?   rT   rY   rc   rw   r~   markparametrizer   filterwarningsr   r   r   r   
ValueError	TypeErrorr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s    (?2>h


& 




