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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.
    )divisionprint_functionabsolute_importN)assert_)uses_pymatbridgeuses_precomputedsize_setmatlab_result_dict_cwt)gausmexhmorlcgaushanfbspcmorc                 C   s   g | ]}t |qS  )pywtwavelist).0namer   r   O/tmp/pip-target-vg8gfxp4/lib/python/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resr0   Nr1   r(   coefsr   r   r   test_accuracy_pymatbridge_cwt(   s>   

&4

rU   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&   r4   r5   r7   r8   r9   r:   r;   r   r<   float32_load_matlab_result_psirG   r!   rH   astyper)   _load_matlab_resultrJ   )rN   rO   	epsilon32rP   r.   r   w32r0   rS   r1   data32scales_countr(   rT   r   r   r   test_accuracy_precomputed_cwtL   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.rT   )r?   rD   RuntimeErrorr&   rE   rF   )r1   r.   r(   rM   rQ   rR   rT   r   r   r   rI   h   s   
rI   c                 C   sH   t | }dt||t|dg}|tvrtd|||t| }|S )" Load the precomputed result.
    _rT   zIPrecompted Matlab result not found for wavelet: {0}, mode: {1}, size: {2})lenjoinr@   r	   KeyErrorformat)r1   r.   r(   rS   	coefs_keyrT   r   r   r   rZ   y   s   
rZ   c                 C   s0   d | dg}|tvrtd| t| }|S )rb   rc   r0   z8Precompted Matlab psi result not found for wavelet: {0}})re   r	   rf   rg   )r.   psi_keyr0   r   r   r   rX      s   rX   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meanrd   r   )r1   r   r(   rT   r.   rO   
coefs_pywtfreqerrrmsrk   r   r   r   rJ      s   
 rJ   c           	   	   C   s`   | j dd\}}| |  }tttt|| }d||f }t||k |d d S )Ni   )lengthz*[RMS > EPSILON] for  Wavelet: %s, rms=%.3grj   )wavefunflattenr&   rn   ro   rp   rm   r   )	r   r0   r.   rO   psi_pywtxrs   rt   rk   r   r   r   rG      s    rG   )__doc__
__future__r   r   r   r8   numpyr&   r2   numpy.testingr   r   pywt._pytestr   r   r   r	   familiessumr7   r!   r)   markslowrU   r_   rI   rZ   rX   rJ   rG   r   r   r   r   <module>   s.    
	"