U
    9%eq                     @   s  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 d dlmZmZ d dlmZmZmZmZmZ d dlmZmZmZmZ eeeegZeeg ZdZejde d	Ze d
dgddgdd
gddgddgddggZ!e ddddddgZ"dd Z#dd Z$dd Z%dd Z&dd Z'dd Z(dd Z)dd Z*dd Z+d d! Z,d"d# Z-d$d% Z.d&d' Z/d(d) Z0ej1d*ed+d, Z2ej1d*ed-d. Z3ej1d/ed0d1 Z4d2d3 Z5ej1d*ed4d5 Z6ej1d*ed6d7 Z7ej1d*ed8d9 Z8ej1d*ed:d; Z9ej1d*eej1d<d=d>gej1d?d=d>gd@dA Z:ej1dBdCdDdE Z;dFdG Z<dHdI Z=dJdK Z>dLdM Z?dNdO Z@ej1dPdQe dd d gddd gge ddd gddd gge d dgge dQdQgfdQdRge dd d gddd gge ddd d gddd d gge d dQgge dQdRgfde dd gddgge ddgddgge d dgge ddgggdSdT ZAej1dUdQdgddRggdVfgdWdX ZBdYdZ ZCd[d\ ZDd]d^ ZEej1d_eej1d`ddadbgdcgddde ZFdfdg ZGej1d_edhdi ZHdS )j    N)	logsumexp)load_digits	load_iris)cross_val_scoretrain_test_split)BernoulliNBCategoricalNBComplementNB
GaussianNBMultinomialNB)assert_allcloseassert_almost_equalassert_array_almost_equalassert_array_equalz/The default value for `force_alpha` will changezignore:z:FutureWarning      c                 C   s6   t j| }|jdd}|jdddkt}||fS )N)
      sizer   r   )nprandomRandomStatenormalastypeint)global_random_seedrngX1y1 r"   ]/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sklearn/tests/test_naive_bayes.pyget_random_normal_x_binary_y$   s    r$   c                 C   s8   t j| }|jddd}t ddddddg}||fS )N   )   d   r   r   r   r   )r   r   r   randintarray)r   r   X2y2r"   r"   r#   $get_random_integer_x_three_classes_y,   s    r,   c               	   C   s|   t  } | ttt}t|t | t}| t}tt	
||d tjtdd t  jttddgd W 5 Q R X d S )N   z;The target label.* in y do not exist in the initial classesmatchr   r   classes)r
   fitXypredictr   predict_probapredict_log_probar   r   logpytestraises
ValueErrorpartial_fit)clfy_predy_pred_probay_pred_log_probar"   r"   r#   test_gnb5   s    


 rA   c                 C   sX   t  tt}ttddgd |jd t| \}}t  ||}t|j	 d d S )Nr         @r-   r   )
r
   r2   r3   r4   r   r   r)   class_prior_r$   sum)r   r=   r    r!   r"   r"   r#   test_gnb_priorK   s
    rE   c           
      C   sN  t d}t tt}t tt|}t|j|j t|j|j t j	
| }|tjd }t jtt|d}t jttddg|d d}|jtt|d d t|j|j t|j|j |dtjd d}t j|tjd d}t t| t| }	t tt|}t|	j|j t|	j|j tdkt j}t jtt|d}d	S )
z5Test whether sample weights are properly used in GNB.r&   r   sample_weightr   r   r1   rG      )Z	minlengthN)r   Zonesr
   r2   r3   r4   r   theta_var_r   r   Zrandshaper<   r(   Zbincountr   float64)
r   swr=   Zclf_swr   clf1clf2indrG   Zclf_duplr"   r"   r#   test_gnb_sample_weightU   s(    
rR   c               	   C   sB   t tddgd} d}tjt|d | tt W 5 Q R X dS )z:Test whether an error is raised in case of negative priorsg             @priorszPriors must be non-negativer.   N	r
   r   r)   r9   r:   r;   r2   r3   r4   r=   msgr"   r"   r#   test_gnb_neg_priors|   s    rY   c                  C   sZ   t tddgdtt} t| ddggtddggd t| jtddg dS )	z6Test whether the class prior override is properly used333333?gffffff?rT   皙g[9h?gs\?r-   N)	r
   r   r)   r2   r3   r4   r   r6   rC   r=   r"   r"   r#   test_gnb_priors   s    r]   c                  C   s   t ddgddgddgddgddgddgddgddgd	d	gd
