o
    :ήcA                     @   s\  d dl Zd dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZ d dlmZmZmZmZ d dlmZ d dlmZ dd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z d d! Z!d"d# Z"d$d% Z#d&d' Z$d(d) Z%eed*d+d,d- Z&d.d/ Z'd0d1 Z(d2d3 Z)d4d5 Z*d6d7 Z+d8d9 Z,d:d; Z-d<d= Z.d>d? Z/d@dA Z0dS )B    N)testing)expected_warnings)arch32assert_almost_equalassert_array_lessassert_equalxfail)LineModelNDCircleModelEllipseModelransac)_dynamic_max_trials)AffineTransformc                   C   B   t t t td W d    d S 1 sw   Y  d S N      )r   raises
ValueErrorr	   estimatenpempty r   r   E/tmp/pip-target-vg8gfxp4/lib/python/skimage/measure/tests/test_fit.pytest_line_model_invalid_input      "r   c                  C   s6   t  } d| _tdd}| |}t|| | d S )N))r   r   )r   r   
   )r	   paramsr   arange	predict_yr   	predict_xmodelxyr   r   r   test_line_model_predict   s
   
r'   c                  C   s  t t t td W d    n1 sw   Y  t t t td W d    n1 s7w   Y  t t t tdtd W d    n1 sYw   Y  t t t td W d    n1 sww   Y  t t t tdtd W d    n1 sw   Y  t t t t	d W d    n1 sw   Y  t t t 
t	d W d    n1 sw   Y  t	d} t t t |  W d    d S 1 sw   Y  d S )Nr   r   )r      )r   r   r   r	   r"   r   zerosr!   r   r   	residualsdatar   r   r    test_line_model_nd_invalid_input   s2   
"r-   c                  C   sN   t  } tddgtddgf| _tdd}| |}t|| | d S )Nr   g?g?r   r   )r	   r   arrayr   r    r!   r   r"   r#   r   r   r   test_line_model_nd_predict4   s
   
r/   c                  C   s  t  } tjg dddtjg dddtd f| _| jd dtdd	d
tjf  | jd   }tjd}||j	|j
d }t  }|| ttjt| jd |jd dd |jd | jd  }tj|dkrw|tj| }ttjt| jd |dd d S )Nr   r   r   floatdtype)r   r   r   r   r   r   d   .r     size)r	   r   r.   sqrtr   r    newaxisrandomdefault_rngnormalshaper   r   linalgnormcross)model0data0random_stater,   	model_estar   r   r   test_line_model_nd_estimate<   s(   "
&rG   c                  C   s   t  } tg dtg df| _tt| tg dgd tt| tg dgd tt| tg dgd tg dg}tg dtg df}tt| j||dd d S )	Nr0   r   r   r   r   )r   r   r   r   )r(   r   r   )r      )r	   r   r.   r   r   absr*   )r$   r,   r   r   r   r   test_line_model_nd_residuals\   s      rK   c                  C   sF   t d} tt t |  W d    d S 1 sw   Y  d S r   )r   r   r   r   r   r	   r   r+   r   r   r   "test_line_modelND_under_determinedh   s   
"rL   c                   C   r   N)   r   )r   r   r   r
   r   r   r   r   r   r   r   test_circle_model_invalid_inputn   r   rO   c                  C   sN   t  } d}dd|f| _tddtj tjd }td}t|| | d S )NrN   r   r(   )rN   r   )r   rN   r   )r   rR   )r
   r   r   r    pir.   r   
predict_xy)r$   rtxyr   r   r   test_circle_model_predicts   s   
rX   c                  C   sl   t  } d| _tddtj d}| |}tjd}||j|j	d }t  }|
| t| j|jd d S )Nr      r   r   r(     r6   r7   )r
   r   r   linspacerS   rT   r;   r<   r=   r>   r   r   )rB   rV   rC   rD   r,   rE   r   r   r   test_circle_model_estimate}   s   

r]   c                  C   sT   t jddgddgddgddggt jd} | d7 } t }||  t|jg d d S )Nr   r   r2     )r_   r_   r   )r   r.   int32r
   r   r   r   )rW   r$   r   r   r   test_circle_model_int_overflow   s
   (
ra   c                  C   sz   t  } d| _tt| tddggd tt| tddggtdd  tt| tddggd d S )N)r   r   rN   rN   r      H   r   )r
   r   r   rJ   r*   r   r.   r9   r$   r   r   r   test_circle_model_residuals   s    $re   c               	   C   s   t  } tdg | tddgddgg W d    n1 s!w   Y  tdg | td W d    n1 s>w   Y  tdg | tddgddgddgg W d    d S 1 sew   Y  d S )Nz.Input data does not contain enough significantr   r(   r      )rb   r(   r   )r
   r   r   r   r.   onesrd   r   r   r   #test_circle_model_insufficient_data   s   $"rh   c                   C   r   rM   )r   r   r   r   r   r   r   r   r   r   r    test_ellipse_model_invalid_input   r   ri   c                  C   sD   t  } d| _tddtj tjd }td}t|| | d S )N)r   r   rN   r   r   r   r(   )rP   )r   r   rQ   )r   r   )r   r   r   r    rS   r.   r   rT   )r$   rV   rW   r   r   r   test_ellipse_model_predict   s
   
