o
    ?Hh?V                     @   s   d dl Z 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ejj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:d; Z"d<d= Z#d>d? Z$d@dA Z%dBdC Z&dDS )ETestODRc                 C   s    t ttdd t ttdd d S )N      )assert_raises
ValueErrorr   r   )self r   X/home/air/sanwanet/gpt-api/venv/lib/python3.10/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      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%   linear	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_fjd2   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   r0   resr   r   r   explicit_fjb7   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)rL   gq?]F f_)rM   rN   gO>)r	   r.   r7   r1   dictr   r
   set_job
set_iprintrunr   betar*   arraysd_betacov_beta)r   explicit_modexplicit_dat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_fcnd   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. 49r8   )implicitr=   )      ?g333333?g?g(\?g(\ @zG@gQ@ra   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(\rd   gp=
ףg      gQg      g(\gq=
ףp)rc   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?)re   gdbb @gR	<?k)rf   ri   g};yWzg?
WWm&W?)rg   rj   rl   gK}U?$_T)rh   rk   rm   rn   ga?gư>g>)rtolatol)r	   r^   rO   r   r
   rR   r   rS   r*   rT   rU   r   rV   )r   implicit_modimplicit_datimplicit_odrrZ   r   r   r   test_impliciti   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#   r\   r/   r   r)   r   r   r]   )anyr   r   r*   cossinr+   r,   arctan2sqrtr3   )
r   r   r   thetactheta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 ]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. 56r8   r=   )rA   g      I@g     Q@rB        b@g      i@g     r@g     @@g     @     @@rC   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?r   gQ?g"~?g|?5^?gRQ?gQ?gCl?gB`"?gK?g/$?g/$?gn?r   dtypeg|@r   g     r   g    f@rB   r   r   g      9@r   g     @r   g     @g     Ar#   g-C6?wdwe)      @r/   r?   皙?r`   )r%   delta0rF   )rH   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	   r   rO   r*   rT   lenzerosfloatr4   intranger   r+   r
   rP   rR   r   rS   rU   rV   )r   	multi_modmulti_xmulti_ynmulti_wemulti_ifixxmulti_deltai	multi_dat	multi_odrrZ   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#   rb   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   r`   gffffff?r   r   Q?r   皙?r   sxsyzUni-linear Fitr9   r   r)   r$   g4ԉ.@gv޿grtA-?gc?g;޵?g=gk?gO&@gj( g3
ٻl?gZ՗?gF)t?g`=Lɿg!?)r*   rT   r   r	   r   rO   r
   rR   r   rS   rU   rV   )r   p_xp_yp_sxp_syp_datpr_datp_modp_odrpr_odrrZ   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*   ry   r+   )r   rS   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   r   )r   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*   rT   r   r	   r   rO   r
   rR   r   rS   rU   rV   )r   l_syl_sxl_datl_modl_odrrZ   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&   W  r!   z(TestODR.test_ticket_1253.<locals>.linearr/         @r   
   r)   r   r$   r   )r*   linspacer	   r   r
   rR   r   info)	r   r&   r   r   ymodeldatajobresultr   r   r   test_ticket_1253V  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=
@r   r   )r   fixc                 S   s,   |dd d f | d |dd d f d   S )Nr   r   r/   r   )rS   r   r   r   r   <lambda>k  s   , z$TestODR.test_ifixx.<locals>.<lambda>T)r_   r)   r$   rE   )r*   r3   
zeros_liker   	ones_liker   r	   r
   rT   rR   r   rS   )
r   x1x2r   r   r   odr1sol1odr2sol2r   r   r   
test_ifixxf  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?rc   g?r`   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   r\   r]      )r*   r3   )rS   r   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*   r5   r   r4   rT   stack)rS   r   nr_measr   r4   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   r]   r   )r*   r5   r4   rT   r   )rS   r   r   r4   r   r   r   r   r   	df_dx_odr  s
   
z,TestODR.test_ticket_11800.<locals>.df_dx_odrr   )r;   r<   r   rb   d   )r%   maxitr\   rG   )r*   rT   r   r	   r   r
   rP   rR   r   r   r   rS   )r   	beta_truenr_measurements	std_dev_xx_error	std_dev_yy_errorbeta_solutionr   r   r   x0_truex1_truex_truey_truex_measy_measmodel_fr   odr_objodr_outr   r   r   test_ticket_11800t  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   rR   r   rS   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      $r`   )	r*   r   r,   r   r
   r   rR   r   rS   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   r\   )r)   r/   r   r   )r*   r   r   r   r
   rR   r   rS   )r   r   r   
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   rR   r   rS   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   rR   r   rS   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   b0b1r   r   r   r     s   z#TestODR.test_work_ind.<locals>.funcr]   r   r   r   r   r$   r   )fit_typesd)r*   arangewherefullr	   r   r
   rP   rR   work_indr   rU   workr   )r   r   n_datar   r   x_erry_errlinear_model	real_datar   rZ   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      | 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$  	overwriteN)r	   r   r*   r  tempfilemkdtempospathjoinr
   rR   shutilrmtree)r   r   pr   tmp_direrror_file_path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   r  r   r   r  r   r   r   r     r!   z1TestODR.test_odr_model_default_meta.<locals>.funczSample Model MetaODRPACKr8   )r	   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 ]}t||d
d
gt |dd}|jddd |  qpdS )zA
        Verify fix for gh-18739 where del_init=1 fails.
        c                 S   r  r   r   r  r   r   r   r      r!   z.TestODR.test_work_array_del_init.<locals>.funcr]   r   r   r   r   r   )r   covyr   rD   )r%   r   r   )r  r   N)	r*   r  r  r  r	   r   r
   rP   rR   )r   r   r  r   r   r  r  r  rd0rd1rd2rd3rd4rd5rdr   r   r   r   test_work_array_del_init  s(   


z TestODR.test_work_array_del_initc                 C   <   t dd}d| d }t||}t|}~t| d S r  )r*   r   r   pickledumpsloadsr   r   r   r   
obj_pickler   r   r   test_pickling_data9     

zTestODR.test_pickling_datac                 C   r>  r  )r*   r   r   r?  r@  rA  rB  r   r   r   test_pickling_real_dataB  rE  zTestODR.test_pickling_real_datac                 C   s   t t}t | d S r  )r?  r@  r   rA  )r   rC  r   r   r   test_pickling_modelK  s   
zTestODR.test_pickling_modelc                 C   sB   t dd}d| d }tt||t}t|}~t| d S r  )r*   r   r
   r   r   r?  r@  rA  )r   r   r   r   rC  r   r   r   test_pickling_odrO  s   
zTestODR.test_pickling_odrc                 C   sD   t dd}d| d }tt||tj}t|}~t| d S r  )	r*   r   r
   r   r   rR   r?  r@  rA  )r   r   r   r  rC  r   r   r   test_pickling_outputX  s   
zTestODR.test_pickling_outputN)'__name__
__module____qualname__r   r    pytestmarkthread_unsafer(   r.   r1   r7   r[   r^   rt   r   r   r   r   r   r   r   r   r   r  r  r  r	  r
  r  skipifr1  r4  r=  rD  rF  rG  rH  rI  r   r   r   r   r      sF    
&2M1(H	
			r   )r?  r&  r+  r(  numpyr*   r   numpy.testingr   r   r   r   rM  r   r   	scipy.odrr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s    4