U
    2d	                    @   s
  d dl Zd dlmZ d dlm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 d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dl!m"Z" d dlm#Z# d dlm$Z$ d dlm%Z% d dl!m&Z& d dl!m'Z' d dl!m(Z( d dl!m)Z) d dl!m*Z* d dl!m+Z+ d dl,m-Z- d dl,m.Z. d dl,m/Z/ d d l,m0Z0 d d!l1m2Z2 d d"l1m3Z3 d d#l1m4Z4 d d$l1m5Z5 d d%l1m6Z6 d d&l7m8Z8 d d'lm9Z9 d(Z:d)Z;d*Z<e= Z>e>j?e>j@ ZAZBeCeAjDd  ZEejFGd ZHeHIeE eEdd+ ZEeAeE eBeE  ZAZBeJ ZKeLeKj?ZMeKj@ZNd,d- ZOd.d/ ZPd0d1 ZQd2d3 ZRe	jSd4d5gd6d7d8 ZTe	jUVd9e:e	jUVd:d;d<gd=d> ZWe	jUVd9e:e	jUVd:d;d<gd?d@ ZXe	jUVd9e:e	jUVd:d;d<gdAdB ZYe	jUVd9e:e	jUVd:d;d<gdCdD ZZe	jUVd9e:e	jUVd:d;d<gdEdF Z[e	jUVd9e:e	jUVd:d;d<gdGdH Z\e	jUVd9e:e	jUVd:d;d<ge	jUVdId;d<ge	jUVdJdKdLgdMdN Z]dOdP Z^dQdR Z_dSdT Z`dUdV ZadWdX ZbdYdZ Zce	jUVd[d\d]d^gd_d` Zde	jUVdadbdcdddedfge	jUVdgd;d<gdhdi Zee	jUVdadbdcdddedfge	jUVdgd;d<gdjdk ZfddrdsZge	jUVdtdudv edwdxdydzd{d|gd<d;gD e	jUVd}d~ddge	jUVdeCddd Zhe	jUVdddge	jUVdejiejLge	jUVdddge	jUVd:d;d<ge	jUVddddgdd Zjdd Zke	jUVdddge	jUVdejiejLge	jUVdddge	jUVdddddgdd Zle	jUVdd;d<ge	jUVdddddgdd Zmdd Zndd Zoe	jUVde#d<de.fe%d<de/fgdd Zpe	jUVde# e.fe% e/fge	jUVdddgdd Zqdd Zrdd Zsdd Ztdd Zue	jUVdddeQge	jUVdde3dge	jUVdeOePgdd Zve	jUVdde3dge	jUVdeOePgdd Zwdd ZxddĄ Zye	jUVdeneoeseteuexfddǄ ZzddɄ Z{e	jUVde$e%fdd̄ Z|dd΄ Z}e	jUVdddeRgddф Z~e	jUVdddeQgddӄ Ze	jUVde#e%gddք Zdd؄ Zddڄ Zdd܄ Zddބ Ze	jUVde#e%ge	jUVdddiedfddiedfddiedfgdd Ze	jUVde#e%gdd Zdd Zdd Zedd Ze	jUVd9dzdyddge	jUVdd;d<gdd Ze	jUVd9d{ddwgdd Ze	jUVdd;d<gdd Ze	jUVdd<d;ge	jUVddedge	jUVdejejLge	jUVd9ddydwdzdxd{dgdd Ze	jUVd9ddydwdzdxd{dgd d Zdd Ze	jUVd9ddwdzdydxd{dge	jUVdedodd Zdd Ze	jUVde$i fe%ddife%ddifgd	d
 Ze	jUVd9ddge	jUVd:d;d<ge	jUVdJddLddKgdd Ze	jUVd:d;d<ge	jUVdJddLddKgdd Ze	jUVd9ddwdzdydxd{gdd Ze	jUVdJddLddKgdd Ze	jUVdJddLddKgdd Zdd Ze	jUVd9dwdzdyddxd{dgdd ZdS (      N)linalg)product)	_IS_32BIT)assert_almost_equal)assert_allclose)assert_array_almost_equal)assert_array_equal)ignore_warnings)check_sample_weights_invariance)ConvergenceWarning)datasetsmean_squared_error)make_scorer)
