o
    h"                     @   s   d Z ddl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mZ dZedd eD g Zdd	 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d ZdS )zu
Test used to verify PyWavelets Continuous Wavelet Transform computation
accuracy against MathWorks Wavelet Toolbox.
    N)assert_)matlab_result_dict_cwtsize_setuses_precomputeduses_pymatbridge)gausmexhmorlcgaushanfbspcmorc                 C   s   g | ]}t |qS  )pywtwavelist).0namer   r   c/var/www/html/scripts/venv/lib/python3.10/site-packages/pywt/tests/test_matlab_compatibility_cwt.py
<listcomp>   s    r   c                 C   s*   t dkrttddg d }|S d}|S )z) Return the sizes to test for wavelet w. fulld   e   )r      i    iP  )r   i  )r   listrange)w
data_sizesr   r   r   _get_data_sizes   s   r   c                 C   sD   t dkrdtddtddtddf}|S dtddf}|S )z* Return the scales to test for wavelet w. r               )r   nparange)r   scalesr   r   r   _get_scales#   s
   $r&   c               
   C   s  t d} |  }tjd}d}d}|  ztD ]}t  t	dt
 t|}W d    n1 s5w   Y  tj|tddgkddr[|d	|t|j d
 t|j  n$|dkry|d	|t|j d
 t|j d
 t|j  n|d	| d}||}t|d}	t||	|| t|D ]$}
||
}|d| t|D ]}t||||}t|||||| qqqW |  d S |  w )Nzpymatbridge.Matlab  V瞯<ignorer   r   r   )axiswavelet-r   zpsi = wavefun(wavelet,10)psidata)pytestimportorskipr#   randomRandomStatestartwaveletswarningscatch_warningssimplefilterFutureWarningr   ContinuousWaveletanyarrayset_variablestrbandwidth_frequencycenter_frequency
fbsp_orderrun_codeasarrayget_variable_check_accuracy_psir   randnr&   _compute_matlab_result_check_accuracystop)Matlabmlabrstateepsilonepsilon_psir+   r   	mlab_coderesr-   Nr.   r%   coefsr   r   r   test_accuracy_pymatbridge_cwt,   s>   

&4

rR   c               
   C   s   t jd} d}d}d}tD ]k}t  tdt t	|}tj	|t j
d}W d    n1 s2w   Y  t|}t|||| t|D ]2}| |}	|	t j
}
d}t|D ]}|d7 }t|	||}t|	||||| t|
||||| qYqFqd S )	Nr'   gV瞯<gh㈵>r(   r)   )dtyper   r   )r#   r1   r2   r4   r5   r6   r7   r8   r   r9   float32_load_matlab_result_psirD   r   rE   astyper&   _load_matlab_resultrG   )rK   rL   	epsilon32rM   r+   r   w32r-   rP   r.   data32scales_countr%   rQ   r   r   r   test_accuracy_precomputed_cwtP   s0   


r\   c                 C   s>   | d| d}||}|d stdt|d}|S )z Compute the result using MATLAB.

    This function assumes that the Matlab variables `wavelet` and `data` have
    already been set externally.
    r%   z"coefs = cwt(data, scales, wavelet)successzXMatlab failed to execute the provided code. Check that the wavelet toolbox is installed.rQ   )r<   rA   RuntimeErrorr#   rB   rC   )r.   r+   r%   rJ   rN   rO   rQ   r   r   r   rF   l   s   
rF   c                 C   sP   t | }dt||t|dg}|tvr"td| d| d| t| }|S )" Load the precomputed result.
    _rQ   z0Precompted Matlab result not found for wavelet: z, mode: z, size: )lenjoinr=   r   KeyError)r.   r+   r%   rP   	coefs_keyrQ   r   r   r   rW   }   s   rW   c                 C   s0   d | dg}|tvrtd| t| }|S )r_   r`   r-   z8Precompted Matlab psi result not found for wavelet: {0}})rb   r   rc   format)r+   psi_keyr-   r   r   r   rU      s   rU   c              	   C   sl   t | ||\}}t|}|| }tttt|| }	d||t| |	f }
t|	|k |
d d S )Nz@[RMS > EPSILON] for Scale: %s, Wavelet: %s, Length: %d, rms=%.3gmsg)	r   cwtr#   conjrealsqrtmeanra   r   )r.   r   r%   rQ   r+   rL   
coefs_pywtfreqerrrmsrh   r   r   r   rG      s   
 rG   c           	   	   C   sf   | j dd\}}| |  }tttt|| }d| d|d}t||k |d d S )Ni   )lengthz[RMS > EPSILON] for  Wavelet: z, rms=z.3grg   )wavefunflattenr#   rk   rl   rm   rj   r   )	r   r-   r+   rL   psi_pywtxrp   rq   rh   r   r   r   rD      s
    rD   )__doc__r5   numpyr#   r/   numpy.testingr   r   pywt._pytestr   r   r   r   familiessumr4   r   r&   markslowrR   r\   rF   rW   rU   rG   rD   r   r   r   r   <module>   s,    
	"