U
    GvfCM                     @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	 d dl
Z
d dl
mZ d dlmZmZmZmZmZmZmZmZmZmZmZ G dd dZdS )    N)pi)assert_array_almost_equalassert_equalassert_warns)raises)DataModelODRRealDataOdrStop
OdrWarningmultilinearexponential	unilinear	quadratic
polynomialc                   @   s   e Z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d!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zejjd1d2d3d4d5 Zd6d7 Zd8S )9TestODRc                 C   s    t ttdd t ttdd d S )N      )assert_raises
ValueErrorr   r
   )self r   </tmp/pip-unpacked-wheel-96ln3f52/scipy/odr/tests/test_odr.pytest_bad_data   s    zTestODR.test_bad_datac                 C   s   |d | |d  S Nr   r   r   r   Bxr   r   r   empty_data_func   s    zTestODR.empty_data_funcc                 C   sN   ddg}t | j}tg g }ttt|||d tg g }ttt|||d d S )N{Gz?        beta0)r   r   r   r   r   r	   r
   )r   r#   linearZ	empty_datr   r   r   test_empty_data   s    

  
  zTestODR.test_empty_datac                 C   s2   |d |d t t |d | d d  }|S )Nr   r   r         ?)nppowerexp)r   r   r   retr   r   r   explicit_fcn+   s    .zTestODR.explicit_fcnc                 C   s6   t |d | }|d d |d  |d  | }|S )Nr   r          @r&   )r'   r)   )r   r   r   eBxr*   r   r   r   explicit_fjd/   s     zTestODR.explicit_fjdc                 C   sV   t |d | }t t |jd t |d d|d d |d  | | g}|S )Nr   r&   r   r,   )r'   r)   vstackonesshaper(   )r   r   r   r-   resr   r   r   explicit_fjb4   s    zTestODR.explicit_fjbc                 C   s  t | j| j| jtdddd}tdddddd	d
dddddgddddddddddddg}t||dddgddd d d d d d d d d dgd!}|jd"d# |jdddd$ |	 }t
|jtd%d&d'g t
|jtd(d)d*g t
|jtd+d,d-gd,d.d/gd-d/d0gg d S )1NzSample Explicit ModelzODRPACK UG, pg. 39nameref)fjacbfjacdmetar!         @      @g      @      $@g      0@g      :@      >@g      A@g     @A@      Y@g     ē@gfffff@g     @g     @g     @g33333@g     T@g     @gfffff@g33333@g     @g     @     p@g      Igr   r   r#   ifixxr   deriv)inititerfinalg8@gLA[KgxQ}gֳ?g1X?gy?ggC?gNM=y7׿g	Jgq?g]F f_gO>)r   r+   r4   r.   dictr   r	   set_jobZ
set_iprintrunr   betar'   arraysd_betacov_beta)r   Zexplicit_modZexplicit_datZexplicit_odroutr   r   r   test_explicit;   sX      zTestODR.test_explicitc                 C   sp   |d t |d |d  d d|d  |d |d   |d |d    |d t |d |d  d  d S )Nr   r   r,      r      r&   )r'   r(   r   r   r   r   implicit_fcna   s    *zTestODR.implicit_fcnc                 C   s   t | jdtdddd}tdddd	d
dddddddddddddddgdddddddd d!d"d#d$d%d%d&d'd(d)d*d+ggd}t||dd,d-d.d/gd0}| }t|jt	d1d2d3d4d5g t|j
t	d6d7d8d9d:g t|jt	d;d<d=d>d?gd<d@dAdBdCgd=dAdDdEdFgd>dBdEdGdHgd?dCdFdHdIgg d S )JNr   zSample Implicit ModelzODRPACK UG, pg. 49r5   )implicitr:         ?g333333?g?g(\?g(\ @gzG@gQ@g{Gz @gףp=
?gq=
ףp??gQѿg(\g(\gffffffg      g
ףp=
gq=
ףp	gQgQg333333      gffffffgRQgzG
g      g      g      g(\gzGgHzGg(\gp=
ףg      gQg      g(\gq=
ףpg      g
ףp=
?r    g{Gz?r"   g{ 3gzJrgJ/k?g&Z薞?gkj?g?g29?g3"͇p?g[=f?gx#+l?g:\ @g8%g??g'M['g%GRR?gdbb @ggRg	<?gkg};yWzg?g
WWgm&W?gK}U?g$_Tga?)r   rS   rH   r   r	   rJ   r   rK   r'   rL   rM   rN   )r   Zimplicit_modZimplicit_datZimplicit_odrrO   r   r   r   test_implicitf   s                 
 
      zTestODR.test_implicitc           
   
   C   s   |dk   rtt|d  d }t|}t|}tdt | t|d   |d }t|| d||  }|d |d  tt	td||  dt|| d |d   }t
|d |t|d |   |t|d |  g}	|	S )	Nr!   rQ   r,   r   r&   r   r   rR   )anyr   r   r'   cossinr(   r)   Zarctan2sqrtr0   )
r   r   r   thetaZcthetaZsthetaomegaphirr*   r   r   r   	multi_fcn   s     

