o
    ?Hh}                    @   s  d dl mZmZmZmZ d dlmZ d dlZd dlm	Z	m
Z
mZmZ d dl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mZmZmZ d dlmZmZ d dlm Z  d dl!m"Z"m#Z# d d	l$m%Z% d d
l&m'Z' d dlm(Z( G dd dZ)G dd dZ*G dd dZ+G dd dZ,ej-.deegdd Z/G dd dZ0G dd dZ1G dd dZ2G dd dZ3G dd  d Z4G d!d" d"Z5G d#d$ d$Z6G d%d& d&Z7d'd( Z8ej9fd)d*Z:d+d, Z;d3d-d.Z<d3d/d0Z=d3d1d2Z>dS )4    )xp_assert_equalxp_assert_closeassert_almost_equalassert_array_almost_equal)raisesN)mgridpisinpoly1d)interp1dinterp2dlagrangePPolyBPolysplrepsplev
splantidersplintsprootAkima1DInterpolatorNdPPolyBSplinePchipInterpolator)pochgamma)_ppoly)assert_deallocatedIS_PYPY)_run_concurrent_barrier)nquad)binomc                   @      e Zd Zdd ZdS )TestInterp2Dc                 C   sf   t ddddtdf \}}t|d|  }tt t||| W d    d S 1 s,w   Y  d S )Nr      y              4@y              5@      ?)r   r   r	   assert_raisesNotImplementedErrorr   )selfyxz r+   h/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/scipy/interpolate/tests/test_interpolate.pytest_interp2d   s
   
"zTestInterp2D.test_interp2dN)__name__
__module____qualname__r-   r+   r+   r+   r,   r"      s    r"   c                   @   sB  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dId d!ZdId"d#Zd$d% Zd&d' Zd(d) Zd*d+ ZdId,d-ZdId.d/Zd0d1 Zejdfd2d3Zd4d5 Zej j!e"d6d7d8d9 Z#d:d; Z$d<d= Z%d>d? Z&d@dA Z'dBdC Z(ej )dDdEdFdG Z*dHS )JTestInterp1Dc                 C   sH  t d| _t d| _t d| _| jd| _t d| _t d| _t 	dg| _
t 	dg| _t dd| _t dd| _t dd	| _t dd| _t d
d| _t d
d| _t dd| _d| jd d df< d| jd d df< t dd| _d| jdd d f< d| jdd d f< d| _d S )N      @      $@)r#             @        g      4@r#   
   )r8   r#   )r#   r#   r4   g      >@)r#      r4   )r9   r#   r4      r         Y)nparangex5x10y10reshapex25x2y2arrayx1y1y210y102y225y25y235y325y210_edge_updatedy102_edge_updated
fill_valuer'   r+   r+   r,   setup_method$   s*   
zTestInterp1D.setup_methodc              
   C   s  dD ]}t | j| j|d t | j| j|dd qt | j| jddd t | j| jdtdgd t | j| jddd t | j| jddd t | j| jdd	d t | j| jd
d t | j| jdd t | j| jdd t | j| jdd t | j| jddd	d t | j| jdd
tdd t | j| jdd
tdtdfd t | j| jdd
tddfd tt	t | j
| j tt	t | jtd
 tt	t | j| j tt	t | j| j tt	t | j| j t | j| j t | j| jd
d tt	t | j| j tt	t | j| j tt	t | j| jddd tt	t | j| jdg dd tt	t | j| jdtdd tt	t | j| jddggd tt	t | j| jdddgd tt	t | j| jdtg d tt	t | j| jddd tt	t | j| jdd
ddgd tt	t | j| jdd
dddgfd d S )N)	nearest
nearest-upzerolinearslinear	quadraticcubicpreviousnextkindextrapolater_   rR   rX   )r<      r<   )r<   )r<   r<   r   rb   r#   r9   r_   axisrR   r8   rd   )r<   r<   r<   r+   r6   )r   rA   rB   r>   rG   rJ   rE   onesr%   
ValueErrorrD   rF   rK   rH   rI   r'   r_   r+   r+   r,   test_validationM   s   

zTestInterp1D.test_validationc                 C   sB  t | j| jjs
J t | j| jddjrJ t | j| jjs J t | j| jddjr,J tt | j| jjs9J t | j| jddjdksGJ t | j| jddjdksUJ t | j| jjdksaJ t | j| j	jdksmJ t | j| j
dd	jdks{J tt | j| jj| j tt | j| jj| j tt | j| j	j| j	 d S )
NF)copy)bounds_error      @rR   )      ?r5   r   rb   re   )r   rA   rB   rj   rk   r>   isnanrR   rd   rJ   rK   r   r)   r(   rS   r+   r+   r,   	test_init   s   zTestInterp1D.test_initc                 C   s.  t | j| j}t | jd d d | jd d d }t|| j| j t|dtd t|g d|g d t | jd d d | jd d d dd}t|| j| j t | jd d d | jd d d dd}tt|| j t | j| j}t | jd d d | jd d d d df }t|| j|| j d S )Nr<   333333?g333333@gffffff@      @F)assume_sortedT)	r   rA   rB   r   r>   rG   r%   rg   rJ   )r'   interp10interp10_unsortedinterp10_assume_kwinterp10_assume_kw2interp10_y_2dinterp10_y_2d_unsortedr+   r+   r,   test_assume_sorted   s(   "
*
zTestInterp1D.test_assume_sortedc                 C      dD ]}|  | qd S )N)rX   rY   )_check_linearrh   r+   r+   r,   test_linear   s   zTestInterp1D.test_linearc                 C   s   t | j| j|d}t|| j| j t|dtd t|g dtg d t | j| j|dd}t|g dtg ddd t|dd	d
}t	t
t | j| jfi | d S )Nr^   rq   rr   r`   ra         r   	      +=rtolTr_   rR   rk   )r   rA   rB   r   r>   rG   r   asarraydictr%   rg   )r'   r_   ru   extrapolatoroptsr+   r+   r,   r}      s"   zTestInterp1D._check_linearc                 C   s   t jt jt jt jfD ]"}t jd|d}|}t||dd|}|j|ks%J t||dd q
g d}t j	dd	g}t|||}t||dd d S )
N   dtyperX   r^   V瞯<atolr   rb   r#   r   rb   )
r>   float16float32float64
longdoubler?   r   r   r   nan)r'   dtypr)   r(   ypr+   r+   r,   test_linear_dtypes   s   zTestInterp1D.test_linear_dtypesc                 C   s   t jt jt jg}|t jt jg }g d}|D ]D}t jdd|d}|D ]7}t | d |}|D ]'}||}	|D ]}
t	|||
dd}t
||	|dd| d	| d
| d q:q1q"qd S )N)rY   rW   rZ   r[   r   r8   r   rl   Fr_   rk   Hz>z,  )r   check_dtypeerr_msg)r>   r   r   r   	complex64
complex128r?   expastyper   r   )r'   dt_rdt_rcspline_kindsdtxr)   dtyr(   dtnxnewr_   fr+   r+   r,   test_slinear_dtypes   s&   
z TestInterp1D.test_slinear_dtypesc                 C   sl   t | j| jdd}t|| j| j t|dtd t|dtd t|g dtg d d S )Nr[   r^   rq         ?rr   r   rA   rB   r   r>   rG   r'   ru   r+   r+   r,   
test_cubic      zTestInterp1D.test_cubicc                 C   s   t | j| jdd}t|| j| j t|dtd t|dtd t|g dtg d t | j| jddd	}t|g d
g ddd tdddd}tt	t | j| jfi | d S )NrU   r^   rq   rn   r   rr   r5   rs   rs   r`   ra   r   r6   r   r   r   r   r   Tr   
r   rA   rB   r   r>   rG   r   r   r%   rg   r'   ru   r   r   r+   r+   r,   test_nearest  $   zTestInterp1D.test_nearestc                 C   s   t | j| jdd}t|| j| j t|dtd t|dtd t|g dtg d t | j| jdd	d
}t|g dg ddd tdd	dd}tt	t | j| jfi | d S )NrV   r^   rq   rn   r   r5   rr   r   r`   ra   r   r   r   r   Tr   r   r   r+   r+   r,   test_nearest_up  r   zTestInterp1D.test_nearest_upc              	   C   s  t | j| jdd}t|| j| j t|dtd t|dtd t|g dtg d t | j| jddd	}t|g d
tjdddgdd t | j| jddd	}t|g dtjtjddddg t | j| jddd	}t|g dtjtjddddgtjtjddddgg t | j| j	dddd}t|g dtjtjgddgddgg t
dddd}ttt | j| jfi | t g dg ddddd}t|g dtjtjddd d d g t g d!g d"ddd#d}t|g dtjtjddd d d g t | j| jddd	}t|g dtjtjddd$d$gtjtjddd$d$gg t | j| jdddd}t|g dtjtjgddgd$d$gg d S )%Nr\   r^   rq   rn   r   rr   r5   r2   rs   r`   ra   r   r   r   r   r   r<   r4   r         r4   r            rc   r   r4   r   r8   r   Tr   r   r   rb   r<   r_   rR   rt   r   r<   r   rb   r#   r9   r4   rb   r<   r#   r   rb   r<   r   rb   Fr;   r   rA   rB   r   r>   rG   r   r   rJ   rK   r   r%   rg   rP   rQ   r'   ru   r   interpolator1Dinterpolator2Dinterpolator2DAxis0r   r+   r+   r,   test_previous/  s   