d
gg
} t ddddddddddg
}t dddd	d
dddddg
}t|d}|| | d S )Nr   r   r   r   r      r%   g{Gz?gQ?gQ?g{Gz?g)\(?gQ?        r&      r-   	   r   rT   )r   r)   r
   r2   )r3   rU   Yr=   r"   r"   r#   test_gnb_priors_sum_isclose   s"    
rf   c               	   C   sF   t tddddgd} d}tjt|d | tt W 5 Q R X dS )z`Test whether an error is raised if the number of prior is different
    from the number of class      ?rT   -Number of priors must match number of classesr.   NrV   rW   r"   r"   r#   test_gnb_wrong_nb_priors   s    ri   c               	   C   sB   t tddgd} d}tjt|d | tt W 5 Q R X dS )z?Test if an error is raised if the sum of prior greater than onerS         ?rT   z!The sum of the priors should be 1r.   NrV   rW   r"   r"   r#   test_gnb_prior_greater_one   s    rk   c                  C   sD   t tddgd} | tt | ddggtdgks@tdS )z@Test if good prediction when class prior favor largely one classg{Gz?gGz?rT   r[   r   N)r
   r   r)   r2   r3   r4   r5   AssertionErrorr\   r"   r"   r#   test_gnb_prior_large_bias   s    rm   c                  C   sP   d} d}d}t dtjd f}t| |||\}}||ks@t||ksLtdS )z4Test when the partial fit is called without any datar'   rb   rj   r   r   N)r   emptyr3   rL   r
   Z_update_mean_variancerl   )Zprev_pointsmeanvarZx_emptyZtmeantvarr"   r"   r#   "test_gnb_check_update_with_no_data   s    rr   c                  C   s   t  tt} t  tttt}t| j|j t| j	|j	 t| j
|j
 t  tdd dd d f tdd d tt}|tdd d tdd d  t| j|j t| j	|j	 t| j
|j
 d S )Nr   r   r   )r
   r2   r3   r4   r<   r   uniquer   rJ   rK   rC   )r=   Zclf_pfZclf_pf2r"   r"   r#   test_gnb_partial_fit   s    2 rt   c                     sP   t  } | j| j   fdddD }t|d |d  t|d |d  d S )Nc                    s(   g | ] }t  |  |  qS r"   )r
   r2   r5   ).0fr3   r4   r"   r#   
<listcomp>   s     z9test_gnb_naive_bayes_scale_invariance.<locals>.<listcomp>)绽|=r   g    _Br   r   r   )r   datatargetr   )irislabelsr"   rw   r#   %test_gnb_naive_bayes_scale_invariance   s
    r~   DiscreteNaiveBayesc                 C   sB   t |\}}|  ||}tttdddgd |jd d S )Nr   rB   r-   )r,   r2   r   r   r8   r)   class_log_prior_)r   r   r*   r+   r=   r"   r"   r#   test_discretenb_prior   s      r   c                 C   s  |  }| ddgddgddggdddg |  }|jddgddgddggdddgddgd t|j|j | tkrtt|jD ]}t|j| |j|  qnt|j|j |  }|jddggdgddgd |ddggdg |ddggdg t|j|j | tkrtt|jD ]J}t|j| j	|j| j	 tt
j|j| ddt
j|j| dd qt|jd d t
ddg t|jd d t
ddg t|jd d t
ddg t|jd d t
ddg nt|j|j d S )Nr   r   r0   Zaxisr   )r2   r<   r   class_count_r   rangelencategory_count_feature_count_rL   r   rD   r)   )r   rO   rP   iclf3r"   r"   r#   test_discretenb_partial_fit   s:    $,

 
 r   
NaiveBayesc              	   C   s   t |\}}tjtdd |  || W 5 Q R X |  }|j||t|d tjtdd |j||tdd W 5 Q R X d S )Nz8classes must be passed on the first call to partial_fit.r.   r0   .is not the same as on last call to partial_fit*   )r,   r9   r:   r;   r<   r   rs   Zarange)r   r   r*   r+   r=   r"   r"   r#   $test_NB_partial_fit_no_first_classes   s      r   c                  C   s  dddgdddgdddgg} ddgddgddgg}dddg}t ttg| |gD ]v\}}| ||}||dd  dks~t||d gjdkstt||d d j	dd	t
d
d
gd qNdddg}t ttg| |gD ]\}}| ||}||dd jdkst||d d jdks4ttt
	||d gd tt
	||d gd tt
	t
|jd qd S )Nr   r'   r   r   ra   r   r   )r   r   r   rj   r&   )r   r   )r   r   )zipr   r   r2   r5   rl   r6   rL   r   rD   r   r)   r   expr   )ZX_bernoulliZX_multinomialr4   r   r3   r=   r"   r"   r#   test_discretenb_predict_proba3  s4    
   
 r   c                 C   sT   |  }|j dd |dgdgdggdddg t|j}t|tddg d S )NF)	fit_priorr   r         ?)Z
set_paramsr2   r   r   r   r   r)   )r   r=   priorr"   r"   r#   test_discretenb_uniform_priorT  s
    r   c              	   C   s   | ddgd}| dgdgdggdddg t|j}t|tddg d}tjt|d$ | dgdgdggdddg W 5 Q R X d}tjt|d( |j	dgdggddgdddgd	 W 5 Q R X d S )
Nr   class_priorr   r   rh   r.   r   r   r0   )
r2   r   r   r   r   r)   r9   r:   r;   r<   )r   r=   r   rX   r"   r"   r#   test_discretenb_provide_prior`  s    (r   c           	      C   s   t  }t|j|jddd\}}}}d dddgfD ]X}| |d}||j|j | |d}|j||dddgd	 ||| t|j|j q0d S )
N皙?i  )Z	test_sizeZrandom_staterZ   r   r   r   r   r0   )r   r   rz   r{   r2   r<   r   r   )	r   r|   Z
iris_data1Z
iris_data2Ziris_target1Ziris_target2r   Zclf_fullZclf_partialr"   r"   r#   .test_discretenb_provide_prior_with_partial_fits  s"       

 r   c                 C   s   dddgdddgdddgdddgg}ddddg}t jddddgt jd}||  }|  j|||d}t||ddddg |  }|j|d d |d d dddg|d d d |j|dd |dd |dd d |j|dd  |dd  |dd  d t||ddddg d S )Nr   r   r   )ZdtyperF   rH   r   )r   r)   rM   rD   r2   r   r5   r<   )r   r3   r4   rG   r=   r"   r"   r#   (test_discretenb_sample_weight_multiclass  s    0((r   use_partial_fitFTtrain_on_single_class_yc                 C   s  dddgdddgdddgg}dddg}|rB|d d }|d d }t tt|}t|}|  }|rv|j|||d n||| ||d d |d kstdddd	d
