U
    -e                    @   s
  d dl Z d dlmZ d dlZd dl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 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mZmZmZm Z m!Z!m"Z" d d	l#m$Z$m%Z%m&Z& d d
l'm(Z(m)Z)m*Z*m+Z+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7 ddddddgZ8dZ9dZ:e; Z<e<j=e<j> Z?Z@eAe?jBd  ZCejDEd ZFeFGeC eCdd ZCe?eC e@eC  Z?Z@eH ZIeJeIj=ZKeIj>ZLdd ZMdd ZNdd ZOdd ZPejQdd gd!d"d# ZRejSTd$e8ejSTd%d&d'gd(d) ZUejSTd$e8ejSTd%d&d'gd*d+ ZVejSTd$e8ejSTd%d&d'gd,d- ZWejSTd$e8ejSTd%d&d'gd.d/ ZXejSTd$e8ejSTd%d&d'gd0d1 ZYejSTd$e8ejSTd%d&d'gd2d3 ZZejSTd$e8ejSTd%d&d'gejSTd4d&d'gejSTd5d6d7gd8d9 Z[d:d; Z\d<d= Z]d>d? Z^d@dA Z_dBdC Z`dDdE ZaejSTdFdGdHdIgdJdK ZbejSTdLdMdNdOdPdQgejSTdRd&d'gdSdT ZcejSTdLdMdNdOdPdQgejSTdRd&d'gdUdV Zddd]d^ZeejSTd_d`da eddddddbgd'd&gD ejSTdcdddedfgejSTdgeAdhdidj ZfejSTdkddlgejSTdmejgejJgejSTdndodpgejSTd%d&d'gejSTdqdrdsdtgdudv Zhdwdx ZiejSTdkddlgejSTdmejgejJgejSTdydzd{gejSTd|d}d~ddgdd ZjejSTdd&d'gejSTdddddgdd Zkdd Zldd ZmejSTded'defed'defgdd ZnejSTde efe efgejSTdddhgdd Zodd Zpdd Zqdd Zrdd ZsejSTdddeOgejSTdde*dgejSTdeMeNgdd ZtejSTdde*dgejSTdeMeNgdd Zudd Zvdd ZwejSTdelemeqeresevfdd Zxdd ZyejSTdeefdd Zzdd Z{ejSTdddePgdd Z|ejSTdddeOgdd Z}ejSTdeegdd Z~dd Zdd Zdd ZddÄ ZejSTdeegejSTdddiedfddiedfddiedfgdd̈́ ZejSTdeegddτ Zddф Zddӄ Ze7ddՄ ZejSTd$ddddgejSTdd&d'gddڄ ZejSTd$dddgdd܄ ZejSTdd&d'gddބ ZejSTdd'd&gejSTddedgejSTdejejJgejSTd$dddddddgdd ZejSTd$dddddddgdd Zdd ZejSTd$dddddddgejSTdgedZdd Zdd ZejSTdei feddifeddhifgdd ZejSTd$ddgejSTd%d&d'gejSTd5dd7dd6gdd ZejSTd%d&d'gejSTd5dd7dd6gdd ZejSTd$ddddddgdd ZejSTd5dd7dd6gdd ZejSTd5dd7dd6gdd Zdd ZejSTd%d'd&gejSTd4d'd&gejSTddd gejSTd$e8dg d d ZdS (      N)product)linalg)datasets)make_classificationmake_low_rank_matrixmake_multilabel_classificationmake_regression)ConvergenceWarning)LinearRegressionRidgeRidgeClassifierRidgeClassifierCVRidgeCVridge_regression)_check_gcv_mode	_RidgeGCV_solve_cholesky_solve_cholesky_kernel_solve_lbfgs
_solve_svd_X_CenterStackOp)
get_scorermake_scorermean_squared_error)GridSearchCV
GroupKFoldKFoldLeaveOneOutcross_val_predict)minmax_scale)	_IS_32BITcheck_random_state)assert_allcloseassert_almost_equalassert_array_almost_equalassert_array_equalignore_warningssvd	sparse_cgcholeskylsqrsagsaga)r(   r+   )r(   r)   r*   r+   r,      c                 C   s   | S N Xr/   r/   f/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/sklearn/linear_model/tests/test_ridge.pyDENSE_FILTERF   s    r3   c                 C   s
   t | S r.   )sp
csr_matrixr0   r/   r/   r2   SPARSE_FILTERJ   s    r6   c                 C   s   t | |kS r.   )npmeanZy_testy_predr/   r/   r2   _accuracy_callableN   s    r;   c                 C   s   | | d   S )N   )r8   r9   r/   r/   r2   _mean_squared_error_callableR   s    r=   longZwide)paramsc                 C   s  |j dkrd\}}nd\}}t||}tj| }t||||d}d|dddf< t|\}}}	t|dkstt	|ddd|f |dd|df  }
}|	d|ddf |	|dddf  }}|j dkr
|j
d	d
|d}|| }|||j|| dd  7 }n.|j
d	d
|d}|jtd|  |
j | }d}|t| }d|d< t|j| | |j| }|||  }|||  }tj|tj|k st	||||fS )aD  Dataset with OLS and Ridge solutions, well conditioned X.

    The construction is based on the SVD decomposition of X = U S V'.

    Parameters
    ----------
    type : {"long", "wide"}
        If "long", then n_samples > n_features.
        If "wide", then n_features > n_samples.

    For "wide", we return the minimum norm solution w = X' (XX')^-1 y:

        min ||w||_2 subject to X w = y

    Returns
    -------
    X : ndarray
        Last column of 1, i.e. intercept.
    y : ndarray
    coef_ols : ndarray of shape
        Minimum norm OLS solutions, i.e. min ||X w - y||_2_2 (with minimum ||w||_2 in
        case of ambiguity)
        Last coefficient is intercept.
    coef_ridge : ndarray of shape (5,)
        Ridge solution with alpha=1, i.e. min ||X w - y||_2_2 + ||w||_2^2.
        Last coefficient is intercept.
    r>   )      )rA   r@   )	n_samples
n_featuresZeffective_rankrandom_state   NMbP?
   lowhighsizerM   r<   r   )rF   rF   )paramminr7   randomRandomStater   r   r'   allAssertionErroruniformnormalTZdiagidentityZsolvenorm)global_random_seedrequestrB   rC   krngr1   UsZVtZU1ZU2ZVt1_Zcoef_olsyalphadZ