zTestInterp1D.test_previousc              	   C   s  t | j| jdd}t|| j| j t|dtd t|dtd t|g dtg d t | j| jddd	}t|g d
dddtjgdd t | j| jddd	}t|g dddddtjtjg t | j| jddd	}t|g dddddtjtjgddddtjtjgg t | j| j	dddd}t|g dddgddgtjtjgg t
dddd}ttt | j| jfi | t g dg ddddd}t|g ddddddtjtjg t g d g d!ddd"d}t|g ddddddtjtjg t | j| jddd	}t|g dd#d#ddtjtjgd#d#ddtjtjgg t | j| jdddd}t|g dd#d#gddgtjtjgg d S )$Nr]   r^   rq   r5   r   rr   )rl   rs   rs   r`   ra   r   r   r   r   r   r   r4   r   r8   r   r   rc   r   rb   r   Tr   r   r   r   r   r<   r   r   Fr:   r   r   r+   r+   r,   	test_nextt  s   



zTestInterp1D.test_nextc                 C   sl   t | j| jdd}t|| j| j t|dtd t|dtd t|g dtg d d S )NrW   r^   rq   rn   r   rr   r   r   r   r+   r+   r,   	test_zero  r   zTestInterp1D.test_zeroc              
   C   sT   t t|| z|| W d S  ty) } z| t|v sJ W Y d }~d S d }~ww N)r%   rg   str)r'   interpolant
test_array
fail_valueerrr+   r+   r,   bounds_check_helper  s    z TestInterp1D.bounds_check_helperrX   c                 C   s   t | j| j| jd|d}t|dt| j t|dt| j t|dgdgdgdgggt| jdd t|tg dtg d	g d
g t | j| jd|d}| |dd | |dd | |g dd | |g dd |g d d S )NF)rR   rk   r_   gffffff&@g333333g333333)@gL3@)check_shape)r   r6   r2         "@      &@)TFFFF)FFFFTT)rk   r_   r   r   )r6   r   r6   )r6   rn         5@r   )r6   r2   r   )	r   rA   rB   rR   r   r>   rG   _check_boundsr   )r'   r_   extrap10raises_bounds_errorr+   r+   r,   _bounds_check  s.   
zTestInterp1D._bounds_checkc                 C   st   t dt}t dt}t|||t jdd}||d }t |d s)J t|t jt j|d d f  d S )Nr8   Fr   rb   r   r<   )	r>   r?   r   intr   r   ro   r   r_)r'   r_   r)   r(   cyir+   r+   r,   _bounds_check_int_nan_fill  s   "z'TestInterp1D._bounds_check_int_nan_fillc                 C   "   dD ]}|  | | | qd S )N)rX   r[   rU   r\   r]   rY   rW   rZ   )r   r   rh   r+   r+   r,   test_bounds     
zTestInterp1D.test_boundsc                 C   s  t | j| j|ddd}t|dtd t|dtd t|ddgdd	g | j| j| j| j	fD ]u}t | j
||d
d	dd}t|dtd t|dtd t|ddgtd t | j
||d
ddd}t|dtd t|dtd |jdkrdd	gg|jd  g|jd  }n
dd	gg|jd  }t|ddg| q4g d}| j| jfD ]}ttt | j
||d
|dd qt | j
| j|d
|dd}t|dg dgd  t|dg dgd  t|ddgd	d	gddgddgggd  d	dg}ttt | j
| j|d
|dd | j| j| j	fD ]M}t | j
||d
|dd}d	dg}|jdkr6|g|jd  }t|d| t|d| d	d	gddgg}|jdkrZ|g|jd  }t|ddg| qtg dd	f}| j| jfD ]}ttt | j
||d
|dd qtt | j
| j|d
|dd}t|dtd t|dg dgd  t|ddgdd	gdd	gdd	gggd  tddgd	f}ttt | j
| j|d
|dd | j| j| j	fD ]P}t | j
||d
|dd}t|dtd	 ddg}|jdkr|g|jd  }t|d| dd	gdd	gg}|jdkr!|g|jd  }t|ddg| qg dg df}| j| jfD ]}ttt | j
||d
|dd q:tdD ]J}|dkr_tdd |D }t | j
| j|d
|dd}t|dg dgd  t|dg dgd  t|ddgdd	gddgddgggd  qOddgd	dgf}ttt | j
| j|d
|dd | j| j| j	fD ]_}t | j
||d
|dd}d	dg}|jdkr|g|jd  }t|d| ddg}|jdkr|g|jd  }t|d| dd	gddgg}|jdkr|g|jd  }t|ddg| qd	dgddgg}| j| j| j	fD ]}ttt | j
||d
|dd q(tdD ]J}|dkrIt|}t | j
| j|d
|dd}t|dd	dgddgg t|dd	dgddgg t|ddgd	d	gddggddgddggg q=ddgddggd	dgddggf}| j| j| j	fD ]}ttt | j
||d
|dd qtdD ]S}|dkrt|d t|d f}t | j
| j|d
|dd}t|dd	dgddgg t|dddgddgg t|ddgdd	gddggddgddggg qd S )N)d   Fr   r8   g      Y@r=   r   r   r<   )r_   rd   rR   rk   r9   rb   r   )r      ,  r#   r   r   )r   8r   r   c                 s   s    | ]}t |V  qd S r   )r>   rG   ).0r   r+   r+   r,   	<genexpr>R  s    z1TestInterp1D._check_fill_value.<locals>.<genexpr>i  i  ii0)r   rA   rB   r   r>   r   rN   rO   rL   rM   r@   ndimshaper%   rg   rG   rangetuple)r'   r_   interpr(   resultrR   iir+   r+   r,   _check_fill_value  sX  
"










zTestInterp1D._check_fill_valuec                 C   r|   N)rX   rU   r[   rY   rZ   rW   r\   r]   )r   rh   r+   r+   r,   test_fill_value  s   zTestInterp1D.test_fill_valuec                 C   s8   t | j| jdd}|jdksJ d|_|jdksJ d S )Ng     ^@rm   g     t@)r   rA   rB   rR   )r'   r   r+   r+   r,   test_fill_value_writeable  s   z&TestInterp1D.test_fill_value_writeablec                 C   s  t | j| j|d}t|tddgddggtddgddgg t|dtjs,J |djdks5J t | j| j	|d}t|dtdd	g t|tddgtddgd	d
gg t | j| j
d|d}t|dtddg t|tddgtddgddgg tddgddgg}t||tddgddggddgd
dggg t||tddgdd	ggddgddggg d S )Nr^   rl   r2   r5         @rq   r+   rn   r         (@r   rd   r_   rs   g      *@g      .@g      1@r3         @g      ,@)r   rA   rB   r   r>   rG   
isinstancendarrayr   rJ   rK   )r'   r_   ru   	interp210	interp102x_newr+   r+   r,   _nd_check_interp  s6   zTestInterp1D._nd_check_interpc           
      C   s   g d}t t |j| }t|D ]?\}}t |}t||||d}t||||d t ddd }t|}	g d|	||d < ||jt	|	ksRJ |qd S )N)   r4         r   r   r  )r#   r9   rb   r   rb   )
r>   r?   prodrC   	enumerater   r   listr   r   )
r'   r_   ar(   nsr)   r*   rE   br+   r+   r,   _nd_check_shape  s   
zTestInterp1D._nd_check_shapec                 C   r   )N)rX   r[   rY   rZ   rU   rW   r\   r]   )r  r  rh   r+   r+   r,   test_nd  r   zTestInterp1D.test_ndc           	      C   s   t g d}||d  }||}t|||d}t|d d ||d d  t ddd}t||j|d}t||j|d}t||j|| t||j|| d S )N)
rb         @r9   g@r  g@g@g       @g      #@r8         ?       @r^   r<   rb   r8      )r>   rG   r   r   r   linspacerealimag)	r'   r   r_   r)   r(   r   xicrcir+   r+   r,   _check_complex  s   
zTestInterp1D._check_complexc                 C   s*   dD ]}|  tj| |  tj| qd S r   )r  r>   r   r   rh   r+   r+   r,   test_complex  s   zTestInterp1D.test_complexzTest not meaningful on PyPy)reasonc                 C   sX   t dd}t dd}tt||}|ddg ~W d    d S 1 s%w   Y  d S )Nr   rb   皙?皙?)r>   r  r   r   )r'   r)   r(   r   r+   r+   r,   test_circular_refs  s   "zTestInterp1D.test_circular_refsc                 C   s>   dD ]}t jg dt jd}t|||d}t||| qd S )N)rU   r\   r]   )r   2      r   r^   )r>   rG   int8r   r   )r'   r_   r)   r   r+   r+   r,   test_overflow_nearest  s
   z"TestInterp1D.test_overflow_nearestc                 C   s\   t dt}| }t j|d< dD ]}t|||d}|ddg}t | s+J qd S )Nr8   r  )rW   rY   r^   g@r   )	r>   r?   r   floatrj   r   r   isfiniteall)r'   r)   r(   r_   irvalsr+   r+   r,   test_local_nans  s   
zTestInterp1D.test_local_nansc           
      C   s   t dt}| }| }t j|d< dD ]?}t|||d}t|||d}dddgddgddggfD ]!}t |}||||}}	t |		 sMJ |j
