o
    i{w                  
   @   s  d dl Z d dlZd dlm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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mZmZmZmZ d d	lmZmZm Z  d d
l!m"Z" ej#$d Z%d\Z&Z'e%(e&e'Z)dd Z*dd Z+dd Z,dd Z-dd Z.ej/0dg dej/0dddgej/0dddgdd Z1ej/0dddgdd Z2d d! Z3d"d# Z4d$d% Z5d&d' Z6d(d) Z7d*d+ Z8d,d- Z9d.d/ Z:ej/0dg dej/0dddgej/0dddgd0d1 Z;ej/0dddgd2d3 Z<ej/0dddgej/0dddgd4d5 Z=d6d7 Z>d8d9 Z?d:d; Z@d<d= ZAd>d? ZBd@dA ZCdBdC ZDej/0dDg dej/0dEddgdFdG ZEej/0dDdHdIgdJdK ZFdLdM ZGdNdO ZHdPdQ ZIdRdS ZJdTdU ZKdVdW ZLdXdY ZMdZd[ ZNd\d] ZOej/0d^d_ej/0d`ejPejQfdadb ZRej/0d^d_dcdd ZSej/0dd_ej/0d`ejPejQfdedf ZTej/0dgdhej/0dd_ej/0diejPejPfejQejQfejUejQfejVejQffdjdk ZWej/0dgdhej/0dd_ej/0diejPejPfejQejQfejUejQfejVejQffdldm ZXej/0dndhej/0diejPejPfejQejQfejUejQfejVejQffdodp ZYej/0dndhdqdr ZZej/0dndhej/0diejPejPfejQejQfejUejQfejVejQffdsdt Z[ej/0dndhdudv Z\ej/j0dwee)j]e edxdydzgd{d| d}d~d Z^dd Z_dS )    N)partial)clone)DictionaryLearningMiniBatchDictionaryLearningSparseCoderdict_learningdict_learning_onlinesparse_encode)_update_dict)ConvergenceWarning)check_array)
TempMemmapassert_allcloseassert_array_almost_equalassert_array_equalignore_warnings)#check_transformer_data_not_an_arraycheck_transformer_generalcheck_transformers_unfitted)Parallel)
      c            	      C   s   t jd} g d}tddgddgD ].\}}| |t}| |t}t|ddgD ]\}}t||||d}|j||fksAJ q,qd S )Nr   )omp
