o
    id                     @   sf  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mZ d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZmZ d d
lmZ d dlmZ e Zdd Z dd Z!dd Z"dd Z#dd Z$						dAddZ%							 dBddZ&dCddZ'dd  Z(d!d" Z)ej*+d#ej*,d$ed%d& Z-ej*+d#ej*,d$ed'd( Z.ej*+d#ej*,d$ed)d* Z/d+d, Z0ej*,d-e1d.ej*,d$ed/d0 Z2ej*+d#ej*,d$ed1d2 Z3ej*+d#ej*,d$ed3d4 Z4ej*,d$ed5d6 Z5ej*+d#ej*,d$ed7d8 Z6d9d: Z7d;d< Z8ej*,d=dd>gd?d@ Z9dS )D    N)clone)	load_iris
make_blobsmake_classification)LogisticRegressionRidge)get_auto_step_size)OneVsRestClassifier)LabelEncoder)check_random_statecompute_class_weight)assert_allcloseassert_almost_equalassert_array_almost_equal)	row_norms)CSR_CONTAINERSc                 C   sD   | | }|dkrt | |  S |dk r| S | t |d  S )Ng      2@g      2      ?)mathexp)pyz r   ]/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/linear_model/tests/test_sag.py	log_dloss   s   r   c              	   C   s    t t dt | |   S )Nr   )npmeanlogr   r   r   r   r   r   log_loss'   s    r   c                 C   s   | | S )Nr   r   r   r   r   squared_dloss,   s   r    c                 C   s   t d| |  | |  S )N      ?)r   r   r   r   r   r   squared_loss0   s   r"   c                 C   s8   |   } t|| }|||}||| |  d 7 }|S )N       @)ravelr   dot)walphaZmyXZmyyZlosspredr   r   r   r   get_pobj5   s
   
r)      FTc
                 C   s  | j d | j d }
}t| j d }t| j d }t|
|f}d}d}t|
}tjd}d}t }|r:d}t|D ]}t|
D ]}t| |
 }| | }|	| t
||| }|||| }|d urp||| 9 }|| ||  }|||  }||7 }|||< |	r||| ddt|   8 }|r|||  }|||< ||7 }||ddt|   9 }|	r||| t| | | 8 }n||| t| | 8 }||| t| 8 }qDq>||fS )Nr   r*           M   r   {Gz?)shaper   zerosrandomRandomStatesetrangeintrandaddr%   len)Xr   	step_sizer'   n_iterdlosssparsesample_weightfit_interceptsaga	n_samples
n_featuresweightssum_gradientgradient_memory	interceptintercept_sum_gradientZintercept_gradient_memoryrngdecayseenepochkidxentryr   gradientupdategradient_correctionr   r   r   sag=   sR   

rQ   c           "      C   s  || dkr
t d| jd | jd }}t|}t|}tj|td}t|}t|
}d}d}d}d}t }t|| }|rEd}d}t|D ]X}t|D ]P}t| | }| | }|	| |dkrt|D ]5}|| dkr||  ||d  ||  8  < n||  ||d  ||| d   ||  8  < |||< qn|t
|| | }|||| }|d ur||| 9 }|| } | || |  }!||!7 }|	rt|D ]}||  |!| | ddt|   | 8  < q|r%|||  }!||!7 }|!|ddt|   9 }!|	r||| t| | |! 8 }n||| t| | 8 }|||< |d||  9 }|dkrA||t|  |d< n||d  ||t|   ||< |dkr|dk rt|D ]5}|| dkrw||  || ||  8  < n||  || ||| d   ||  8  < |d ||< q_d||< ||9 }d}|d7 }qRqKt|D ]4}|| dkr||  ||d  ||  8  < q||  ||d  ||| d   ||  8  < q||9 }||fS )	Nr   z:Sparse sag does not handle the case step_size * alpha == 1r   r*   Zdtyper+   r-   g&.>)ZeroDivisionErrorr.   r   r/   r4   r   r2   r3   r5   r6   r%   r7   )"r8   r   r9   r'   r:   r;   r=   r<   r>   r?   random_stater@   rA   rB   rC   Zlast_updatedrD   rG   rE   rF   ZwscalerH   rI   Zc_sumZcounterrJ   rK   rL   rM   jr   rN   rO   rP   r   r   r   
sag_sparse}   s   



