
    _ndU                     n   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 Zd Zd Zd Zd Zd Z d Z!e j"        #                    deeef          d             Z$e j"        %                    d          e j"        #                    deeef          d                         Z&e j"        #                    deeeef          d             Z'd Z(e j"        #                    deeeef          e j"        #                    d e(                      d                         Z)e j"        #                    deeeef          d             Z*e j"        #                    dddg          e j"        #                    d e+d                     d!                         Z,d" Z-d# Z.d$ Z/d% Z0e j"        #                    d&eeeg          d'             Z1e j"        %                    d(          e j"        #                    d)d*d+g          e j"        #                    d&eeeg          d,                                     Z2e j"        #                    d-eeeeg          d.             Z3e j"        #                    d-eeeeg          d/             Z4dS )0    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                     t          j        | j        |           }t          |t          j        t          j        |                               d S )N)npdotTr   diag)MKs     Jlib/python3.11/site-packages/sklearn/cross_decomposition/tests/test_pls.pyassert_matrix_orthogonalr      s;    
qsAAa!4!455555    c                     t                      } | j        }| j        }t          |j        d                   }|                    ||           t          |j                   t          |j                   t          |j	                   t          |j
                   |j	        }|j        }|j
        }|j        }t          |                                |                                d          \  }}	}
}}}t          |t!          j        ||j                             t          |	t!          j        ||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_backs                      r   test_pls_canonical_basicsrB      s   A	A	A
AGAJ
/
/
/CGGAqMMMS^,,,S^,,,S]+++S]+++ 	AAAA+;	!&&(($, , ,(BFFE5 b"&AC..111b"&AC..111 
q		Bb#-000]]1a  FBb#-000b#-000 ""2&&Ffa(((%%b"--IAvfa(((((r   c                     t                      } | j        }| j        }t          |j        d                   }|                    ||          \  }}t          ||j                   t          j	        g dg dg dg          }t          j	        g dg dg dg          }t          j	        g d	g d
g dg          }t          j	        g d	g d
g dg          }	t          t          j        |j                  t          j        |                     t          t          j        |j                  t          j        |                     t          t          j        |j                  t          j        |	                     t          t          j        |j                  t          j        |                     t          j        |j        |z            }
t          j        |j        |z            }t          j        |j        |z            }t          j        |j        |	z            }t          |
|           t          ||           d S )Nr   r   ),6gbx+rNF?);0g&Կf_)@mпg<-bL?ȣȿ)gHgtϿrE   )gE` gt[Wm¿rG   )ggLM3?rI   )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)r0   r1   r2   r3   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_flips                 r    test_sanity_check_pls_regressionrX   B   sV    	A	A	A
QWQZ
0
0
0C""1a((JGQ
 GS]+++222333222	
  (222333222	
  111111333	
  (111111333	
  bfS_55rv>Q7R7RSSSbfS^44bf=O6P6PQQQbfS_55rv>Q7R7RSSSbfS^44bf=O6P6PQQQ 73?5H#HII'#.3E"EFF'#.3E"EFF73?5H#HII24GHHH24GHHHHHr   c                  @   t                      } | j        }| j        }d|d d df<   t          |j        d                   }|                    ||           t          j        g dg dg dg          }t          j        g dg dg d	g          }t          j        g d
g dg dg          }t          t          j	        |          t          j	        |j
                             t          t          j	        |          t          j	        |j                             t          t          j	        |j                  t          j	        |                     t          t          j	        |j                  t          j	        |                     t          j        ||j        z            }t          j        ||j
        z            }t          j        |dd          |j        dd          z            }	t          ||           t          |dd          |	           d S )Nr   r   r   )g͝Og(}?:F?)gqgqdvgѿ|N<)g1, ˿g7Ƚ?\ƿ)gCgBg<&.̿rZ   )gBg5_/Er[   )gQggr9?r\   )        r]   r]   )g ?gXZ?ghC%d?)gVSg{sɂϿg$(E,ǿ)r   r#   r$   r   r%   r&   r   rL   r   rM   r'   r+   r,   r(   rN   r   )
r0   r1   r2   r3   rP   rQ   rS   rT   rU   rW   s
             r   2test_sanity_check_pls_regression_constant_column_Yr^      s    	A	A	AAaaadG
QWQZ
0
0
0CGGAqMMM000222111	
  (000111000	
  (------000	
  bf%788"&:P:PQQQbf%89926#/;R;RSSSbfS_55rv>Q7R7RSSSbfS^44bf=P6Q6QRRR7#6#HII'"4s~"EFF7#6qrr#:S_QRR=P#PQQ+-@AAA+ABB/1EFFFFFr   c                     t                      } | j        }| j        }t          |j        d                   }|                    ||           t          j        g dg dg dg          }t          j        g dg dg dg          }t          j        g d	g d
g dg          }t          j        g dg dg dg          }t          t          j	        |j
                  t          j	        |                     t          t          j	        |j                  t          j	        |                     t          t          j	        |j                  t          j	        |                     t          t          j	        |j                  t          j	        |                     t          j        |j
        |z            }t          j        |j        |z            }	t          j        |j        |z            }
t          j        |j        |z            }t          ||	           t          |
|           t          |j                   t          |j                   t          |j                   t          |j                   d S )Nr   r   )rD   g{cd?gr	)rF   g?g>c?)rH   gP,"Pgͺ@)rD   gCj?g#i)rF   g2Щ?gr?)rH   go _g<:ο)c?gD}Ȇ??g5?)UҮ?gOgөeJo?).a#οgbM4gYV?)r`   gͱ?g[K?)ra   g=mBgo1S?)rb   gP.%lgq!?)r   r#   r$   r   r%   r&   r   rL   r   rM   x_rotations_r'   y_rotations_r(   rN   r   r)   r*   )r0   r1   r2   r3   rP   expected_x_rotationsrR   expected_y_rotationsx_rotations_sign_fliprU   y_rotations_sign_fliprV   s               r   test_sanity_check_pls_canonicalri      s|    	A	A	A
AGAJ
/
/
/CGGAqMMM222111333	
  8222111333	
  ///222222	
  8000222222	
  bfS%566?S8T8TUUUbfS^44bf=O6P6PQQQbfS%566?S8T8TUUUbfS^44bf=O6P6PQQQGC$47K$KLL'#.3E"EFFGC$47K$KLL'#.3E"EFF35HIII35HIIIS^,,,S^,,,S]+++S]+++++r   c                     d} d}d}t          d          }|                    |           }|                    |           }t          j        ||||g          j        }||                    d| z                                | df          z   }||                    d| z                                | df          z   }t          j        ||                    || z                                | |          fd          }t          j        ||                    || z                                | |          fd          }t          d	
          }	|	                    ||           t          j        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          j        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          j        g d'g d(g d)g d*g d+g d,g d-g d.g d/g	          }t          j        g d0g d1g d2g d3g d4g d5g d6g d7g d8g	          }t          t          j
        |	j                  t          j
        |                     t          t          j
        |	j                  t          j
        |
                     t          t          j
        |	j                  t          j
        |                     t          t          j
        |	j                  t          j
        |                     t          j        |	j        |z            }t          j        |	j        |