get_scorer)LinearRegression)ridge_regression)Ridge)	_RidgeGCV)RidgeCV)RidgeClassifier)RidgeClassifierCV)_solve_cholesky)_solve_cholesky_kernel)
_solve_svd)_solve_lbfgs)_check_gcv_mode)_X_CenterStackOp)make_low_rank_matrix)make_regression)make_classification)make_multilabel_classification)GridSearchCV)KFold)
GroupKFold)cross_val_predict)LeaveOneOut)minmax_scale)check_random_state)svd	sparse_cgcholeskylsqrsagsaga)r*   r-   )r*   r+   r,   r-   r.      c                 C   s   | S N Xr1   r1   I/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/linear_model/tests/test_ridge.pyDENSE_FILTERF   s    r5   c                 C   s
   t | S r0   )sp
csr_matrixr2   r1   r1   r4   SPARSE_FILTERJ   s    r8   c                 C   s   t | |kS r0   )npmeanZy_testy_predr1   r1   r4   _accuracy_callableN   s    r=   c                 C   s   | | d   S )N   )r:   r;   r1   r1   r4   _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 mininum ||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@   )      )rC   rB   )	n_samples
n_featureseffective_rankrandom_state   NMbP?
   lowhighsizerP   r>   r   )rI   rI   )paramminr9   randomRandomStater   r   r)   allAssertionErroruniformnormalTZdiagidentityZsolvenorm)global_random_seedrequestrD   rE   krngr3   UsZVtZU1ZU2ZVt1_Zcoef_olsyalphadZ
coef_ridgeZR_OLSZR_Ridger1   r1   r4   ols_ridge_datasetV   s<    


   **rg   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瞯<绽|=re   ri   rh   tolrG   rH   r>   NrI   r   axissample_weight)dictr9   r:   sumr   fit
intercept_pytestapproxrW   r   coef_scoreonesshape)rh   ri   rg   r]   r3   rd   rc   coefre   rA   Zres_nullZ	res_RidgeZR2_Ridgemodel	interceptr1   r1   r4   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.
    rj   r>   rk   rl   rm   rn   NrI         ?rH   rp   r   :0yE>atol)r}   r   r9   concatenater   matrix_rankrS   rW   r:   rv   rw   rx   ry   r   rz   r_rh   ri   rg   r]   r3   rd   rc   r~   rD   rE   re   r   r   r1   r1   r4    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.
    rj   r>   rk   rl   rm   rn   NrI   r   rp   r   r   )r}   r   r9   r   r   r   rS   rW   r   r:   rv   rw   rx   ry   r   rz   r   r1   r1   r4    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   rk   rl   rm   rn   NrI   1Ridge does not provide the minimum norm solution.reason)r}   rt   r   rv   rw   rx   ry   rW   r   rz   predictr9   r   r\   r   xfail)rh   ri   rg   r]   r3   rd   r~   rc   rD   rE   re   rA   r   r   r1   r1   r4   !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   rk   rl   rm   rn   NrI   r   rH   rp   r+   r   r   )r}   r   r9   r   r   r   rS   rW   rv   rw   rx   ry   skipr   rz   r   r   r\   r   rh   ri   rg   r]   r3   rd   r~   rc   rD   rE   re   r   r   r1   r1   r4   ,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   rk   rl   rm   rn   NrI   rp   r   r   )r}   r   r9   r   r   r   rS   rW   r   rv   rw   rx   ry   r   rz   r   r\   r   r   r1   r1   r4   ,test_ridge_regression_unpenalized_vstacked_X  s:    