rj   c            	      C   s   t dddD ]V} t| }t }dddd|f|_tddtj d}||}tj	d	}||j
|jd
 }t }|| t|jd d |jd d d ||}t|t|j qd S )Nr         r         r(   r5   r6   r7   )ranger   deg2radr   r   r\   rS   rT   r;   r<   r=   r>   r   r   r*   r   rg   )	angleradrB   rV   rC   rD   r,   rE   resr   r   r   test_ellipse_model_estimate   s   


 
rt   c                  C   s  t jg ddgddgddgddgd	d
gddgddgddgddgddgddgddgddgddgddgddgddgddgd d!gd"dgd#d$gd%d&gd'd!gd'd&gd(d&gd)d*gd+dgd,dgd-dgd.d/gd0dgd0dgd1d2gd1d3gd4d5gd4d6gd7d8gd9dgd:d;gd<d=gd>d?gd@d
gdAdBgdCdDgdEdFgdGdHgdIdJgdIdKgdLdMgdLdNgdOdPgdQdRgdSdTgdUdVgdUdMgdWdXgdWdYgdZdMgd[d\gdZdHgdZd]gd[dgd^d_gd`dagdbdcgdddegdddfgdbdggdbdgdddgd`dhgdid]gdjdkgdldmgdldgdndogdpdqgdrdsgdtdugdndJgdrdgdvd
gdwdqgdxdHgdydzgdwd{gd|d}gdxd~gddgddgddKgdd5gddsgdd$gddgddgddgddgddgddegddgddgddgddgddgddgddgddgddgddgddcgddgddgddgddgddgddsgddggddgddgddegddgddgddgddgddXgddNgddgddgddgddgddgddgddgddgddgt jd} t }||  t|jd d t dd tt dt 	|jd d  d S )Ni  iV  i	  ik  i  i_  i  iY  i  i  i  i  i1  i  iD  i  iO  i  iP  iY  i  ib  i  ic  i  il  i  im  i  iw  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  iW  i  iL  iu  i  iM  ii  i  is  i!  ij  i  i`  i)  ia  i*  i9  iC  i3  i5  i:  i  i=  i
  i<  i/  i>  i$  i?  i  i  i  i  iF  iC  i  iG  i%  iJ  i  iH  i8  iI  i  iE  i  iK  iR  iQ  iN  i{  i  iT  i  i  i[  i  i\  i  i]  i^  i  ie  i"  i  ig  i  ii  io  i  ip  i  iq  i  iy  i  i  i  i  iz  i  i{  i  i  i}  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i)  i  i  i  i  i  i  i+  i  i  i  i  i  io  r2   rf   r[   )
r   r.   r`   r   r   r   r   fullr)   rJ   )r,   r$   r   r   r   %test_ellipse_model_estimate_from_data   s.  						






$rv   zKnown test failure on 32-bit platforms. See links for details: https://github.com/scikit-image/scikit-image/issues/3091 https://github.com/scikit-image/scikit-image/issues/2670)	conditionreasonc                  C   sD   t  } | tdrJ | tddgddgddggr J d S )N)rN   r(   2   P   3   Q   4   )r   r   r   rg   r.   rd   r   r   r   #test_ellipse_model_estimate_failers   s   *r~   c                  C   sp   t  } d| _tt| tddggd tt| tddggd tt| tddggd d S )N)r   r   r   rN   r   r   r   rN   )r   r   r   rJ   r*   r   r.   rd   r   r   r   test_ellipse_model_residuals  s
     $r   c                  C   s   t  } d| _tddtj d}| |}d}d||d d d f< d||d d d f< d	||d d d f< t|t d
ddd\}}t| j|j |D ]}||vsQJ qId S )NrY   r   r(   r[   )r   rI      )r[   r[   )iry   r   )r4   r   r   rN   rD   )r
   r   r   r\   rS   rT   r   r   )rB   rV   rC   outliersrE   inliersoutlierr   r   r   test_ransac_shape  s   
