a
    CCCfR                     @   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	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assert_allclose)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d8d9 Z d:S );TestODRc                 C   s    t ttdd t ttdd d S )N      )assert_raises
ValueErrorr   r   )self r   T/var/www/html/django/DPS/env/lib/python3.9/site-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   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_fjd0   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_fjb5   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      I皙)r   r   r   r   r   r   r   r   r   r   r   r   r$   ifixxr   derivr   )inititerfinal)g8@gLA[KgxQ})gֳ?g1X?gy?)ggC?NM=y7׿	J)rJ   gq?]F f_)rK   rL   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_fcnb   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dd d S )Nr   zSample Implicit ModelzODRPACK UG, pg. 49r6   )implicitr;   )      ?g333333?g?g(\?g(\ @zG@gQ@r[   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`   rc   g};yWzg?
WWm&W?)ra   rd   rf   gK}U?$_T)rb   re   rg   rh   ga?gư>g>)ZrtolZatol)r	   rX   rM   r   r
   rO   r   rP   r(   rQ   rR   r   rS   )r   Zimplicit_modZimplicit_datZimplicit_odrrT   r   r   r   test_implicitg   sF    
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"   rV   r-   r   r'   r   r   rW   )anyr   r   r(   cossinr)   r*   Zarctan2sqrtr1   )
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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 ]}|| dk rd||< n^|| dkrnP|| dkrd||< n8|| dkrd||< n || dkr2d||< nd||< || dksT|| dkrd|d d d d |f< qt||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?rx   gQ?g"~?g|?5^?gRQ?gQ?gCl?gB`"?gK?g/$?g/$?gn?r   Zdtypeg|@r   g     r   g    f@r@   rt   ru   g      9@rv   g     @rw   g     @g     Ar"   g-C6?wdZwe)      @r-   r=   皙?rZ   )r$   delta0rD   )rF   del_init)g@gNUiw@gz @gR?gFu?)gfkl,?g 1w?gAS?g@L*?g?)g?#0z?_ n=m?-Mu?G:xgTÚ?)r   gaǇ
z?4<n?gjtܪVŊ?)r   r   gHAcO?K*rԬa/??)r   r   r   gk{?y7)r   r   r   r   g
P/{7?)r	   rr   rM   r(   rQ   lenzerosfloatr2   intranger   r)   r
   rN   rO   r   rP   rR   rS   )r   Z	multi_modZmulti_xZmulti_ynZmulti_weZmulti_ifixxZmulti_deltaiZ	multi_datZ	multi_odrrT   r   r   r   
test_multi   sr    $




zTestODR.test_multic                 C   s   |d |d |  S r   r   r   r   r   r   pearson_fcn   s    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"   r\   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   rZ   gffffff?r   r   Q?r   皙?r   sxZsyzUni-linear Fitr7   rs   r'   r#   g4ԉ.@gv޿grtA-?gc?g;޵?g=gk?gO&@gj( g3
ٻl?gZ՗?gF)t?g`=Lɿg!?)r(   rQ   r   r	   r   rM   r
   rO   r   rP   rR   rS   )r   Zp_xZp_yZp_sxZp_syZp_datZpr_datZp_modZp_odrZpr_odrrT   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(   rm   r)   )r   rP   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   rs   )ru   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(   rQ   r   r	   r   rM   r
   rO   r   rP   rR   rS   )r   Zl_syZl_sxZl_datZl_modZl_odrrT   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%   U  s    z(TestODR.test_ticket_1253.<locals>.linearr-         @r   
   r'   rz   r#   r   )r(   linspacer	   r   r
   rO   r   info)	r   r%   r   r   ymodeldataZjobresultr   r   r   test_ticket_1253T  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=
@ry   r   )r   fixc                 S   s,   |dd d f | d |dd d f d   S )Nr   r   r-   r   )rP   r   r   r   r   <lambda>i      z$TestODR.test_ifixx.<locals>.<lambda>T)rY   r'   r#   rC   )r(   r1   Z
zeros_liker   Z	ones_liker   r	   r
   rQ   rO   r   rP   )
r   x1Zx2r   r   r   Zodr1Zsol1Zodr2Zsol2r   r   r   
test_ifixxd  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?rZ   r   {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   rV   rW      )r(   r1   )rP   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(   r3   r   r2   rQ   stack)rP   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   rW   r   )r(   r3   r2   rQ   r   )rP   r   r   r2   r   r   r   r   r   	df_dx_odr  s
    
z,TestODR.test_ticket_11800.<locals>.df_dx_odrr   )r9   r:   r   r\   d   )r$   ZmaxitrV   rE   )r(   rQ   r   r	   r   r
   rN   rO   r   r   r   rP   )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_11800r  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   rO   r   rP   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      $rZ   )	r(   r   r*   r   r
   r   rO   r   rP   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   r|   rV   )r'   r-   r   r|   )r(   r   r   r   r
   rO   r   rP   )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   rO   r   rP   r   r   r   r   test_unilinear_model  s    

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   rO   r   rP   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b0b1r   r   r   r     s    z#TestODR.test_work_ind.<locals>.funcrW   r   r   r   r}   r#   r   )fit_typesd)r(   arangewherefullr	   r   r
   rN   rO   Zwork_indr   rR   Zworkr   )r   r   n_datar   r   x_erry_errlinear_modelZ	real_datar   rT   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}zDt	||ddg||d	
  t	||ddg||d
d
  W t| nt| 0 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.datr      )r$   errfilerptfileT)r$   r   r   	overwriteN)r	   r   r(   r   tempfilemkdtempospathjoinr
   rO   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_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ODRPACKr6   )r	   Zset_metar   r;   )r   r   r   r   r   r   test_odr_model_default_meta  s    z#TestODR.test_odr_model_default_metac              	   C   s  dd }d}t |}t |d |d |d }t |d}t |d}t|}t||||d}t|||dd}	t|||dgd}
t|||t d|fdd}t|||dggd	}t|||t dd|fdd	}||	|
|||fD ]6}t||d
d
gt |dd}|jddd |  qdS )zA
        Verify fix for gh-18739 where del_init=1 fails.
        c                 S   s   | d | d |  S r   r   r   r   r   r   r     s    z.TestODR.test_work_array_del_init.<locals>.funcrW   r   r   r   r   r   )r   Zcovyr}   rB   )r$   r~   r   )r   r   N)	r(   r   r   r   r	   r   r
   rN   rO   )r   r   r   r   r   r   r   r   Zrd0Zrd1Zrd2Zrd3Zrd4Zrd5rdr   r   r   r   test_work_array_del_init  s&    

z TestODR.test_work_array_del_initN)!__name__
__module____qualname__r   r    r&   r,   r/   r5   rU   rX   ri   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   pytestmarkZskipifr   r   r   r   r   r   r   r      s8   &2M1(H	
r   )r   r   r   numpyr(   r   Znumpy.testingr   r   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