U
    2d?F                     @   s   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mZmZ d d	lmZ d d
lmZ d dlmZ eddZde d ZeeegZejdZeej e!eddZ"ee"ddf  de#e!e"dd  7  < eddd f ddej$f Zedddf 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- Z0d.d/ Z1d0d1 Z2d2d3 Z3d4d5 Z4d6d7 Z5d8d9 Z6d:d; Z7d<d= Z8d>d? Z9d@dA Z:dBdC Z;dDdE Z<dFdG Z=dS )H    N)sparse)assert_array_almost_equal)assert_array_equal)check_random_state)assert_allclose)make_regression)LinearRegressionRANSACRegressorRidge)OrthogonalMatchingPursuit)_dynamic_max_trials)ConvergenceWarningi8   皙?     size2      
      c                  C   sN   t  } t| dddd}|tt t|jtj	}d|t
< t|j| d S Nr      r   min_samplesresidual_thresholdrandom_stateFr   r	   fitXynp	ones_likeinlier_mask_astypebool_outliersr   	estimatorransac_estimatorref_inlier_mask r,   J/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/linear_model/tests/test_ransac.pytest_ransac_inliers_outliers   s       r.   c               	   C   sj   dd } t jd}|dd}|dd}t }t|dd| dd}tt |	|| W 5 Q R X d S )	Nc                 S   s(   | j d dkst|j d dks$tdS Nr   r   FshapeAssertionErrorr    r!   r,   r,   r-   is_data_valid1   s    z0test_ransac_is_data_valid.<locals>.is_data_validr   r   r   r   r   )r   r   r4   r   )
r"   randomRandomStaterandr   r	   pytestraises
ValueErrorr   )r4   rngr    r!   r)   r*   r,   r,   r-   test_ransac_is_data_valid0   s    r<   c               	   C   sF   dd } t  }t|dd| dd}tt |tt W 5 Q R X d S )Nc                 S   s(   |j d dkst|j d dks$tdS r/   r0   r)   r    r!   r,   r,   r-   is_model_validG   s    z2test_ransac_is_model_valid.<locals>.is_model_validr   r   r   )r   r   r>   r   )r   r	   r8   r9   r:   r   r    r!   )r>   r)   r*   r,   r,   r-   test_ransac_is_model_validF   s    r?   c               	   C   s   t  } t| ddddd}tt |tt W 5 Q R X tt	tt	t
 tjd dd}t| dd}tdD ]0}|jd|d |tt |j|d	 k sntqnd S )
Nr   r   r   )r   r   
max_trialsr   gv?r   r   r   r   r   )r   r	   r8   r9   r:   r   r    r!   r   lenr'   r1   rangeZ
set_params	n_trials_r2   )r)   r*   r@   ir,   r,   r-   test_ransac_max_trialsX   s      rG   c                  C   s6   t  } t| ddddd}|tt |jdks2td S )Nr   r   r   )r   r   Zstop_n_inliersr   r   r   r	   r   r    r!   rE   r2   r)   r*   r,   r,   r-   test_ransac_stop_n_inliersp   s    rJ   c                  C   s6   t  } t| ddddd}|tt |jdks2td S )Nr   r   r   )r   r   Z
stop_scorer   r   rH   rI   r,   r,   r-   test_ransac_stop_score~   s    rK   c                  C   s   t dd d d f } t d}d|d< d|d< t }t|dddd}|| | || dd  |dd  dksvt|| d d |d d dk std S Nd   rM   r   r   r   g      ?r   )r"   arangezerosr   r	   r   Zscorer2   r    r!   r)   r*   r,   r,   r-   test_ransac_score   s    
   $rR   c                  C   sl   t dd d d f } t d}d|d< d|d< t }t|dddd}|| | t|| t d d S rL   )r"   rO   rP   r   r	   r   r   predictrQ   r,   r,   r-   test_ransac_predict   s    
   rT   c               	   C   st   dd } t  }t|| dd}d}tjt|d |tt W 5 Q R X |jdksTt	|j