g}|D ]V}	t||	d }
|
d krqt	|
t
jr|
jd |kstq|
D ]}|jd |kstqqd S )Nr   r   r   r   r0   Zclasses_r   r   r   feature_log_prob_)sortedlistsetr   r<   r2   r5   rl   getattr
isinstancer   ZndarrayrL   )r   r   r   r3   r4   r1   Znum_classesr=   Zattribute_namesZattribute_name	attributeelementr"   r"   r#   )test_discretenb_degenerate_one_class_case  s4    
r   kind)densesparsec              	   C   s  t |\}}| dkr|}n| dkr.tj|}t }d}tjt|d || | W 5 Q R X |||	|}t
|| ||}||}	tt||	d t }
|
j|d d |d d t|d |
|dd |dd  |
|dd  |dd   |
	|}t
|| |
|}|
|}tt||d t|| t||	 t }|j||t|d |	|}t
|| ||}||}tt||d t|| t||	 d S )	Nr   r   z!Negative values in data passed tor.   r-   r   r0   r%   )r,   scipyr   
csr_matrixr   r9   r:   r;   r2   r5   r   r6   r7   r   r   r8   r<   rs   )r   r   r*   r+   r3   r=   rX   r>   r?   r@   rP   Zy_pred2Zy_pred_proba2Zy_pred_log_proba2r   Zy_pred3Zy_pred_proba3Zy_pred_log_proba3r"   r"   r#   	test_mnnb  sD    


&










r   c               	   C   s,  t ddgddgg} t ddg}t }t ( tdt |j| |dddgd W 5 Q R X |ddggdksxt	|ddggdkst	|ddggdkst	t & tdt |ddggdg W 5 Q R X |ddggdkst	|ddggdkst	|ddggdks(t	d S )Nr   r   errorr   r0   )
r   r)   r   warningscatch_warningssimplefilterRuntimeWarningr<   r5   rl   )r3   r4   r=   r"   r"   r#   !test_mnb_prior_unobserved_targets  s    
 