z            }t          j        |	j        |z            }t          j        |	j        |z            }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   rL   r   reshapeconcatenater   r&   r   rM   r+   r'   r,   r(   rN   r   r)   r*   )np_noiseq_noiserngl1l2latentsr1   r2   r3   rP   rQ   rR   rS   rT   rU   rV   rW   s                     r   &test_sanity_check_pls_canonical_randomr~      s    	AGG
R
 
 C			B			BhBB'((*G#**!a%*((00!Q888A#**!a%*((00!Q888A
3::7Q;:77??7KKLSTUUUA
3::7Q;:77??7KKLSTUUUA
A
&
&
&CGGAqMMM000000111222222///111000222111222///222222	
 & (///111111111222111111111111222111000222111	
 & 000111111111000111111111000
	
  (...000111111000///222111000
	
  bfS_55rv>Q7R7RSSSbfS^44bf=O6P6PQQQbfS_55rv>Q7R7RSSSbfS^44bf=O6P6PQQQ73?5H#HII'#.3E"EFF'#.3E"EFF73?5H#HII24GHHH24GHHHS^,,,S^,,,S]+++S]+++++r   c                     t                      } | j        }| j        }t          |j        d         d          }t          j        t                    5  |                    ||           d d d            d S # 1 swxY w Y   d S )Nr      r    max_iter)	r   r#   r$   r   r%   pytestwarnsr   r&   )r0   r1   r2   
pls_nipalss       r   test_convergence_failr   Y  s    A	A	A171:BBBJ	(	)	)  q!                 s   A66A:=A:Estc                     t                      }|j        }|j        }d |           }|                    ||           t	          fd|j        |j        fD                       sJ d S )Nr   r   c              3   :   K   | ]}|j         d          k    V  dS )r   N)r%   ).0attrr    s     r   	<genexpr>z(test_attibutes_shapes.<locals>.<genexpr>l  s?        *.
1%     r   )r   r#   r$   r&   allr'   r(   )r   r0   r1   r2   r3   r    s        @r   test_attibutes_shapesr   c  s     	A	A	AL
#<
(
(
(CGGAqMMM    36>3>2R         r   z>ignore:The attribute `coef_` will be transposed in version 1.3c                 2   t                      }|j        }|j        } | d          }|                    ||d d df                   j        }|                    ||d d d df                   j        }|j        |j        k    sJ t          ||           d S )Nr   r   r   )r   r#   r$   r&   coef_r%   r   )r   r0   r1   r2   estone_d_coefftwo_d_coeffs          r   test_univariate_equivalencer   r  s     	A	A	A
#1