coef_ridgeZR_OLSZR_Ridger/   r/   r2   ols_ridge_datasetV   s<    


   **rd   solverfit_interceptTFc                 C   sl  |\}}}}d}t |d| | dkr$dnd|d}	|t| }
|||  }dt|d t|
d   }tf |	}|d	d	d	d
f }|r|d
 }n ||jdd }||  }d}||| |d	d
 }|jt|kst	t
|j| |||t|kst	tf |	j||t|jd d}|jt|ks@t	t
|j| |||t|ksht	d	S )zTest that Ridge converges for all solvers to correct solution.

    We work with a simple constructed data set with known solution.
          ?Tr+   r,   V瞯<绽|=rb   rf   re   tolrD   rE   r<   NrF   r   axissample_weight)dictr7   r8   sumr   fit
intercept_pytestapproxrT   r"   coef_scoreonesshape)re   rf   rd   rZ   r1   ra   r`   coefrb   r?   Zres_nullZ	res_RidgeZR2_Ridgemodel	interceptr/   r/   r2   test_ridge_regression   s8    	 

"r~   c                 C   s   |\}}}}|j \}}	d}
t|
d || | dkr2dnd|d}|ddddf }d	tj||fd
d }tj|t||	d
 kst|r|d }n ||jdd }||  }d}|	|| |dd }|j
t|kstt|jtj||f dd dS )a  Test that Ridge converges for all solvers to correct solution on hstacked data.

    We work with a simple constructed data set with known solution.
    Fit on [X] with alpha is the same as fit on [X, X]/2 with alpha/2.
    For long X, [X, X] is a singular matrix.
    rg   r<   rh   ri   rj   rk   NrF         ?rE   rm   r   :0yE>atol)rz   r   r7   concatenater   matrix_rankrP   rT   r8   rs   rt   ru   rv   r"   rw   r_re   rf   rd   rZ   r1   ra   r`   r{   rB   rC   rb   r|   r}   r/   r/   r2    test_ridge_regression_hstacked_X   s,    

r   c                 C   s   |\}}}}|j \}}	d}
td|
 || | dkr2dnd|d}|ddddf }tj||fd	d
}tj|t||	ks|ttj||f }|r|d }n ||j	d	d
 }||	  }d	}|
|| |dd }|jt|kstt|j|dd dS )aJ  Test that Ridge converges for all solvers to correct solution on vstacked data.

    We work with a simple constructed data set with known solution.
    Fit on [X] with alpha is the same as fit on [X], [y]
                                                [X], [y] with 2 * alpha.
    For wide X, [X', X'] is a singular matrix.
    rg   r<   rh   ri   rj   rk   NrF   r   rm   r   r   )rz   r   r7   r   r   r   rP   rT   r   r8   rs   rt   ru   rv   r"   rw   r   r/   r/   r2    test_ridge_regression_vstacked_X   s.    

r   c                 C   s8  |\}}}}|j \}}	d}
t|
|| | dkr.dnd|d}tf |}|rp|ddddf }|d }|dd }nd}||| ||	ks|s|jt|kstt|j	| nt|
|| t|| | | tjtj|j|j	f tjtj||f ksttjdd	 |jt|ks(tt|j	| dS )
a  Test that unpenalized Ridge = OLS converges for all solvers to correct solution.

    We work with a simple constructed data set with known solution.
    Note: This checks the minimum norm solution for wide X, i.e.
    n_samples < n_features:
        min ||w||_2 subject to X w = y
    r   rh   ri   rj   rk   NrF   1Ridge does not provide the minimum norm solution.reason)rz   rq   r   rs   rt   ru   rv   rT   r"   rw   predictr7   r   rY   r   xfail)re   rf   rd   rZ   r1   ra   r{   r`   rB   rC   rb   r?   r|   r}   r/   r/   r2   !test_ridge_regression_unpenalized  s8    

r   c                 C   sr  |\}}}}|j \}}	d}
t|
|| | dkr.dnd|d}|rf|ddddf }|d }|dd }nd}dtj||fd	d
 }tj|t||	kst||| ||	ks|s|j	t
|kst| dkrt
  t|jtj||f  nt||| tjtj|j	|jf tjtj|||f ks6tt
jdd |j	t
|ksXtt|jtj||f  dS )a^  Test that unpenalized Ridge = OLS converges for all solvers to correct solution.

    We work with a simple constructed data set with known solution.
    OLS fit on [X] is the same as fit on [X, X]/2.
    For long X, [X, X] is a singular matrix and we check against the minimum norm
    solution:
        min ||w||_2 subject to min ||X w - y||_2
    r   rh   ri   rj   rk   NrF   r   rE   rm   r)   r   r   )rz   r   r7   r   r   r   rP   rT   rs   rt   ru   rv   skipr"   rw   r   r   rY   r   re   rf   rd   rZ   r1   ra   r{   r`   rB   rC   rb   r|   r}   r/   r/   r2   ,test_ridge_regression_unpenalized_hstacked_XR  s<    
r   c                 C   sV  |\}}}}|j \}}	d}
t|
|| | dkr.dnd|d}|rf|ddddf }|d }|dd }nd}tj||fdd}tj|t||	ksttj||f }|	|| ||	ks|s|j
t|kstt|j| ntt||| tjtj|j
|jf tjtj||f ks$ttjd	d
 |j
t|ksFtt|j| dS )a  Test that unpenalized Ridge = OLS converges for all solvers to correct solution.

    We work with a simple constructed data set with known solution.
    OLS fit on [X] is the same as fit on [X], [y]
                                         [X], [y].
    For wide X, [X', X'] is a singular matrix and we check against the minimum norm
    solution:
        min ||w||_2 subject to X w = y
    r   rh   ri   rj   rk   NrF   rm   r   r   )rz   r   r7   r   r   r   rP   rT   r   rs   rt   ru   rv   r"   rw   r   rY   r   r   r/   r/   r2   ,test_ridge_regression_unpenalized_vstacked_X  s:    