r   sparseXre   rj   {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   rH   rM   rk   rl   rm   順 )re   ri   rh   ro   max_iterrG   NrI   rp   rr   )SPARSE_SOLVERS_WITH_INTERCEPTrx   r    SPARSE_SOLVERS_WITHOUT_INTERCEPTr}   r`   rX   r   r9   r   r   r:   r6   r7   rv   rw   ry   rW   r   rz   )rh   ri   r   re   rg   r]   r3   rd   rc   r~   rD   rE   swr   r   r1   r1   r4   $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 )NrI   rH   r   re   )	
y_diabetesreshaper   
X_diabetesr9   dotrZ   r   r   )rd   r~   KZ	dual_coefZcoef2r1   r1   r4   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      rL   z3sparse_cg did not converge after [0-9]+ iterations.matchrj   r*           rH   )re   rh   ro   r   verbose)r9   rT   rU   randnrx   warnsr   r   )r`   rd   r3   Zwarning_messager1   r1   r4   &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   rL   rH   r1   rH   r>   )r>   )r9   rT   rU   r   newaxisc_r   rv   rz   r}   rW   rw   
isinstanceZndarrayfloat)r`   rD   rE   r3   rd   ZY1Yridger1   r1   r4   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   rj   rH   )	r9   rT   rU   r   r   r   rv   rw   r   )r`   rD   rE   r3   rd   r   r   r   r1   r1   r4   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   rC   r   Fre   ri   ri   )	r9   rT   rU   r   r   r   rv   r   rz   )r`   rD   rE   rd   r3   r   Zolsr1   r1   r4   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*   )   rL   r   c                    s&   g | ]\}}t |d d |jqS )r+   re   rh   r   rv   rz   ).0re   targetr2   r1   r4   
<listcomp>V  s   z3test_ridge_individual_penalties.<locals>.<listcomp>c                    s$   g | ]}t |d d jqS )-q=)re   rh   ro   r   )r   rh   r3   Z	penaltiesrd   r1   r4   r   \  s   )r)   r*   r,   r+   r-   r.   rI   r   zCNumber of targets and number of penalties do not correspond: 4 != 5r   )r9   rT   rU   r   arangearrayziprZ   r   r   rx   raises
ValueErrorrv   )	r`   rD   rE   	n_targetscoef_choleskyZcoefs_indiv_penZcoef_indiv_penr   err_msgr1   r   r4   test_ridge_individual_penaltiesJ  s&    



r   n_colr1   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   )r9   rT   rU   r   lenr   r6   r7   Zhstackr   r   rZ   )	r   r`   r3   ZX_msqrt_swr   AoperatorZreference_operatorr1   r1   r4   test_X_CenterStackOpj  s    
.r   r}   )rL   rH   )   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   rH   )rq   weightsTr   )r9   rT   rU   r   r|   r}   	chisquaresqrtaverager   rZ   r6   r7   r   Z_compute_gramr   )r}   r   r`   r3   r   r   X_mean
X_centeredZ	true_gramX_sparsegcvZcomputed_gramcomputed_meanr1   r1   r4   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   )r9   rT   rU   r   r|   r}   r   r   r   rZ   r   r6   r7   r   Z_compute_covariancer   )r}   r   r`   r3   r   r   r   r   Ztrue_covariancer   r   Zcomputed_covr   r1   r1   r4   test_compute_covariance  s    



r   d   r   rL   rH         *@      >@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)	rD   rE   n_informativer   biasnoiseshuffler~   rG   rH   r   r   )
r   r9   asarrayrT   rU   Zbinomialr}   copyr   abs)rD   rE   proportion_nonzeror   r   r   X_offsetr   r   r~   positiverG   r3   rd   cmaskZ	removed_Xr1   r1   r4   _make_sparse_offset_regression  s8    

r   zsolver, sparse_Xc                 c   s&   | ]\}}|r|d ks||fV  qdS ))r*   ridgecvNr1   )r   rh   sparse_Xr1   r1   r4   	<genexpr>  s    r   r+   r-   r*   r,   r.   r   z"n_samples,dtype,proportion_nonzero)r   float32皙?)(   r   rj   )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 )Nrj   g?g      I@g     @@rL      )r   rE   r   r   rG   rD   r)   )rh   re   F)r   r   alphasrm   )rh   ro   re   rJ   r   rtol)r   r'   r   rv   astyper6   r7   r   r   rz   rw   )rh   r   rD   dtyper   r   re   r   r3   rd   Z	svd_ridger   r1   r1   r4   test_solver_consistency  s,    

r  gcv_moder)   eigenX_constructorX_shape)r   r   )r   r   zy_shape, noise)r   rj   )r   rH   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>   rI   rH   r   Fr   rD   rE   r   rG   r   r   r   rJ   r   rj         $@     @@neg_mean_squared_errorcvri   r   scoring)r  ri   r   r  )r   r   r   r   rv   alpha_rx   ry   rW   r   rz   rw   )r  r  r	  y_shaperi   r   rD   rE   r   r3   rd   r   	loo_ridge	gcv_ridgeX_gcvr1   r1   r4   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)rL   r   rH   r   Fr   r  rJ   r   rj   r  r  Tr  )ri   r   r  r  )
r   r   rv   r  rx   ry   rW   r   rz   rw   )	r  rD   rE   r   r3   rd   r   r  r  r1   r1   r4   test_ridge_loo_cv_asym_scoring1  s2    

   r  rE   r   r   zy_shape, fit_intercept, noise)r
  Trj   )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 )NrJ   r   rj   r  r  r   r>   rI   rH   r   F)rD   rE   r   rG   r   r   r   )Zn_splits)groupsr  )r   r  r  ri   r   r  c                    s"   g | ]}t j |k d dqS )r   rp   )r9   ru   )r   iindicesZkfold_errorsr1   r4   r     s    z1test_ridge_gcv_sample_weights.<locals>.<listcomp>T)r   store_cv_valuesr  ri   rr   r  )r9   rT   rU   r   r   r   r   rS   r  intrepeatr   r}   r   r$   splitr   rv   r   r  r%   r   
cv_values_indexrx   ry   rW   r   rz   rw   )r  r  ri   rE   r  r   r   r`   r   r3   rd   rs   ZX_tiledZy_tiledr  splitsZkfoldZ	ridge_regZpredictionsr  r  Z
gcv_errorsr1   r   r4   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>   )rD   rE   )r   r6   r7   r   rW   rZ   )r*  modeZmode_n_greater_than_pZmode_p_greater_than_nr3   rc   r1   r1   r4   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)ri   r  c                 S   s   t | | S r0   r   )xrd   r1   r1   r4   func  s    z_test_ridge_loo.<locals>.funcr  rr   h㈵>r  )r   r}   r5   r   rv   r   r  appendr	   r   r   r   rx   ry   rW   r   r9   r|   vstackrZ   r   r   )filter_rD   retri   Z	ridge_gcvr  fr  Z
ridge_gcv2r/  Z
ridge_gcv3ZscorerZ
ridge_gcv4r   Y_predr<   r1   r1   r4   _test_ridge_loo  s>    