|	j
ksUJ q4qd S )Nr   r9   )rZ   r[   r^   r  rb   r4   )r>   r?   r   r#  rj   r   r   r   ro   r%  r   )
r'   r)   r(   ynr_   r&  irnr   outoutnr+   r+   r,   test_spline_nans  s   

zTestInterp1D.test_spline_nansc                 C   sV   t dt j }t d}tt t||dd W d    d S 1 s$w   Y  d S )Nr8   r[   r^   )r>   rf   r   r?   r%   rg   r   )r'   r)   r(   r+   r+   r,   test_all_nans  s
   

"zTestInterp1D.test_all_nansc                 C   sz   t dd}t | d }t ddd}dD ]#}||j_d|j_dD ]}t|||d	}||}t | s9J q#qd S )
Nr   r8   rl   r   r  TFF)rX   rU   rW   rY   rZ   r[   r^   )r>   r?   r   flags	writeabler   r$  r%  )r'   r)   r(   r   xnew_writeabler_   r   r'  r+   r+   r,   test_read_only  s   zTestInterp1D.test_read_onlyr_   )rX   rU   rV   r\   r]   c                 C   s   t dgdg|ddd}t|g dtg d t dgdg|dd	}ttd
d |d W d    d S 1 s9w   Y  d S )Nr   r  Fr7   )r_   rk   rR   )rb   r   r#   )r5   r  r8   Tr   zx_new is abovematchr5   )r   r   r>   r   r%   rg   )r'   r_   r   r+   r+   r,   test_single_value,  s   
"zTestInterp1D.test_single_valueN)rX   )+r.   r/   r0   rT   ri   rp   r{   r~   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r>   r   r  r  pytestmarkskipifr   r  r"  r(  r-  r.  r3  parametrizer6  r+   r+   r+   r,   r1   "   sN    )D	EE	
	
 "

 
	r1   c                   @   r!   )TestLagrangec                 C   s@   t g d}tt|j}||}t||}t|j|j d S )N)r4   r#   rb   r  r9   )r
   r>   r?   lencoeffsr   r   )r'   pxsysplr+   r+   r,   test_lagrange<  s
   
zTestLagrange.test_lagrangeN)r.   r/   r0   rB  r+   r+   r+   r,   r;  :  s    r;  c                   @   sL   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S )TestAkima1DInterpolatorc                 C   sR   t dd}t g d}t||}t g d}t g d}t||| d S )Nr6   r   r6   r5   rn   rl   r5   rs         @rE  g@ffffff@rl   r6   r$   rn   r   r        @g      @rF  g      @g@g333333!@g#@r3   r6   g      ?r5   r   g     @?g     @g.袋@g^@gn @gGNB@grcߖ@g	I@rl   r>   r?   rG   r   r   r'   r)   r(   akr  r   r+   r+   r,   	test_evalE  s   
z!TestAkima1DInterpolator.test_evalc                 C   sV   t dd}t g d}t||dd}t g d}t g d}t||| d S )Nr6   r   rD  makimamethodrG  )r6   gF??r5   g?g?gg{'@g>J(j@g?@gq@g@g9~@go
@rl   rJ  rK  r+   r+   r,   test_eval_modR  s   z%TestAkima1DInterpolator.test_eval_modc                 C   sv   t dd}t g d}t |d| f}t||}t g d}t g d}t |d| f}t||| d S )Nr6   r   rD  r5   rG  rI  )r>   r?   rG   column_stackr   r   rK  r+   r+   r,   test_eval_2dc  s   
z$TestAkima1DInterpolator.test_eval_2dc                 C   s  t dd}t g d}t d}||d d ddf< d| |d d ddf< d| |d d ddf< d	| |d d ddf< t||}t g d
}t d}t g d}||d d ddf< d| |d d ddf< d| |d d ddf< d	| |d d ddf< t||| d S )Nr6   r   rD  )r   r#   r#   r   r5   rb   rl   r   rG  )   r#   r#   rI  )r>   r?   rG   emptyr   r   )r'   r)   y_r(   rL  r  r   yi_r+   r+   r,   test_eval_3dt  s    


z$TestAkima1DInterpolator.test_eval_3dc                 C   s`   t g d}t ||d fj}t||}t ddg}||}t|t ||d fj d S )Nr   r#   r$   r   )r>   rG   vstackTr   r   )r'   r)   r(   rL  x_evaly_evalr+   r+   r,   %test_degenerate_case_multidimensional  s   
z=TestAkima1DInterpolator.test_degenerate_case_multidimensionalc                 C   sh   t dd}t g d}t||}d}tjt|d |d d  W d    d S 1 s-w   Y  d S )Nr6   r   rD  z9Extending a 1-D Akima interpolator is not yet implementedr4  )r>   r?   rG   r   r7  r   r&   extend)r'   r)   r(   rL  r5  r+   r+   r,   test_extend  s   
"z#TestAkima1DInterpolator.test_extendc                 C   s`   t dd}t g d}d}tjt|d t||dd W d    d S 1 s)w   Y  d S )Nr6   r   rD  z `method`=invalid is unsupported.r4  invalidrO  )r>   r?   rG   r7  r   r&   r   )r'   r)   r(   r5  r+   r+   r,   test_mod_invalid_method  s   "z/TestAkima1DInterpolator.test_mod_invalid_methodc                 C   s   t ddd}|d }t ddd}|d }t||dd	}t||d
d	}t||d d	}t||||dd t||dd t dt j t||dd t dt j t||dd	||dd t|||dd d S )Nr4   r   r#   r   r8      Tr`   Fr   r   r   r  r<   r9   )r>   r  r   r   r   fullr   )r'   r)   r(   x_exty_extak_trueak_falseak_noner+   r+   r,   test_extrapolate_attr  s     z-TestAkima1DInterpolator.test_extrapolate_attrN)r.   r/   r0   rM  rQ  rS  rX  r]  r_  ra  rl  r+   r+   r+   r,   rC  D  s    	rC  rP  c                 C   sn   t dd}t g d}|d|  }d}tjt|d | || W d    n1 s,w   Y  dd }d S )	Nr6   r   rD  y               @zreal valuesr4  c                 S   sL   t ddd}|d }t ddd}t||dd	}d
d }td||| d S )Nrb  r4   r   r#   r   r8   rc  Trd  c                 S      || d S r   r+   )_rL  rg  r+   r+   r,   	worker_fn     z9test_complex.<locals>.test_concurrency.<locals>.worker_fn)r>   r  r   r   )r'   r)   r(   rg  rL  ro  r+   r+   r,   test_concurrency  s   z&test_complex.<locals>.test_concurrency)r>   r?   rG   r7  r   rg   )rP  r)   r(   msgrq  r+   r+   r,   r    s   r  c                   @   sT   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S )TestPPolyCommonc                 C   sJ   t ddgddgddgg}t g d}ttt|| ttt|| d S )Nrb   r  r#   r4   r9   r  )r   rb   r$   )r>   rG   r%   rg   r   r   )r'   r   r)   r+   r+   r,   test_sort_check  s   zTestPPolyCommon.test_sort_checkc                 C   s@   t t tddgddg W d    d S 1 sw   Y  d S )Nrb   r#   r   )r%   rg   r   rS   r+   r+   r,   test_ctor_c  s   
"zTestPPolyCommon.test_ctor_cc                 C   s8  t jd d}t t jddt jd df }dt j|d t|d dd d }ttfD ]i}||d d d df |d d }|	|d d dd f |dd   ||d d dd f |dd  }|	|d d d df |d d  |||}t
|j|j t
|j|j t
|j|j t
|j|j q0d S )	N  r9   r   r8   r:   r#   rb   r   )r>   randomseeduniquer   randr<  r   r   r^  r   r   r)   )r'   orderr)   r   clspppp2pp3r+   r+   r,   r_    s   "&"$"$
zTestPPolyCommon.test_extendc                 C   s   t jd t ddd}t jdd}t ddd}t jdd}ttfD ]=}|||}|||}|||}|||dd   t jdddd	d
}	t ddd}
t||	||	 t||
||
 q&d S )Nrv  r   rb   r  r#   r4   r  r   F)endpoint)	r>   rw  rx  r  rz  r   r   r^  r   )r'   r)   r   rE   c2r|  pp1r~  pp_combxi1xi2r+   r+   r,   test_extend_diff_orders  s   


z'TestPPolyCommon.test_extend_diff_ordersc                 C   s&  t jd d}t t jddd}t j|d |jd d dd}ttfD ]i}|||}||d d d df |d d }|	|d d dd f |dd   ||d d dd f |dd  }|	|d d d df |d d  t
|j|j t
|j|j t
|j|j t
|j|j q'd S )Nr   r9   r8      rb   r#   r   )r>   rw  rx  sortuniformrz  r   r   r   r^  r   r   r)   )r'   r{  r)   r   r|  r>  p1p2r+   r+   r,   test_extend_descending  s    
"$"$z&TestPPolyCommon.test_extend_descendingc                 C   s   t jd t jddddd}t t jd}t jdd	}ttfD ]}|||}||jd
ks4J q$ttfD ]2}||d |}t |ddksMJ t |t ddks[J t	t
|t jddgdggtd q9d S )Nrv  r   r   r4   r  r  rT  r9   r  )r9   r  r4   r  r  ).r   r   r   r$   r+   r  r  皙?r   )r>   rw  rx  rz  r  r   r   r   rG   r%   rg   object)r'   r   r)   xpr|  r>  r+   r+   r,   
test_shape!  s   
"zTestPPolyCommon.test_shapec                 C   sf   t jddddd}t t jd}t jdd}ttfD ]}|||}d	d
 }td||| qd S )Nr   r   r4   r  r  rT  r9   r  c                 S   rm  r   r+   )rn  r   r  r+   r+   r,   ro  <  rp  z3TestPPolyCommon.test_concurrency.<locals>.worker_fnr8   )r>   rw  rz  r  r   r   r   )r'   r   r)   r  r|  r   ro  r+   r+   r,   rq  3  s   