r   sparseXrb   rg   {Gz?c                 C   s<  |r.|r| t krt  n|s.| tkr.t  |\}}}}	|j\}
}tjdd|
d}t||| | dkrhdndd|d}|d	d	d	d
f }tj	||fdd}tj
||f }tj
|d| f | }|r|	d
 }n ||jdd }||  }d}|rt|}|j|||d |	d	d
 }	|jt|ks,tt|j|	 d	S )zTest that Ridge with sample weights gives correct results.

    We use the following trick:
        ||y - Xw||_2 = (z - Aw)' W (z - Aw)
    for z=[y, y], A' = [X', X'] (vstacked), and W[:n/2] + W[n/2:] = 1, W=diag(W)
    r   rE   rJ   rh   ri   rj   順 )rb   rf   re   rl   max_iterrD   NrF   rm   ro   )SPARSE_SOLVERS_WITH_INTERCEPTru   r    SPARSE_SOLVERS_WITHOUT_INTERCEPTrz   r]   rU   r   r7   r   r   r8   r4   r5   rs   rt   rv   rT   r"   rw   )re   rf   r   rb   rd   rZ   r1   ra   r`   r{   rB   rC   swr|   r}   r/   r/   r2   $test_ridge_regression_sample_weights  s>    



r   c                  C   sX   t dd} tt| dgd}tttj}t|| dgd}ttj|j}t|| d S )NrF   rE   r   rb   )	
y_diabetesreshaper   
X_diabetesr7   dotrW   r   r$   )ra   r{   KZ	dual_coefZcoef2r/   r/   r2   test_primal_dual_relationship  s    r   c               
   C   sZ   t jd} | d}| dd}d}tjt|d t||dddd d	d
 W 5 Q R X d S )Nr      rI   z3sparse_cg did not converge after [0-9]+ iterations.matchrg   r(           rE   )rb   re   rl   r   verbose)r7   rQ   rR   randnru   warnsr	   r   )r]   ra   r1   Zwarning_messager/   r/   r2   &test_ridge_regression_convergence_fail  s    
      r   c                  C   sX  t jd} d\}}| ||}| |}|d d t jf }t j|d| f }t }||| |jj	|fksrt
|jj	dkst
t|jt jst
t|jtst
||| |jj	d|fkst
|jj	dkst
t|jt jst
t|jt jst
||| |jj	d|fkst
|jj	dks,t
t|jt js@t
t|jt jsTt
d S )Nr   r   rI   rE   r/   rE   r<   )r<   )r7   rQ   rR   r   newaxisc_r   rs   rw   rz   rT   rt   
isinstanceZndarrayfloat)r]   rB   rC   r1   ra   ZY1Yridger/   r/   r2   test_ridge_shapes_type  s,    
r   c                  C   s   t jd} d\}}| ||}| |}t j|d| f }t }||| |j}||| t|jd | t|jd |d  d S )Nr   r   rg   rE   )	r7   rQ   rR   r   r   r   rs   rt   r#   )r]   rB   rC   r1   ra   r   r   r}   r/   r/   r2   test_ridge_intercept#  s    
r   c                  C   s   t jd} d\}}| |}| ||}tddd}tdd}||| ||| t|j|j ||| ||| t|j|j d S )Nr   )r   rA   r   Frb   rf   rf   )	r7   rQ   rR   r   r   r
   rs   r#   rw   )r]   rB   rC   ra   r1   r   Zolsr/   r/   r2   test_ridge_vs_lstsq5  s    

r   c            	   	      s   t jd} d\}}}| || | ||t |t  fddtjD } fdddD }|D ]}t|| qrt	d d d}d	}t
jt|d
 |  W 5 Q R X d S )N*   )   rI   r   c                    s&   g | ]\}}t |d d |jqS )r)   rb   re   r   rs   rw   ).0rb   targetr0   r/   r2   
<listcomp>V  s   z3test_ridge_individual_penalties.<locals>.<listcomp>c                    s$   g | ]}t |d d jqS )-q=)rb   re   rl   r   )r   re   r1   Z	penaltiesra   r/   r2   r   \  s   )r'   r(   r*   r)   r+   r,   rF   r   zCNumber of targets and number of penalties do not correspond: 4 != 5r   )r7   rQ   rR   r   arangearrayziprW   r$   r   ru   raises
ValueErrorrs   )	r]   rB   rC   	n_targetscoef_choleskyZcoefs_indiv_penZcoef_indiv_penr   err_msgr/   r   r2   test_ridge_individual_penaltiesJ  s&    



r   n_colr/   r   )   c           	      C   s   t jd}|dd}|d}|t|}|jd|  }|jd|  }tt|||}t ||d d d f |  |d d d f g}t	|
||
| t	|j
||j
| d S )Nr         	   )r   )r   )r7   rQ   rR   r   lenr   r4   r5   Zhstackr"   r   rW   )	r   r]   r1   ZX_msqrt_swr   AoperatorZreference_operatorr/   r/   r2   test_X_CenterStackOpj  s    
.r   rz   )rI   rE   )   r   )r      )r<   r<   )r   r   uniform_weightsc                 C   s   t jd}|j|  }|r,t |jd }n|d| d }t |}t j|d|d}|| |d d d f  }|	|j
}t||d d d f  }	tdd}
|
|	|\}}t|| t|| d S Nr   rE   )rn   weightsTr   )r7   rQ   rR   r   ry   rz   	chisquaresqrtaverager   rW   r4   r5   r   Z_compute_gramr"   )rz   r   r]   r1   r   r   X_mean
X_centeredZ	true_gramX_sparsegcvZcomputed_gramcomputed_meanr/   r/   r2   test_compute_gramx  s    



r   c                 C   s   t jd}|j|  }|r,t |jd }n|d| d }t |}t j|d|d}|| |d d d f  }|j	
|}t||d d d f  }	tdd}
|
|	|\}}t|| t|| d S r   )r7   rQ   rR   r   ry   rz   r   r   r   rW   r   r4   r5   r   Z_compute_covariancer"   )rz   r   r]   r1   r   r   r   r   Ztrue_covariancer   r   Zcomputed_covr   r/   r/   r2   test_compute_covariance  s    



