
    {Kg=                        d Z ddlZddlZddlZddlZddl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mZ d!dZd	 Zd
 Zd Zej0                  j3                  dddg      d        Zd Zd Zej0                  j3                  dddg      d        Zd Zej0                  j?                  d      ej0                  j3                  dg d      d               Z d Z!d Z"ej0                  j3                  dg d      ej0                  j3                  dddg      ej0                  j3                  dddg      d                      Z#ej0                  j3                  dddg      d        Z$d  Z%y)"z
Test the fastica algorithm.
    N)stats)PCAFastICAfastica)_gs_decorrelation)ConvergenceWarning)assert_allcloseignore_warningsc                     t        j                  | |      } | | j                  d      z  } | | j                  d      z  } y)a  Centers and norms x **in place**

    Parameters
    -----------
    x: ndarray
        Array with an axis of observations (statistical units) measured on
        random variables.
    axis: int, optional
        Axis along which the mean and variance are calculated.
    r   axisN)nprollaxismeanstd)xr   s     l/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/decomposition/tests/test_fastica.pycenter_and_normr      s<     	AtAQAAA    c                     t         j                  j                  d      } t         j                  j	                  | j                  dd            \  }}}| j                  d      }t        ||d       |dz  j                         dk  sJ | j                  d      }t        ||d      }t        j                  ||j                        }|d d dz  j                         dk  sJ y )Nr   
      g|=   )
r   randomRandomStatelinalgsvdrandnr   sumdotT)rngW_wutmps         r   test_gsr(   #   s     ))


"CiimmCIIb"-.GAq!		"AaBqD::<'!!!		"A!Q"A
&&ACC.CGqL')))r   c                    t         j                  j                  d      }|j                  d      j	                  | d      }t        dddd      j                  |      }|j                  j                  | k(  sJ |j                  j                  | k(  sJ |j                  j                  | k(  sJ |j                  j                  | k(  sJ y )	Nr   d   r   Fcopyr     unit-variancen_componentsmax_iterwhitenrandom_state)r   r   r   random_sampleastyper   fitcomponents_dtypemixing_mean_
whitening_)global_dtyper"   Xficas       r   test_fastica_attributes_dtypesr@   1   s    
))


"C)$++Lu+EAoA	c!f 	 !!\111<<---::|+++??  L000r   c                    t         j                  j                  d      }|j                  d      j	                  | d      }t        |dd|      \  }}}|j                  | k(  sJ |j                  | k(  sJ |j                  | k(  sJ y )Nr   r*   Fr,   r.   r/   )r2   r3   r4   )r   r   r   r5   r6   r   r9   )r=   r"   r>   k_r:   s_s         r   test_fastica_return_dtypesrD   =   s    
))


"C)$++Lu+EA	DsOB 88|###==L(((88|###r   	add_noiseTFc           	         |dk(  rB|t         j                  k(  r/| s-t        j                  d      dk(  rt	        j
                  d       t         j                  j                  |      }d}dt        j                  t        j                  dd|            z  dkD  d	z
  }t        j                  j                  d	||
      }t         j                  ||f   j                  }t        |       |j!                  |      }|\  }}d}t        j"                  t        j$                  |      t        j                  |      gt        j                  |      t        j$                  |       gg      }	|	j!                  |      }	t        j&                  |	|      }
| r|
d|j)                  dd      z  z  }
t        |
       d }ddg}ddd|g}g d}t+        j,                  |||      D ]  \  }}}|rht/        |
j                  ||||      \  }}}t	        j0                  t2              5  t/        |
j                  t         j4                  ||       d d d        n{t7        dd|      }|j9                  |
j                        }t/        |||d|      \  }}}t	        j0                  t2              5  t/        |t         j4                  |       d d d        |j                  }|rM|t         j                  k(  rdnd}t;        t        j&                  t        j&                  ||      |
      ||       t        |       |\  }}t=        t        j&                  ||            t=        t        j&                  ||            kD  r|\  }}|t        j>                  t        j&                  ||            z  }|t        j>                  t        j&                  ||            z  }| sLt;        t        j&                  ||      |z  d	d       t;        t        j&                  ||      |z  d	d       Bt;        t        j&                  ||      |z  d	d       t;        t        j&                  ||      |z  d	d        t/        |