z TestPPolyCommon.test_concurrencyc                 C   s   t jd t t jd}t jdd }|j|j}}t jd}ttfD ]0}|||||||||}}}	dD ]}
t|||
j|||
 t|||
j|	||
 q=q(d S )N90  rT  )r   r   y      ?333333?r4   r   )	r>   rw  rx  r  r  r  r   r   r   )r'   r)   r   c_rec_imr  r|  r>  p_rep_imnur+   r+   r,   test_complex_coefB  s   "z!TestPPolyCommon.test_complex_coefc              
   C   s  t jd t jdddddd}|j}t jd}d	D ]}|j|d
  }t t j|d
 }ttfD ]p}||||d}|jj|||d  |d |  ||d d   ksYJ ||}	|d | |j |d| d   }
|	j|
ksuJ ||||d	 ||||d	d||||d
 ||||d
dfD ]
}|j|jksJ qq4qdD ]}ttfD ]}tt|fi t|||d qqd S )Nr  r9   r  r4   r  r  r   )rb   r#   r   rb   r#   r9   rb   re   r#   )r<   r  r4   r  )r   r)   rd   )r>   rw  rx  rz  r   r  r   r   r   
derivativeantiderivativerd   r%   rg   r   )r'   r   c_sr  rd   mr)   r|  r>  res
targ_shaper  r+   r+   r,   	test_axisN  s4   8"zTestPPolyCommon.test_axisN)r.   r/   r0   rt  ru  r_  r  r  r  rq  r  r  r+   r+   r+   r,   rs    s    rs  c                   @   sT   e Zd ZG dd deZG dd deZdd Zdd Zd	d
 Z	dd Z
dd ZdS )TestPolySubclassingc                   @      e Zd ZdS )zTestPolySubclassing.PNr.   r/   r0   r+   r+   r+   r,   Pl      r  c                   @   r  )zTestPolySubclassing.BNr  r+   r+   r+   r,   Bo  r  r  c                 C   sB   t jd t t jd}t jd}| ||| ||fS )Nrv  r9   )r  r#   )r>   rw  rx  r  r  r  )r'   r)   r   r+   r+   r,   _make_polynomialsr  s   z%TestPolySubclassing._make_polynomialsc                 C   sN   |   \}}||fD ]}| }|j|jksJ q
| }|j|jks%J d S r   )r  r  	__class__r  )r'   r}  bpr>  pdppar+   r+   r,   test_derivativex  s   z#TestPolySubclassing.test_derivativec                 C   sh   t jd t t jdt jddf }t jt|}t||dd}| j	|}|j
| jks2J d S )Nrv  r   r   rb   r  )r>   rw  rx  r  r   rz  r<  r   r  from_spliner  )r'   r)   r(   splr}  r+   r+   r,   test_from_spline  s   z$TestPolySubclassing.test_from_splinec                 C   sH   |   \}}| j|}|j| jksJ | j|}|j| jks"J d S r   )r  r  from_bernstein_basisr  r  from_power_basis)r'   r}  r  r  bp1r+   r+   r,   test_conversions  s
   z$TestPolySubclassing.test_conversionsc                 C   s:   g d}dgdgdgg}| j ||}|j| j ksJ d S )Nr   rb   r#   r9   )r  from_derivativesr  )r'   r)   r(   r  r+   r+   r,   test_from_derivatives  s   z)TestPolySubclassing.test_from_derivativesN)r.   r/   r0   r   r  r   r  r  r  r  r  r  r+   r+   r+   r,   r  k  s    			r  c                   @   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d1d2 Zd3d4 Zd5d6 Zd7d8 Zd9S ):	TestPPolyc                 C   s`   t ddgddgddgg}t g d}t||}t|dt d	 t|d
t d d S )Nrb   r  r#   r4   r9   r  r   r$   rb   333333?Q@ffffff?p=
ף@r>   rG   r   r   r   r'   r   r)   r>  r+   r+   r,   test_simple  s
   
zTestPPoly.test_simplec                 C   s   t ddgddgddgg}t g d}t||dd	}t|d
t d t|dt d t|d
dt d t|ddt d d S )Nrb   r  r#   r4   r9   r  r  periodicrd  g?r  333333ӿr  g@gffffff@r  r  r+   r+   r,   test_periodic  s   zTestPPoly.test_periodicc                 C   s   t ddgddgddgg}t g d}t g d}t||d	d
 dD ]}||j_||j_t||}||}t | sAJ q%d S )Nrb   r  r#   r4   r9   r  r  )r   r  r  r  rd  r/  )r>   rG   r   r0  r1  r$  r%  )r'   r   r)   r   r1  r   r'  r+   r+   r,   r3    s   
zTestPPoly.test_read_onlyc              	   C   s  dd }t jd}d}dD ]}t |dd|d }|jdd	|d |fd
}t |}|d d d f t |d d d dd f  }||}	|| }
t |	j|
}|| }t	||dd}t	|d d d d df |d d d dd}|ddd}t
||||dd t
||d||ddd | }| }t
||||dd | }| }|dddD ]*\}}|||}|||}t
||dd t
|||| |||| dd q| }| }t
|t |dd qd S )Nc                 S   sF   t | d dd}t | d }t||}|d d dd d df S )Nrb   r<   )r>   r?   rC   r    )powerr  kr  r+   r+   r,   binom_matrix  s   
z/TestPPoly.test_descending.<locals>.binom_matrixr   r9   r8   r  r:   r8   rb   r   r#   sizer<   Trd  r   r  r   vIh%<=r   r4   r#   -q=)r>   rw  RandomStater  r  diffr?   dotrZ  r   r   r  r  	integrateroots)r'   r  rngr  r  r)   cahh_powersr  capcdpcdpar  x_testpa_dpd_dpa_ipd_ir
  r  int_aint_droots_droots_ar+   r+   r,   test_descending  sB   
,*zTestPPoly.test_descendingc                 C   s   t jddddd}t g d}t||}|jj|jksJ |jj|jks(J |dj|jdd  ks6J |t jddjd|jdd   ksKJ | }|jjd	ksWJ |	 }|jjd
kscJ d S )Nr  r#   rb   r9   r  r  r4   r4   r  r4   r#   rb   r#   r9   )r  r#   rb   r#   r9   )
r>   rw  rz  rG   r   r)   r   r   r  r  )r'   r   r)   r>  dpipr+   r+   r,   test_multi_shape  s   
*zTestPPoly.test_multi_shapec                 C   sr   t jd t jddgddgddggtd}t g d	}t||}t|d
t d t|dt d d S )Nrv  rb   r  r#   r4   r9   r  r   r  r  r  r  r  )	r>   rw  rx  rG   r#  r   construct_fastr   r   r  r+   r+   r,   test_construct_fast  s    zTestPPoly.test_construct_fastc                 C   s   t jd}|ddd}t t jd|ddf }t||}t jd }t|||}t||| t	|d d d d df ||}t||d d df | d S )	Nrv  r9   r      r   r   rb   )r  r$   gQ?333333?)
r>   rw  r  rz  r  r   r   _ppoly_eval_1r   _ppoly_eval_2)r'   r  r   r)   r>  r  expectedr+   r+   r,   #test_vs_alternative_implementations  s   

