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)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   V/var/www/html/venv/lib/python3.8/site-packages/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)Matlabmlabrstateepsilonepsilon_pywt_coeffsr   r   Nr    pmodemmodemamdr   r   r   test_accuracy_pymatbridge,   s&    


r9   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.   )r1   r2   r3   r   r   r4   r    r5   r6   r7   r8   r   r   r   test_accuracy_precomputedH   s    

r;   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.r7   r8   )r"   anyarrayr   r(   r)   Zdec_loZdec_hiZrun_codeRuntimeErrorZasarrayZget_variable)	r    r   r6   r0   r   Z	mlab_coderesr7   r8   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.
    _r7   r8   IPrecompted Matlab result not found for wavelet: {0}, mode: {1}, size: {2}lenjoinstrmatlab_result_dictKeyErrorformatr    r   r6   r4   Zma_keyZmd_keyr7   r8   r   r   r   r:   r   s       r:   c                 C   sn   t | }d||t|dg}d||t|dg}|tksD|tkrVtd|||t| }t| }||fS )rA   rB   Zma_pywtCoeffsZmd_pywtCoeffsrC   rD   rK   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meanrE   r   )r    r   r5   r7   r8   r   r2   papdZrms_aZrms_drM   r   r   r   r-      s    r-   )__doc__
__future__r   r   r   numpyr"   r!   Znumpy.testingr   r   Zpywt._pytestr   r   r   r	   rH   r+   Zfamiliessumr'   r   markZslowr9   r;   r,   r:   r.   r-   r   r   r   r   <module>   s<   