j                  |      \  }}}tA        |||      }|j9                  |
j                        }|jB                  jD                  dk(  sJ |jD                  d k(  sJ t;        ||       t        jF                  t        j<                  |            |t         j                  k(  rdnd!z  }t;        ||jI                  |
j                        |       |jJ                  jD                  dk(  sJ tA        t         j4                  |      }t	        j0                  t2              5  |jM                  |
j                         d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)"N   DISTRIBubuntuzFastICA instability with Ubuntu Atlas build with float32 global_dtype. For more details, see https://github.com/scikit-learn/scikit-learn/issues/24131#issuecomment-1208091119r.   r   r   r+      sizer4   g333333?皙?c                 <    | dz  d| dz  z  j                  d      fS )N   r   r   )r   )r   s    r   g_testz#test_fastica_simple.<locals>.g_testm   s$    !ta!Q$h__"_---r   parallel	deflationlogcoshexpcubearbitrary-variancer/   F)funr3   	algorithmr4   )rY   r3   rZ   Tr1   r3   r4   F)rY   rZ   r3   r4   )rY   rZ   gh㈵>atolg{Gz?)rY   rZ   r4   r   r   r.   r   gHz>)'r   float32osgetenvpytestxfailr   r   sinlinspacer   trvsc_r!   r   r6   arraycosr    r   	itertoolsproductr   raises
ValueErrortanhr   fit_transformr	   abssignr   r8   shapemax	transformr:   r7   )rE   global_random_seedr=   r"   	n_sampless1s2sphimixingmrQ   algosnls	whiteningalgonlr3   rB   r:   rC   pcar>   r]   s1_s2_r$   sources_funicasourcess                                 r   test_fastica_simpler   H   s    	b BJJ&IIi H,`	
 ))

 2
3CI
bffR[[C34
4q
8A	=B	QY5G	HB
b"fAA	AFB CXXsRVVC[1BFF3K"&&+3NOPF]]<(F
vqA	S399Q%%%A. %EeVV
,C>I%--eS)Db&%FdOB z*4H +* 1TDC!!!##&A%rT%cOB z*rww$7 +TT (2::541DBFF266'2#6:BTJS rvvc2#bffS"o"66HCrwwrvvc2''rwwrvvc2'' BFF3Oi7FBFF3Oi7FBFF3Oi7FBFF3Oi7FS EX  	t2DAq+ bD7I
JC$G??  F***==I%%%K) 66"&&/"lbjj.HddSDGS]]133/d;;;&&&
bgg
.C	z	" 
#	"q +* +*` 
#	"s$   (W$WWW	W	W'c                      ddgddgg} t        ddd      }d}t        j                  t        |      5  |j	                  |        d d d        t        |d      sJ y # 1 sw Y   xY w)Nr   rJ   Fr[   z(Ignoring n_components with whiten=False.matchr:   )r   rc   warnsUserWarningr7   hasattr)r~   r   warn_msgs      r   test_fastica_nowhitenr      s`    
Q!QA qQ
?C9H	k	2
 