r   c                  C   s  t ddddddgddddddgddddddgddddddgg} t ddddg}tdd}|| | t ddg}tt |j| t ddd	ddd	gd
ddd
d
dgg}tt |j| t ddddddgg}t ddgg}|t | }t|	|| d S )Nr   r   rj   alphag      ?rg   r   g?g?UUUUUU?UUUUUU?g@fg;u?gy?)
r   r)   r   r2   r   r   r   r   rD   r6   )r3   re   r=   r   feature_probZX_testZunnorm_predict_probar6   r"   r"   r#   test_bnb)  s$    :
r   c               	   C   s   t dddgdddgdddgdddgdddgg} t dddddg}tdd}|| | t |jd }t t |jd | jd dfj	}t
|j||  d S )Nr   r   r   rj   r   rS   )r   r)   r   r2   r8   r   Ztiler   rL   Tr   r   )r3   re   r=   numdenomr"   r"   r#   test_bnb_feature_log_probX  s    2
$r   c                  C   s  t ddddddgddddddgddddddgddddddgg} t ddddg}t ddddddgddddddgg}t |j}t |j}tdD ]0}t ||  ||< || ||   ||< qtd	d
}t	d}t
jt|d ||  | W 5 Q R X || | t ddddddgddddddgg}t|j| t ddg}	t|j|	 t ddddddg}
t|j|
 t|j| td	dd}|| | t|j| d S )Nr   r   qq?gqq?gUUUUUU?r   gUUUUUU?r   rj   r   z8Negative values in data passed to ComplementNB (input X)r.   r   ra   T)r   Znorm)r   r)   ZzerosrL   r   r8   rD   r	   reescaper9   r:   r;   r2   r   r   r   Zfeature_all_r   r   )r3   re   thetaweightsZnormed_weightsr   r=   rX   Zfeature_countZclass_countZfeature_allr"   r"   r#   test_cnbo  sR    :	

&r   c              	   C   s|  t  }t| \}}||||}t|| tddgddgg}tddg}t ddd}||| t|jtddg td	d
gg}tdg}t	d}	t
jt|	d || W 5 Q R X t
jt|	d ||| W 5 Q R X tddgg}
tddgg}| }t||
||  t|j|jd ksFttd	d	gd	dgd	d	gddgg}tddddg}t ddd}||| t|td	d	ggtdg t|jtddg dD ]}td	d	gd	dgd	d	gddgg}tddddg}tddddg| }t ddd}|j|||d t|td	d	ggtdg t|jtddg qd S )Nr   ra   r   r%   F)r   r   r   r&   r   r   z9Negative values in data passed to CategoricalNB (input X)r.   r   qq?)rj   rZ   r%   g-C6?r   皙?rF   )r   r,   r2   r5   r   r   r)   n_categories_r   r   r9   r:   r;   rD   r   r6   r   r   rL   rl   )r   r=   r*   r+   r>   ZX3Zy3r3   r4   	error_msgZX3_testZbayes_numeratorZbayes_denominatorfactorrG   r"   r"   r#   test_categoricalnb  sL    

 "$"$r   zDmin_categories, exp_X1_count, exp_X2_count, new_X, exp_n_categories_r   ra   c                 C   s   t ddgddgddgddgg}t ddddg}t dg}tdd| d}||| |j\}	}
t|	| t|
| ||}t|| t|j| d S )Nr   r   r   Fr   r   min_categories)r   r)   r   r2   r   r   r5   r   )r   Zexp_X1_countZexp_X2_countZnew_XZexp_n_categories_ZX_n_categoriesZy_n_categoriesZexpected_predictionr=   ZX1_countZX2_countZpredictionsr"   r"   r#   &test_categoricalnb_with_min_categories  s    ""




r   zmin_categories, error_msgz"'min_categories' should have shapec              	   C   sl   t ddgddgddgddgg}t ddddg}tdd| d}tjt|d ||| W 5 Q R X d S )Nr   r   r   Fr   r.   )r   r)   r   r9   r:   r;   r2   )r   r   r3   r4   r=   r"   r"   r#   (test_categoricalnb_min_categories_errors  s
    "r   c               	   C   sB  t ddgddgg} t ddg}tdd}d}tjt|d |j| |ddgd W 5 Q R X tjt|d || | W 5 Q R X t ddgddgg}t|	| | t