C''!Qqqq!tW%%+K''!Qqqq"1"uX&&,K 11111k;77777r   c                    t                      }|j        }|j        }|                                } | d                              ||          }t          ||           t          j        t                    5   | d                              ||           t          ||           d d d            n# 1 swxY w Y   | t          u rd S |                                }t          j        t                    5  |                    ||d          f t          ||           d d d            n# 1 swxY w Y   |                                }t          j        t                    5  |                    |d          f t          ||           d d d            n# 1 swxY w Y   t          |                    ||d          |                    |                                |                                d                     t          |                    |d          |                    |                                d                     d S )NTr-   F)r   r#   r$   r-   r&   r   r   raisesAssertionErrorr   r   r.   predict)r   r0   r1   r2   X_origr3   s         r   	test_copyr     s    	A	A	AVVXXF #4...

Q
"
"Cq&!!! 
~	&	& - -Aq!!!!!V,,,- - - - - - - - - - - - - - - f}}VVXXF	~	&	& - -a''((!!V,,,- - - - - - - - - - - - - - - VVXXF	~	&	& - -AE""##!!V,,,- - - - - - - - - - - - - - -
 a&&affhhu(U(U   AD!!3;;qvvxxe;#D#D    s6   :1B77B;>B;:*D00D47D4()FF!$F!c               #     K   t           j                            d          } d}d}d}|                     ||          }|                     ||          }t          j        ||          d|                     ||          z  z   dz   }|dz  }||fV  t          d          \  }}d	|d
d
df<   ||fV  t          j        g dg dg dg dg          }t          j        ddgddgddgddgg          }||fV  ddg}|D ]S}t           j                            |          } |                     dd          }|                     dd          }||fV  Td
S )z-Generate dataset for test_scale_and_stabilityr   i  rm   rl   r   r   T
return_X_y      ?N)r]   r]   r   )r   r]   r]   )       @r   r   )g      @g      @g      @皙?gɿg?g?g@g@g'@g(@i  i  rp   rs   )r   randomRandomStaterandnr   r   rL   )	rz   	n_samples	n_targets
n_featuresr6   r2   r1   seedsseeds	            r   +_generate_test_scale_and_stability_datasetsr     s      )