33	""" 
3	2s   AA&c                  n   t         j                  j                  d      } d}t        j                  dd|      }t        j                  |      }t        j
                  t        j                  t         j                  |z              }t         j                  ||f   j                  }t        |       | j                  dd      }t        j                  ||      }d}t        j                  t        |      5  t        dd| dd	
      }	|	j!                  |j                         d d d        y # 1 sw Y   y xY w)Nr   r.   r+      r   z\FastICA did not converge. Consider increasing tolerance or the maximum number of iterations.r   rR           )rZ   r1   r4   r2   tol)r   r   r   rf   re   ceilpiri   r!   r   r   r    rc   r   r   r   r7   )
r"   rx   rg   ry   rz   r{   r}   r~   r   r   s
             r   test_fastica_convergence_failr      s     ))


"CI
AsI&A	B		"	#B
b"fAA YYq!_F
vqA	/  
(	9 qsQTW
 		 
:	9	9s   6,D++D4c           	         t         j                  j                  d      }d}t        j                  dd|      }t        j                  |      }t        j
                  t        j                  t         j                  |z              }t         j                  ||f   j                  }t        |       |\  }}|j                  dd      }t        j                  ||      }| r|d|j                  d|      z  z  }t        |       t        |j                  dd|      \  }	}
}|j                  }t        |t        j                  t        j                  |
|	      |             t        |       |\  }}t        t        j                  ||            t        t        j                  ||            kD  r|\  }}|t        j                  t        j                  ||            z  }|t        j                  t        j                  ||            z  }| sKt        t        j                  ||      |z  d	d
       t        t        j                  ||      |z  d	d
       y y )Nr   r.   r+   r   r   rM   r/   r[   rJ   gMbP?r\   )r   r   r   rf   re   r   r   ri   r!   r   r   r    r   r	   rr   rs   )rE   r"   rx   rg   ry   rz   r{   r}   r~   rB   r:   rC   r   r   s                 r   test_non_square_fasticar      s    ))


"CI
AsI&A	B		"	#B
b"fAAFB YYq!_F
vqA	S399Q	***A	!O#OB 
B Brvvgr2A67BHC 266#r?c"&&b/22S277266#r?##C277266#r?##C sB)3QTBsB)3QTB r   c                    t         j                  j                  |       }|j                  d      j	                  |      }d}ddgddgfD ]  \  }}||n|j
                  d   }t        |||d	      }t        j                         5  t        j                  d
t               t        j                  dt               |j                  |      }	ddd       |j                  j
                  |dfk(  sJ 	j
                  |j
                  d   |fk(  sJ t        |||d	      }
t        j                         5  t        j                  d
t               t        j                  dt               |
j                  |       ddd       |
j                  j
                  |dfk(  sJ |
j                  |      }|r't        j                   |      j#                         dz  }nd}t%        |	||        y# 1 sw Y   #xY w# 1 sw Y   xY w)zTest unit variance of transformed data using FastICA algorithm.

    Check that `fit_transform` gives the same result as applying
    `fit` and then `transform`.

    Bug #13056
    r*   i,  r/   r   FNrJ   r   r0   errorignorer   g    .Ar   r\   )r   r   r   r5   r6   rt   r   warningscatch_warningssimplefilterRuntimeWarningr   rq   r8   r7   rv   rr   r   r	   )rw   r=   r"   r>   r2   r3   r1   n_components_r   Xtica2Xt2r]   s                r   test_fit_transformr     s    ))

 2
3C)$++L9AH"11!5t} E(4(@aggaj%VW
 $$& !!'>: !!(,>?""1%B ' $$(;;;;xxAGGAJ6666%VW
 $$& !!'>:!!(,>?HHQK ' %%-)<<<<nnQ 66#;##%+DDCd+G !F '& '&s   AG.5AG;.G8	;H	z/ignore:Ignoring n_components with whiten=False.z+whiten, n_components, expected_mixing_shape))rX   r   r   r   )rX   r   r   r   )r/   r   r   )r/   r   r   )Fr   r   )Fr   r   c                 t   d}t         j                  j                  |      }|j                  |df      j	                  |      }t        |||       }t        j                         5  t        j                  dt               |j                  |      }	d d d        |j                  j                  |k(  sJ |j                  	      }
|j                  |
j                  k(  sJ ||j                  d   k(  r:|r't        j                  |
      j                         dz  }nd}t!        ||
|       y y # 1 sw Y   xY w)	Nr+   r   )r1   r4   r3   r   rJ   g     j@r   r\   )r   r   r   r5   r6   r   r   r   r   r   rq   r:   rt   inverse_transformrr   r   r	   )r3   r1   expected_mixing_shaperw   r=   rx   r"   r>   r   r   X2r]   s               r   test_inverse_transformr   =  s     I
))

 2
3C9b/*11,?A
|#f
MC		 	 	" 	h(:;q! 
# ;; 5555			r	"B77bhh qwwqz!  66":??$s*DD2D) " 
#	"s   &,D..D7c                     d} d}t         j                  j                  d      }|j                  || f      }|j	                  | dz   | dz         }t        j                  t        d      5  t        |ddi       d d d        t        j                  t        d	      5  t        ||
       d d d        y # 1 sw Y   ;xY w# 1 sw Y   y xY w)NrO   r   r   rJ   zalpha must be in \[1,2\]r   alpha)fun_argsz0w_init has invalid shape.+should be \(3L?, 3L?\))w_init)	r   r   r   r5   r   rc   rn   ro   r   )
n_featuresrx   r"   r>   r   s        r   test_fastica_errorsr   i  s    JI
))


"C9j12AYYzA~zA~6F	z)D	EWaL) 
F	P
 	&!
 
 
F	E
 
s   *B4C 4B= C	c                     t         j                  j                  d      } | j                  d      }|j                  d   }t        |dd      }|j                  |      }t        j                  |      t        j                  d      k(  sJ y)zTTest unit variance of transformed data using FastICA algorithm.

    Bug #13056
    r   r*   rJ   r/   r[   g      ?N)
r   r   r   r5   rt   r   rq   varrc   approx)r"   r>   r1   r   r   s        r   !test_fastica_whiten_unit_variancer   w  ss    
 ))


"C)$A771:L
|ORS
TC			1	B66":s++++r   r3   rW   return_X_meanreturn_n_iterc                     d}d}t         j                  j                  d      }|j                  ||f      }d|z   |z   }t	        || ||      }t        |      |k(  sJ | s|d   J y y )NrO   r   r   )r3   r   r   )r   r   r   r5   r   len)	r3   r   r   r   rx   r"   r>   expected_lenouts	            r   test_fastica_output_shaper     s     JI
))


"C9j12A}$}4L
	&]C s8|###1v~~ r   c                    t         j                  j                  |      }d}dt        j                  t        j                  dd|            z  dkD  dz
  }t
        j                  j                  d||      }t         j                  ||f   j                  }t        |       |\  }}|j                         dz  t         j                  z  }t        j                  t        j                  |      t        j                  |      gt        j                  |      t        j                  |       gg      }t        j                  ||      }	| r|	d|j!                  dd      z  z  }	t        |	       i }
dD ]\  }t#        dd	|
      }|j%                  |	j                        }||
|<   |j&                  j(                  dk(  sJ |j(                  dk(  r\J  t+        |
d   |
d   d       y)z2Test FastICA is consistent between whiten_solvers.r.   r   r   r+   rJ   rK   rM   )r   eighr/   r4   r3   whiten_solverr^   r_   r   r   g-q=r\   N)r   r   r   re   rf   r   rg   rh   ri   r!   r   randr   rj   rk   r    r   r   rq   r8   rt   r	   )rE   rw   r"   rx   ry   rz   r{   r|   r}   r~   outssolverr   r   s                 r   %test_fastica_simple_different_solversr     s    ))

 2
3CI
bffR[[C34
4q
8A	=B	QYS	9B
b"fAAFB ((*q.255
 CXXsRVVC[1BFF3K"&&+3NOPF
vqA	S399Q%%%AD!1_FS##ACC(V$$...}}	))) " DL$u+E:r   c                 p   t         j                  j                  |       }|j                  dd      }||j                  z  }t        ddd      }d}t        j                  t        |      5  t        t        	      5  |j                  |       d
d
d
       d
d
d
       y
# 1 sw Y   xY w# 1 sw Y   y
xY w)z:Test FastICA eigh solver raises warning for low-rank data.r   r   r   r/   r   r   z$There are some small singular valuesr   )categoryN)r   r   r   r   r!   r   rc   r   r   r
   r   r7   )rw   r"   Ar>   r   msgs         r   "test_fastica_eigh_low_rank_warningr     s    
))

 2
3C		"aA	ACCA
q
OC
0C	k	-&89 GGAJ	 : 
.	-99 
.	-s$   ,B,=B B, B)	%B,,B5)rP   )&__doc__rl   ra   r   numpyr   rc   scipyr   sklearn.decompositionr   r   r   sklearn.decomposition._fasticar   sklearn.exceptionsr   sklearn.utils._testingr	   r
   r   r(   r@   rD   markparametrizer   r   r   r   r   filterwarningsr   r   r   r   r   r    r   r   <module>r      s    	     7 7 < 1 C *	1$ tUm4h 5hV#< tUm4*C 5*CZ/,d MN1
*
 O*@", #QR4-84-8 9 9 S" tUm4; 5;Dr   