r   d   r   rI   rE         *@      >@c                 C   s   t | ||||||d|d	\}}}|dkr4t|g}||7 }tj|d||jdk}| }d|| < d||< |||8 }|
r||t	|d | 7 }t	|d }|dkr|d }|	r|||fS ||fS )NT)	rB   rC   n_informativer   biasnoiseshuffler{   rD   rE   r   r   )
r   r7   asarrayrQ   rR   Zbinomialrz   copyr   abs)rB   rC   proportion_nonzeror   r   r   X_offsetr   r   r{   positiverD   r1   ra   cmaskZ	removed_Xr/   r/   r2   _make_sparse_offset_regression  s8    

r   zsolver, sparse_Xc                 c   s&   | ]\}}|r|d ks||fV  qdS ))r(   ridgecvNr/   )r   re   sparse_Xr/   r/   r2   	<genexpr>  s    r   r   z"n_samples,dtype,proportion_nonzero)r   float32皙?)(   r   rg   )r   float64皙?seedr   c                 C   s   d}|dkrdnd}t dd||||d\}}	t|}td|d	||	}
|j|d
d}|	j|d
d}	|rrt|}| dkrt|gd}nt| d|d}|||	 t|j	|
j	ddd t|j
|
j
ddd d S )Nrg   g?g      I@g     @@rI      )r   rC   r   r   rD   rB   r'   )re   rb   F)r   r   alphasrj   )re   rl   rb   rG   r   rtol)r   r   r   rs   astyper4   r5   r   r"   rw   rt   )re   r   rB   dtyper   r   rb   r   r1   ra   Z	svd_ridger   r/   r/   r2   test_solver_consistency  s,    

r  gcv_modeeigenX_constructorX_shape)r   r   )r   r   zy_shape, noise)r   rg   )r   rE   r   )r   r        b@c              	   C   s   |\}}t |dkr|d nd}t|||dd|dd\}	}
|
|}
dd	d
ddg}t|||dd}t| ||d}||	|
 ||	}|||
 |jt|jkstt	|j
|j
dd t	|j|jdd d S )Nr<   rF   rE   r   Fr   rB   rC   r   rD   r   r   r   rG   r   rg         $@     @@neg_mean_squared_errorcvrf   r   scoring)r  rf   r   r   )r   r   r   r   rs   alpha_ru   rv   rT   r"   rw   rt   )r  r  r  y_shaperf   r   rB   rC   r   r1   ra   r   	loo_ridge	gcv_ridgeX_gcvr/   r/   r2   test_ridge_gcv_vs_ridge_loo_cv  s<    
	
r  c            	   	   C   s   d} d\}}d}t |||ddddd\}}dd	d
ddg}t|d|| d}td|| d}||| ||| |jt|jkstt|j|jdd t|j	|j	dd d S )NZexplained_variance)rI   r   rE   r   Fr   r  rG   r   rg   r  r  Tr  )rf   r   r  r  )
r   r   rs   r  ru   rv   rT   r"   rw   rt   )	r  rB   rC   r   r1   ra   r   r  r  r/   r/   r2   test_ridge_loo_cv_asym_scoring1  s2    

   r  rC   r   r   zy_shape, fit_intercept, noise)r  Trg   )r  Tg      4@)r	  Tr
  )r	  Fr   c                    s  dddddg}t jd}t|dkr.|d nd	}td
||dd|d\}	}
|
|}
d|t|	 }||  d	 t	}t 
t |	jd | |t}|	  |
   }}t|	jd d}|j|| d}t||d|d}||| t|j|d}|j|| d}t||||d}|| d  fddt |	jd D t ||	}t|d| |d}|j||
|d t|dkr|jd d d d ||jf }n|jd d ||jf }|jt|jkstt|dd t|j|jdd t|j|jdd d S )NrG   r   rg   r  r  r   r<   rF   rE   r   F)rB   rC   r   rD   r   r   r   )Zn_splits)groupsr  )r   r  r  rf   r   r  c                    s"   g | ]}t j |k d dqS )r   rm   )r7   rr   )r   iindicesZkfold_errorsr/   r2   r     s    z1test_ridge_gcv_sample_weights.<locals>.<listcomp>T)r   store_cv_valuesr  rf   ro   r  )r7   rQ   rR   r   r   r   r   rP   r   intrepeatr   rz   r   r   splitr   rs   r   r  r   r   
cv_values_indexru   rv   rT   r"   rw   rt   )r  r  rf   rC   r  r   r   r]   r   r1   ra   rp   ZX_tiledZy_tiledr  ZsplitsZkfoldZ	ridge_regZpredictionsr  r  Z
gcv_errorsr/   r  r2   test_ridge_gcv_sample_weightsO  sb    



"r%  sparsez2mode, mode_n_greater_than_p, mode_p_greater_than_n)Nr'   r  )autor'   r  )r  r  r  )r'   r'   r'   c                 C   sH   t ddd\}}| rt|}t|||ks0tt|j||ksDtd S )Nr   r<   )rB   rC   )r   r4   r5   r   rT   rW   )r&  modeZmode_n_greater_than_pZmode_p_greater_than_nr1   r`   r/   r/   r2   test_check_gcv_mode_choice  s
    
r)  c                 C   s  t jd }g }| tk}t|d}|| t t |j}|| t}t	t
dd}td|d}||j| t t |jt|kstdd }	t	|	}td|d}
||
j| t t |
jt|ksttd}td|d}|| t t |jt|kst| tkr<|j| t tt|d	 |jt|ks<ttttfj}|| t | || t }|| t t || t }tt||fj|d
d |S )Nr   r   F)Zgreater_is_better)rf   r  c                 S   s   t | | S r.   )r   )xra   r/   r/   r2   func  s    z_test_ridge_loo.<locals>.funcr  ro   h㈵>r  )r   rz   r3   r   rs   r   r  appendr&   r   r   r   ru   rv   rT   r   r7   ry   vstackrW   r   r"   )filter_rB   retrf   Z	ridge_gcvr  fr  Z
ridge_gcv2r+  Z
ridge_gcv3ZscorerZ
ridge_gcv4r   Y_predr:   r/   r/   r2   _test_ridge_loo  s>    



r3  c                 C   s   t  }|| tt || t t|jjdks8tt	|j
tjksLttd}|j|d || tt || t t|jjdkstt	|j
tjkstd S )NrE   r   r  )r   rs   r   r   r   r   rw   rz   rT   typert   r7   r   r   
set_params)r/  ridge_cvr  r/   r/   r2   _test_ridge_cv  s    r7  zridge, make_dataset)r  c                 C   s.   |ddd\}}|  || t| dr*td S )N   r   rB   rD   r#  )rs   hasattrrT   )r   make_datasetr1   ra   r/   r/   r2   #test_ridge_gcv_cv_values_not_stored  s    	r<  r  c                 C   sL   |ddd\}}| j d|d | || t| ds8tt| jtsHtd S )Nr8  r   r9  F)r  r  best_score_)r5  rs   r:  rT   r   r=  r   )r   r;  r  r1   ra   r/   r/   r2   test_ridge_best_score   s
    r>  c               	      s  t jd} d\}}}| ||}t |d d dgf t d|ft |d d dgf dt d|f  t |d d dgf dt d|f  | ||  d fd	d
