o
    Eb:L                     @   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d6S )7TestODRc                 C   s    t ttdd t ttdd d S )N      )assert_raises
ValueErrorr   r
   )self r   :/usr/lib/python3/dist-packages/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      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g dg d}t||g dg dd	}|jd
d |jdddd |	 }t
|jtg d t
|jtg d t
|jtg dg dg dg d S )NzSample Explicit ModelzODRPACK UG, pg. 39nameref)fjacbfjacdmeta)r"   r"         @      @g      @      $@g      0@g      :@      >@g      A@g     @A@      Y@)g     ē@gfffff@g     @g     @g     @g33333@g     T@g     @gfffff@g33333@g     @g     @)     p@g      Ig)r   r   r   r   r   r   r   r   r   r   r   r   r$   ifixxr   derivr   )Zinititerfinal)g8@gLA[KgxQ})gֳ?g1X?gy?)ggC?NM=y7׿	J)rH   gq?]F f_)rI   rJ   gO>)r   r,   r5   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;   s@   
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g dg dgd}t||g dd	}| }t|jt	g d
 t|j
t	g d t|jt	g dg dg dg dg dg d S )Nr   zSample Implicit ModelzODRPACK UG, pg. 49r6   )implicitr;   )      ?g333333?g?g(\?g(\ @zG@gQ@rY   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(\r\   gp=
ףg      gQg      g(\gq=
ףp)r[   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:\ @8%??'M['%GRR?)r]   gdbb @gR	<?k)r^   ra   g};yWzg?
WWm&W?)r_   rb   rd   gK}U?$_T)r`   rc   re   rf   ga?)r   rV   rK   r   r	   rM   r   rN   r(   rO   rP   rQ   )r   Zimplicit_modZimplicit_datZimplicit_odrrR   r   r   r   test_implicitf   sD   
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"   rT   r-   r   r'   r   r   rU   )anyr   r   r(   ZcosZsinr)   r*   Zarctan2sqrtr1   )
r   r   r   ZthetaZcthetaZsthetaZomegaZphirr+   r   r   r   	multi_fcn   s    

(( zTestODR.multi_fcnc              
   C   s  t | jtdddd}tg d}tg dg dg}t|}tjdd|ftd	}tj|t	d	}tj|td	}d
|ddd d f< d |ddd d f< |ddd d f< d|ddd d f< t
|D ]P}|| dk rnd||< n,|| dkrun%|| dkrd||< n|| dkrd||< n|| dkrd||< nd||< || dks|| dkrd|d d d d |f< qat||dt|d |d}	t|	|g d||d}
|
jddd |
 }t|jtg d t|jtg d t|jtg d g d!g d"g d#g d$g d S )%NzSample Multi-Response ModelzODRPACK UG, pg. 56r6   r;   )r?   g      I@g     Q@r@        b@g      i@g     r@g     @@g     @     @@rA   g     @@g     p@g     @g     X@     @g     L@g     @g     L@g     j@g     @     j@g    OA)gz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-?灕Cl?gjt?rq   gQ?g"~?g|?5^?gRQ?gQ?gCl?gB`"?gK?g/$?g/$?gn?r   Zdtypeg|@r   g     r   g    f@r@   rm   rn   g      9@ro   g     @rp   g     @g     Ar"   g-C6?ZwdZwe)      @r-   r=   皙?rX   )r$   Zdelta0rC   )rE   Zdel_init)g@gNUiw@gz @gR?gFu?)gfkl,?g 1w?gAS?g@L*?g?)g?#0z?_ n=m?-Mu?G:xgTÚ?)rv   gaǇ
z?4<n?gjtܪVŊ?)rw   rz   gHAcO?K*rԬa/??)rx   r{   r}   gk{?y7)ry   r|   r~   r   g
P/{7?)r   rk   rK   r(   rO   lenzerosfloatr2   intranger   r)   r	   rL   rM   r   rN   rP   rQ   )r   Z	multi_modZmulti_xZmulti_ynZmulti_weZmulti_ifixxZmulti_deltaiZ	multi_datZ	multi_odrrR   r   r   r   
test_multi   st   $