"
"CIIJ		)Z((A		)Y''A
q!q399Y
;;;;a?AIA
Q$JJJ D)))DAqAaaaeH
Q$JJJ
///???OOO___UVVA
3+SzC:d|DEEA
Q$JJJ #JE  i##D))IIaOOIIaOOd



	 r   zX, Yc                     t          ||          ^}}} | d                              ||          \  }} | d                              ||          \  }}	t          ||d           t          |	|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   rJ   r   )
r   r1   r2   X_sY_sr@   X_scoreY_score	X_s_score	Y_s_scores
             r   test_scale_and_stabilityr     s     $Aq))LCqs44Q::GW3U+++99#sCCIyIwT2222IwT222222r   	Estimatorc                 L   t           j                            d          }|                    dd          }|                    dd          } | d          }d}t	          j        t          |          5  |                    ||           ddd           dS # 1 swxY w Y   dS )	zICheck the validation of `n_components` upper bounds for `PLS` regressors.r   rl   rm   rs   r   zH`n_components` upper bound is .*. Got 10 instead. Reduce `n_components`.matchN)r   r   r   r   r   r   
ValueErrorr&   )r   rz   r1   r2   r   err_msgs         r   test_n_components_upper_boundsr     s     )


"
"C		"aA		"aA
)
$
$
$CXG	z	1	1	1  1                 s   5BB Bzn_samples, n_features)d   rl   )r      r   rl   c                    t          | |d|          \  }}t          ||d          \  }}}t          ||          \  }}	t          ||           t          ||	           d}
t	          |||
           t	          ||	|
           d S )Nrm   r   random_stateT)norm_y_weightsr   rtol)r   r   r	   r
   r   )r   r   r   r1   r2   u1v1r@   u2v2r   s              r   test_singular_value_helpersr     s     9jADQQQDAq8AdSSSIBA,Q22FBRRDB&&&&B&&&&&&r   c                     t          dddd          \  } }t          d                              | |                              |           }t	          d                              | |                              |           }t          d                              | |                              |           }t          ||d	           t          ||d	           d S )
Nr   rl   rm   r   r   r   r   g{Gz?r   )r   r   r&   r.   r   r   r   )r1   r2   svdreg	canonicals        r   test_one_component_equivalencer     s     3aa@@@DAq
a
 
 
 
$
$Q
*
*
4
4Q
7
7C
Q
'
'
'
+
+Aq
1
1
;
;A
>
>C!,,,00A66@@CCIC4((((C......r   c                     t          j        g d          } t          j        g d          }t          |                     dd          |                    dd                    \  }}t	          | |           t          | |                                           t          | g d           t          ||                                           t          |g d           d S )N)r   r   )r   r   rs   r   r   )r   rp   )r   r   )r   rL   r   ru   r
   r   ravel)uv
u_expected
v_expecteds       r   test_svd_flip_1dr     s    
A
A%aiiA&6&6		!R8H8HIIJ
AAz''))***A{{{###Az''))***A|||$$$$$r   c                  l   t          dddd          \  } }t          dd          }t          j                    5  t          j        dt
                     |                    | |           ddd           n# 1 swxY w Y   t          j        t          j	        |j
                  d	k               sJ dS )
z8Test that CCA converges. Non-regression test for #19549.r      )r   r   r   r   rl   rk   r   errorNr   )r   r   warningscatch_warningssimplefilterr   r&   r   r   rM   r+   )r1   yccas      r   test_loadings_convergesr     s    SR2TVWWWDAq
2
,
,
,C		 	"	"  g'9:::1               6"&))A-.......s   1A88A<?A<c                  t   t           j                            d          } |                     dd          }t          j        d          }t                      }d}t          j        t          |          5  |	                    ||           ddd           n# 1 swxY w Y   t          |j        d           dS )zAChecks warning when y is constant. Non-regression test for #19831*   r   rs   z#Y residual is constant at iterationr   Nr   )r   r   r   randzerosr   r   r   UserWarningr&   r   rc   )rz   xr   r3   msgs        r   test_pls_constant_yr      s    
)


#
#CaA
A
//C
/C	k	-	-	-  1               C$a(((((s   5BBBPLSEstimatorc                 *   t                      }|j        }|j        } | d                              ||          }d}t	          j        t          |          5  |j        j        |j        d         |j        d         fk    sJ 	 ddd           n# 1 swxY w Y   t          j
                    5  t          j        dt                     |j         ddd           n# 1 swxY w Y   |j        j        |j        d         |j        d         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   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   r0   r1   r2   r3   warning_msgs         r   test_pls_coef_shaper   /  s    	A	A	A
,D
!
!
!
%
%a
+
+C LK	m;	7	7	7 ; ;y171:qwqz"::::::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 
	 	"	"  g}555		              
 :
