o
    h                     @   s   d Z ddlZddlZddlmZ ddlZddlmZ	 ddlm
Z
mZ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.
    N)assert_)matlab_result_dict_dwt)size_setuses_precomputeduses_pymatbridge)	)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   _/var/www/html/scripts/venv/lib/python3.10/site-packages/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   r.   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_variabler.   randnmodes_compute_matlab_result_check_accuracy_load_matlab_result_pywt_coeffsstop)Matlabmlabrstateepsilonepsilon_pywt_coeffsr2   r,   Nr3   pmodemmodemamdr   r   r"   test_accuracy_pymatbridge+   s,   


rM   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 )Nr/   r0   r1   )r6   r7   r8   r:   r   r;   r.   r=   r>   _load_matlab_resultr@   rA   )rE   rF   rG   r2   r,   rH   r3   rI   rJ   rK   rL   r   r   r"   test_accuracy_precomputedG   s   

rO   c           	      C   s   t j|t g dkddr(t|}|d|j |d|j d| d}nd| d}||}|d	 s;t	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', 'z');z'[ma, md] = dwt(data, wavelet, 'mode', 'successzXMatlab failed to execute the provided code. Check that the wavelet toolbox is installed.rK   rL   )r6   anyarrayr   r;   r<   dec_lodec_hirun_codeRuntimeErrorasarrayget_variable)	r3   r2   rJ   rD   r,   	mlab_coderesrK   rL   r   r   r"   r?   Z   s   

r?   c                 C   v   t | }d||t|dg}d||t|dg}|tvs"|tvr/td| d| d| t| }t| }||fS )" Load the precomputed result.
    _rK   rL   0Precompted Matlab result not found for wavelet: , mode: , size: lenjoinstrmatlab_result_dictKeyErrorr3   r2   rJ   rH   ma_keymd_keyrK   rL   r   r   r"   rN   q   "   rN   c                 C   rj   )rk   rl   ma_pywtCoeffsmd_pywtCoeffsrm   rn   ro   rp   rv   r   r   r"   rA      ry   rA   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   dwtr6   sqrtmeanrq   r   )r3   r,   rI   rK   rL   r2   rF   papdrms_arms_dr}   r   r   r"   r@      s   r@   )__doc__numpyr6   r4   numpy.testingr   r   pywt._pytestr   rt   r   r   r   r>   familiessumr:   r.   markslowrM   rO   r?   rN   rA   r@   r   r   r   r"   <module>   s*    