zTestODR.test_multic                 C   s   |d |d |  S r   r   r   r   r   r   pearson_fcn   r    zTestODR.pearson_fcnc                 C   s8  t g d}t g d}t g d}t g d}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 ddgddgg d S )N)
r"   rZ   g?g@gffffff
@皙@g@gffffff@g      @g@)
g@g@r   gffffff@g      @g@ffffff@r   g333333@g      ?)
Q?r   {Gz?gQ?gQ?g)\(?gp=
ף?)\(?Gz?r'   )
r'   r   rX   gffffff?r   r   Q?r   皙?r   ZsxZsyzUni-linear Fitr7   rl   r'   r#   g4ԉ.@gv޿grtA-?gc?g;޵?g=gk?gO&@gj( g3
ٻl?gZ՗?gF)t?g`=Lɿg!?)r(   rO   r
   r   r   rK   r	   rM   r   rN   rP   rQ   )r   Zp_xZp_yZp_sxZp_syZp_datZpr_datZp_modZp_odrZpr_odrrR   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(   ri   r)   )r   rN   r   r   r   r   lorentz&  s   $zTestODR.lorentzc                 C   s   t dgd }t g d}tg dg d||d}t| jtddd	}t||d
d}| }t|j	t g d t|j
t g d t|jt g dg dg dg d S )Ng(\?   )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@r   zLorentz Peakr   rl   )rn   r   gffffff@r#   )gA5[Z@gO#?gF=@)g(1?gȕ6?gQ.q;0?)g\j?EGp` )r   g3<n>G!fc>)r   r   gq[cсE]>)r(   rO   r
   r   r   rK   r	   rM   r   rN   rP   rQ   )r   Zl_syZl_sxZl_datZl_modZl_odrrR   r   r   r   test_lorentz*  s4   	
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  r    z(TestODR.test_ticket_1253.<locals>.linearr-         @r   
   r'   rs   r#   r   )r(   linspacer   r   r	   rM   r   info)	r   r%   r   r   ymodeldataZjobresultr   r   r   test_ticket_1253R  s   
zTestODR.test_ticket_1253c           
      C   s   g d}g d}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 )N)gGz gGzgMbPgRQ?gGz?)gףp=
@g)\(?gMbP?gV-?g
ףp=
@rr   r   )r   fixc                 S   s,   |dd d f | d |dd d f d   S )Nr   r   r-   r   )rN   r   r   r   r   <lambda>g  s   , z$TestODR.test_ifixx.<locals>.<lambda>T)rW   r'   r#   rB   )r(   r1   Z
zeros_liker   Z	ones_liker   r   r	   rO   rM   r   rN   )
r   Zx1Zx2r   r   r   Zodr1Zsol1Zodr2Zsol2r   r   r   
test_ifixxb  s   "zTestODR.test_ifixxc                 C   s  t g d}d}d}t g dg dg}d}t g dg dg}t g d	}d
d }dd }	dd }
t dd|}t dd|}t ||g}|||}|| }|| }t||	|
d}t||||d}t||d| dd}|jdd | }t|j	d t
|j| d S )N)r'   gffffff@g?r[   g?rX   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   rT   rU      )r(   r1   )rN   r   Zy0Z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(   r3   r   r2   rO   stack)rN   r   nr_measr   r2   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   rU   r   )r(   r3   r2   rO   r   )rN   r   r   r2   r   r   r   r   r   	df_dx_odr  s
   
z,TestODR.test_ticket_11800.<locals>.df_dx_odrr   )r9   r:   r   rZ   d   )r$   ZmaxitrT   rD   )r(   rO   r   r   r
   r	   rL   rM   r   r   r   rN   )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  s6   


	
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   rM   r   rN   r   r   r   r   r   outputr   r   r   test_multilinear_model     

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      $rX   )	r(   r   r*   r   r	   r   rM   r   rN   r   r   r   r   test_exponential_model  s   

zTestODR.test_exponential_modelc                 C   sh   t dd}dd|  d|d   d|d   }td}t||}t||}| }t|jg d	 d S )
Nr"   r<   r'   r-   r   r   rt   rT   )r'   r-   r   rt   )r(   r   r   r   r	   rM   r   rN   )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   rM   r   rN   r   r   r   r   test_unilinear_model  r   zTestODR.test_unilinear_modelc                 C   sT   t dd}d|d  d|  d }t||}t|t}| }t|jg d d S )Nr"   r<   r'   r   r-   r   )r'   r-   r   )r(   r   r   r	   r   rM   r   rN   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   )Zparr   Zb0Zb1r   r   r   r     s   z#TestODR.test_work_ind.<locals>.funcrU   r   r   r   ru   r#   r   )Zfit_typesd)r(   arangewhereZfullr   r
   r	   rL   rM   Zwork_indr   rP   Zworkr   )r   r   Zn_datar   r   Zx_errZy_errZlinear_modelZ	real_datar   rR   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 t| dS t| w )z(
        Verify fix for gh-1892
        c                 S   s   | d | d |  S r   r   )br   r   r   r   r     r    z0TestODR.test_output_file_overwrite.<locals>.funcr      z	error.datz
report.datr      )r$   errfilerptfileT)r$   r   r   Z	overwriteN)r   r   r(   r   tempfileZmkdtempospathjoinr	   rM   shutilrmtree)r   r   pr   Ztmp_dirZerror_file_pathZreport_file_pathr   r   r   test_output_file_overwrite  s    z"TestODR.test_output_file_overwriteN)__name__
__module____qualname__r   r   r&   r,   r/   r5   rS   rV   rg   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r   pytestZmarkZskipifr   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