(( zTestODR.multi_fcnc                 C   s  t | jtdddd}tddddd	d
dddddddddddddddddg}tddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2gd3d4d5d6d7d8d9d:d;d<d=d<d>d?d@dAdBdCdDdEdFdGdHgg}t|}tjdIdI|ftdJ}tj|t	dJ}tj|tdJ}dK|dLdLd d f< dM |dNdLd d f< |dLdNd d f< dO|dNdNd d f< t
|D ]}|| dk r\dL||< n`|| d	krlnP|| dkrdP||< n8|| dkrdQ||< n || dkrdR||< ndS||< || dks|| d	kr@dT|d d d d |f< q@t||dUt|dI |dV}	t|	|dWdXdYdZd[g||d\}
|
jdNdNd] |
 }t|jtd^d_d`dadbg t|jtdcdddedfdgg t|jtdhdidjdkdlgdidmdndodpgdjdndqdrdsgdkdodrdtdugdldpdsdudvgg d S )wNzSample Multi-Response ModelzODRPACK UG, pg. 56r5   r:   r>   g      I@g     Q@r?   g     b@g      i@g     r@g     @@g     @     @@r@   g     @@g     p@g     @g     X@g     @g     L@g     @g     L@g     j@g     @g     j@g    OAgzG@g^I@gI+@gx&@g~jt@gS@gOn@gʡE@gNbX9@gMb@gRQ@gX9v@gw/
@gMb
@g%C	@g/$	@gFx@gZd;@gFx@g5^I@gNbX9@gMb@gOn@g rh?gK7A`?gMb?gA`"?gh|?5?g r?gDl?g5^I?g-?gCl?gjt?gQ?g"~?g|?5^?gRQ?gQ?gCl?gB`"?gK?g/$?g/$?gn?r   Zdtypeg|@r   g     r   g    f@g      9@g     @g     @g     Ar!   g-C6?wdZwe      @r,   r<   皙?rU   )r#   Zdelta0rB   )rD   Zdel_initg@gNUiw@gz @gR?gFu?gfkl,?g 1w?gAS?g@L*?g?g?#0z?g_ n=m?g-Mu?gG:xggTÚ?gaǇ
z?g4<n?ggjtgܪVŊ?gHAcO?gK*rԬga/??gk{?gy7g
P/{7?)r   ra   rH   r'   rL   lenzerosfloatr1   intranger   r(   r	   rI   rJ   r   rK   rM   rN   )r   Z	multi_modZmulti_xZmulti_ynZmulti_weZmulti_ifixxZmulti_deltaiZ	multi_datZ	multi_odrrO   r   r   r   
test_multi   s                                         $



 
 
 
     zTestODR.test_multic                 C   s   |d |d |  S r   r   r   r   r   r   pearson_fcn   s    zTestODR.pearson_fcnc                 C   sx  t ddddddddd	d
g
}t ddddddddddg
}t ddddddddddg
}t ddddddddddg
}t||||d }t||||d }t| jtd!d"d#}t||ddgd$}t||ddgd$}	| }
t|
j	t d%d&g t|
j
t d'd(g t|
jt d)d*gd*d+gg |	 }t|j	t d,d-g t|j
t d.d/g t|jt d0d1gd1d2gg d S )3Nr!   rV   g?g@gffffff
@g@g@gffffff@g      @g@g@g@gffffff@g      @g@gffffff@g333333@g      ?gQ?g{Gz?gQ?gQ?g)\(?gp=
ף?g)\(?gGz?r&   rU   gffffff?gQ?皙?ZsxZsyzUni-linear Fitr6   rb   r"   g4ԉ.@gv޿grtA-?gc?g;޵?g=gk?gO&@gj( g3
ٻl?gZ՗?gF)t?g`=Lɿg!?)r'   rL   r
   r   rq   rH   r	   rJ   r   rK   rM   rN   )r   Zp_xZp_yZp_sxZp_syZp_datZpr_datZp_modZp_odrZpr_odrrO   Zroutr   r   r   test_pearson   sN    