z-TestPPoly.test_vs_alternative_implementationsc                 C   s   t jd}t t jd|ddf }|t|}t||dd}t	|}t 
ddd}t||t|| t| }t	|}t|||| |\}	}
}dD ]}t|	|
||d}t	|}|j|jkshJ qQd S )	Nrv  r   r   rb   r  r   )NTFrd  )r>   rw  r  r  r   rz  r<  r   r   r  r  r   r   r   r`   )r'   r  r)   r(   r  r}  r  r  ppptr   r  extrapr>  r+   r+   r,   r    s    



zTestPPoly.test_from_splinec                 C   s   t jd t g dgj}t g dgj}t ddggj}t ddg}t||}t||}t||}t| j|j t|dj|j d S )	Nrv  )r  r9   r#   rb   )r   r  r#      r  r   rb   r#   )	r>   rw  rx  rG   rZ  r   r   r  r   )r'   r   dcddcr)   r}  dppddppr+   r+   r,   test_derivative_simple)  s   


z TestPPoly.test_derivative_simplec                 C   s   t jd}t t jd|ddf }|t|}t||dd}t	|}t 
ddd}tddD ]}t|||t||| q3d S )Nrv  r   r   rb   r  r   r9   )r>   rw  r  r  r   rz  r<  r   r   r  r  r   r   r   r'   r  r)   r(   r  r}  r  dxr+   r+   r,   test_derivative_eval7  s   
zTestPPoly.test_derivative_evalc                 C   s   t jd}t t jd|ddf }|t|}t||ddd}t	|}t 
ddd}tddD ]}t||||||d	|f d
 q4d S )Nrv  r   r   rb   r4   r  r  r   r8   zdx=%dr  )r>   rw  r  r  r   rz  r<  r   r   r  r  r   r   r  r  r+   r+   r,   r  C  s   
zTestPPoly.test_derivativec                 C   s^   t dggddg}t| jt dgdggddgj t| jt dgdggddgj d S )Nrn   r   rb   )r   r   r  r   r)   )r'   r>  r+   r+   r,   test_antiderivative_of_constantP  s   $(z)TestPPoly.test_antiderivative_of_constantc                 C   s   t ddggg d}| }t|jddgddgg t|jg d t|ddtd tt|d|d td d S )	Nrn   r$   r   rb   r   )r6   rb   r#   r#   r   )	r   r  r   r   r)   r   r  r>   r   )r'   r>  qr+   r+   r,   #test_antiderivative_regression_4355V  s   z-TestPPoly.test_antiderivative_regression_4355c           	      C   s   t jd t g dg dgj}t g dg dgj}t g dg dgj}t g d}t||}| }|d	}| }t|j| t|j	j|j t|j	j|j t|j	j|j d S )
Nrv  )r9   r#   rb   )r   r         ?)rb   rb   rb   r   )r   r   r        ?)      ?gUUUUUU?r$   r   r   )r   r   g      ?r   g*?)r   r  rb   r#   )
r>   rw  rx  rG   rZ  r   r  r   r)   r   )	r'   r   iciicr)   r}  ippiippiipp2r+   r+   r,   test_antiderivative_simple`  s"   


z$TestPPoly.test_antiderivative_simplec              	   C   s   t jd}t dddd }|t|}t||ddd}t|}t	ddD ]J}|
|}||}t|j|j t	|D ]2}	||	}d	}
|
|jd d
  d|
 |jdd    }t||jdd  ||dd||	f d q?q(d S )Nrv  r   rb   r:   r#   r4   r  r8   r  r<   r   z
dx=%d k=%d)r   r   )r>   rw  r  r  rz  r<  r   r   r  r   r  r  r   r   r)   )r'   r  r)   r(   r  r}  r  r  r~  r  rr  r+   r+   r,   !test_antiderivative_vs_derivativex  s$   



(z+TestPPoly.test_antiderivative_vs_derivativec           
      C   s   t jd}t t jd|ddf }|t|}t||ddd}t	|}t
ddD ]}||}t||}t ddd}	t||	t|	|d	d
 q-d S )Nrv  r   r   rb   r4   r  r8   r   r   r   )r>   rw  r  r  r   rz  r<  r   r   r  r   r  r   r  r   r   )
r'   r  r)   r(   r  r}  r  r~  spl2r  r+   r+   r,   test_antiderivative_vs_spline  s   


z'TestPPoly.test_antiderivative_vs_splinec                 C   sh   t g dg dgj}t g d}t||}| }t|d|ddd | }t|j|j d S )N)r#   rb   r#   r#   )r#   rb   r9   r9   r  gA?g_p   ?g:0yE>r   )r>   rG   rZ  r   r  r   r  r   )r'   r   r)   r>  r  r  r+   r+   r,   test_antiderivative_continuity  s   
z(TestPPoly.test_antiderivative_continuityc           
      C   s   t jd}t t jd|ddf }|t|}t||ddd}t	|}d\}}|
||}| }	t||	||	| dd	 t|t|||dd	 d
\}}|j
||dd}t||	||	| dd	 t |j
||dd svJ d S )Nrv  r   r   rb   r4   r  )r  ?Fcheck_0d)r  r  Trd  )r>   rw  r  r  r   rz  r<  r   r   r  r  r  r   r   ro   r%  )
r'   r  r)   r(   r  r}  r
  r  igr  r+   r+   r,   test_integrate  s   
"zTestPPoly.test_integratec                 C   sn   t g d}t ddgddgddgddgg}dD ]}||j_t||}|dd	}t | s4J qd S )
Nrb   r#   r  r6   r   r5          rn   r/  rb   r  )r>   rG   r0  r1  r   r  r$  r%  )r'   r)   r   r1  r  r'  r+   r+   r,   test_integrate_readonly  s   "
z!TestPPoly.test_integrate_readonlyc                 C   s  t g d}t ddgddgddgddgg}t||dd}| }t |d	|d
 }t|d
d	| t|dd| t|ddt d|  t|ddt |d|d  t|ddt |d|d
 |d	 |d  t|ddt |d|d
 |d	 |d  t|ddt |d|d
 |d	 |d d	|   t|ddt |d|d  t|ddt |d|d  t|ddt |d|d d|   d S Nr  r6   r   r5   r  rn   r  rd  r  rb   r   ire  r#   r   r  rH  r4   g      /@rc  r   r<   r9   i)r>   rG   r   r  r   r   r  r'   r)   r   r  I
period_intr+   r+   r,   test_integrate_periodic  s:   "$$,z!TestPPoly.test_integrate_periodicc                 C   sl   t dddd }t d| }t||ddd}t|}| }||dk|d	k@  }t|t|d
d d S )Nr   rb   r  r#   r:   r9   r  gV瞯Ҽg     ?r   r   )	r>   r  r	   r   r   r  r  r   r   )r'   r)   r(   r  r}  r  r+   r+   r,   
test_roots  s   
zTestPPoly.test_rootsc                 C   s   t ddgddgddggj}t g d}t||}t| ddt jdg d}| }|dd d f  |7  < t||}t||ddt jdg d S )	Nr<   r  r   )r   r  r  rn   r  g333333?r5   rb   )	r>   rG   rZ  r   r   r  r   rj   solve)r'   r   r)   r}  constc1r  r+   r+   r,   test_roots_idzero  s   


zTestPPoly.test_roots_idzeroc                 C   s   dgdgg}ddg}t ||}t| dtjg t|ddtjg t|dg  ddgddgg}g d}t ||}t| dtjdtjg t|ddtjdtjg t|dg  d S )Nr   rb   r   )r   r   r  r>   r   r  r  r+   r+   r,   test_roots_all_zero	  s   

zTestPPoly.test_roots_all_zeroc                 C   sf   t g dg dgj}t g d}t||}t| t ddg t|jddt dg d S )N)rb   r   r<   )r<   r   r   r   g       r6   Frd  )r>   rG   rZ  r   r   r  r   r'   r   r)   r}  r+   r+   r,   test_roots_repeated  s
   
zTestPPoly.test_roots_repeatedc                 C   s   t dgdggj}t g d}t||}t| t dg t|jddt g  t|dt dg t|jdddt g  t|dt g  t|jdddt g  d S )Nrb   r<   r  r$   F)discontinuityr   )r>   rG   rZ  r   r   r  r   r  r   r+   r+   r,   test_roots_discont%  s   
zTestPPoly.test_roots_discontc                 C   sX  t jd}d}dD ]}tddD ]}t t jdd|d df }d||d t|d dd	 d }t||}d| fD ]]}|j	|d
|d}	tdD ]N}
td	D ]G}|	|
|f }|j
dkr||j
7 }|||dd d |
|f }||d|dd d |
|f }d|dt| }t|| | t dd|d
d qTqNq@qq
|dksJ t|d S )Nrv  r   r/  r  r8   r:   r#   rb   r9   F)r"  r`   rd  )r  r`   (z) r = r6   r   )r   r   r   r   )r>   rw  r  r   ry  r   rz  r<  r   r  r  reprr   r   )r'   r  numr`   r{  r)   r   r}  r(   r  ijrrvalcmpvalrr  r+   r+   r,   test_roots_random4  s>    $


zTestPPoly.test_roots_randomc           	   
   C   sP  t jd}tddD ]}||dd}|dkr!d|d d ddf< d| fD ]}}t j|jtd}t	||| |dkrFt 
| sEJ q'| }d}t|D ]$}|||d f ||d |   7 }|t||d f ||d |   7 }qOt jd	d
 || }W d    n1 sw   Y  | }|t 
|  }t|t |dd q'qd S )Nrv  rb   r      r9   )rb   r#   rb   r   r   ignore)r`  g|=r   )r>   rw  r  r   rz  rU  r   complexr   _croots_poly1ro   r%  abserrstateravelr   
zeros_like)	r'   r  r  r   r(   wr  cresr'  r+   r+   r,   test_roots_crootsT  s0    &
zTestPPoly.test_roots_crootsc                 C   s  t g dgj}t ddg}dD ]w}t|||d}| }| }|du rXt |ddg s4J t |ddg sAJ t |ddg sNJ | dgksWJ qt	|ddgd	d
g t |ddg
 rpJ t |ddg
 r}J t	| t ddg qd S )Nr   r   rb   TFNrd  F皙皙?gGz?gzGʿrn   r   )r>   rG   rZ  r   r  r  ro   r%  r  r   anyr   )r'   r   r)   r`   r}  pp_dpp_ir+   r+   r,   rl  r  s    zTestPPoly.test_extrapolate_attrN)r.   r/   r0   r  r  r3  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r  r  r!  r#  r,  r7  rl  r+   r+   r+   r,   r    s:    1
 r  c                   @   d   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S )	TestBPolyc                 C   s2   ddg}dgg}t ||}t|dtd d S )Nr   rb   r9   r  rl   r   r   r>   r   r'   r)   r   r  r+   r+   r,   r    s   
