o
    g+                     @   s   d dl Zd dlmZ d dlmZmZ d dlmZ	 d dlZd dl
mZmZ d dlmZmZ d dlmZ dd	d
ZG dd dZeejejeefZG dd dZdd ZdS )    N)product)assert_equalassert_allclose)raises)upfirdnfirwin)_output_len_upfirdn_modes)	_pad_test   c                 C   sb   t |}t t| | | j}| |dd|< t ||dd| dtt|t| || }|S )zpNaive upfirdn processing in Python.

    Note: arg order (x, h) differs to facilitate apply_along_axis use.
    N)npasarrayzeroslendtypeconvolver   )xhupdownout r   ]/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/scipy/signal/tests/test_upfirdn.pyupfirdn_naive/   s
   
0r   c                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )UpFIRDnCasezTest _UpFIRDn objectc                 C   s0   || _ || _t|| _|| _tjd| _d S )N   )	r   r   r   
atleast_1dr   x_dtyperandomRandomStaterng)selfr   r   r   r   r   r   r   __init__=   s
   zUpFIRDnCase.__init__c                 C   s&  |  td| j |  td| j | jd| j}| jtjtjfv r1|d| jd 7 }|  | |  t	d| j d}| jj| | j}| jtjtjfv ra|d| jj|  7 }t
t|D ]	}| j ||d qg|d d d d ddd df j}t
t|D ]	}| j ||d qd S )Nr   
                 ?)         axisr%   r&   )scrubr   onesr   r    randnastype	complex64
complex128arangeranger   T)r!   r   sizer)   r   r   r   __call__D   s"   
 zUpFIRDnCase.__call__c                 C   s:  t t||| j| j| j}tt| j|j| | j| j}|j| |ks%J t	| j|| j| j|d}|j| |ks:J |j|jksBJ | jj
|j
f}tdd |D rZt|j
t j n<t j|v rlt j|v rlt|j
t j n*tdd |D r}t|j
t j nt j|v st j|v rt|j
t j nt|j
t j t|| d S )Nr(   c                 s       | ]}|t jkV  qd S N)r   r.   .0dr   r   r   	<genexpr>d       z$UpFIRDnCase.scrub.<locals>.<genexpr>c                 s   r6   r7   )r   float32r8   r   r   r   r;   h   r<   )r   apply_along_axisr   r   r   r   r   r   shaper   r   allr   r.   r=   r/   float64r   )r!   r   r)   yrwant_lenydtypesr   r   r   r*   [   s&   
zUpFIRDnCase.scrubN)r5   )__name__
__module____qualname____doc__r"   r4   r*   r   r   r   r   r   ;   s
    r   c                   @   s  e Zd Zdd Zejdg dejdg ddd Zdd	 Zejd
ddddg dfddddg dfddddg dfddddg dfddddg dfgdd Z	ejdg ddd Z
ejdeejddejdg d d!d" Zejdeejd#eejd$eed%d%d&d' Zd(d) Zejd*ed+d, Zejd-ed.gg d/eejejejejgd0d1 Zd2S )3TestUpfirdnc                 C   sF   t ttdgdgdd t ttg dgdd t ttdggdgdd d S )Nr   r   )assert_raises
ValueErrorr   )r!   r   r   r   test_valid_inputv   s   zTestUpfirdn.test_valid_inputlen_h)r   r%   r&      r'   len_xc                 C   sZ   t |}d||d < t |}t||dd}t ||d |d d fd}t|| d S )N      ?r%   r   constant)r   r   r+   r   padr   )r!   rN   rP   r   r   rD   wantr   r   r   test_singleton{   s   

zTestUpfirdn.test_singletonc                 C   sJ   t ddgdgdd}t|ddg t ddgddgdd}t|g d d S )Nr   rQ   g        )r   r   r   )r   r   )r!   rD   r   r   r   test_shift_x   s   zTestUpfirdn.test_shift_xz len_h, len_x, up, down, expectedr%   r'   )r   r   r   r   r&      )r   r   r   r   r   rO   )r   r   r   r   r   )r   r   r   r   r      )r   r   r   r   r   r   r   c           	      C   s8   t |}d|d< t |}t||||}t|| d S )NrQ   r   )r   r   r+   r   r   )	r!   rN   rP   r   r   expectedr   r   rD   r   r   r   test_length_factors   s
   
	
zTestUpfirdn.test_length_factorszdown, want_len))r%   i  )rX   i  )O      c                 C   s   t jd}tt jt jttf}d}|D ]O}||	|}|t jt j
fv r.|d|| 7 }tdd| dd}t||d|}	t||d|d	}
|
j|fksNJ |	jd
 |