zTestODR.test_pearsonc              	   C   sR   |d |d  |d  t t || |d |d   dt |d | d  S )Nr   r   r   r,   )r'   r\   r(   )r   rK   r   r   r   r   lorentz&  s    $zTestODR.lorentzc                 C   s  t dgd }t ddddddd	d
ddddddddddg}tdddddddddddd d!d"d#d$d%d&gd'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8g||d9}t| jtd:d;d<}t||d=d>}| }t|j	t d?d@dAg t|j
t dBdCdDg t|jt dEdFdGgdFdHdIgdGdIdJgg d S )KNg(\?   gdOO?gO?g&0G?gpt͘(G?g^"G?g eG?genBF?g8=?g-=?g`EE?g,!WsE?g01cE?g&-}Ԭ>g;vQ?gPmQ?gGus#T?gW UW?g>c?gׁsF@g`TR'@gxN@gs@g3@gN#-@g	ϛ@gW[N@gp:@@g@gs,&6@g@g2c@gHIOG@g?@g;@gx&q@gҌEY@i  g     t@i  i  g     |@i  g     "@g     @i  ib  g     @i  g     L@g     ,@i  g     @g     (z@g     8q@rs   zLorentz Peakrt   rb   )rc   rr   gffffff@r"   gA5[Z@gO#?gF=@g(1?gȕ6?gQ.q;0?g\j?gEGgp` g3<n>gG!fc>gq[cсE]>)r'   rL   r
   r   rv   rH   r	   rJ   r   rK   rM   rN   )r   Zl_syZl_sxZl_datZl_modZl_odrrO   r   r   r   test_lorentz*  s                               	zTestODR.test_lorentzc           	      C   sh   dd }ddg}t dd}|||}t|}t||ddd}t||ddgd	}| }t|jd
 d S )Nc                 S   s   | d | | d  S r   r   )cr   r   r   r   r$   S  s    z(TestODR.test_ticket_1253.<locals>.linearr,         @r   
   r&   re   r"   r   )r'   linspacer   r   r	   rJ   r   info)	r   r$   ry   r   ymodeldataZjobresultr   r   r   test_ticket_1253R  s    
zTestODR.test_ticket_1253c           
      C   s   dddddg}dddd	d
g}t t j|tdt j|tdf}tt ||fd|d}tdd dd}t||t dgd}|	 }t||t dg|d}|	 }	t
|j|	j d S )NgGz gGzgMbPgRQ?gGz?gףp=
@g)\(?gMbP?gV-?g
ףp=
@rd   r   )r~   fixc                 S   s,   |dd d f | d |dd d f d   S )Nr   r   r,   r   )rK   r   r   r   r   <lambda>g      z$TestODR.test_ifixx.<locals>.<lambda>T)rT   r&   r"   rA   )r'   r0   Z
zeros_likerl   Z	ones_liker   r   r	   rL   rJ   r   rK   )
r   x1Zx2r   r   r   Zodr1Zsol1Zodr2Zsol2r   r   r   
test_ifixxb  s    "zTestODR.test_ifixxc                 C   sb  t ddddddg}d}d}t d	d
ddddddddg
ddddddddddg
g}d}t ddd d!d"d#d$d%d&d'g
d(d)d*d+d,d-d.d/d0d1g
g}t d2d3d4d5d6d7g}d8d9 }d:d; }	d<d= }
t d>d|}t d>d|}t ||g}|||}|| }|| }t||	|
d?}t||||d@}t||dA| dBdC}|jdDdE | }t|j	d> t
|j| d S )FNr&   gffffff@g?rW   g?rU   r{   g{Gz?g	 'D?g"u?gsfZ?gt?g	Yqog?s?gJf?g>xF}gvIxg!͒&|ggÚрgz7X0ت`gN77?ga5|gLl	TZj?g^1;e?g<%gwg%.hgܾ#ń?g?g!Kr?gR#?g)BgH]N?gK?gNr}?gt%?g')vU~g^'2g?)gÊ?giP?gލho?gʐ:l?gM*gD3g\`gg֓А?g3p~?ghϬg>@gk_gʖ6`@g<u+g|㉘S@g2dSc                 S   s~   | d | d |dd d f   | d |dd d f   }| d | d |dd d f   | d |dd d f   }t ||fS )Nr   r   r   rQ   rR      )r'   r0   )rK   r   Zy0y1r   r   r   func  s    88z'TestODR.test_ticket_11800.<locals>.funcc                 S   s   t |d }t |}t |}t ||dd d f |dd d f |||g}t |||||dd d f |dd d f g}t ||fS )Nr   r   )r'   r2   rj   r1   rL   stack)rK   r   nr_measrj   r1   dy0dy1r   r   r   df_dbeta_odr  s    

