
    h$,f<                        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 d!dZd	 Zd
 Zd Zej.                  j1                  dddg      d        Zd Zd Zej.                  j1                  dddg      d        Zd Zej.                  j=                  d      ej.                  j1                  dg d      d               Zd Z d Z!ej.                  j1                  dg d      ej.                  j1                  dddg      ej.                  j1                  dddg      d                      Z"ej.                  j1                  dddg      d        Z#d  Z$y)"z
Test the fastica algorithm.
    N)stats)PCAFastICAfastica)_gs_decorrelation)ConvergenceWarning)assert_allclosec                     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     Hlib/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?   0   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.   )r1   r2   r3   )r   r   r   r4   r5   r   r8   )r<   r!   r=   k_r9   s_s         r   test_fastica_return_dtypesrC   <   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*      sizer3   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_testl   s$    !ta!Q$h__"_---r   parallel	deflationlogcoshexpcubearbitrary-variancer.   F)funr2   	algorithmr3   )rX   r2   rY   Tr0   r2   r3   F)rX   rY   r2   r3   )rX   rY   gh㈵>atolg{Gz?)rX   rY   r3   r   r   r-   r   gHz>)'r   float32osgetenvpytestxfailr   r   sinlinspacer   trvsc_r    r   r5   arraycosr   r   	itertoolsproductr   raises
ValueErrortanhr   fit_transformr	   abssignr   r7   shapemax	transformr9   r6   )rD   global_random_seedr<   r!   	n_sampless1s2sphimixingmrP   algosnls	whiteningalgonlr2   rA   r9   rB   pcar=   r\   s1_s2_r#   sources_funicasourcess                                 r   test_fastica_simpler   G   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 )Gb&%FdOB z* I4HI I 1TDC!!!##&A%rT%cOB z* 8rww$78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)GX  	t2DAq+ bD7I
JC$G??  F***==I%%%K) 66"&&/"lbjj.HddSDGS]]133/d;;;&&&
bgg
.C	z	"  qI I8 8` 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   rI   FrZ   z(Ignoring n_components with whiten=False.matchr9   )r   rb   warnsUserWarningr6   hasattr)r}   r   warn_msgs      r   test_fastica_nowhitenr      sg    
Q!QA qQ
?C9H	k	2 
3	""" s   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   rQ           )rY   r0   r3   r1   tol)r   r   r   re   rd   ceilpirh   r    r   r   r   rb   r   r   r   r6   )
r!   rw   rf   rx   ry   rz   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
 		  s   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   rL   r.   rZ   rI   gMbP?r[   )r   r   r   re   rd   r   r   rh   r    r   r   r   r   r	   rq   rr   )rD   r!   rw   rf   rx   ry   rz   r|   r}   rA   r9   rB   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   FNrI   r   r/   errorignorer   g    .Ar   r[   )r   r   r   r4   r5   rs   r   warningscatch_warningssimplefilterRuntimeWarningr   rp   r7   r6   ru   rq   r   r	   )rv   r<   r!   r=   r1   r2   r0   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#,	& 	&	 	s   AG.5AG;.G8	;H	z/ignore:Ignoring n_components with whiten=False.z+whiten, n_components, expected_mixing_shape))rW   r   r   r   )rW   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   )r0   r3   r2   r   rI   g     j@r   r[   )r   r   r   r4   r5   r   r   r   r   r   rp   r9   rs   inverse_transformrq   r   r	   )r2   r0   expected_mixing_shaperv   r<   rw   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)NrN   r   r   rI   zalpha must be in \[1,2\]r   alpha)fun_argsz0w_init has invalid shape.+should be \(3L?, 3L?\))w_init)	r   r   r   r4   r   rb   rm   rn   r   )
n_featuresrw   r!   r=   r   s        r   test_fastica_errorsr   h  s    JI
))


"C9j12AYYzA~zA~6F	z)D	E *WaL)*	P
 " 	&!" "* *" "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)   rI   r.   rZ   g      ?N)
r   r   r   r4   rs   r   rp   varrb   approx)r!   r=   r0   r   r   s        r   !test_fastica_whiten_unit_variancer   v  ss    
 ))


"C)$A771:L
|ORS
TC			1	B66":s++++r   r2   rV   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 )NrN   r   r   )r2   r   r   )r   r   r   r4   r   len)	r2   r   r   r   rw   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*   rI   rJ   rL   )r   eighr.   r3   r2   whiten_solverr]   r^   r   r   g-q=r[   N)r   r   r   rd   re   r   rf   rg   rh   r    r   randr   ri   rj   r   r   r   rp   r7   rs   r	   )rD   rv   r!   rw   rx   ry   rz   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                 &   t         j                  j                  |       }|j                  dd      }||j                  z  }t        ddd      }d}t        j                  t        |      5  |j                  |       d	d	d	       y	# 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   N)
r   r   r   r   r    r   rb   r   r   r6   )rv   r!   Ar=   r   msgs         r   "test_fastica_eigh_low_rank_warningr     su    
))

 2
3C		"aA	ACCA
q
OC
0C	k	- 
  s   ,BB)rO   )%__doc__rk   r`   r   numpyr   rb   scipyr   sklearn.decompositionr   r   r   sklearn.decomposition._fasticar   sklearn.exceptionsr   sklearn.utils._testingr	   r   r'   r?   rC   markparametrizer   r   r   r   r   filterwarningsr   r   r   r   r   r    r   r   <module>r      s    	     7 7 < 1 2 *	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   