
    rh,>                        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     {/var/www/html/ai-insurance-compliance-backend/venv/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                  |       }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 )N
      g|=   )
r   randomRandomStatelinalgsvdrandnr   sumdotT)global_random_seedrngW_wutmps          r   test_gsr)   #   s     ))

 2
3C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_dtypesrA   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/   r0   )r3   r4   r5   )r   r   r   r6   r7   r   r:   )r>   r#   r?   k_r;   s_s         r   test_fastica_return_dtypesrE   =   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,      sizer5   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-variancer0   F)funr4   	algorithmr5   )rZ   r4   r[   Tr2   r4   r5   F)rZ   r[   r4   r5   )rZ   r[   gh㈵>atolg{Gz?)rZ   r[   r5   r   r   r/   r   gHz>)'r   float32osgetenvpytestxfailr   r   sinlinspacer   trvsc_r!   r   r7   arraycosr    r   	itertoolsproductr   raises
ValueErrortanhr   fit_transformr	   abssignr   r9   shapemax	transformr;   r8   )rF   r"   r>   r#   	n_sampless1s2sphimixingmrR   algosnls	whiteningalgonlr4   rC   r;   rD   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 )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   rK   Fr\   z(Ignoring n_components with whiten=False.matchr;   )r   rd   warnsUserWarningr8   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}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   rS           )r[   r2   r5   r3   tol)r   r   r   rg   rf   ceilpirj   r!   r   r   r    rd   r   r   r   r8   )r"   r#   rx   rh   ry   rz   r{   r}   r~   r   r   s              r   test_fastica_convergence_failr      s     ))

 2
3CI
AsI&A	B		"	#B
b"fAA YYq!_F
vqA	/  
(	9  qsQTW
 		  s   6,D++D4c           	         t         j                  j                  |       }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   rN   r0   r\   rK   gMbP?r]   )r   r   r   rg   rf   r   r   rj   r!   r   r   r    r   r	   rs   rt   )r"   rF   r#   rx   rh   ry   rz   r{   r}   r~   rC   r;   rD   r   r   s                  r   test_non_square_fasticar      s    ))

 2
3C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,  r0   r   FNrK   r   r1   errorignorer   g    .Ar   r]   )r   r   r   r6   r7   ru   r   warningscatch_warningssimplefilterRuntimeWarningr   rr   r9   r8   rw   rs   r   r	   )r"   r>   r#   r?   r3   r4   r2   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))rY   r   r   r   )rY   r   r   r   )r0   r   r   )r0   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   )r2   r5   r4   r   rK   g     j@r   r]   )r   r   r   r6   r7   r   r   r   r   r   rr   r;   ru   inverse_transformrs   r   r	   )r4   r2   expected_mixing_shaper"   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)NrP   r   r   rK   zalpha must be in \[1,2\]r   alpha)fun_argsz0w_init has invalid shape.+should be \(3L?, 3L?\))w_init)	r   r   r   r6   r   rd   ro   rp   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)*	M
 " 	&!" "* *" "s   *B4C 4B= C	c                    t         j                  j                  |       }|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+   rK   r0   r   r\   g      ?N)
r   r   r   r6   ru   r   rr   varrd   approx)r"   r#   r?   r2   r   r   s         r   !test_fastica_whiten_unit_variancer   w  st    
 ))

 2
3C)$A771:L
|ORS
TC			1	B66":s++++r   r4   rX   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 )NrP   r   r   )r4   r   r   )r   r   r   r6   r   len)	r4   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,   rK   rL   rN   )r   eighr0   r5   r4   whiten_solverr_   r`   r   r   g-q=r]   N)r   r   r   rf   rg   r   rh   ri   rj   r!   r   randr   rk   rl   r    r   r   rr   r9   ru   r	   )rF   r"   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   r0   r   r   z$There are some small singular valuesr   )categoryN)r   r   r   r   r!   r   rd   r   r   r
   r   r8   )r"   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		 	 	 s$   ,B,=B B, B)	%B,,B5)rQ   )&__doc__rm   rb   r   numpyr   rd   scipyr   sklearn.decompositionr   r   r   sklearn.decomposition._fasticar   sklearn.exceptionsr   sklearn.utils._testingr	   r
   r   r)   rA   rE   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   