"

 
D$rV   c                 C   sP   |rdt t j| |  dd| d|   S dt t j| |  dd| |  S )N      @r*   )Zaxisr   )r   maxsum)r8   r'   r>   classificationr   r   r   get_step_size   s   ($r[   c                  C   s,  d} t | dddd\}}d}d}t|||}dD ]{}|d	kr!d
}nd}t||dd| |  |dd}||| t|d| d |||t||dkd\}	}
t|d| d |||t||dkd\}}t|	}	t	|
}
t|}t	|}t
|	|jdd t
|
|jdd t
||jdd t
||jdd qd S )N      r   皙?r@   ZcentersrT   Zcluster_stdg?T)rQ   r?   rQ   P   ,  dy=r   
   solverr>   tolCmax_iterrT   r*   r?   )r:   r;   r>   r?   	   decimal)r   r[   r   fitrV   r   rQ   r   Z
atleast_2dZ
atleast_1dr   coef_
intercept_)r@   r8   r   r'   r>   r9   re   r:   clfrB   rE   weights2
intercept2r   r   r   test_classifier_matching   s^   










rr   c               	   C   s   d} d}t jd}|j| |fd}|j|d}||}d}d}d}t|||dd}	t|d	d
||  |d}
|
|| t|||	||t	|d\}}t
|||	||t	|d\}}t||
j t||
j t||
j t||
j d S )Nrc      sizer   d   TFrZ   rb   rQ   )r>   rf   re   r'   rh   r:   r;   r>   )r   r0   r1   normalr%   r[   r   rl   rV   r    rQ   r   rm   rn   )r@   rA   rG   r8   true_wr   r'   r:   r>   r9   ro   Zweights1
intercept1rp   rq   r   r   r   test_regressor_matching/  sP   

	

r|   zignore:The max_iter was reachedcsr_containerc                 C   s   d}d}d}t |dddd\}}tdd	d
d| | |dd}t|}td	d
d| | |dd}||| || || ||| t|j|||t}	t|j|||t}
t|j|||t}t|	|
dd t|
|dd t||	dd dS )z%tests if the sag pobj matches log regrv   r   r\   r]   r   r^   r_   rQ   FgHz>rc   rd   )r>   rf   rg   rh   rT      rj   N)r   r   r   rl   r)   rm   r   r   )r}   r@   r'   rh   r8   r   clf1clf2clf3pobj1pobj2pobj3r   r   r   )test_sag_pobj_matches_logistic_regression_  s:   

r   c                 C   s  d}d}d}d}d}t jd}|j||fd}|j|d}||}	t|dd||dd	}
t|
}t|d
d||dd	}|
||	 || ||	 |||	 t|
j	|||	t
}t|j	|||	t
}t|j	|||	t
}t||dd t||dd t||dd dS )z'tests if the sag pobj matches ridge regrv   rc   r   Frt   rb   rQ   *   r>   rf   re   r'   rh   rT   h㈵>Zlsqrr~   rj   N)r   r0   r1   ry   r%   r   r   rl   r)   rm   r"   r   )r}   r@   rA   r'   r:   r>   rG   r8   rz   r   r   r   r   r   r   r   r   r   r   &test_sag_pobj_matches_ridge_regression  sF   
	r   c                 C   s  d}d}d}d}d}d}t jd}|j||fd}|j|d}	t ||	d	 }
t|||d
d}t||d|| ||d}t|}|||
 || ||
 t	||