zTestBPoly.test_simplec                 C   s6   ddg}dgdgg}t ||}t|dtd d S )Nr   rb   r9   r  ggfffff@r@  rA  r+   r+   r,   test_simple2  s   
zTestBPoly.test_simple2c                 C   s:   ddg}dgdgdgg}t ||}t|dtd d S )Nr   rb   r9   r  r  g433333@r@  rA  r+   r+   r,   test_simple3  s   
zTestBPoly.test_simple3c                 C   s>   ddg}dgdgdgdgg}t ||}t|dtd d S )Nr   rb   r#   r  g:On?r@  rA  r+   r+   r,   test_simple4  s   
zTestBPoly.test_simple4c                 C   sB   ddg}dgdgdgdgdgg}t ||}t|dtd d S )Nr   rb   r   r#   r  g	h"l@r@  rA  r+   r+   r,   test_simple5  s   
zTestBPoly.test_simple5c                 C   s   g d}ddgddgddgg}t ||dd}t|dtd t|d	td
 t|ddtd t|d	dtd d S )Nr   rb   r9   r9   r   r#   r  rd  g333333@gHzG?g[(\?rb   r  r@  rA  r+   r+   r,   r    s   zTestBPoly.test_periodicc              	   C   sp  t jd}d}dD ]}t |dd|d }|jdd|d |fd}|d d d	  }t||d
d}t|d d d d d	f |d d d	 d
d}|ddd}	t||	||	dd t||	d||	ddd | }
| }t|
|	||	dd |	 }|	 }|dddD ]*\}}|
||}|
||}t||dd t|||| |||| dd qq
d S )Nr   r9   r  r8   rb   r9  r  r  r<   Trd  r   r  r   r  r   r  r  )r>   rw  r  r  r  rj   r   r   r  r  r  )r'   r  r  r  r)   r  r  r  r  r  r  r  r  r  r
  r  r  r  r+   r+   r,   r    s2   *zTestBPoly.test_descendingc                 C   s   t jd}|ddddd}t g d}t||}|jj|jks$J |jj|jks-J |dj|jdd  ks;J ||ddjd	|jdd   ksOJ |	 }|jjd
ks[J d S )Nrv  r  r#   rb   r9   r  r  r4   r  r  )
r>   rw  r  rz  rG   r   r)   r   r   r  )r'   r  r   r)   r>  r  r+   r+   r,   r    s   
(zTestBPoly.test_multi_shapec                 C   sr   ddg}dgdgdgg}t ||}d}|d }t||tdd|  d|  d| d|   d| |   d S )Nr   r#   r9   rb   r  r  r@  )r'   r)   r   r  xvalr  r+   r+   r,   test_interval_length  s   
4zTestBPoly.test_interval_lengthc                 C   sT   g d}ddgddgddgg}t ||}t|dtd t|dtd d S )	NrF  r9   r   r#   r  gGzG?333333?rG  r@  rA  r+   r+   r,   test_two_intervals  s
   
zTestBPoly.test_two_intervalsc                 C   s   ddg}dgdgdgg}t ||}dD ]F}t |||d}| }|du r?t|d	d
g s1J t|d	d
g s>J qt|d	d
g rLJ t|d	d
g rYJ qd S )Nr   r#   r9   rb   r  r8  rd  Fr9  g @)r   r  r>   ro   r%  r;  )r'   r)   r   r  r`   bp_dr+   r+   r,   rl     s   
zTestBPoly.test_extrapolate_attrN)r.   r/   r0   r  rB  rC  rD  rE  r  r  r  rJ  rL  rl  r+   r+   r+   r,   r?    s    "
r?  c                   @   r>  )TestBPolyCalculusc                    s   g d}ddgddgddgg}t ||   }t|dtd t|dtd tt fd	d
dD tg d tt fdd
dD tg d d S )NrF  r9   r   r#   r  rH  rK  r  c                       g | ]} d |qS )r  r+   r   r  r  r+   r,   
<listcomp>      z5TestBPolyCalculus.test_derivative.<locals>.<listcomp>rb   r#   r9   )rH  rs   r6   c                    rO  )rK  r+   rP  rQ  r+   r,   rR    rS  )r  rn   r   )r   r  r   r>   r   )r'   r)   r   bp_derr+   rQ  r,   r    s   
z!TestBPolyCalculus.test_derivativec           
      C   s   t jd}d\}}t ||}|||d f}t||}t|}t|D ]}| }| }t 	|d |d d}	t
||	||	 q)d S Nrv  r4   r   rb   r   r<      )r>   rw  r  r  r   r   r  r   r  r  r   )
r'   r  r  r  r)   r   r  r}  dr  r+   r+   r,   test_derivative_ppoly!  s   

z'TestBPolyCalculus.test_derivative_ppolyc           
      C   s   t jd}d\}}t ||}|||d f}| |d fD ]&}t||}t |d |d d}t|D ]}	t|||	|	|	| q9q#d S )Nrv  rW  rb   r  r   r<   rX  )
r>   rw  r  r  rj   r   r  r   r   r  )
r'   r  r  r  r)   r   ccr  r  r'  r+   r+   r,   test_deriv_inplace0  s   
z$TestBPolyCalculus.test_deriv_inplacec              	   C   sz   g d}ddgddgg}t ||}| }tddd}t||t|dk |d d d| |d d  d	 d
d
d d S )NrF  r   rb   r9   r   r#   r5   r$   g      ?r  r   r   )r   r  r>   r  r   where)r'   r)   r   r  bixxr+   r+   r,   r  =  s   

z,TestBPolyCalculus.test_antiderivative_simplec                 C   sj   t jd}t |d}|d}t||}t |d |d d}t|  |||ddd d S )	Nrv  r   r  r8   r#   r9   r   r<   r   r  r]  )	r>   rw  r  r  r   r  r   r  r  r'   r  r)   r   r  r`  r+   r+   r,   test_der_antiderQ  s   



z"TestBPolyCalculus.test_der_antiderc                 C   sx   t jd}t |d}|d}t||}t|}t |d |d d}t|	d||	d|ddd	 d S )
Nrv  r   ra  r   r<   r8   r#   r  r]  )
r>   rw  r  r  r   r   r  r  r   r  )r'   r  r)   r   r  r}  r`  r+   r+   r,   test_antider_ppoly[  s   



z$TestBPolyCalculus.test_antider_ppolyc                 C   sf   t jd}t |d}|d}t|| }|jdd }t||d ||d ddd d S )	Nrv  r   r  r8   rb   r<   r   r  r]  )r>   rw  r  r  r   r  r)   r   rb  r+   r+   r,   test_antider_continuousg  s   

z)TestBPolyCalculus.test_antider_continuousc                 C   s`   t jd}t |d}|d}t||}t|}t|dd|dddddd d S )	Nrv  r   re  r   rb   r  F)r   r   r  )	r>   rw  r  r  r   r   r  r   r  )r'   r  r)   r   r  r}  r+   r+   r,   r  q  s   



z TestBPolyCalculus.test_integratec                 C   s   dgg}ddg}t ||}t|ddtdddd t ||dd}t|dds.J t|jddd	dtdddd d S )
Nrb   r   r#   r5   r   F)r   r  rd  T)r   r   r  r>   r   ro   )r'   r   r)   r  b1r+   r+   r,   test_integrate_extrapz  s   

z'TestBPolyCalculus.test_integrate_extrapc                 C   s  t g d}t ddgddgddgddgg}tjt||dd}| }|d	|d
 }t|d
d	| t|dd| t|ddd|  t|dd|d|d  t|dd|d|d
 |d	 |d  t|dd|d|d
 |d	 |d  t|dd|d|d
 |d	 |d d	|   t|dd|d|d  t|dd|d|d  t|dd|d|d d|   d S r  )r>   rG   r   r  r   r  r   r  r  r+   r+   r,   r    s&   ".&*z)TestBPolyCalculus.test_integrate_periodicc                 C   sr   dgg}ddg}t ||}tddd}t|d|| |ddd t|d||d|ddd d S )Nrb   r   rX  r<   r  r]  )r   r>   r  r   r  r  )r'   r   r)   r  r`  r+   r+   r,   test_antider_neg  s   

z"TestBPolyCalculus.test_antider_negN)r.   r/   r0   r  rZ  r\  r  rc  rd  rf  r  rh  r  ri  r+   r+   r+   r,   rN    s    

	rN  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestPolyConversionsc                 C   sl   g d}ddgddgddgg}t ||}t|}t |}ddg}t|||| t|||| d S )	NrF  r9   r#   rb   r   r  r  ffffff?)r   r   r  r  r   )r'   r)   r   r}  r  r  r  r+   r+   r,   test_bp_from_pp     


z#TestPolyConversions.test_bp_from_ppc           
      C   s   t jd}d\}}t ||}|||d f}t||}t|}t|}t |d |d d}	t	||	||	 t	||	||	 d S rV  )
r>   rw  r  r  r   r   r  r  r  r   )
r'   r  r  r  r)   r   r}  r  r  r  r+   r+   r,   test_bp_from_pp_random  s   