|jD }tdd |}t	||j
 tt|j
d |j|j tddd |}|j
j|fks$t|jj|fks8t|jj|t|fksTttdddd |}|j
j|fks~t|jj|fkst|jj||dfksttddd |d d df }t |j
stt |jst|jj|tfks
ttddd |}t	||j
 tt|j
d |j|j tt dd}d}tjt|d | | W 5 Q R X tddd}tjt|d | | W 5 Q R X d S )Nr   )r   r   r   r   rE   g?r<   rG   )rE   r     c                    s    g | ]}t d  |jqS )r   )r   rs   r  )r   r   r1   r   r/   r2   r   !  s     z6test_ridge_cv_individual_penalties.<locals>.<listcomp>T)r   alpha_per_targetr   )r   rA  r  r2)r   rA  r  )r   r  rA  z3cv!=None and alpha_per_target=True are incompatibler   r8  )r7   rQ   rR   r   r   ry   rW   r   rs   r%   r  r$   r   rw   rz   rT   r=  r#  r   Zisscalarr   ru   r   r   )r]   rB   rC   r   ra   Zoptimal_alphasr6  msgr/   r@  r2   "test_ridge_cv_individual_penalties  sd    
"&&
    rD  c                 C   s2   t dd}|| tt t|| ttdS )NFr   r   )r   rs   r   r   r7   roundrx   )r/  r   r/   r/   r2   _test_ridge_diabetesU  s    
rF  c                 C   s   t ttfj}tjd }tdd}|| t| |jjd|fksHt	|
| t}|| tt |
| t}tt ||fj|dd d S )NrE   Fr   r<   r   decimal)r7   r.  r   rW   r   rz   r   rs   rw   rT   r   r$   )r/  r   rC   r   r2  r:   r/   r/   r2   _test_multi_ridge_diabetes[  s    

rI  c                 C   s   t tjd }tjd }t t fD ]L}|| tt |jj||fksNt	|
| t}t t|kdks&t	q&td}t|d}|| tt |
| t}t t|kdkst	d S )Nr   rE   gHzG?r   r  g?)r7   uniquey_irisrz   X_irisr   r   rs   rw   rT   r   r8   r   )r/  	n_classesrC   regr:   r  r/   r/   r2   _test_ridge_classifiersi  s    

rO  r  Zaccuracyr   r/  c                 C   s>   t |rt|n|}t||d}|| tt| t d S )N)r  r  )callabler   r   rs   rL  rK  r   )r/  r  r  scoring_clfr/   r/   r2   "test_ridge_classifier_with_scoringy  s    rS  c                 C   sj   dd }t jdddd}t|t||d}|| tt |jt	dksNt
|jt	|d	 ksft
d S )
Nc                 S   s   dS )NzG?r/   r9   r/   r/   r2   _dummy_score  s    z:test_ridge_regression_custom_scoring.<locals>._dummy_scorer<   r   )num)r   r  r  rT  r   )r7   Zlogspacer   r   rs   rL  rK  r=  ru   rv   rT   r  )r/  r  rU  r   rR  r/   r/   r2   $test_ridge_regression_custom_scoring  s    rX  c                 C   sh   t ddd}|| tt || tt}t ddd}|| tt || tt}||ksdtd S )Nr,  F)rl   rf   rG   )r   rs   r   r   rx   rT   )r/  r   rx   Zridge2Zscore2r/   r/   r2   _test_tolerance  s    rY  c                 C   s2   | t }| t}|d k	r.|d k	r.t||dd d S )Nr   rG  )r3   r6   r$   )	test_funcZ	ret_denseZ
ret_sparser/   r/   r2   check_dense_sparse  s    r[  rZ  c                 C   s   t |  d S r.   )r[  )rZ  r/   r/   r2   test_dense_sparse  s    r\  c                  C   sd  t ddgddgddgddgddgg} dddddg}td d}|| | t|d	dggt dg tdd
id}|| | t|d	dggt dg tdd}|| | t|d	dggt dg t ddgddgddgddgg} ddddg}td d}|| | tdd}|| | t|jdksDtt	|j
|j
 t	|j|j d S )N      r   皙rg   r   rE   rF   class_weightr   rG   balancedr<   )r7   r   r   rs   r%   r   r   Zclasses_rT   r$   rw   rt   )r1   ra   rN  Zregar/   r/   r2   test_class_weights  s(    (

"

rb  rN  c                 C   s   |  }| tjtj | dd}| tjtj t|j|j ttjj}|tjdk  d9  < dddd}|  }| tjtj| | |d}| tjtj t|j|j |  }| tjtj|d  | |d}| tjtj| t|j|j d	S )
z5Check class_weights resemble sample_weights behavior.ra  r_  rE   r   rg   g      Y@)r   rE   r<   r<   N)	rs   irisdatar   r#   rw   r7   ry   rz   )rN  reg1reg2rp   r`  r/   r/   r2   "test_class_weight_vs_sample_weight  s$    