..z/TestODR.test_ticket_11800.<locals>.df_dbeta_odrc                 S   sb   t |d }t |}t | d | | d | g}t | d | | d | g}t ||fS )Nr   r   rR   r   )r'   r2   r1   rL   r   )rK   r   r   r1   r   r   r   r   r   	df_dx_odr  s
    
z,TestODR.test_ticket_11800.<locals>.df_dx_odrr   )r8   r9   rs   rV   d   )r#   ZmaxitrQ   rC   )r'   rL   r|   r   r
   r	   rI   rJ   r   r}   r   rK   )r   Z	beta_trueZnr_measurementsZ	std_dev_xZx_errorZ	std_dev_yZy_errorZbeta_solutionr   r   r   Zx0_trueZx1_trueZx_trueZy_trueZx_measZy_measZmodel_fr   odr_objZodr_outr   r   r   test_ticket_11800p  sx         
         
        
	
zTestODR.test_ticket_11800c                 C   sH   t dd}dd|  }t||}t|t}| }t|jddg d S )Nr!   r;   r=   )r'   r|   r   r	   r   rJ   r   rK   r   r   r~   r   r   outputr   r   r   test_multilinear_model  s    

zTestODR.test_multilinear_modelc                 C   sN   t dd}dt d|  }t||}t|t}| }t|jddg d S )Nr!   r;   g      $rU   )	r'   r|   r)   r   r	   r   rJ   r   rK   r   r   r   r   test_exponential_model  s    

zTestODR.test_exponential_modelc                 C   sl   t dd}dd|  d|d   d|d   }td}t||}t||}| }t|jddddg d S )	Nr!   r;   r&   r,   rz   r   rg   rQ   )r'   r|   r   r   r	   rJ   r   rK   )r   r   r~   Z
poly_modelr   r   r   r   r   r   test_polynomial_model  s    $

zTestODR.test_polynomial_modelc                 C   sH   t dd}d| d }t||}t|t}| }t|jddg d S )Nr!   r;   r&   r,   )r'   r|   r   r	   r   rJ   r   rK   r   r   r   r   test_unilinear_model  s    

zTestODR.test_unilinear_modelc                 C   sV   t dd}d|d  d|  d }t||}t|t}| }t|jdddg d S )Nr!   r;   r&   r   r,   rz   )r'   r|   r   r	   r   rJ   r   rK   r   r   r   r   test_quadratic_model  s    

zTestODR.test_quadratic_modelc                 C   s   dd }d}t |}t |d |d |d }t |d}t |d}t|}t||||d}t||ddgd}	|	jd	d
 |	 }
|
j	d }t
|
j|
j||t|
j   d S )Nc                 S   s   | \}}|||  S )Nr   )parr   Zb0Zb1r   r   r   r     s    z#TestODR.test_work_ind.<locals>.funcrR   r   rr   rs   rh   r"   r   )Zfit_typesd)r'   arangewherefullr   r
   r	   rI   rJ   Zwork_indr   rM   Zworkri   )r   r   Zn_datar   r~   Zx_errZy_errZlinear_modelZ	real_datar   rO   Zsd_indr   r   r   test_work_ind  s    

zTestODR.test_work_indTzJFortran I/O prone to crashing so better not to run this test, see gh-13127)reasonc              	   C   s   dd }t |}ttddtd }t }tj|d}tj|d}z:t||ddg||d	  t||ddg||d
d  W 5 t	
| X dS )z(
        Verify fix for gh-1892
        c                 S   s   | d | d |  S r   r   br   r   r   r   r     s    z0TestODR.test_output_file_overwrite.<locals>.funcr{      z	error.datz
report.datrr      )r#   errfilerptfileT)r#   r   r   	overwriteN)r   r   r'   r   tempfilemkdtempospathjoinshutilrmtreer	   rJ   )r   r   pr   Ztmp_dirZerror_file_pathZreport_file_pathr   r   r   test_output_file_overwrite  s    
 z"TestODR.test_output_file_overwritec                 C   s4   dd }t |}|jddd t|jddd d S )Nc                 S   s   | d | d |  S r   r   r   r   r   r   r     s    z1TestODR.test_odr_model_default_meta.<locals>.funczSample Model MetaZODRPACKr5   )r   Zset_metar   r:   )r   r   r   r   r   r   test_odr_model_default_meta  s    z#TestODR.test_odr_model_default_metaN) __name__
__module____qualname__r   r   r%   r+   r.   r4   rP   rS   rX   ra   rp   rq   ru   rv   rx   r   r   r   r   r   r   r   r   r   pytestmarkZskipifr   r   r   r   r   r   r      s6   &1M1(G	
r   )r   r   r   Znumpyr'   r   Znumpy.testingr   r   r   r   r   r   Z	scipy.odrr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   4