dd}tjt|d |j| |ddgd W 5 Q R X tjt|d || | W 5 Q R X t dd	gddgg}t|	| | tdd}tjt|d || | W 5 Q R X t d
dgdd
gg}t|	| | tj| } tdd}tjt|d || | W 5 Q R X t ddgddgg}t|	| | t
dd}tjt|d || | W 5 Q R X t dd	gddgg}t|	| | d S )Nr   r   rb   r   zFalpha too small will result in numeric errors, setting alpha = 1.0e-10r.   r0   r   r   rj   )r   r)   r   r9   warnsUserWarningr<   r2   r   r6   r   r   r   r   r   )r3   r4   nbrX   probr"   r"   r#   
test_alpha,  sB    




r   c            	   	   C   sr  t ddgddgg} t ddg}t ddg}t|d}|j| |ddgd t ddgddgg}t|jt | t d	d
gddgg}t|| | t ddg}t|d}d}tj	t
|d || | W 5 Q R X d}t |d dg}t|d}|j| |ddgd t| |dgdd t dddg}t|d}d}tj	t
|d || | W 5 Q R X d S )Nr   r   r   r   r0   r   r   g333333?grq?r   gS?gևX?rj   r[   z+All values in alpha must be greater than 0.r.   ry      )decimalrS   g      @z7When alpha is an array, it should contains `n_features`)r   r)   r   r<   r   r   r8   r6   r9   r:   r;   r2   _check_alpha)	r3   r4   r   r   r   r   Zm_nbZexpected_msgZ	ALPHA_MINr"   r"   r#   test_alpha_vectorV  s0    



r   c                  C   sF  t dd\} }t|dk|dk}| | ||  }}ttdd| |dd}| dksZtttdd||dd}| d	kstttdd| d
k|dd}| dkstttdd|d
k|dd}| dksttt | |dd}| dkstttdd| |dd}| dksttt ||dd}| dksBtd S )NT)Z
return_X_yr   r-   r   r   )ZcvgQ?gGz?ra   g(\?gq=
ףp?gp=
ף?r   )Zvar_smoothingg{Gz?)	r   r   
logical_orr   r   ro   rl   r   r
   )r3   r4   Z
binary_3v8ZX_3v8Zy_3v8Zscoresr"   r"   r#   test_check_accuracy_on_digits~  s"    r   	Estimatorr   r   gdy=g-q=c              	   C   s   | t krt|trtd tddgddgg}tddg}d}d}| |d	}| |d
d}t||k rtjt	|d |
|| W 5 Q R X n|
|| |
|| d S )Nz7CategoricalNB does not support array-like alpha values.r   r   r   ra   r   ry   z9The default value for `force_alpha` will change to `True`r   Tr   Zforce_alphar.   )r   r   r   r9   skipr   r)   minr   FutureWarningr2   )r   r   r3   r4   Z	alpha_minrX   estZ	est_forcer"   r"   r#   test_force_alpha_deprecation  s    

r   c               	   C   s  d} t ddd}| dks ttddg}t |dd}|jd |_t| | d|  }t ddd}tj	t
|d	 | | kstW 5 Q R X t dd
}tj	t
|d	 | | kstW 5 Q R X t |dd}|jd |_tj	t
|d	 t| t| dg W 5 Q R X dS )zThe provided value for alpha must only be
    used if alpha < _ALPHA_MIN and force_alpha is True.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/10772
    ry   r   Tr   rb   rj   zCalpha too small will result in numeric errors, setting alpha = %.1eFr.   r   N)r   r   rl   r   r)   rL   Zn_features_in_r   r9   r   r   )Z
_ALPHA_MINbalphasrX   r"   r"   r#   test_check_alpha  s*    
r   c                 C   sT   t |\}}|  ||}||}t|dd}|t|j }t||| d S )Nr   r   )	r,   r2   Zpredict_joint_log_probar   r   Z
atleast_2dr   r   r7   )r   r   r*   r+   r   ZjllZ
log_prob_xZlog_prob_x_yr"   r"   r#   test_predict_joint_proba  s    
r   )Ir   r   numpyr   r9   Zscipy.sparser   Zscipy.specialr   Zsklearn.datasetsr   r   Zsklearn.model_selectionr   r   Zsklearn.naive_bayesr   r   r	   r
   r   Zsklearn.utils._testingr   r   r   r   ZDISCRETE_NAIVE_BAYES_CLASSESZALL_NAIVE_BAYES_CLASSESrX   markfilterwarningsZ
pytestmarkr)   r3   r4   r$   r,   rA   rE   rR   rY   r]   rf   ri   rk   rm   rr   rt   r~   Zparametrizer   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#   <module>   s   
.	
'	
		
	
1
!



2
7/G7	


	*("%