r   c                  C   s   t jd} d| d }tdddd}||}d}d	||d
 < d||d < d||d < t||ftdd| d\}}t|j|j t t |dkd
 |ksPJ d S )Ni̼ r5   )ry   r(   )      ?333333?r   )r   rm   )scalerotationtranslation)r   rN   rm   )'  r   r   )r4   r5   )ry   ry   r(   rm   r   F)	r   r;   r<   r   r   r   r   allnonzero)rD   srcrB   dstr   rE   r   r   r   r   test_ransac_geometric&  s   
$r   c               	   C   j   dd } t dg ttdtdtj| dd\}}W d    n1 s$w   Y  t|d  t|d  d S )Nc                 S   s   | j d dkS )Nr   r(   )r>   r+   r   r   r   is_data_valid?  s   z0test_ransac_is_data_valid.<locals>.is_data_validNo inliers foundr   r(   r(   r   )r   rD   r   r   r   r   r	   infr   )r   r$   r   r   r   r   test_ransac_is_data_valid>     
r   c               	   C   r   )Nc                 S   s   dS )NFr   )r$   r,   r   r   r   is_model_validI  s   z2test_ransac_is_model_valid.<locals>.is_model_validr   r   r(   r   )r   rD   r   )r   r$   r   r   r   r   test_ransac_is_model_validH  r   r   c                   C   s   t tddddd t tddddd t tddddd t tddddd	 t td
dddd t tddddd t tddddd t tddddd t td
dddd t tddddd t tddddtj d S )Nr5   r(   gGz?r   _   Z   r   F      ry         rN   	   N   i  r   )r   r   r   r   r   r   r   r   test_ransac_dynamic_max_trialsR  s   r   c                   C   s  t t ttdd ddd W d    n1 sw   Y  t t ttdd dddd W d    n1 s<w   Y  t t ttdd dddd W d    n1 s]w   Y  t t ttdd ddd	d W d    n1 s~w   Y  t t ttdd ddd W d    n1 sw   Y  t t ttdd d
dd W d    n1 sw   Y  t t ttdd ddd W d    d S 1 sw   Y  d S )Nr   r(   g      )min_samplesresidual_thresholdr   r^   r   r   
max_trials)r   r   stop_probabilityg)\(?r   )r   r   r   r   r   r)   r   r   r   r   test_ransac_invalid_inputr  sF   "r   c                  C   s\   G dd dt } td}tdg t|| dddd W d    d S 1 s'w   Y  d S )	Nc                   @   s    e Zd ZdZdd Zdd ZdS )z1test_ransac_sample_duplicates.<locals>.DummyModelz$Dummy model to check for duplicates.c                 S   s   t t|j|j dS )NT)r   r   uniquer8   selfr,   r   r   r   r     s   z:test_ransac_sample_duplicates.<locals>.DummyModel.estimatec                 S   s   t jt|t jdS )Nr2   )r   rg   lendoubler   r   r   r   r*     s   z;test_ransac_sample_duplicates.<locals>.DummyModel.residualsN)__name__
__module____qualname____doc__r   r*   r   r   r   r   
DummyModel  s    r   rf   r   r   g        r   r   )objectr   r    r   r   )r   r,   r   r   r   test_ransac_sample_duplicates  s   

"r   c                  C   sj   t jdd} tdg t| tdddd\}}W d    n1 s"w   Y  |d u s-J |d u s3J d S )NrN   r(   z"No inliers found. Model not fittedr   r   i> )model_classr   r   rD   )r   r;   randr   r   r	   )r,   r$   r   r   r   r   !test_ransac_with_no_final_inliers  s   r   c               
   C   s   dt fdd} tjd}tg dg dd|dd d	 }td
g t|tdddd| d W d   dS 1 s<w   Y  dS )zExample from GH issue #5572returnc                 W   s.   t tt| jd g d}|dtj kS )zIAllow models with a maximum of 10 degree tilt from the vertical

        r   rH   gqq?)rJ   r   arccosdotr   rS   )r$   random_datatiltr   r   r   r     s    z8test_ransac_non_valid_best_model.<locals>.is_model_validr   r0   )r   r   r   r[   r   r   zEstimated model is not validr(   r   ry   r   )r   r   r   rD   r   N)	boolr   r;   RandomStater\   r   r   r   r	   )r   rndr,   r   r   r    test_ransac_non_valid_best_model  s   &"r   )1numpyr   skimage._sharedr   skimage._shared._warningsr   skimage._shared.testingr   r   r   r   r   skimage.measurer	   r
   r   r   skimage.measure.fitr   skimage.transformr   r   r'   r-   r/   rG   rK   rL   rO   rX   r]   ra   re   rh   ri   rj   rt   rv   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sL     

		&
	

 	