lasso_larslasso_cdlars	threshold      	      )	algorithmn_jobs)	nprandomRandomState	itertoolsproductrandn
n_featuresr	   shape)	rngZ
algorithmsn_components	n_samplesZX_
dictionaryr!   r"   code r0   h/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/decomposition/tests/test_dict_learning.pytest_sparse_encode_shapes_omp(   s   r2   c                  C   sv   d} t | ddt}|jj| tfksJ d} t | ddt}|jj| tfks*J |tjtjd | fks9J d S )Nr   r   random_stater   )r   fitXcomponents_r*   r)   	transformr,   dicor0   r0   r1   test_dict_learning_shapes3   s   "r;   c                  C   s.   d} t | ddt}|jj| tfksJ d S )N   r   r3   )r   r5   r6   r7   r*   r)   r9   r0   r0   r1   test_dict_learning_overcomplete>   s   r=   c                     s  dd fddd} dd}|  t jt fdd	d
D  }t dd }|d k }d||< d|t |< |dd}tt t	|| dd}|
| W d    n1 s`w   Y  t  tdt t	|| dd}|
| W d    d S 1 sw   Y  d S )Nc                 S   sj   t d| d | }dt d| t jd   d|| d |d    t || d  d|d    }|S )z1Discrete sub-sampled Ricker (Mexican hat) waveletr   r   r       g      ?)r#   linspacesqrtpiexp)
resolutioncenterwidthxr0   r0   r1   ricker_functionE   s   z&test_max_iter.<locals>.ricker_functionc                    sp   t d|d |}t ||f}t|D ]\}} ||| ||< q|t t j|d ddddt jf  }|S )z+Dictionary of Ricker (Mexican hat) waveletsr   r   r    ZaxisN)r#   r?   empty	enumerater@   sumnewaxis)rE   rC   r,   ZcentersDirD   )rG   r0   r1   ricker_matrixO   s   *z$test_max_iter.<locals>.ricker_matrixr   i   r>   c                 3   s"    | ]}| d  dV  qdS )r   )rE   rC   r,   Nr0   ).0w)r,   rC   rO   r0   r1   	<genexpr>_   s    

z test_max_iter.<locals>.<genexpr>)r   2   d   i    r   r      g      @g      )transform_algorithmZtransform_max_itererrori  )r#   Zr_tupler?   Zlogical_notZreshapepytestZwarnsr   r   fit_transformwarningscatch_warningssimplefilter)rX   ZsubsamplingZD_multir6   Zfirst_quartermodelr0   )r,   rC   rG   rO   r1   test_max_iterD   s:   
		
"ra   c                  C   sP   d} d}d}t jt|d tt| |dd W d    d S 1 s!w   Y  d S )Nr   r   ;Positive constraint not supported for 'lars' coding method.matchT)alphapositive_code)r[   raises
ValueErrorr   r6   )r,   re   err_msgr0   r0   r1   *test_dict_learning_lars_positive_parameter}   s   "rj   rX   )r   r   r   rf   FTpositive_dictc                 C   s~   d}t || d||ddt}|t}|r |jdk sJ n	|jdk  s)J |r5|dk s3J d S |dk  s=J d S )Nr   r   cd)rX   r4   rf   rk   fit_algorithm)r   r5   r6   r8   r7   allanyrX   rf   rk   r,   r:   r/   r0   r0   r1   test_dict_learning_positivity   s$   
	rq   c                 C   sL   d}t |dd| ddt}| r|jdk sJ d S |jdk  s$J d S )Nr   r   r   rl   )rX   r4   rk   rm   )r   r5   r6   r7   rn   ro   rk   r,   r:   r0   r0   r1   'test_dict_learning_lars_dict_positivity   s   rs   c                  C   sh   d} t | dddddt}d}|d}tjt|d |t W d    d S 1 s-w   Y  d S )	Nr   r   r   Trl   )rX   r4   rf   rm   9Positive constraint not supported for '{}' coding method.rc   )r   r5   r6   formatr[   rg   rh   r8   )r,   r:   ri   r0   r0   r1   'test_dict_learning_lars_code_positivity   s   
"rv   c                  C   s   d} t | dddd}|tt}tt||jt t||t |j	dd |t}tt||jtdd	 t||tdd	 t
jtd
d ||d d d df  W d    d S 1 sew   Y  d S )Nr<   r   MbP?r   )rX   transform_alphar4   r   rX   r    decimalzExpected 12, got 11.rc   rW   )r   r5   r6   r8   r   r#   dotr7   inverse_transform
set_paramsr[   rg   rh   r,   r:   r/   r0   r0   r1   !test_dict_learning_reconstruction   s   
"r   c                  C   sl   d} t | ddddd}|tt}tt||jt |jdd |t}tt||jtd	d
 d S )Nr<   r   rw   r   rV   rX   rx   r4   r"   r   ry   r    rz   )	r   r5   r6   r8   r   r#   r|   r7   r~   r   r0   r0   r1   *test_dict_learning_reconstruction_parallel   s   
r   c               	   C   s   d} t t;}t| ddddd}ttd |||}W d    n1 s(w   Y  tt	||j
|dd	 W d    d S 1 sDw   Y  d S )
Nr<   r   rw   r   rV   r   )categoryr    rz   )r   r6   r   r   r   r5   r8   r   r#   r|   r7   )r,   ZX_read_onlyr:   r/   r0   r0   r1   (test_dict_learning_lassocd_readonly_data   s    
"r   c                  C   s~   d} t | dddd}|tttjdf }tt|dks"J |jdd |ttjdf }tt|dks=J d S )	NrV   r   r>   r   )rX   Ztransform_n_nonzero_coefsr4   r   r   ry   )	r   r5   r6   r8   r#   rL   lenZflatnonzeror~   r   r0   r0   r1    test_dict_learning_nonzero_coefs   s   r   c                  C   s   d} t | ddd}|tt}||}d|_|t}t|d d d | f |d d | d f  | ||}t|| d S )Nr   r   r   )rX   r4   T)r   r5   r6   r8   r}   Z
split_signr   )r,   r:   r/   XrZ
split_codeZXr2r0   r0   r1   test_dict_learning_split  s   

(
r   c               	   C   s   t jd} d}tt|ddd| dd\}}|jt|fksJ |j|tfks'J t ||jtjks3J tt|ddd| dd}|j|tfksGJ d S )	Nr   r   rV   r   rl   T)r,   
batch_sizemax_itermethodr4   Zreturn_codeF)	r#   r$   r%   r   r6   r*   r-   r)   r|   )r+   r,   r/   r.   r0   r0   r1    test_dict_learning_online_shapes"  s0   
		r   c                  C   sH   d} t jt| d ttdddd W d    d S 1 sw   Y  d S )Nrb   rc   rV   r   T)r   r   rf   )r[   rg   rh   r   r6   )ri   r0   r0   r1   1test_dict_learning_online_lars_positive_parameter?  s   "r   c              
   C   s   d}t |dd| d||ddt}|t}|r"|jdk s!J n	|jdk  s+J |r7|dk s5J d S |dk  s?J d S )Nr   rV   r   r   rl   )r   r   rX   r4   rf   rk   rm   )r   r5   r6   r8   r7   rn   ro   rp   r0   r0   r1   -test_minibatch_dictionary_learning_positivityE  s(   	
r   c              	   C   sP   d}t |dddd| ddt}| r|jdk sJ d S |jdk  s&J d S )Nr   rV   r   r   r   rl   )r   r   rX   r4   rk   rm   )r   r5   r6   r7   rn   ro   rr   r0   r0   r1   'test_minibatch_dictionary_learning_larsi  s   
r   c              
   C   s~   t jd}d}tt|ddd||| d\}}|r!|dk s J n|dk  s)J | r5|dk s3J d S |dk  s=J d S )Nr   r   rV   rl   r   )r,   r   r   re   r4   rk   rf   )r#   r$   r%   r   r6   rn   ro   )rf   rk   r+   r,   r/   r.   r0   r0   r1   $test_dict_learning_online_positivity}  s$   

r   c                  C   s   d} dd l }ddlm} |j}zI| |_t| dddddd}|t t| dddddd	}|t t| ddddd
}|t tt| ddddd tt| ddddd W ||_n||_w |jj	| t
fksgJ d S )Nr   r   )StringIOrV   r   皙?)r   r   verbosetolr4   r    )r   r   r   max_no_improvementr4   )r   r   r   r4   )r,   r   re   r   r4   )sysior   stdoutr   r5   r6   r   r7   r*   r)   )r,   r   r   Z
old_stdoutr:   r0   r0   r1   #test_dict_learning_online_verbosity  sR   



	r   c                  C   s6   d} t | dddd}|t |jj| tfksJ d S )Nr   rV   r   r   r   r4   r   r5   r6   r7   r*   r)   r9   r0   r0   r1   *test_dict_learning_online_estimator_shapes  s   
r   c                  C   s2   d} t | ddddt}|jj| tfksJ d S )Nr<   rV   r   r   r   r   r9   r0   r0   r1   &test_dict_learning_online_overcomplete  s   r   c                  C   sD   d} t jd}|| t}t| dd|ddt}t|j	| d S )Nr<   r   rV   )r   r   	dict_initr4   )
r#   r$   r%   r(   r)   r   r5   r6   r   r7   )r,   r+   Vr:   r0   r0   r1   (test_dict_learning_online_initialization  s   
r   c                  C   sF   d} t jd}|| t}|jdd t| dd|dddt d S )Nr<   r   F)writerV   r   )r   r   r   r4   shuffle)	r#   r$   r%   r(   r)   Zsetflagsr   r5   r6   )r,   r+   r   r0   r0   r1   1test_dict_learning_online_readonly_initialization  s   r   c                  C   s   d} t jd}|| t}|t j|d ddd d t jf  }t| dddd|d ddd		t	}t| d|dd
}t
dD ]}t	D ]}||t jd d f  q@q<t tt	|jdddkr_J t|j|jdd |j|j  krudksxJ  J d S )Nr<   r   r    r   rH   r   F        )r   r   re   r   r   r   r   r4   )re   r   r4   re   rz   rT   )r#   r$   r%   r(   r)   rK   rL   r   r5   r6   rangeZpartial_fitrn   r	   r7   r   Zn_steps_)r,   r+   r   Zdict1Zdict2rN   sampler0   r0   r1   %test_dict_learning_online_partial_fit  s6   $
$r   c                  C   sn   d} t jd}|| t}|t j|d ddd d t jf  }dD ]}tt||d}|j	t
| fks4J q"d S )Nr<   r   r    r   rH   r   r   r   r   r   r!   )r#   r$   r%   r(   r)   rK   rL   r	   r6   r*   r-   )r,   r+   r   algor/   r0   r0   r1   test_sparse_encode_shapes  s   $r   r   positivec                 C   s|   d}t jd}||t}|t j|d ddd d t jf  }tt|| |d}|r4|dk	 s2J d S |dk 
 s<J d S )Nr<   r   r    r   rH   r!   r   )r#   r$   r%   r(   r)   rK   rL   r	   r6   rn   ro   )r   r   r,   r+   r   r/   r0   r0   r1   test_sparse_encode_positivity  s   $r   r   r   c                 C   s   d}t jd}||t}|t j|d ddd d t jf  }d}|| }tj	t
|d tt|| dd	 W d    d S 1 sBw   Y  d S )
Nr<   r   r    r   rH   rt   rc   Tr   )r#   r$   r%   r(   r)   rK   rL   ru   r[   rg   rh   r	   r6   )r   r,   r+   r   ri   r0   r0   r1   )test_sparse_encode_unavailable_positivity,  s   $
"r   c                  C   s   d} t jd}|| t}|t j|d ddd d t jf  }ttdd}dD ]}t	t||d	}t	|||d	}t
|| q(d S )
NrT   r   r    r   rH   F)orderr   r   )r#   r$   r%   r(   r)   rK   rL   r   r6   r	   r   )r,   r+   r   ZXfr   abr0   r0   r1   test_sparse_encode_input8  s   $r   c                  C   s   d} t jd}|| t}|t j|d ddd d t jf  }tt|dd}t 	|dkr0J t 
t t ||t d dk sDJ d S )	Nr<   r   r    r   rH   rw   r   r   )r#   r$   r%   r(   r)   rK   rL   r	   r6   rn   r@   r|   )r,   r+   r   r/   r0   r0   r1   test_sparse_encode_errorD  s   $,r   c                  C   sJ   t jd} | dd}| dd}tt||dd d}|jdks#J d S )Nr   rT   @   r    r   )r!   Zn_nonzero_coefs)rT   r    )r#   r$   r%   r(   r   r	   r*   )r+   r6   rM   r/   r0   r0   r1   )test_sparse_encode_error_default_sparsityN  s
   r   c                  C   s   d} t jd}|| t}|t j|d ddd d t jf  }t|ddd}|t	}|
|}t |dkr:J t t t ||t	 d d	k sNJ t j|t || d S )
Nr<   r   r    r   rH   r   rw   r.   rX   rx   r   )r#   r$   r%   r(   r)   rK   rL   r   r\   r6   r}   rn   r@   r|   testingr   )r,   r+   r   coderr/   r   r0   r0   r1   test_sparse_coder_estimatorV  s   $

(r   c                  C   s   d} t jd}|| t}|t j|d ddd d t jf  }t|ddd}t|}t	|t	|ks5J t j
|j|j t	|jt	|jksJJ |j|jksRJ |j|jksZJ t jttt j}t j
|||| d S )	Nr<   r   r    r   rH   r   rw   r   )r#   r$   r%   r(   r)   rK   rL   r   r   idr   r   r.   Zn_components_n_features_in_randr-   astypefloat32r8   )r,   r+   r   r   Zcloneddatar0   r0   r1   !test_sparse_coder_estimator_clonee  s   $r   c                  C   sb   t jd} d\}}| ||}tdd|  }t j||t j}t|ddd}|| d S )N	  )(   r   g    >ArV   r   r    )rX   r"   )	r#   r$   r%   r   intr   r   r   r\   )r+   r,   r)   	init_dictr-   r   scr0   r0   r1   test_sparse_coder_parallel_mmapw  s   r   c                  C   sp   t jd} d\}}| ||}t|}t|jj| t|jj| t	tdd}||jj| t
|jj| d S )Nr   )r   r>   T)Zreadonly_memmap)r#   r$   r%   r   r   r   	__class____name__r   r   r   )r+   r,   r)   r   r   Z check_transformer_general_memmapr0   r0   r1   $test_sparse_coder_common_transformer  s   r   c                  C   s6   t g dg dg} t| }|j| jd ksJ d S )N)r   r    r>   r   )r#   arrayr   r   r*   )dr   r0   r0   r1   test_sparse_coder_n_features_in  s   r   c                  C   s   t jd} t ddgddgg}t ddgdd	gg}t ||| d
d
 }| }t||| t |j|}t |j|}| }t||||| t	|| d S )Nr   g      ?g      r   g?g      ?r   g333333?g?r    )
r#   r$   r%   r   r|   r(   copyr
   Tr   )r+   r/   r.   r6   Z
newd_batchABZnewd_onliner0   r0   r1   test_update_dict  s   r   r!   )r   r   r   r   r   	data_typec                 C   sH   d}t jd}||t}tt| || |d}|j| ks"J d S )N   r   r   )	r#   r$   r%   r(   r)   r	   r6   r   dtype)r   r!   r,   r+   r.   r/   r0   r0   r1   test_sparse_encode_dtype_match  s   r   c                 C   sn   d}d}t jd}||t}ttt j|t j| d}ttt j	|t j	| d}t
|||d d S )N-C6?r   r   r   rtol)r#   r$   r%   r(   r)   r	   r6   r   r   float64r   )r!   r   r,   r+   r.   Zcode_32Zcode_64r0   r0   r1   (test_sparse_encode_numerical_consistency  s   r   c                 C   sP   d}t jd}||t}t|| |d}|t| }|j	| ks&J d S )Nr   r   ry   )
r#   r$   r%   r(   r)   r   r   r8   r6   r   )r   rX   r,   r+   r.   r   r/   r0   r0   r1   test_sparse_coder_dtype_match  s   
r   rm   )r   rl   zdata_type, expected_typec                 C   sN   t d||dd}|t|  |jj|ksJ |t| j|ks%J d S )Nr   r   )r,   rm   rX   r4   )r   r5   r6   r   r7   r   r8   r   expected_typerm   rX   dict_learnerr0   r0   r1   $test_dictionary_learning_dtype_match  s   r   c              	   C   st   t dd||dddd}|t|  |jj|ksJ |t| j|ks(J |jj|ks0J |jj|ks8J d S )Nr   r   rT   r   r   )r,   r   rm   rX   r   r   r4   )	r   r5   r6   r   r7   r   r8   Z_AZ_Br   r0   r0   r1   .test_minibatch_dictionary_learning_dtype_match
  s   	r   r   c                 C   sN   t jd}d}tt| |d||d\}}}|j|ksJ |j|ks%J d S )Nr   r   r   r,   re   r4   r   )r#   r$   r%   r   r6   r   r   )r   r   r   r+   r,   r/   r.   _r0   r0   r1   test_dict_learning_dtype_match/  s   r   c           	      C   s   d}d}d}t ttj||d| d\}}}t ttj||d| d\}}}tt||t|||d ttt	|tt	||d tt|d t|d |d t
|dkdksdJ t|dkt|dkkstJ d S )	Ngư>rV   r    r   r   r   r   皙?)r   r6   r   r#   r   r   r   matmulrK   absmeancount_nonzero)	r   r   r,   re   U_64V_64r   U_32V_32r0   r0   r1   (test_dict_learning_numerical_consistencyH  s,   

&"$r   c                 C   sN   t jd}d}tt| |dd||d\}}|j|ksJ |j|ks%J d S )Nr   r   r   r   )r,   re   r   r4   r   )r#   r$   r%   r   r6   r   r   )r   r   r   r+   r,   r/   r.   r0   r0   r1   %test_dict_learning_online_dtype_matchl  s   
r   c                 C   s   d}d}d}t ttj|d|dd| dd d	\}}t ttj|d|dd| dd d	\}}tt||t|||d	 ttt	|tt	||d	 tt|d
 t|d
 |d	 t
|dkdksjJ t|dkt|dkkszJ d S )Nr   rV   r   rU   r   r   r   )r,   r   re   r   r4   r   r   r   r   r    r   )r   r6   r   r#   r   r   r   r   rK   r   r   r   )r   r   r,   re   r   r   r   r   r0   r0   r1   /test_dict_learning_online_numerical_consistency  s<   



&"$r   	estimatorrV   r   )r   r   c                 C   s   | j jS )N)r   r   )rF   r0   r0   r1   <lambda>  s    r   )Zidsc                    sH   |  t tjd }|  }| jj  t| fddt|D  dS )z1Check feature names for dict learning estimators.r   c                    s   g | ]}  | qS r0   r0   )rP   rN   Zestimator_namer0   r1   
<listcomp>  s    z.test_get_feature_names_out.<locals>.<listcomp>N)	r5   r6   r*   Zget_feature_names_outr   r   lowerr   r   )r   r,   Zfeature_names_outr0   r   r1   test_get_feature_names_out  s   

r   c                 C   sT   |  tjjdttdd tjd}|	dd}t
ddddd	d
d}|| d S )Nr   rT   )Z
max_nbytesr   r   r   r    rl   rS   T)r,   r4   r"   rm   r   r   )setattrsklearndecompositionZ_dict_learningr   r   r#   r$   r%   r(   r   r5   )Zmonkeypatchr+   ZX_trainr   r0   r0   r1   %test_cd_work_on_joblib_memmapped_data  s    

r   )`r&   r]   	functoolsr   numpyr#   r[   r   Zsklearn.baser   Zsklearn.decompositionr   r   r   r   r   r	   Z$sklearn.decomposition._dict_learningr
   Zsklearn.exceptionsr   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r   r   r   Zsklearn.utils.estimator_checksr   r   r   Zsklearn.utils.parallelr   r$   r%   Z
rng_globalr-   r)   r(   r6   r2   r;   r=   ra   rj   markZparametrizerq   rs   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zint32Zint64r   r   r   r   r   r   r   r   r   r0   r0   r0   r1   <module>   s$    9

5	









	



	



	
#



	
+

	