r7  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 )NrH   r   r  )r   rv   r   r   r   r   rz   r}   rW   typerw   r9   r   r#   
set_params)r3  ridge_cvr  r1   r1   r4   _test_ridge_cv  s    r;  zridge, make_dataset)r"  c                 C   s.   |ddd\}}|  || t| dr*td S )N   r   rD   rG   r&  )rv   hasattrrW   )r   make_datasetr3   rd   r1   r1   r4   #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 )Nr<  r   r=  F)r"  r  best_score_)r9  rv   r>  rW   r   rA  r   )r   r?  r  r3   rd   r1   r1   r4   test_ridge_best_score   s
    rB  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   rH   g?r>   rJ   )rH   r     c                    s    g | ]}t d  |jqS )r   )r   rv   r  )r   r   r3   r   r1   r4   r   !  s     z6test_ridge_cv_individual_penalties.<locals>.<listcomp>T)r   alpha_per_targetr   )r   rE  r"  Zr2)r   rE  r  )r   r  rE  z3cv!=None and alpha_per_target=True are incompatibler   r<  )r9   rT   rU   r   r   r|   rZ   r   rv   r   r  r   r   rz   r}   rW   rA  r&  r   Zisscalarr&   rx   r   r   )r`   rD   rE   r   rd   Zoptimal_alphasr:  msgr1   rD  r4   "test_ridge_cv_individual_penalties  sd    
"&&
    rG  c                 C   s2   t dd}|| tt t|| ttdS )NFr   r   )r   rv   r   r   r9   roundr{   )r3  r   r1   r1   r4   _test_ridge_diabetesU  s    
rI  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 )NrH   Fr   r>   r   decimal)r9   r2  r   rZ   r   r}   r   rv   rz   rW   r   r   )r3  r   rE   r   r6  r<   r1   r1   r4   _test_multi_ridge_diabetes[  s    

rL  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   rH   gHzG?r   r  g?)r9   uniquey_irisr}   X_irisr   r   rv   rz   rW   r   r:   r#   )r3  	n_classesrE   regr<   r  r1   r1   r4   _test_ridge_classifiersi  s    

