o
    7ήc                     @   s   d Z ddlmZmZmZ ddlZddlZddlm	Z	 ddl
Z
ddlmZmZmZ ddlmZ g dZdZed	d
 eD g Zdd Zeejjdd Zeejjdd Zdd Zdd Zdd Zdd ZdS )zs
Test used to verify PyWavelets Discrete Wavelet Transform computation
accuracy against MathWorks Wavelet Toolbox.
    )divisionprint_functionabsolute_importN)assert_)uses_pymatbridgeuses_precomputedsize_set)matlab_result_dict_dwt)	)zerozpd)constantsp0)	symmetricsym)reflectsymw)periodicppd)smoothsp1)periodizationper)antisymmetricasym)antireflectasymw)dbr   coifbiorrbioc                 C   s   g | ]}t |qS  )pywtwavelist).0namer    r    K/tmp/pip-target-vg8gfxp4/lib/python/pywt/tests/test_matlab_compatibility.py
<listcomp>   s    r&   c                 C   s8   t dkrtt| jdg d }|S | j| jd f}|S )z) Return the sizes to test for wavelet w. full(   )d      i  i  iP     )r   listrangedec_len)w
data_sizesr    r    r%   _get_data_sizes"   s   r1   c                  C   s   t d} |  }tjd}d}d}|  zUtD ]K}t|}|	d| t
|D ]9}||}|	d| tD ])\}	}
t|||
|\}}t|||	|||| t|||
\}}t|||	|||| q9q*qW |  d S |  w )Nzpymatbridge.Matlab  -C6
?绽|=waveletdata)pytestimportorskipnprandomRandomStatestartwaveletsr!   Waveletset_variabler1   randnmodes_compute_matlab_result_check_accuracy_load_matlab_result_pywt_coeffsstop)Matlabmlabrstateepsilonepsilon_pywt_coeffsr5   r/   Nr6   pmodemmodemamdr    r    r%   test_accuracy_pymatbridge,   s,   


rP   c                  C   s   t jd} d}d}tD ]>}t|}t|D ]2}| |}tD ](\}}t	|||\}	}
t
||||	|
|| t|||\}	}
t
||||	|
|| q qqd S )Nr2   r3   r4   )r9   r:   r;   r=   r!   r>   r1   r@   rA   _load_matlab_resultrC   rD   )rH   rI   rJ   r5   r/   rK   r6   rL   rM   rN   rO   r    r    r%   test_accuracy_precomputedH   s   

rR   c           	      C   s   t j|t g dkddr&t|}|d|j |d|j d| }nd| }||}|d s7t	d	t 
|d
}t 
|d}||fS )z Compute the result using MATLAB.

    This function assumes that the Matlab variables `wavelet` and `data` have
    already been set externally.
    )coif6coif7coif8coif9coif10coif11coif12coif13coif14coif15coif16coif17r   )axisLo_DHi_Dz/[ma, md] = dwt(data, Lo_D, Hi_D, 'mode', '%s');z,[ma, md] = dwt(data, wavelet, 'mode', '%s');successzXMatlab failed to execute the provided code. Check that the wavelet toolbox is installed.rN   rO   )r9   anyarrayr!   r>   r?   dec_lodec_hirun_codeRuntimeErrorasarrayget_variable)	r6   r5   rM   rG   r/   	mlab_coderesrN   rO   r    r    r%   rB   [   s   


rB   c                 C   n   t | }d||t|dg}d||t|dg}|tvs"|tvr+td|||t| }t| }||fS )" Load the precomputed result.
    _rN   rO   IPrecompted Matlab result not found for wavelet: {0}, mode: {1}, size: {2}lenjoinstrmatlab_result_dictKeyErrorformatr6   r5   rM   rK   ma_keymd_keyrN   rO   r    r    r%   rQ   r      
rQ   c                 C   rm   )rn   ro   ma_pywtCoeffsmd_pywtCoeffsrp   rq   rx   r    r    r%   rD      r{   rD   c                 C   s   t | ||\}}tt|| d }	tt|| d }
d||t| |	f }t|	|k |d d||t| |
f }t|
|k |d d S )N   zA[RMS_A > EPSILON] for Mode: %s, Wavelet: %s, Length: %d, rms=%.3g)msgzA[RMS_D > EPSILON] for Mode: %s, Wavelet: %s, Length: %d, rms=%.3g)r!   dwtr9   sqrtmeanrr   r   )r6   r/   rL   rN   rO   r5   rI   papdrms_arms_dr   r    r    r%   rC      s   rC   )__doc__
__future__r   r   r   numpyr9   r7   numpy.testingr   r!   pywt._pytestr   r   r   r	   ru   rA   familiessumr=   r1   markslowrP   rR   rB   rQ   rD   rC   r    r    r    r%   <module>   s,    