AGAJ7777777s$   +BBB0"CC"%C"z/ignore:The attribute `coef_` will be transposedr"   TFc                    t                      }|j        }|j        } | d|                              ||          }|                    |d          }|                    d          }||                    d          z
  }|r||                    dd          z  }t          |j        |           t          |||j	        z  |j        z              dS )	z/Check the behaviour of the prediction function.T)r-   r"   r   r   rq   r   )rr   ddofN)
r   r#   r$   r&   r   meanstdr   
intercept_r   )	r   r"   r0   r1   r2   r3   Y_predr:   rO   s	            r   test_pls_predictionr   L  s    
 	A	A	A
,D
.
.
.
2
21a
8
8C[[[&&FVVV^^F!&&a&.. G )155aa5(((CNF+++FGci/#.@AAAAAr   Klassc                 l   t          d          \  }} |                                 ||          }|                                }| j                                        t          j        fdt          |j        j	        d                   D             t                    }t          ||           dS )z9Check `get_feature_names_out` cross_decomposition module.Tr   c                     g | ]} | 	S  r   )r   iclass_name_lowers     r   
<listcomp>z.test_pls_feature_names_out.<locals>.<listcomp>k  s%    JJJa	!a	!	!JJJr   r   )dtypeN)r   r&   get_feature_names_out__name__lowerr   rL   ranger'   r%   objectr   )r   r1   r2   r   	names_outexpected_names_outr   s         @r   test_pls_feature_names_outr  a  s     D)))DAq
%''++a

C))++I~++--JJJJ51Ea1H+I+IJJJ   y"455555r   c                    t          j        d          }t          dd          \  }} |                                 d                              ||          }|                    ||          \  }}t          |t          j                  sJ t          ||j	                  sJ 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   pdr1   r2   r   rO   y_transs          r   test_pls_set_outputr  q  s     
	X	&	&BD4888DAq
%''

x

0
0
4
4Q
:
:C}}Q**GWgrz*****gr|,,,,,w(A(A(C(CDDDDDr   )5r   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   rB   rX   r^   ri   r~   r   markparametrizer   filterwarningsr   r   r   r   r   r  r   r   r   r   r   r   r   r  r  r   r   r   <module>r     s         X X X X X X X X X X * * * * * *            , + + + + + K K K K K K K K K K , , , , , , , , , , , , * * * * * * 1 1 1 1 1 16 6 6
%) %) %)P<I <I <I~/G /G /Gd;, ;, ;,|e, e, e,P    EFF
 
 GF
 D  c BCC8 8 DC 8 c6 JKK# # LK#L  @ lM6 JKK!L!L!N!NOO
3 
3 PO LK
3 v}lC&PQQ  RQ 09j2IJJr++' ' ,+ KJ'	/ 	/ 	/% % %/ / /) ) ) -s)KLL8 8 ML88 MNN4-00-s)KLLB B ML 10 ONB$ 3|"LMM6 6 NM6 3|"LMM	E 	E NM	E 	E 	Er   