z*TestPolyConversions.test_bp_from_pp_randomc                 C   sl   g d}ddgddgddgg}t ||}t|}t |}ddg}t|||| t|||| d S )NrF  r9   rb   r  r#   r  rk  )r   r   r  r  r   )r'   r)   r   r  r}  r  r  r+   r+   r,   test_pp_from_bp  rm  z#TestPolyConversions.test_pp_from_bpc                 C   s   g d}ddgddgddgg}t ||}tt t | W d    n1 s(w   Y  t||}tt t| W d    d S 1 sGw   Y  d S )NrF  r9   rb   r  r#   )r   r%   	TypeErrorr  r   r  )r'   r)   r   r}  r  r+   r+   r,   test_broken_conversions  s   



"z+TestPolyConversions.test_broken_conversionsN)r.   r/   r0   rl  rn  ro  rq  r+   r+   r+   r,   rj    s
    rj  c                   @   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!S )"TestBPolyFromDerivativesc                 C   s&   t dddgdg}t|ddg d S )Nr   rb   r#   r9   r5   rl   r   _construct_from_derivativesr   )r'   r  r+   r+   r,   test_make_poly_1  s   z)TestBPolyFromDerivatives.test_make_poly_1c                 C   sp   t ddddgdg}t|g d t ddddgdg}t|g d t dddgddg}t|g d d S )Nr   rb   )rn   rn   rn   r#   r9   )r5   rH  rn   )r5   g      rn   rs  r'   r  r  c3r+   r+   r,   test_make_poly_2  s   z)TestBPolyFromDerivatives.test_make_poly_2c                 C   sr   t ddg ddg}t|g d t dddgg d}t|g d t ddddgdd	g}t|g d
 d S )Nr   rb   rT  r  )rn   竪?g@r   )r  r#   r9   )rn   gUUUUUU	@g
@r   r#   r9   )rn   ry  rl   r   rs  rv  r+   r+   r,   test_make_poly_3  s   z)TestBPolyFromDerivatives.test_make_poly_3c                 C   s   t jd}t jd|df }t jd|df }tdd||}t|d d d f ddg}tdD ]}t|d|| dd t|d	|| dd | }q3d S )
Nr  r   r4   rb   r  r6   Fr  rn   )	r>   rw  r  r   r   rt  r   r   r  )r'   r  yaybr   r}  r(  r+   r+   r,   test_make_poly_12  s   
z*TestBPolyFromDerivatives.test_make_poly_12c           
      C   st   t jd}ddg}d\}}||ddddf}t||}t||}t||}t ddd}	t||	||	 d S )	Nr  r   rb   )r   r4   r#   r9   r  r   )r>   rw  r  r   _raise_degreer  r   )
r'   r  r)   r  rY  r   r  r  r  r  r+   r+   r,   test_raise_degree
  s   

z*TestBPolyFromDerivatives.test_raise_degreec                 C   s   t ttjddgdg d S )Nr   rb   r%   rg   r   r  rS   r+   r+   r,   
test_xi_yi  s   z#TestBPolyFromDerivatives.test_xi_yic                 C   s,   g d}dgdgdgg}t ttj|| d S )Nr   r   rb   r   r  )r'   r  r   r+   r+   r,   test_coords_order  s   z*TestBPolyFromDerivatives.test_coords_orderc                 C   s|   g d}ddgdgddgddgg}t ||}|jjdksJ | }dD ]}t||td t||td q%d S )Nr  r   )r  r9   )r6   r  rn   r:  gffffff?r5   r  r6   )r   r  r   r   r  r   r>   r   )r'   r  r   r}  ppdr  r+   r+   r,   
test_zeros  s   z#TestBPolyFromDerivatives.test_zerosc                    sL   t jdt dd t|d D } fddt|d D }||fS )Nrv  c                 S   s   g | ]}d |d  qS )rn   r#   r+   r   r(  r+   r+   r,   rR  .  s    z<TestBPolyFromDerivatives._make_random_mk.<locals>.<listcomp>rb   c                    s   g | ]}  qS r+   )rw  r  r  r  r+   r,   rR  /  rS  )r>   rw  r  r   r   r'   r  r  r  r   r+   r  r,   _make_random_mk+  s   z(TestBPolyFromDerivatives._make_random_mkc                    s^   d\}}|  ||\}}t||}t|d D ] t|| fdd|D  | }qd S )Nr4   r   r#   c                    s   g | ]}|  qS r+   r+   )r   yyr{  r+   r,   rR  8      z;TestBPolyFromDerivatives.test_random_12.<locals>.<listcomp>)r  r   r  r   r   r  )r'   r  r  r  r   r}  r+   r  r,   test_random_122  s   
z'TestBPolyFromDerivatives.test_random_12c                 C   s:   d\}}|  ||\}}tttjfi t||dd d S )Nr  r   r  r   orders)r  r%   rg   r   r  r   r  r+   r+   r,   test_order_zero;  s
   
z(TestBPolyFromDerivatives.test_order_zeroc                 C   sV   d\}}|  ||\}}tj||d| d d tttjfi t||d| d d S )Nr  r#   rb   r  r  )r  r   r  r%   rg   r   r  r+   r+   r,   test_orders_too_highA  s   
z-TestBPolyFromDerivatives.test_orders_too_highc                 C   s0  d\}}|  ||\}}d}tj|||d}t|d d D ]}t||dd d ||dd d  | }qt||dd d ||dd d rRJ d}tj|||d}t|d D ]}t||dd d ||dd d  | }qbt||dd d ||dd d rJ d S )	Nr  r4   r  r#   rb   r<   r  r  )r  r   r  r   r   r  r>   allclose)r'   r  r  r  r   r{  r}  r(  r+   r+   r,   test_orders_globalI  s   *
0*
4z+TestBPolyFromDerivatives.test_orders_globalc           
      C   s   d\}}|  ||\}}dd t|D }t|dd D ]:\}}tj|||d}t|| d d D ]}	t||d ||d  | }q3t||d ||d rWJ qd S )	N)r  r   c                 S   s   g | ]}|d  qS )rb   r+   )r   or+   r+   r,   rR  e  r  z>TestBPolyFromDerivatives.test_orders_local.<locals>.<listcomp>rb   r<   r  r#   r  )	r  r   r  r   r  r   r  r>   r  )
r'   r  r  r  r   r  r'  r)   r}  r(  r+   r+   r,   test_orders_locala  s   
"z*TestBPolyFromDerivatives.test_orders_localc                 C   sn   t jd}d\}}t ||d }||d |dddf}t||}|jjd| |dddfks5J d S )Nrv  )r  r4   rb   r  r  r   r#   )r>   rw  r  r  r   r  r   r   )r'   r  r  r  r  r   r}  r+   r+   r,   test_yi_trailing_dimsm  s   "z.TestBPolyFromDerivatives.test_yi_trailing_dimsc                 C   s   t d}tjddgdgdgg|d}t|dt d t d}tjddgdgdgg|d}t|dt d d}tjddgdgdgg|d}t|dt d d}d S )Nrb   r   r  )r>   int32r   r  r   r   int64)r'   r  r>  r+   r+   r,   test_gh_5430u  s   

z%TestBPolyFromDerivatives.test_gh_5430N)r.   r/   r0   ru  rx  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r+   r+   r+   r,   rr    s"    	rr  c                   @   sd   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ejjdd ZdS )TestNdPPolyc                 C   sv   t jd}|dd}t ddd}|d}t||f}||f}t|d d d d d f || }t|| d S )Nrv  r  r4   r   rb   r  r   )	r>   rw  r  rz  r  r   r  r3  r   )r'   r  r   r)   r  r>  v1v2r+   r+   r,   test_simple_1d  s   

"zTestNdPPoly.test_simple_1dc              
   C   s@  t jd}|dddd}t ddd}t dddd	 }|d
}|d
}t jt|dg|jd}|t j	 t
|ddd||ft jddgt jdt j||f t jddgt jdd| | }t|||f||}t|| t|||f}	dD ]!}
|	t j||f |
d}t|||f|||
d}t||t|
d q|d S )Nrv  r  r4   r  r  r   rb   r   r#   r   r   r  *   )Nr   r   r   rb   )rb   r   )r#   r9   )r   r#   r  r  )r>   rw  r  rz  r  rU  r<  r   fillr   r   evaluate_ndrC   rG   intcc_r3  _ppoly2d_evalr   r   r%  )r'   r  r   r)   r(   r  r   r  r  r>  r  r+   r+   r,   test_simple_2d  s2   


zTestNdPPoly.test_simple_2dc              	   C   s   t jd}|dddddd}t dd	d}t dd	dd
 }t dd	dd }|d}|d}|d}t||||f}	dD ]!}
|	|||f|
d}t||||f||||
d}t||t|
d qBd S )Nrv  r  r4   r  r  r   r   r   rb   r#   r8   r9   (   )Nr   r   r   r   rb   r   rb   r   r   )r#   r9   r   )r  r   r#   r  r  )	r>   rw  r  rz  r  r   _ppoly3d_evalr   r%  )r'   r  r   r)   r(   r*   r  r   zir>  r  r  r  r+   r+   r,   test_simple_3d  s   


zTestNdPPoly.test_simple_3dc              
   C   s   t jd}|dddddddd	}t d
dd}t d
ddd }t d
dd	d }t d
ddd }|d}|d}|d}	|d}
t|||||f}||||	|
f}t|||||f|||	|
}t|| d S )Nrv  r  r4   r  r  r   r   r8   r   r   rb   r#   r9   r   r  )r>   rw  r  rz  r  r   _ppoly4d_evalr   )r'   r  r   r)   r(   r*   ur  r   r  uir>  r  r  r+   r+   r,   test_simple_4d  s   



