U
    h                  	   @   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 ddd	d
dddddg	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)ZzeroZzpd)ZconstantZsp0)Z	symmetricsym)ZreflectZsymw)ZperiodicZppd)ZsmoothZsp1)ZperiodizationZper)ZantisymmetricZasym)ZantireflectZasymw)dbr
   ZcoifZbiorZrbioc                 C   s   g | ]}t |qS  )pywtZwavelist).0namer   r   H/tmp/pip-unpacked-wheel-mu97bu1x/pywt/tests/test_matlab_compatibility.py
<listcomp>   s     r   c                 C   s<   t dkr(tt| jddddddg }n| j| jd f}|S )	z) Return the sizes to test for wavelet w. full(   d      i  i  iP     )r   listrangeZdec_len)wZ
data_sizesr   r   r   _get_data_sizes"   s    r   c                  C   s   t d} |  }tjd}d}d}|  ztD ]}t	|}|
d| t|D ]r}||}|
d| tD ]R\}	}
t|||
|\}}t|||	|||| t|||
\}}t|||	|||| qrqTq2W 5 |  X d S )Nzpymatbridge.Matlab  -C6
?绽|=waveletdata)pytestZimportorskipnprandomRandomStatestartstopwaveletsr   Waveletset_variabler   randnmodes_compute_matlab_result_check_accuracy_load_matlab_result_pywt_coeffs)ZMatlabmlabrstateepsilonepsilon_pywt_coeffsr   r   Nr   pmodemmodemamdr   r   r   test_accuracy_pymatbridge,   s&    


r7   c                  C   s   t jd} d}d}tD ]|}t|}t|D ]d}| |}tD ]P\}}t	|||\}	}
t
||||	|
|| t|||\}	}
t
||||	|
|| q@q.qd S )Nr   r   r   )r!   r"   r#   r&   r   r'   r   r)   r*   _load_matlab_resultr,   r-   )r/   r0   r1   r   r   r2   r   r3   r4   r5   r6   r   r   r   test_accuracy_precomputedH   s    

r9   c           	      C   s   t j|t ddddddddd	d
ddgkddr`t|}|d|j |d|j d| }nd| }||}|d st	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.
    Zcoif6Zcoif7Zcoif8Zcoif9Zcoif10Zcoif11Zcoif12Zcoif13Zcoif14Zcoif15Zcoif16Zcoif17r   )ZaxisZLo_DZ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.r5   r6   )r!   anyarrayr   r'   r(   Zdec_loZdec_hiZrun_codeRuntimeErrorZasarrayZget_variable)	r   r   r4   r.   r   Z	mlab_coderesr5   r6   r   r   r   r+   [   s    0


r+   c                 C   sn   t | }d||t|dg}d||t|dg}|tksD|tkrVtd|||t| }t| }||fS )" Load the precomputed result.
    _r5   r6   IPrecompted Matlab result not found for wavelet: {0}, mode: {1}, size: {2}lenjoinstrmatlab_result_dictKeyErrorformatr   r   r4   r2   Zma_keyZmd_keyr5   r6   r   r   r   r8   r   s       r8   c                 C   sn   t | }d||t|dg}d||t|dg}|tksD|tkrVtd|||t| }t| }||fS )r?   r@   Zma_pywtCoeffsZmd_pywtCoeffsrA   rB   rI   r   r   r   r-      s       r-   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   Zdwtr!   sqrtZmeanrC   r   )r   r   r3   r5   r6   r   r0   papdZrms_aZrms_drK   r   r   r   r,      s    r,   )__doc__
__future__r   r   r   Znumpyr!   r    Znumpy.testingr   r   Zpywt._pytestr   r   r   r	   rF   r*   Zfamiliessumr&   r   markZslowr7   r9   r+   r8   r-   r,   r   r   r   r   <module>   s<   