rg  c                  C   s   t ddgddgddgddgddgg} dddddg}td dd	dgd
}|| | tddidd	ddgd
}|| | t|ddggt dg d S )Nr]  r   r^  rg   r   rE   rF   r   r   )r`  r   rG   rI   gɿr<   )r7   r   r   rs   r%   r   )r1   ra   rN  r/   r/   r2   test_class_weights_cv  s    (rh  r  c              	   C   s   t jd}d}d}|||}dddg}t|}t| rBt| n| }t|d d|d}||}	|||	 |j	j
||fkstd	}
|||
}	|||	 |j	j
||
|fksttd	d| d
}tjtdd |||	 W 5 Q R X d S )Nr   r   r   r   rg   r  Tr   r  r  r  r   )r  r  r  zcv!=None and store_cv_valuesr   )r7   rQ   rR   r   r   rP  r   r   rs   r#  rz   rT   ru   r   r   )r  r]   rB   rC   r*  r   n_alphasrQ  rra   r   r/   r/   r2   test_ridgecv_store_cv_values  s$    

rl  c           	   	   C   s  t ddgddgddgddgddgg}t dddddg}|jd }ddd	g}t|}t| rht| n| }t|d d
|d}d}||| |jj|||fkst	t dddddgdddddgdddddgg
 }|jd }||| |jj|||fkst	d S )Nr]  r   r^  rg   r   rE   rF   r   r  Tri  )r7   r   rz   r   rP  r   r   rs   r#  rT   Z	transpose)	r  r*  ra   rB   r   rj  rQ  rk  r   r/   r/   r2   (test_ridge_classifier_cv_store_cv_values+  s*    (

   &
rm  	Estimatorc                 C   s   t jd}d}d\}}| tkr,||}n|dd|}|||}| |d}|j|ksltd| j d|	|| t
|jt | d S )Nr   r   rg   r  r   r   r<   r   z`alphas` was mutated in `z
.__init__`)r7   rQ   rR   r   r   randintr   rT   __name__rs   r%   r   )rn  r]   r   rB   rC   ra   r1   Z	ridge_estr/   r/   r2   test_ridgecv_alphas_conversionH  s    
rs  c                  C   s   t jd} d}dD ]\}}| |}| ||}d| | }td}t||d}|j|||d d|i}	tt	 |	|d	}
|
j|||d |j
|
jjkstt|j|
jj qd S )
Nr   ro  )r8  r   r   rg   r   )r   r  ro   rb   r  )r7   rQ   rR   r   randr   r   rs   r   r   r  Zbest_estimator_rb   rT   r$   rw   )r]   r   rB   rC   ra   r1   rp   r  r   
parametersgsr/   r/   r2   test_ridgecv_sample_weight]  s    
rx  c               
      s(  ddg} ddg}t jd}t| |D ]\}}||| ||||d d }d}d}|d d t jf |t jd d f tdd |  |  |  fdd	} fd
d}	d}
tj	t
|
d |  W 5 Q R X d}
tj	t
|
d |	  W 5 Q R X q&d S )Nr<   r   r   rE   rg   g       @r   c                      s      d S r.   rs   r/   )r1   r   sample_weights_not_OKra   r/   r2   fit_ridge_not_ok  s    zStest_raises_value_error_if_sample_weights_greater_than_1d.<locals>.fit_ridge_not_okc                      s      d S r.   ry  r/   )r1   r   sample_weights_not_OK_2ra   r/   r2   fit_ridge_not_ok_2  s    zUtest_raises_value_error_if_sample_weights_greater_than_1d.<locals>.fit_ridge_not_ok_2z)Sample weights must be 1D array or scalarr   )r7   rQ   rR   r   r   r   r   rs   ru   r   r   )
n_samplessn_featuressr]   rB   rC   Zsample_weights_OKZsample_weights_OK_1Zsample_weights_OK_2r{  r}  r   r/   )r1   r   rz  r|  ra   r2   9test_raises_value_error_if_sample_weights_greater_than_1du  s.    

r  c                  C   s   ddg} ddg}t jd}tjtjtjtjtjg}t	ddd}t	ddd}t
| |D ]t\}}|||}||}	||d d }
|D ]>}||}|j||	|
d |j||	|
d t|j|jd	d
 qqVd S )Nr<   r   r   rg   Fr   rE   ro   r8  rG  )r7   rQ   rR   r4   Z
coo_matrixr5   Z
csc_matrixZ
lil_matrixZ
dok_matrixr   r   r   rs   r$   rw   )r~  r  r]   Zsparse_matrix_converterssparse_ridgedense_ridgerB   rC   r1   ra   Zsample_weightsZsparse_converterr   r/   r/   r2   &test_sparse_design_with_sample_weights  s(    
r  c                  C   sP   t ddgddgddgddgddgg} dddddg}tdd	}|| | d S )
Nr]  r   r^  rg   r   rE   rF   )rE   rI   r   r   )r7   r   r   rs   )r1   ra   r   r/   r/   r2   test_ridgecv_int_alphas  s    (
r  zparams, err_type, err_msgr   )rE   rF   iz alphas\[1\] == -1, must be > 0.0)gr]  g      $z"alphas\[0\] == -0.1, must be > 0.0)rE   rg   1z1alphas\[2\] must be an instance of float, not strc              	   C   sR   d\}}t ||}t dd|}tj||d | f ||| W 5 Q R X dS )z?Check the `alphas` validation in RidgeCV and RidgeClassifierCV.rp  r   r<   r   N)r]   r   rq  ru   r   rs   )rn  r?   Zerr_typer   rB   rC   r1   ra   r/   r/   r2   test_ridgecv_alphas_validation  s
    r  c                 C   sL   d\}}t ||}| tkr(t |}nt dd|}| dd|| dS )zCheck the case when `alphas` is a scalar.
    This case was supported in the past when `alphas` where converted
    into array in `__init__`.
    We add this test to ensure backward compatibility.
    rp  r   r<   rE   r   N)r]   r   r   rq  rs   )rn  rB   rC   r1   ra   r/   r/   r2   test_ridgecv_alphas_scalar  s    r  c                      s&   dt  d  fddd S )Nz5This is not a solver (MagritteSolveCV QuantumBitcoin)zQKnown solvers are 'sparse_cg', 'cholesky', 'svd' 'lsqr', 'sag' or 'saga'. Got %s.c               	      sH   t d} t d}t| |dd tj d   W 5 Q R X d S )Nr   rg   r   r   )r7   eyery   r   ru   r   r1   ra   	exceptionr+  messageZwrong_solverr/   r2   r+    s
    

z=test_raises_value_error_if_solver_not_supported.<locals>.func)r   r/   r/   r  r2   /test_raises_value_error_if_solver_not_supported  s    r  c                  C   s6   t ddd} | tt | jjd tjd ks2td S )Nr(   rE   )re   r   r   )r   rs   r   r   rw   rz   rT   )rN  r/   r/   r2   test_sparse_cg_max_iter  s    r  c                  C   s   d} t t }}t|| dfj}tddD ]<}dD ]2}t||dd}||| t|j	t||  q2q*dD ],}t|ddd}||| |j	d kslt
qld S )	Nr<   rE   rA   )r+   r,   r*   r   )re   r   rl   )r(   r'   r)   r   )r   r   r7   ZtilerW   ranger   rs   r%   Zn_iter_rT   )r   r1   ra   Zy_nr   re   rN  r/   r/   r2   test_n_iter  s    
r  lbfgsr'  with_sample_weightc                 C   s   | dk}t d||d\}}d}|rDtj|}d|j|jd d }| dkrPd	n| }t|d
|d}	t| d
|d}
|	j|||d |
jt	|||d t
|	j|
j t
|	j|
jdd dS )a  Check that ridge finds the same coefs and intercept on dense and sparse input
    in the presence of sample weights.

    For now only sparse_cg and lbfgs can correctly fit an intercept
    with sparse X with default tol and max_iter.
    'sag' is tested separately in test_ridge_fit_intercept_sparse_sag because it
    requires more iterations and should raise a warning if default max_iter is used.
    Other solvers raise an exception, as checked in
    test_ridge_fit_intercept_sparse_error
    r  r   )rC   rD   r   Nrg   r   rN   r'  r(   r   )re   rl   r   ro   gƠ>r  )r   r7   rQ   rR   rU   rz   r   rs   r4   r5   r"   rt   rw   )re   r  rZ   r   r1   ra   rp   r]   Zdense_solverr  r  r/   r/   r2   test_ridge_fit_intercept_sparse   s"      
r  c              	   C   sX   t ddd\}}t|}t| d}d| }tjt|d ||| W 5 Q R X d S )Nr   r   )rC   rD   re   zsolver='{}' does not supportr   )	r   r4   r5   r   formatru   r   r   rs   )re   r1   ra   X_csrr  r   r/   r/   r2   %test_ridge_fit_intercept_sparse_errorF  s    


r  c           
   	   C   s
  t dd|dd\}}| r<tj|}d|j|jd d }nd }t|}tddd	d
dd}t	f |}t	f |}	|j
|||d t " tdt |	j
|||d W 5 Q R X t|j|	jdd t|j|	jdd tjtdd t	dd	dd d
|| W 5 Q R X d S )Nr   r   g      @)rC   rB   rD   r   rg   r   rN   r+   Trj   r   )rb   re   rf   rl   r   ro   error-C6?r  z"sag" solver requires.*r   rG   )re   rf   rl   r   )r   r7   rQ   rR   rU   rz   r4   r5   rq   r   rs   warningscatch_warningssimplefilterUserWarningr"   rt   rw   ru   r   )
r  rZ   r1   ra   r]   rp   r  r?   r  r  r/   r/   r2   #test_ridge_fit_intercept_sparse_sagP  s8       

    


r  return_interceptrp   r?  arr_typec                 C   s   t d}|dd}dddg}t||}d}| r6d}||7 }||}	d	\}
}trVd
nd}|dk}|dkr| rtjtdd t|	||
||| ||d W 5 Q R X dS t|	||
|||| |d}| r|\}}t	||d|d t	||d|d nt	||d|d dS )z=check if all combinations of arguments give valid estimationsr   r?  r   rE   r<   r   r   g     @)rG   ư>rG   r  r  )r+   r'  zIn Ridge, only 'sag' solverr   )rb   re   rp   r  r   rl   N)rb   re   rp   r   r  rl   r   r   r   )
r!   ru  r7   r   r    ru   r   r   r   r"   )r  rp   r  re   r]   r1   Z
true_coefsra   Ztrue_interceptZ	X_testingrb   rl   r   r   outr{   r}   r/   r/   r2   .test_ridge_regression_check_arguments_validityk  sP    

r  c                 C   s  t jd}d}| dk}d\}}|||}||}|t j}|t j}	dt t jj }
t|| d|
|d}|	||	 |j
}t|| d|
|d}|	|| |j
}|j|jkst|j|jkst||j|jkst||j|jkstt|j
|j
dd	d
 d S )Nr   rg   r  rt  r<     )rb   re   r   rl   r   r  gMb@?r  )r7   rQ   rR   r   r   r   Zfinfo
resolutionr   rs   rw   r  rT   r   r"   )re   r]   rb   r   rB   rC   X_64y_64X_32y_32rl   ridge_32coef_32ridge_64coef_64r/   r/   r2   test_dtype_match  s@    
        r  c                  C   s   t jd} t ddg}d\}}}| ||}| ||}|t j}|t j}t|dd}	|	|| |	j	}
t|dd}||| |j	}|
j
|j
kst|j
|j
kst|	|j
|j
kst||j
|j
kstt|	j	|j	dd d S )	Nr   rg   r   )r8  r   r<   r)   r   r   rG  )r7   rQ   rR   r   r   r   r   r   rs   rw   r  rT   r   r#   )r]   rb   rB   rC   Zn_targetr  r  r  r  r  r  r  r  r/   r/   r2   test_dtype_match_cholesky  s$    
r  c                 C   s   t j|}d\}}|||}||}t ||d||  }d}| dk}	t }
| dkrbdnd}t jt jfD ]2}t|	||	||| |d |	dd	d
d
d|
|< qr|
t j j
t jkst|
t j j
t jkstt|
t j |
t j |d d S )Nrt  r   rg   r  r(   rG   r,  r  rj   F)	rb   re   rD   rp   r   r   rl   Zreturn_n_iterr  r   )r7   rQ   rR   r   r   rq   r   r   r   r   r  rT   r"   )re   r   rD   rB   rC   r1   r{   ra   rb   r   resultsr   Zcurrent_dtyper/   r/   r2   %test_ridge_regression_dtype_stability  s4    
r  c                  C   sR   t dd\} }t| } | d d dd d f } |d d d }tdd| | d S )Nr   rD   r<   r+   r  )r   r7   Zasfortranarrayr   rs   r  r/   r/   r2   test_ridge_sag_with_X_fortran  s
    
r  zClassifier, paramsc                 C   s   t ddd\}}|dd}tj||gdd}| f |||}||}|j|jksZtt|dddf |dddf  t	dd|| dS )	zRCheck that multilabel classification is supported and give meaningful
    results.rE   r   )rM  rD   rF   rm   Nr+   r  )
r   r   r7   r   rs   r   rz   rT   r%   r   )
Classifierr?   r1   ra   r   rR  r2  r/   r/   r2   test_ridgeclassifier_multilabel  s    
"r  rG   r   c                 C   s   t ddgddgddgddgg}t dd	g}|rHd
}||| }n
||}t|d| |d}||| t |jdkstdS )z:Test that positive Ridge finds true positive coefficients.rE   r<   r   rA   r   r8  r   r   rH   r   Trb   r   re   rf   r   N)r7   r   r   r   rs   rS   rw   rT   )re   rf   rb   r1   r{   r}   ra   r|   r/   r/   r2   #test_ridge_positive_regression_test/  s    "
   r  c           
      C   s   t jd}|dd}|jdd|jd d}| rDd}|| | }n|| }||j|jd dd	 7 }g }d
D ](}t||| dd}	||		||j
 qnt|ddd dS )zTest that Ridge w/wo positive converges to the same solution.

    Ridge with positive=True and positive=False must give the same
    when the ground truth coefs are all positive.
    r   ,  r   r   rg   rE   rN   r   r   )TFrj   )rb   r   rf   rl   r  r   N)r7   rQ   rR   r   rU   rz   rV   r   r-  rs   rw   r"   )
rf   rb   r]   r1   r{   r}   ra   r  r   r|   r/   r/   r2   %test_ridge_ground_truth_positive_testC  s$       r  c              	   C   s   d}t ddgddgg}t ddg}|| }t|d| dd	}tjtd
d ||| W 5 Q R X tjtdd t|||d| dd\}}W 5 Q R X dS )z5Test input validation for positive argument in Ridge.r   rE   r<   r   rA   rF   TFr  zdoes not support positiver   zonly 'lbfgs' solver can be used)r   re   r  N)r7   r   r   ru   r   r   rs   r   )re   rb   r1   r{   ra   r|   r`   r/   r/   r2   test_ridge_positive_error_test^  s          r  c           	         s   t dddd\ dd}d fdd		}td
 }tdd }||}||}||ksntt|D ]}|||d}||ksvtqvdS )z?Check ridge loss consistency when positive argument is enabled.r  r   rB   rC   rD   r   r   Nr   c                    sp   | j }|d k	r6tj|}| j|jd|| jjd }n| j}dt |  | d  d t|d   S )Nr   rN   r   r<   )rt   r7   rQ   rR   rw   rU   rz   rr   )r|   rD   Znoise_scaler}   r]   r{   r1   rb   ra   r/   r2   
ridge_lossy  s    &z,test_positive_ridge_loss.<locals>.ridge_lossr   T)rb   r   r  )Nr   )r   r   rs   rT   r  )	rb   Zn_checksr  r|   Zmodel_positiveZlossZloss_positiverD   Zloss_perturbedr/   r  r2   test_positive_ridge_lossr  s    r  c                 C   sf   t dddd\}}t|d}t| g} dddd}t||| f|}t||| }t||d	d
d dS )zETest that LBGFS gets almost the same coef of svd when positive=False.r  r   r  rE   FgؗҜ<i  )r   rl   r   r  r   r   N)r   r7   Zexpand_dimsr   r   r   r"   )rb   r1   ra   configZ
coef_lbfgsr   r/   r/   r2   test_lbfgs_solver_consistency  s    r  c               	   C   sb   t ddgddgg} t ddg}tddddd	dd
}tjtdd || | W 5 Q R X dS )z1Test that LBFGS solver raises ConvergenceWarning.rE   rF   g    _g    _Br   r  Fr   T)rb   re   rf   rl   r   r   zlbfgs solver did not converger   N)r7   r   r   ru   r   r	   rs   )r1   ra   r|   r/   r/   r2   test_lbfgs_solver_error  s    r  rd  tallc                 C   s   |r"|dks|dkr"| r"t d tjd}d}|dkrD|d }n|d }|||}||}	|rpt|}t| d||d	k|d
d}
t	f |
j
||	dd}|j }| r|j}t|	}|j
||	|d t|j|dd | rt|j| |jdd|jd d}d|dd< |	dd  d9  < |j
||	|d |j }| rH|j}|j
|ddddf |	dd |dd d t|j|dd | rt|j| t	f |
jtj|
d  d}|j
||	tj| d |dkr| st d| d t|j|dd | rt|j| |r| }tj||d|d  gdd}t|	|	d|d  g}| }|d|d   d9  < tj||d|d  gdd}|rt|}t|}t	f |
j
||	|d}t	f |
j
|||d}t|j|j | rt|j|j dS )zTest that the impact of sample_weight is consistent.

    Note that this test is stricter than the common test
    check_sample_weights_invariance alone.
    r'   )r)   r,   zunsupported configurationr   r@   r  r<   rg   r  r   )rf   rb   re   r   rD   rl   Nro   r  r  r   r   rJ   r?  rb   r   rh   zSolver z- does fail test for scaling of sample_weight.rm   )ru   r   r7   rQ   rR   ru  r4   r5   rq   r   rs   rw   r   rt   Z	ones_liker"   rU   rz   r5  pir   Ztoarrayr   )rf   r   rd  re   rZ   r]   rB   rC   r1   ra   r?   rN  r{   r}   rp   rf  ZX2y2Zsample_weight_1Zsample_weight_2re  r/   r/   r2   $test_ridge_sample_weight_consistency  s    