dksbt	|jdkspt	d S )Nc                 S   s   dS NFr,   r3   r,   r,   r-   r4      s    z0test_ransac_no_valid_data.<locals>.is_data_validr   )r4   r@   +RANSAC could not find a valid consensus setmatchr   r   r	   r8   r9   r:   r   r    r!   n_skips_no_inliers_r2   n_skips_invalid_data_n_skips_invalid_model_r4   r)   r*   msgr,   r,   r-   test_ransac_no_valid_data   s      r_   c               	   C   st   dd } t  }t|| dd}d}tjt|d |tt W 5 Q R X |jdksTt	|j
dksbt	|jdkspt	d S )Nc                 S   s   dS rU   r,   r=   r,   r,   r-   r>      s    z2test_ransac_no_valid_model.<locals>.is_model_validr   )r>   r@   rV   rW   r   rY   )r>   r)   r*   r^   r,   r,   r-   test_ransac_no_valid_model   s      r`   c               	   C   sv   dd } t  }t|| ddd}d}tjt|d |tt W 5 Q R X |jdksVt	|j
d	ksdt	|jdksrt	d S )
Nc                 S   s   dS rU   r,   r3   r,   r,   r-   r4      s    z3test_ransac_exceed_max_skips.<locals>.is_data_validr      )r4   r@   	max_skipsz/RANSAC skipped more iterations than `max_skips`rW   r      rY   r]   r,   r,   r-   test_ransac_exceed_max_skips   s       rd   c               	   C   sz   da dd } t }t|| ddd}d}tjt|d |tt W 5 Q R X |j	d	ksZt
|jd
ksht
|jd	ksvt
d S )NFc                 S   s   t sda dS dS d S )NTF)
cause_skipr3   r,   r,   r-   r4      s    z8test_ransac_warn_exceed_max_skips.<locals>.is_data_validra   r   )r4   rb   r@   zRANSAC found a valid consensus set but exited early due to skipping more iterations than `max_skips`. See estimator attributes for diagnostics.rW   r   rc   )re   r   r	   r8   warnsr   r   r    r!   rZ   r2   r[   r\   )r4   r)   r*   Zwarning_messager,   r,   r-   !test_ransac_warn_exceed_max_skips   s        rg   c                  C   sX   t t} t }t|dddd}|| t t|j	
tj}d|t< t|j	| d S r   )r   Z
coo_matrixr    r   r	   r   r!   r"   r#   r$   r%   r&   r'   r   ZX_sparser)   r*   r+   r,   r,   r-   test_ransac_sparse_coo   s    
   ri   c                  C   sX   t t} t }t|dddd}|| t t|j	
tj}d|t< t|j	| d S r   )r   Z
csr_matrixr    r   r	   r   r!   r"   r#   r$   r%   r&   r'   r   rh   r,   r,   r-   test_ransac_sparse_csr
  s    
   rj   c                  C   sX   t t} t }t|dddd}|| t t|j	
tj}d|t< t|j	| d S r   )r   Z
csc_matrixr    r   r	   r   r!   r"   r#   r$   r%   r&   r'   r   rh   r,   r,   r-   test_ransac_sparse_csc  s    
   rk   c                  C   sX   t  } t| dddd}td dddd}|tt |tt t|t|t d S )Nr   r   r   r   )r   r	   r   r    r!   r   rS   )r)   r*   Zransac_none_estimatorr,   r,   r-   test_ransac_none_estimator(  s&           rl   c               	   C   s<  t  } t| dddd}t| dtjd  ddd}t| dddd}t| ddd}t| tjd d ddd}tt d ddd}|tt |tt |tt |tt t|t|t t|t|t t|t|t t	
t |tt W 5 Q R X d}t	j
t|d	 |tt W 5 Q R X d S )
Nr   r   r   r   g       @)r   r   r   z(`min_samples` needs to be explicitly setrW   )r   r	   r    r1   r
   r   r!   r   rS   r8   r9   r:   )r)   ransac_estimator1ransac_estimator2Zransac_estimator5Zransac_estimator6Zransac_estimator7Zransac_estimator8err_msgr,   r,   r-   test_ransac_min_n_samples;  sj                   rp   c                  C   s^   t  } t| dddd}ttttg}|t| t|j	tj
}d|t< t|j| d S r   )r   r	   r"   column_stackr!   r   r    r#   r$   r%   r&   r'   r   )r)   r*   yyyr+   r,   r,   r-   %test_ransac_multi_dimensional_targetsi  s       rs   c            	      C   s  dd } dd }dd }t tttg}t }t|ddd	d
}t|ddd	| d}t|ddd	|d}|t| |t| |t| t|t|t t|t|t |tt ||_	|tt t|t|t t|ddd	dd}|tt t|t|t d S )Nc                 S   s   t jt | | ddS )Nr   Zaxis)r"   sumabsZy_trueZy_predr,   r,   r-   loss_multi1~  s    z.test_ransac_residual_loss.<locals>.loss_multi1c                 S   s   t j| | d ddS )Nr   r   rt   )r"   ru   rw   r,   r,   r-   loss_multi2  s    z.test_ransac_residual_loss.<locals>.loss_multi2c                 S   s   t | | S )N)r"   rv   rw   r,   r,   r-   	loss_mono  s    z,test_ransac_residual_loss.<locals>.loss_monor   r   r   r   )r   r   r   lossZsquared_error)
r"   rq   r!   r   r	   r   r    r   rS   r{   )	rx   ry   rz   rr   r)   Zransac_estimator0rm   rn   Zransac_estimator3r,   r,   r-   test_ransac_residual_loss}  sn       	    r|   c                  C   sL   t  } t| ddd}|tt t|jtj	}d|t
< t|j| d S )Nr   r   rB   Fr   r(   r,   r,   r-   &test_ransac_default_residual_threshold  s    r}   c                   C   s   t dddddkstt dddddks,tt dddddksBtt ddddd	ksXtt d
ddddksntt dddddkstt dddddkstt dddddkstt d
ddddkstt dddddkstt ddddtdkstd S )NrM   r   gGz?r   _   Z   ra   F      r         r   	   N   i  r   r   inf)r   r2   floatr,   r,   r,   r-   test_ransac_dynamic_max_trials  s    r   c               	   C   s  t dd} tjd }t|}| tt| | jjd |ks@tt	| j
tj}d|t< t| j| td}|ddddg}tjd| d }|ddd}|dd	ddg}|ddd}	|d
dd}
tjtj||ddtj||	dddd}tjtjtj||ddtj|
|	dddd}| || | jj}t||	}tj||dd}t||
}| ||| t| jj| t }t |dd} |jj d}tjt|d | tt| W 5 Q R X d S )Nr   r   Fr   r   r   r   r   r   irt   rA   z  does not support sample_weight.rW   )r	   r!   r1   r"   Zonesr   r    r$   r2   r#   r%   r&   r'   r   r   randintZndarrayflattenappendrepeat
estimator_coef_r   r   	__class____name__r8   r9   r:   )r*   	n_samplesweightsr+   r   ZX_Zy_sample_weightZ	outlier_XZoutlier_weightZ	outlier_yZX_flatZy_flatZ	ref_coef_r)   ro   r,   r,   r-   test_ransac_fit_sample_weight  sN    


r   c                  C   s   t ddd\} }td}|jdd|jd d}||  }tt dd	}|j| ||d
 t }|j}|j| | || || d
 t	|j
j|jdd d S )Nr   r   )r   r   *   r   rc   r   r   )r)   r   )r   g-q=)Zatol)r   r   r   r1   ru   r	   r   r   r$   r   r   r   )r    r!   r;   r   ZransacZfinal_modelZmask_samplesr,   r,   r-   )test_ransac_final_model_fit_sample_weight   s      r   c                  C   s^   t ddddf } t d}t }t|dd}|| | t|jjd t|jj	d dS )zCheck that we can fit a line where all samples are inliers.
    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/19497
    rM   NrN   r   r   g        )
r"   rO   rP   r   r	   r   r   r   r   Z
intercept_rQ   r,   r,   r-   test_perfect_horizontal_line1  s    
r   c               	   C   s@   t t dddd} d}tjt|d | tt W 5 Q R X d S )Nr   r   r   )Zbase_estimatorr   r   r   zV`base_estimator` was renamed to `estimator` in version 1.1 and will be removed in 1.3.rW   )r	   r   r8   rf   FutureWarningr   r    r!   )r*   ro   r,   r,   r-   test_base_estimator_deprecatedA  s    r   )>Znumpyr"   r8   Zscipyr   Znumpy.testingr   r   Zsklearn.utilsr   Zsklearn.utils._testingr   Zsklearn.datasetsr   Zsklearn.linear_modelr   r	   r
   r   Zsklearn.linear_model._ransacr   Zsklearn.exceptionsr   rO   r    r!   rq   datar5   r6   r;   uniquer   rC   r'   r7   Znewaxisr.   r<   r?   rG   rJ   rK   rR   rT   r_   r`   rd   rg   ri   rj   rk   rl   rp   rs   r|   r}   r   r   r   r   r   r,   r,   r,   r-   <module>   sX   ,.> 7