rR  r  Zaccuracyr   r3  c                 C   s>   t |rt|n|}t||d}|| tt| t d S )N)r  r  )callabler   r   rv   rO  rN  r   )r3  r  r  scoring_clfr1   r1   r4   "test_ridge_classifier_with_scoringy  s    rV  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?r1   r;   r1   r1   r4   _dummy_score  s    z:test_ridge_regression_custom_scoring.<locals>._dummy_scorer>   r   )num)r   r  r  rW  r   )r9   Zlogspacer   r   rv   rO  rN  rA  rx   ry   rW   r  )r3  r  rX  r   rU  r1   r1   r4   $test_ridge_regression_custom_scoring  s    r[  c                 C   sh   t ddd}|| tt || tt}t ddd}|| tt || tt}||ksdtd S )Nr0  F)ro   ri   rJ   )r   rv   r   r   r{   rW   )r3  r   r{   Zridge2Zscore2r1   r1   r4   _test_tolerance  s    r\  c                 C   s2   | t }| t}|d k	r.|d k	r.t||dd d S )Nr   rJ  )r5   r8   r   )	test_funcZ	ret_denseZ
ret_sparser1   r1   r4   check_dense_sparse  s    r^  r]  c                 C   s   t |  d S r0   )r^  )r]  r1   r1   r4   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   皙rj   r   rH   rI   class_weightr   rJ   balancedr>   )r9   r   r   rv   r   r   r   Zclasses_rW   r   rz   rw   )r3   rd   rQ  Zregar1   r1   r4   test_class_weights  s(    (

"

re  rQ  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.rd  rb  rH   r   rj   g      Y@)r   rH   r>   r>   N)	rv   irisdatar   r   rz   r9   r|   r}   )rQ  Zreg1Zreg2rs   rc  r1   r1   r4   "test_class_weight_vs_sample_weight  s$    


