B
    \!                 @   s  d Z ddlmZmZmZ ddlZddlZddlZddlZ	ddl
mZ ddlmZmZmZmZ ddlZy4ejd dkr~ddlZnddlmZ e ZdZW n ek
r   d	ZY nX d
d Zee dd Zee dd Zee dd Zee dd Zedkre  dS )z
Tests used to verify running PyWavelets transforms in parallel via
concurrent.futures.ThreadPoolExecutor does not raise errors.
    )divisionprint_functionabsolute_importN)partial)decrun_module_suiteassert_array_equalassert_allclose   )futuresTFc             C   s   t | t |krdS xxt| |D ]j\}}t|trVxVt||D ]\}}t|| q>W q t|trx(| D ]\}}t|||  qjW q dS q W dS )NFT)lenzip
isinstancetupler   dictitems)Zcoefs1Zcoefs2Zc1Zc2a1a2kv r   9lib/python3.7/site-packages/pywt/tests/test_concurrent.py_assert_all_coeffs_equal   s    

r   c                 s   t   t dt xttjtjtjgt	
dt	dt	dgD ]f\}  t| ddd}xNtdD ]B} fdd	td
D }tjtd}t|||}W d Q R X qfW qFW | }t||d  W d Q R X d S )Nignore      haar   )waveletlevel
   c                s   g | ]}   qS r   )copy).0_)xr   r   
<listcomp>;   s    z'test_concurrent_swt.<locals>.<listcomp>d   )max_workers)warningscatch_warningssimplefilterFutureWarningr   pywtZswtZswt2Zswtnnponeseyer   ranger   ThreadPoolExecutorr'   listmapr   )Zswt_func	transformr#   arrsexresultsexpected_resultr   )r$   r   test_concurrent_swt/   s    
&"r:   c                 s   xt tjtjtjgtdtdtdgD ]|\}  t| ddd}xNt	dD ]B} fddt	d	D }t
jtd
}t|||}W d Q R X qPW | }t||d  q0W d S )Nr   r   r      )r   r   r    c                s   g | ]}   qS r   )r!   )r"   r#   )r$   r   r   r%   L   s    z+test_concurrent_wavedec.<locals>.<listcomp>r&   )r'   r(   )r   r-   ZwavedecZwavedec2Zwavedecnr.   r/   r0   r   r1   r   r2   r'   r3   r4   r   )Zwavedec_funcr5   r#   r6   r7   r8   r9   r   )r$   r   test_concurrent_wavedecD   s    &r<   c                 s   xt tjtjtjgtdtdtdgD ]~\}  t| dd}xNt	dD ]B} fddt	dD }t
jtd	}t|||}W d Q R X qNW | }t|g|d
 g q0W d S )Nr   r   r   )r   r    c                s   g | ]}   qS r   )r!   )r"   r#   )r$   r   r   r%   ]   s    z'test_concurrent_dwt.<locals>.<listcomp>r&   )r'   r(   )r   r-   ZdwtZdwt2Zdwtnr.   r/   r0   r   r1   r   r2   r'   r3   r4   r   )Zdwt_funcr5   r#   r6   r7   r8   r9   r   )r$   r   test_concurrent_dwtU   s    &r=   c           
      s   d } }t j \} |d |d  }tt jtddd|d}xNtdD ]B} fdd	td
D }tj	t
d}t|||}W d Q R X qJW | }	x*t|	|d D ]\}
}t|
|| |d qW d S )Ng+=r;   r      z	cmor1.5-1)Zscalesr   Zsampling_periodr    c                s   g | ]}   qS r   )r!   )r"   r#   )sstr   r   r%   n   s    z'test_concurrent_cwt.<locals>.<listcomp>2   )r'   r(   )atolrtol)r-   dataZninor   Zcwtr.   Zaranger1   r   r2   r'   r3   r4   r   r	   )rA   rB   ZtimeZdtr5   r#   r6   r7   r8   r9   r   r   r   )r?   r   test_concurrent_cwtf   s    rD   __main__) __doc__Z
__future__r   r   r   sysr)   ZmultiprocessingZnumpyr.   	functoolsr   Znumpy.testingr   r   r   r	   r-   version_infor   Z
concurrent	cpu_countr'   Zfutures_availableImportErrorr   Zskipifr:   r<   r=   rD   __name__r   r   r   r   <module>   s.   