|||t
||d\}}t	||
|||t
d||d	\}}t|j | dd t|j|dd dS )z0tests if the sag regressor is computed correctlyr^   rc   (   rv   gư>Tr   rt   r#   Frw   rQ   r   )r:   r;   r>   rT   )r:   r;   r<   r>   rT      rj   r*   N)r   r0   r1   ry   r%   r[   r   r   rl   rV   r    r   rm   r$   r   rn   )r}   r'   rA   r@   rh   rf   r>   rG   r8   r&   r   r9   r   r   
spweights1spintercept1
spweights2spintercept2r   r   r   %test_sag_regressor_computed_correctly  sZ   

r   c               
   C   s  t jg dg dg dgt jd} d}d}d}t| dd	 }| jd
 }t||dd dD ]x}dD ]s}|rl|| t| }|d|  t| d }td| | |}	td| | |}
dd| |	  }dd| |
  }nd|| t|  }d|d|  t|  }t	||d|||d}t	||d|||d}t||dd t||dd q1q-d}t
jt|d t	||d| W d    d S 1 sw   Y  d S )N)r*   r]   r   )r]   r   r~   )r]   r   r]   rR   g333333?F   T)squaredr   r~   rj   )TFrW   r]   r*   r   r   )r@   Zis_sagar   z:Unknown loss function for SAG solver, got wrong instead ofmatchZwrong)r   arrayZfloat64r   rX   r.   r   r4   minr   pytestraises
ValueError)r8   r'   r>   Zmax_squared_sumZmax_squared_sum_r@   r?   ZL_sqrZL_logZmun_sqrZmun_logZstep_size_sqrZstep_size_logZstep_size_sqr_Zstep_size_log_msgr   r   r   test_get_auto_step_size  sV   "
	""r   seedr   c                 C   s8  d\}}d}d}d}d}t j| }t ||||d}	d|	  }
t|d||| |d	}t|}||	|
 |||	|
 |	|	|
}|	|	|
}|d
ksRJ |d
ksXJ d|	  |
|d  }
t|d||| d}t|}||	|
 |||	|
 |	|	|
}|	|	|
}|dksJ |dksJ dS )z(tests if the sag regressor performs well)rs   ra   gMbP?rv   r^   r*   r!   rQ   )rf   re   rh   r'   rT   g\(\?)rf   re   rh   r'   ?N)r   r0   r1   ZlinspaceZreshaper$   r   r   rl   ZscoreZrandn)r   r}   ZxminZxmaxr@   rf   rh   r'   rG   r8   r   r   r   Zscore1Zscore2r   r   r   test_sag_regressor#  s>   r   c              
   C   s*  d}d}d}d}d}t |dddd\}}t|||dd}t|}	t|}
d	|
||	d
 k< |
}tdd| | ||d|d}t|}||| || || t|||||t	|d\}}t|||||t	d|d\}}t
|j | dd t|j|d
d t
|j | dd t|j|d
d dS )z4tests if the binary classifier is computed correctlyr^   2   r   Tr]   r   r_   rw   r*   rQ   r   r,   re   rg   rh   rf   rT   r>   rx   )r:   r;   r<   r>   rj   N)r   r[   r   uniqueonesr   r   rl   rV   r   r   rm   r$   r   rn   )r}   r'   r@   r:   rf   r>   r8   r   r9   classesy_tmpr   r   	spweightsspinterceptr   r   r   r   r   &test_sag_classifier_computed_correctlyN  sZ   



	
r   c                 C   s  d}d}d}d}d}t |dddd\}}t|||dd	}t|}	ttd
d| | ||d|d}
t|
}|
|| || || g }g }g }g }|	D ]<}t|}d|||k< t	||||t
||d\}}t	||||t
|d|d\}}|| || || || qMt|}t|}t|}t|}t|	D ]<\}}t|
j| j || dd t|
j| j|| dd t|j| j || dd t|j| j|| dd qdS )z8tests if the multiclass classifier is computed correctlyr^   r\   r   F   Tr   r   r_   rw   rQ   r   r,   r   r   )r;   r:   r>   )r;   r:   r<   r>   r-   )Zrtolr!   N)r   r[   r   r   r	   r   r   rl   r   rV   r   appendZvstackr   	enumerater   Zestimators_rm   r$   rn   )r}   r'   r@   rf   rh   r>   r8   r   r9   r   r   r   Zcoef1r{   Zcoef2rq   clZ	y_encodedr   r   r   r   ir   r   r   &test_sag_multiclass_computed_correctly  sz   




	








