o
    i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   g/var/www/html/eduruby.in/lip-sync/lip-sync-env/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%   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)rK   gq?]F f_)rL   rM   gO>)r	   r-   r6   r0   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. 49r7   )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)ra   rd   g};yWzg?
WWm&W?)rb   re   rg   gK}U?$_T)rc   rf   rh   ri   ga?gư>g>)ZrtolZatol)r	   rY   rN   r   r
   rP   r   rQ   r)   rR   rS   r   rT   )r   Zimplicit_modZimplicit_datZimplicit_odrrU   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#   rW   r.   r   r(   r   r   rX   )anyr   r   r)   cossinr*   r+   Zarctan2sqrtr2   )
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 ]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. 56r7   r<   )r@   g      I@g     Q@rA        b@g      i@g     r@g     @@g     @     @@rB   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?ry   gQ?g"~?g|?5^?gRQ?gQ?gCl?gB`"?gK?g/$?g/$?gn?r   Zdtypeg|@r   g     r   g    f@rA   ru   rv   g      9@rw   g     @rx   g     @g     Ar#   g-C6?wdZwe)      @r.   r>   皙?r[   )r%   delta0rE   )rG   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	   rs   rN   r)   rR   lenzerosfloatr3   intranger   r*   r
   rO   rP   r   rQ   rS   rT   )r   Z	multi_modZmulti_xZmulti_ynZmulti_weZmulti_ifixxZmulti_deltaiZ	multi_datZ	multi_odrrU   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#   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   r[   gffffff?r   r   Q?r   皙?r   sxZsyzUni-linear Fitr8   rt   r(   r$   g4ԉ.@gv޿grtA-?gc?g;޵?g=gk?gO&@gj( g3
ٻl?gZ՗?gF)t?g`=Lɿg!?)r)   rR   r   r	   r   rN   r
   rP   r   rQ   rS   rT   )r   Zp_xZp_yZp_sxZp_syZp_datZpr_datZp_modZp_odrZpr_odrrU   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)   rn   r*   )r   rQ   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   rt   )rv   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)   rR   r   r	   r   rN   r
   rP   r   rQ   rS   rT   )r   Zl_syZl_sxZl_datZl_modZl_odrrU   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  r!   z(TestODR.test_ticket_1253.<locals>.linearr.         @r   
   r(   r{   r$   r   )r)   linspacer	   r   r
   rP   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=
@rz   r   )r   fixc                 S   s,   |dd d f | d |dd d f d   S )Nr   r   r.   r   )rQ   r   r   r   r   <lambda>i  s   , z$TestODR.test_ifixx.<locals>.<lambda>T)rZ   r(   r$   rD   )r)   r2   Z
zeros_liker   Z	ones_liker   r	   r
   rR   rP   r   rQ   )
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?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   rW   rX      )r)   r2   )rQ   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)   r4   r   r3   rR   stack)rQ   r   nr_measr   r3   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   rX   r   )r)   r4   r3   rR   r   )rQ   r   r   r3   r   r   r   r   r   	df_dx_odr  s
   
z,TestODR.test_ticket_11800.<locals>.df_dx_odrr   )r:   r;   r   r]   d   )r%   ZmaxitrW   rF   )r)   rR   r   r	   r   r
   rO   rP   r   r   r   rQ   )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   rP   r   rQ   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   rP   r   rQ   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}   rW   )r(   r.   r   r}   )r)   r   r   r   r
   rP   r   rQ   )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   rP   r   rQ   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   rP   r   rQ   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>.funcrX   r   r   r   r~   r$   r   )fit_typesd)r)   arangewherefullr	   r   r
   rO   rP   Zwork_indr   rS   Zworkr   )r   r   n_datar   r   x_erry_errlinear_modelZ	real_datar   rU   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      | 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
   rP   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   r   r   r   r   r   r   r   r     r!   z1TestODR.test_odr_model_default_meta.<locals>.funczSample Model MetaZODRPACKr7   )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 ]}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>.funcrX   r   r   r   r   r   )r   Zcovyr~   rC   )r%   r   r   )r   r   N)	r)   r   r   r   r	   r   r
   rO   rP   )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-   r0   r6   rV   rY   rj   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   pytestmarkZskipifr   r   r   r   r   r   r   r      s:    &2M1(G	
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