jd
 ksZJ t|	|
ddd qd S )Nr   i'  r$      rQ   hamming)windowr   )r   r   r   gHz>atolrtol)r   r   r   intr=   r.   floatcomplexr,   r-   r/   r   r   r   r?   r   )r!   r   rC   random_state	try_typesr3   r   r   r   ylrD   r   r   r   test_vs_convolve   s   zTestUpfirdn.test_vs_convolver   r   )rQ   r$   zup, down)r   r   )r%   r%   )r&   r%   )r%   r&   c                 C   s   t ||||  d S r7   )r   )r!   r   r   r   r   r   r   r   test_vs_naive_delta   s   zTestUpfirdn.test_vs_naive_deltah_dtypezp_max, q_max)r#   d   c                 C   s$   |  ||||}|D ]}|  q
d S r7   )_random_factors)r!   r   rl   p_maxq_maxteststestr   r   r   test_vs_naive   s   zTestUpfirdn.test_vs_naivec                 C   s   d}d}t jd}g }t|D ]K}	||kr|nd}
||kr |nd}|||
 }||| }||d }t ||}||}|tkrQ|d|| 7 }|t	|||| q|S )Nr&      r   r   r$   )
r   r   r   r1   randintr   r-   re   appendr   )r!   ro   rp   rl   r   n_rep	longest_hrf   rq   _p_addq_addpqrN   r   r   r   r   rn      s    
zTestUpfirdn._random_factorsmodec           
      C   s  t jg dtd}d\}}t||||d}|dkr!t g d}nY|dkr-t g d}nM|d	kr9t g d
}nA|dkrp|d |d  t|d  }|d t | dd|  }|d t d|d |  }	t |||	f}n
t j|||f|d}t	|| dS )z@Test vs. manually computed results for modes not in numpy's pad.)r   r%   r&   r   r   )rW   rW   nprenpostr~   antisymmetric)r&   r   r5   r5   r   r%   r&   r   r5   r   r   r5   r   r%   antireflect)r   r%   r&   r   r5   r   r   r%   r&   r   r5   r   r   r%   r&   r   smooth)r   r   r5   r   r   r%   r&   r   r5   r   r   iiiliner5   r   r   r~   N)
r   arrayrd   r
   r   r   r0   concatenaterS   r   )
r!   r~   r   r   r   rD   
y_expected	lin_slopeleftrightr   r   r   test_extensions   s,   zTestUpfirdn.test_extensionszsize, h_len, mode, dtype   )rO   r'      c                 C   s   t jd}|||}|t jt jfv r|d|| 7 }t jdd| |jj	d}t
||dd|d}|d }	|dv rEt||	|	|d}
nt j||	|d}
t
||
ddd	d}||	|	  }t |jd
  }}t||||d d S )Nr'   r$   r   r   )r   r   r~   )r   r   r   r   r   r   rR   g      Y@r`   )r   r   r   r,   r-   r.   r/   r0   realr   r   r
   rS   finfoepsr   )r!   r3   h_lenr~   r   rf   r   r   rD   npadxpadypadr   ra   rb   r   r   r   
test_modes   s   
zTestUpfirdn.test_modesN)rF   rG   rH   rM   pytestmarkparametrizerU   rV   rZ   ri   _UPFIRDN_TYPESrk   listr   rs   rn   r	   r   r   r=   rA   r.   r/   r   r   r   r   r   rJ   t   sN    	



	rJ   c                  C   s.   d} d}d}d}t | |||}|dksJ d S )Ni  i i@  i  i6S)r   )rN   in_lenr   r   out_lenr   r   r   test_output_len_long_input  s   r   rj   )numpyr   	itertoolsr   numpy.testingr   r   r   r   rK   scipy.signalr   r   scipy.signal._upfirdnr   r	   scipy.signal._upfirdn_applyr
   r   r   rc   r=   r.   rd   re   r   rJ   r   r   r   r   r   <module>   s   "
6 !