r   c                 C   s   d}d}d}d}d}t jd}|j||fd}|j|d}t ||}	t |	}	tdd	| | ||d
d}
t|
}|
||	 || ||	 |
	|}|	|}t
||	dd t
||	dd dS )z(tests if classifier results match targetr^   r\   rc   r-      r   rt   rQ   r   r,   )re   rg   rh   rf   rT      rj   N)r   r0   r1   ry   r%   signr   r   rl   Zpredictr   )r}   r'   rA   r@   rf   rh   rG   r8   r&   r   r   r   Zpred1Zpred2r   r   r   test_classifier_results  s0   



r   c                 C   sb  d}d}d}d}d}t |dddd\}}t|||dd	}t|}	t|}
d
|
||	d k< |
}ddd}tdd| | ||d||d}t|}||| || || t }t	|t||d}||
| }t|||||t||d\}}t|||||td||d	\}}t|j | dd t|j|dd t|j | dd t|j|dd dS )z8tests binary classifier with classweights for each classr^   r   r\   r   Tr]   rc   r_   rw   r   r*   r   g?)r*   r   rQ   r   r,   )re   rg   rh   rf   rT   r>   class_weight)r   r   )r:   r;   r=   r>   )r:   r;   r<   r=   r>   rj   N)r   r[   r   r   r   r   r   rl   r
   r   Zfit_transformrV   r   r   rm   r$   r   rn   )r}   r'   r@   r:   rf   r>   r8   r   r9   r   r   r   r   r   leZclass_weight_r=   r   r   r   r   r   r   r   #test_binary_classifier_class_weight  sh   



	


r   c                  C   sb   ddgddgg} ddg}d}t jt|d tdd| | W d	   d	S 1 s*w   Y  d	S )
z1tests if ValueError is thrown with only one classr*   r]   r   r~   z;This solver needs samples of at least 2 classes in the datar   rQ   )re   N)r   r   r   r   rl   )r8   r   r   r   r   r   test_classifier_single_class.  s   "r   c                  C   s   ddgddgg} ddg}d}d}t d}tdd| |d}tjt|d	 || | W d    n1 s6w   Y  t|d|d
}tjt|d	 || | W d    d S 1 s[w   Y  d S )Nr   r*   r   Fr   zQCurrent sag implementation does not handle the case step_size * alpha_scaled == 1rQ   )re   rg   r>   r   )r>   re   r'   )reescaper   r   r   rS   rl   r   )r8   r   r>   r'   r   r   r   r   r   r   test_step_size_alpha_error8  s   "r   re   r?   c                 C   s   t jd}t|d\}}t| |dd}||| t j|jd d < tj	t
dd ||| W d    d S 1 s;w   Y  d S )Nr   )rT   T)re   rT   Z
warm_startzFloating-point under-/overflowr   )r   r0   r1   r   r   rl   nanrm   r   r   r   )re   rG   r8   r   ro   r   r   r    test_sag_classifier_raises_errorK  s   "r   )r*   NFNTF)r*   NNFTFr   )T):r   r   numpyr   r   Zsklearn.baser   Zsklearn.datasetsr   r   r   Zsklearn.linear_modelr   r   Zsklearn.linear_model._sagr   Zsklearn.multiclassr	   Zsklearn.preprocessingr
   Zsklearn.utilsr   r   Zsklearn.utils._testingr   r   r   Zsklearn.utils.extmathr   Zsklearn.utils.fixesr   Zirisr   r   r    r"   r)   rQ   rV   r[   rr   r|   markfilterwarningsZparametrizer   r   r   r   r3   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   

E

u6
0
%
+<2
)
6I

=