zTestNdPPoly.test_simple_4dc                 C   s   t jd}|dd}t ddd}t||f}|jdgd}t||}| }t|j	|j	 |j
dgd}t||}|
d}t|j	|j	 d S )	Nrv  r  r4   r   rb   r  r  r#   )r>   rw  r  rz  r  r   r  r   r   r   r  )r'   r  r   r)   r>  r  r  dp1r+   r+   r,   test_deriv_1d  s   


zTestNdPPoly.test_deriv_1dc           
   
   C   sZ  t jd}|dddddd}t dd	d}t dd	dd
 }t dd	dd }t||||f}t|ddd	d
dd|}|jd
gd}|d
}	t	|j
|	j
dd
dd	dd t|d	ddd
dd|}|jg dd}|d	}	t	|j
|	j
d
dddd	d t|d
ddd	dd|}|jg dd}|d}	t	|j
|	j
d
ddddd	 d S )Nrv  r  r4   r  r  r   r   r   rb   r#   r8   r9   r  r  )r   r   r9   )r>   rw  r  rz  r  r   r   	transposer  r   r   r  )
r'   r  r   r)   r(   r*   r>  r  r  r  r+   r+   r,   test_deriv_3d  s0   


zTestNdPPoly.test_deriv_3dc                 C   s   t jd}t d}t dddd }t dddd }t dddd	 }t||||f}|d
}|d}|d}|d}	|d}
t|||	|
f||	d  |
d  t	d	t	d   d S )Nrv  )rb   rb   rb   r9   r  r4   r   rb   r  r4   r#   r  r9   )rb   r   r  )r   r#   r   r  )
r>   rw  r  rf   r  r   r  rz  r   r   )r'   r  r   r)   r(   r*   r>  r  r  r   r  r+   r+   r,   test_deriv_3d_simple	  s   





"z TestNdPPoly.test_deriv_3d_simplec           
   	      sr  t jd}|dddd}t dddd }t dddd	 }|dd	dd
}||jd |jd d }t	
||d	 ||j}|dd	dd
}|dd
dd	}||jd |jd d }t	
||d	 ||j}|d	dd
d }t|||f ddgddgddgddgfD ]'} |}t fdd|tdddgd	 d\}}	t||dddt|d qd S )Nrv  r  r4      rc  r   rb   r   r#   r9   r<   r  )r   r$   )r  r  )r  r  c                    s    | |fS r   r+   )r)   r(   r>  r+   r,   <lambda>>	  s    z/TestNdPPoly.test_integrate_2d.<locals>.<lambda>gh㈵>)epsrelepsabs)r   F)r   r   r  r   )r>   rw  r  rz  r  r  rC   r   rj   r   fix_continuityr   r  r   r   r   r%  )
r'   r  r   r)   r(   cxrangesr  ig2err2r+   r  r,   test_integrate_2d"	  s8   

zTestNdPPoly.test_integrate_2dc                 C   sR  t jd}|dddddd}t dd	dd	 }t dd	dd
 }t dd	dd }t||||f}|d}|d}d\}	}
|j|	|
dd}|d}t|||f||
||f||	||f  |j|	|
d	d}|d}t|||f|||
|f|||	|f  |j|	|
d
d}|d}t|||f||||
f||||	f  d S )Nrv  r  r4   r  r  rc  r   r   rb   r#   r   r9   r   )r  r  re   r  r  r  )	r>   rw  r  rz  r  r   integrate_1dr  r   )r'   r  r   r)   r(   r*   r>  r  vr
  r  pxpaxpypaypzpazr+   r+   r,   test_integrate_1dC	  s$   


*
*
.zTestNdPPoly.test_integrate_1dc                    sv   t jd  jdd}t ddd}t dddd }t ddd	d
 }t||||f} fdd}td	|| d S )Nr  )r  r4   r  r  r   r   r  r   rb   r   r   r#   r8   r9   c                    s6    j dd} j dd} j dd}||||f d S )Nr  r  )r  )rn  r  r  r   r  r  r+   r,   ro  h	  s   z/TestNdPPoly.test_concurrency.<locals>.worker_fn)r>   rw  default_rngr  r  r   r   )r'   r   r)   r(   r*   r>  ro  r+   r  r,   rq  ]	  s   zTestNdPPoly.test_concurrencyN)r.   r/   r0   r  r  r  r  r  r  r  r  r  r7  r8  thread_unsaferq  r+   r+   r+   r,   r    s    !r  c                    s   t t| jd f}t|D ]R\}}|dk s|dkr&t j||ddf< qt ||d ||  | |  krE|d  k sHJ  J t fddt jd D }|||ddf< q|S )z&Evaluate piecewise polynomial manuallyr#   r   rb   Nc                 3   s2    | ]} |f  j d  | d   V  qdS )r   rb   N)r   r   r  r   rY  r(  r+   r,   r   {	  s    *z _ppoly_eval_1.<locals>.<genexpr>)	r>   zerosr<  r   r  r   searchsortedsumr   )r   r)   xpsr+  r'  r  r  r+   r  r,   r  q	  s   (r  c                    s   |d }|d }| j d }t |}t|}t|}||k||k@ }	|||	 < ||	}
t||
d dt|| |
| }tj	||d t
 fddtt|
D }|||	< ||_ |S )z4Evaluate piecewise polynomial manually (another way)r   r<   rb   )Nc              	      s4   g | ]}t  |d d f d d | f qS r   )r>   r  r  Vindxsr}  r+   r,   rR  	  s   4 z!_ppoly_eval_2.<locals>.<listcomp>)r   r>   r3  
empty_likecompressr  clipr<  takevanderrG   r   )r=  breaksr   r  r
  r  K	saveshaper  maskr`  r  valuesr+   r  r,   r  	  s$   





$r  c                 C   s:   |dk rt d||krdS t|| d || ||   S )z
    d^n (x**y) / dx^n
    r   zinvalid derivative orderrb   )rg   r   )r)   r(   r  r+   r+   r,   _dpow	  s
   r  c              
   C   sn  |du rd}t jt|f| jd}| jdd \}}tt||D ]\}\}	}
|d d |	  kr9|d d krNn n|d d |
  krM|d d ksTn t j||< q!t |d |	d }t |d |
d }|	|d |  }|
|d |  }d}t	| jd D ].}t	| jd D ]$}|| || d || d ||f t
|||d  t
|||d  7 }qq|||< q!|S )z@
    Straightforward evaluation of 2-D piecewise polynomial
    Nr  r   r#   r   r<   rb   r>   rU  r<  r   r   r  zipr   r  r   r  )r   r?  r   ynewr  r+  nxnyjoutr)   r(   j1j2s1s2r*  k1k2r+   r+   r,   r  	  s0   (&
 
r  c                 C   s  |du rd}t jt|f| jd}| jdd \}}}	tt|||D ]\}
\}}}|d d |  kr<|d d kren n'|d d |  krP|d d kren n|d d |  krd|d d kskn t j||
< q#t |d |d }t |d |d }t |d |d }||d |  }||d |  }||d |  }d}t	| jd D ]F}t	| jd D ]<}t	| jd D ]2}|| || d || d |	| d |||f t
|||d  t
|||d  t
|||d  7 }qqq|||
< q#|S )	z@
    Straightforward evaluation of 3-D piecewise polynomial
    Nr  r   r9   r   r<   rb   r#   r  )r   r?  r   r  znewr  r+  r  r  nzr  r)   r(   r*   r  r  j3r  r  s3r*  r  r  k3r+   r+   r,   r  	  s>   ((&
,
r  c                 C   st  |du rd}t jt|f| jd}| jdd \}}	}
}tt||||D ]\}\}}}}|d d |  kr@|d d kr}n n;|d d |  krT|d d kr}n n'|d d |  krh|d d kr}n n|d	 d |  kr||d	 d ksn t j||< q%t |d |d }t |d |d }t |d |d }t |d	 |d }||d |  }||d |  }||d |  }||d	 |  }d}t	| jd D ]^}t	| jd D ]T}t	| jd D ]J}t	| jd	 D ]@}|| || d |	| d |
| d || d ||||f t
|||d  t
|||d  t
|||d  t
|||d	  7 }qqqq|||< q%|S )
z@
    Straightforward evaluation of 4-D piecewise polynomial
    N)r   r   r   r   r   r  r   r<   rb   r#   r9   r  )r   r?  r   r  r  unewr  r+  mxmymzmur  r)   r(   r*   r  r  r  r  j4r  r  r  s4r*  r  r  r  k4r+   r+   r,   r  	  sL   $(((&
8
	r  r   )?scipy._lib._array_apir   r   r   r   r7  r   r%   numpyr   r   r	   r
   r>   scipy.interpolater   r   r   r   r   r   r   r   r   r   r   r   r   r   scipy.specialr   r   r   scipy._lib._gcutilsr   r   scipy._lib._testutilsr   scipy.integrater   r    r"   r1   r;  rC  r8  r:  r  rs  r  r  r?  rN  rj  rr  r  r  r   r  r  r  r  r  r+   r+   r+   r,   <module>   s\    @      
u
 /   q 	  1 ( k

$(