0 

r  )r   r   r   rI   rE   r   r   r   TFFN)r  	itertoolsr   numpyr7   ru   Zscipy.sparser&  r4   Zscipyr   Zsklearnr   Zsklearn.datasetsr   r   r   r   Zsklearn.exceptionsr	   Zsklearn.linear_modelr
   r   r   r   r   r   Zsklearn.linear_model._ridger   r   r   r   r   r   r   Zsklearn.metricsr   r   r   Zsklearn.model_selectionr   r   r   r   r   Zsklearn.preprocessingr   Zsklearn.utilsr    r!   Zsklearn.utils._testingr"   r#   r$   r%   r&   ZSOLVERSr   r   Zload_diabetesZdiabetesrd  r   r   r   r   rz   indrQ   rR   r]   r   Z	load_irisrc  r5   rL  rK  r3   r6   r;   r=   Zfixturerd   markZparametrizer~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r  r%  r)  r3  r7  r<  r>  rD  rF  rI  rO  rS  rX  rY  r[  r\  rb  rg  rh  rl  rm  rs  rx  r  r  r  r   	TypeErrorr  r  r  r  r  r  r  r  ry   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r/   r/   r/   r2   <module>   s   $	

F*&(555-	 
           
-!'	<	
6
	G


#
 


'	

$
	
 7 
"  



 

%