rh  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   ra  rj   r   rH   rI   r   r   )rc  r   rJ   rL   gɿr>   )r9   r   r   rv   r   r   )r3   rd   rQ  r1   r1   r4   test_class_weights_cv  s    (ri  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   rj   r  Tr   r  r"  r  r   )r  r"  r  zcv!=None and store_cv_valuesr   )r9   rT   rU   r   r   rS  r   r   rv   r&  r}   rW   rx   r   r   )r  r`   rD   rE   r.  r   n_alphasrT  rrd   r   r1   r1   r4   test_ridgecv_store_cv_values  s$    

rm  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   ra  rj   r   rH   rI   r   r  Trj  )r9   r   r}   r   rS  r   r   rv   r&  rW   Z	transpose)	r  r.  rd   rD   r   rk  rT  rl  r   r1   r1   r4   (test_ridge_classifier_cv_store_cv_values+  s*    (

   &
rn  	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   rj   r  r   r   r>   r   z`alphas` was mutated in `z
.__init__`)r9   rT   rU   r   r   randintr   rW   __name__rv   r   r   )ro  r`   r   rD   rE   rd   r3   Z	ridge_estr1   r1   r4   test_ridgecv_alphas_conversionH  s    
rt  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   rp  )r<  r   r   rj   r   )r   r  rr   re   r  )r9   rT   rU   r   randr#   r   rv   r"   r   r  Zbest_estimator_re   rW   r   rz   )r`   r   rD   rE   rd   r3   rs   r  r   
parametersZgsr1   r1   r4   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   rH   rj   g       @r   c                      s      d S r0   rv   r1   )r3   r   sample_weights_not_OKrd   r1   r4   fit_ridge_not_ok  s    zStest_raises_value_error_if_sample_weights_greater_than_1d.<locals>.fit_ridge_not_okc                      s      d S r0   ry  r1   )r3   r   sample_weights_not_OK_2rd   r1   r4   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   )r9   rT   rU   r   r   r   r   rv   rx   r   r   )
n_samplessn_featuressr`   rD   rE   Zsample_weights_OKZsample_weights_OK_1Zsample_weights_OK_2r{  r}  r   r1   )r3   r   rz  r|  rd   r4   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   rj   Fr   rH   rr   r<  rJ  )r9   rT   rU   r6   Z
coo_matrixr7   Z
csc_matrixZ
lil_matrixZ
dok_matrixr   r   r   rv   r   rz   )r~  r  r`   Zsparse_matrix_converterssparse_ridgedense_ridgerD   rE   r3   rd   Zsample_weightsZsparse_converterr   r1   r1   r4   &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   ra  rj   r   rH   rI   )rH   rL   r   r   )r9   r   r   rv   )r3   rd   r   r1   r1   r4   test_ridgecv_int_alphas  s    (
r  zparams, err_type, err_msgr   )rH   rI   iz alphas\[1\] == -1, must be > 0.0)gr`  g      $z"alphas\[0\] == -0.1, must be > 0.0)rH   rj   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.rq  r   r>   r   N)r`   r   rr  rx   r   rv   )ro  rA   Zerr_typer   rD   rE   r3   rd   r1   r1   r4   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.
    rq  r   r>   rH   r   N)r`   r   r   rr  rv   )ro  rD   rE   r3   rd   r1   r1   r4   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   rj   r   r   )r9   Zeyer|   r   rx   r   r3   rd   	exceptionr/  messageZwrong_solverr1   r4   r/    s
    

z=test_raises_value_error_if_solver_not_supported.<locals>.func)r   r1   r1   r  r4   /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*   rH   )rh   r   r   )r   rv   r   r   rz   r}   rW   )rQ  r1   r1   r4   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>   rH   rC   )r-   r.   r,   r   )rh   r   ro   )r*   r)   r+   r   )r   r   r9   ZtilerZ   ranger   rv   r   Zn_iter_rW   )r   r3   rd   Zy_nr   rh   rQ  r1   r1   r4   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   )rE   rG   r   Nrj   r   rQ   r+  r*   r   )rh   ro   r   rr   gƠ>r  )r   r9   rT   rU   rX   r}   r   rv   r6   r7   r   rw   rz   )rh   r  r]   r   r3   rd   rs   r`   Zdense_solverr  r  r1   r1   r4   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   )rE   rG   rh   zsolver='{}' does not supportr   )	r   r6   r7   r   formatrx   r   r   rv   )rh   r3   rd   X_csrr  r   r1   r1   r4   %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      @)rE   rD   rG   r   rj   r   rQ   r-   Trm   r   )re   rh   ri   ro   r   rr   error-C6?r  z"sag" solver requires.*r   rJ   )rh   ri   ro   r   )r   r9   rT   rU   rX   r}   r6   r7   rt   r   rv   warningscatch_warningssimplefilterUserWarningr   rw   rz   rx   r   )
r  r]   r3   rd   r`   rs   r  rA   r  r  r1   r1   r4   #test_ridge_fit_intercept_sparse_sagP  s8       

    


r  return_interceptrs   rC  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   rC  r   rH   r>   r   r   g     @)rJ   ư>rJ   r  r  )r-   r+  zIn Ridge, only 'sag' solverr   )re   rh   rs   r  r   ro   N)re   rh   rs   r   r  ro   r   r  r   )
r(   rv  r9   r   r   rx   r   r   r   r   )r  rs   r  rh   r`   r3   Z
true_coefsrd   Ztrue_interceptZ	X_testingre   ro   r   r   outr~   r   r1   r1   r4   .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   rj   r  ru  r>     )re   rh   r   ro   r   r  gMb@?r  )r9   rT   rU   r   r  r   Zfinfo
resolutionr   rv   rz   r  rW   r   r   )rh   r`   re   r   rD   rE   X_64y_64X_32y_32ro   ridge_32coef_32ridge_64coef_64r1   r1   r4   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   rj   r   )r<  r   r>   r+   r   r   rJ  )r9   rT   rU   r   r   r  r   r   rv   rz   r  rW   r   r   )r`   re   rD   rE   Zn_targetr  r  r  r  r  r  r  r  r1   r1   r4   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 )Nru  r   rj   r  r*   rJ   r0  r  rm   F)	re   rh   rG   rs   r   r   ro   Zreturn_n_iterr  r   )r9   rT   rU   r   r   rt   r   r   r   r  r  rW   r   )rh   r   rG   rD   rE   r3   r~   rd   re   r   resultsr   Zcurrent_dtyper1   r1   r4   %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   rG   r>   r-   r  )r   r9   Zasfortranarrayr   rv   r  r1   r1   r4   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.rH   r   )rP  rG   rI   rp   Nr-   r  )
r!   r   r9   r   rv   r   r}   rW   r   r   )
ClassifierrA   r3   rd   r   rU  r6  r1   r1   r4   test_ridgeclassifier_multilabel  s    
"r  rJ   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.rH   r>   r   rC   r   r<  r   r   rK   r   Tre   r   rh   ri   r   N)r9   r   r   r   rv   rV   rz   rW   )rh   ri   re   r3   r~   r   rd   r   r1   r1   r4   #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   rj   rH   rQ   r   r   )TFrm   )re   r   ri   ro   r  r  N)r9   rT   rU   r   rX   r}   rY   r   r1  rv   rz   r   )
ri   re   r`   r3   r~   r   rd   r  r   r   r1   r1   r4   %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   rH   r>   r   rC   rI   TFr  zdoes not support positiver   zonly 'lbfgs' solver can be used)r   rh   r  N)r9   r   r   rx   r   r   rv   r   )rh   re   r3   r~   rd   r   rc   r1   r1   r4   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   rD   rE   rG   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   rQ   r   r>   )rw   r9   rT   rU   rz   rX   r}   ru   )r   rG   Znoise_scaler   r`   r~   r3   re   rd   r1   r4   
ridge_lossy  s    &z,test_positive_ridge_loss.<locals>.ridge_lossr   T)re   r   r  )Nr   )r   r   rv   rW   r  )	re   Zn_checksr  r   Zmodel_positiveZlossZloss_positiverG   Zloss_perturbedr1   r  r4   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  rH   FgؗҜ<i  )r   ro   r   r  r   r  N)r   r9   Zexpand_dimsr   r   r   r   )re   r3   rd   configZ
coef_lbfgsr   r1   r1   r4   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.rH   rI   g    _g    _Br   r  Fr   T)re   rh   ri   ro   r   r   zlbfgs solver did not converger   N)r9   r   r   rx   r   r   rv   )r3   rd   r   r1   r1   r4   test_lbfgs_solver_error  s    r  c                 C   s   t d| d| dkd}tf |}|jj}t||dd t||dd tjd}td	d
dd|d\}}|j	dd|j
d d}tj||gdd}tj||gdd}	tj||gdd}
tf |j||d| d}tf |j||	|
d}t|j|j t|j|j dS )zTest that Ridge fulfils sample weight invariance.

    Note that this test is stricter than the common test
    check_sample_weights_invariance alone.
    rj   r   r  )re   rh   ro   r   r|   )kindzerosr   r   r  rL   2   )rD   rE   rF   r   rG   r   r>   r   rM   rp   rr   N)rt   r   	__class__rs  r
   r9   rT   rU   r   rX   r}   r   rv   r   rz   rw   )rh   rA   rQ  namer`   r3   rd   r   ZX_dupZy_dupZsw_dupZ	ridge_2swZ	ridge_dupr1   r1   r4   #test_ridge_sample_weight_invariance  s4    	

r  )r   r   r   rL   rH   r   r   r   TFFN)Znumpyr9   Zscipy.sparser*  r6   Zscipyr   	itertoolsr   rx   r  Zsklearn.utilsr   Zsklearn.utils._testingr   r   r   r   r	   Zsklearn.utils.estimator_checksr
   Zsklearn.exceptionsr   Zsklearnr   Zsklearn.metricsr   r   r   Zsklearn.linear_modelr   r   r   Zsklearn.linear_model._ridger   r   r   r   r   r   r   r   r   r   Zsklearn.datasetsr   r   r    r!   Zsklearn.model_selectionr"   r#   r$   r%   r&   Zsklearn.preprocessingr'   r(   ZSOLVERSr   r   Zload_diabetesZdiabetesrg  r   r   r   r   r}   indrT   rU   r`   r   Z	load_irisrf  r7   rO  rN  r5   r8   r=   r?   Zfixturerg   markZparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r  r)  r-  r7  r;  r@  rB  rG  rI  rL  rR  rV  r[  r\  r^  r_  re  rh  ri  rm  rn  rt  rx  r  r  r  r   	TypeErrorr  r  r  r  r  r  r  r  r|   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r1   r1   r1   r4   <module>   sN  

F*&(555-	 
           
-!'	<	
6
	G


#
 


'	

$
	
 7 "  


 % 