B
    \&                 @   s   d Z ddlmZ ddlZddlmZ ddddd	d
gZdd Z	dd Z
dd Zdd Zdi ddfddZdd Zdi ddfddZdd	 Zddd
ZdS )z@Utilities used to generate various figures in the documentation.    )productN)pyplotwavedec_keyswavedec2_keysdraw_2d_wp_basisdraw_2d_fswavedecn_basispadboundary_mode_subplotc             C   sb   d}i }xLt | D ]@}xdD ]}d||| < qW d|d  }|| d k r|| qW t| S )z6Subband keys corresponding to a wavedec decomposition. )adNr      )rangepoplistkeys)levelapproxcoeffslevk r   .lib/python3.7/site-packages/pywt/_doc_utils.pyr      s    
c             C   sb   d}i }xLt | D ]@}xdD ]}d||| < qW d|d  }|| d k r|| qW t| S )z7Subband keys corresponding to a wavedec2 decomposition.r
   )r   hvr   Nr   r   )r   r   r   r   )r   r   r   r   r   r   r   r   r      s    
c             C   sT   | d |d  }}| d |d  }}||||||||g}||||||||g}||fS )af  (x, y) coordinates for the 4 lines making up a rectangular box.

    Parameters
    ==========
    bl : float
        The bottom left corner of the box
    ur : float
        The upper right corner of the box

    Returns
    =======
    coords : 2-tuple
        The first and second elements of the tuple are the x and y coordinates
        of the box.
    r   r   r   )ZblZurZxlZxrZybZytZbox_xZbox_yr   r   r   _box%   s    r   c             C   s   g }i }x|D ]}d }}xTt |D ]H\}}|dkrL|| d d|d   7 }|dkr$|| d d|d   7 }q$W | d d|d   }	| d d|d   }
t|| f||	 | |
 f\}}|||f ||	d  | |
d  f||< qW ||fS )Nr   )r   r      r   )r   r   )	enumerater   append)shaper   coordscenterskeyZoffset_xZoffset_yncharZsxZsyxcycr   r   r   _2d_wp_basis_coordsB   s     

"r'   r   c             C   s   t | |\}}|dkr(tdd\}}n| }x"|D ]}	||	d |	d | q6W |  |d |dkrx<| D ]0\}
}t|
|krx|j	|d |d |
ddd qxW ||fS )z4Plot a 2D representation of a WaveletPacket2D basis.Nr   r   squarecenter)horizontalalignmentverticalalignment)
r'   pltsubplots
get_figureplotset_axis_offaxisitemslentext)r   r   fmtplot_kwargsaxlabel_levelsr    r!   figcoordr"   cr   r   r   r   V   s    

c          	   C   sl  g }i }xXt t|ddD ]B}|\}}ddg}t| }x<t|D ]0\}	}
|
dkrD|d  | d d|	d   7  < qDW x<t|D ]0\}}
|
dkr|d  | d d|d   7  < qW | d d|	d   |d< | d d|d   |d< t|d |d  f|d |d  |d  |d  f\}}|||f |d |d d  |d  |d d  f|||f< qW ||fS )Nr   )repeatr   )r   r   )r   r   r   r   r   r   )r   levelsr    r!   r"   Zkey0Zkey1ZoffsetsZwidthsZn0r$   Zn1r%   r&   r   r   r   _2d_fswavedecn_coordsk   s(    $$($r>   c             C   s   t | |\}}|dkr(tdd\}}n| }x"|D ]}	||	d |	d | q6W |  |d |dkrxL| D ]@\}
}t	dd |
D }||krx|j
|d |d |
ddd qxW ||fS )	z4Plot a 2D representation of a WaveletPacket2D basis.Nr   r   r(   c             S   s   g | ]}t |qS r   )r3   ).0r   r   r   r   
<listcomp>   s    z,draw_2d_fswavedecn_basis.<locals>.<listcomp>r)   )r*   r+   )r>   r,   r-   r.   r/   r0   r1   r2   npmaxr4   )r   r=   r5   r6   r7   r8   r    r!   r9   r:   r"   r;   r   r   r   r   r      s     

c          
   C   s  t |r||f}| jdkr$td|dkr@t j| ||d}n`|dkrz|dkrf| jd dkrftdt j| |d	d}n&|d
krt j| |ddd}n|dkrt j| |dd}n|dkrt j| |d| d |d | d | d    | d |d | d | d    fd}n|dkr|\}}t j| |dd}|| j d }|}| j}d}	xZ||jkrt|d t|d | |j}
|	d r||
  d9  < ||7 }|	d7 }	qPW d}	xN|dkrttd|| |}
|	d r||
  d9  < ||8 }|	d7 }	qW n|dkr|\}}t j| |ddd}|| j d }|}| d }| d }| jd }| ddd }| dd }d}	x||jkrt|d t|d | |j}
t|
j	|
j
 }|| }|	d r||| |  ||
< n||| |  ||
< ||7 }|	d7 }	qrW | ddd }| dd }d}	x|dkrttd|| |}
t|
j
|
j	 d}|| }|	d rv||| |  ||
< n||| |  ||
< ||8 }|	d7 }	qW |S )ztExtend a 1D signal using a given boundary mode.

    Like numpy.pad but supports all PyWavelets boundary modes.
    r   z-This padding function is only for 1D signals.)	symmetricZreflect)mode)ZperiodicperiodizationrE   r   z,periodization expects an even length signal.Zwrapzerosconstantr   )rD   Zconstant_valuesZedgesmoothZlinear_ramp)rD   Z
end_valuesZantisymmetricrC   ZantireflectN)rA   Zisscalarndim
ValueErrorr   sizesliceminrB   stopstart)xZ
pad_widthsrD   xpZnpad_lZnpad_rZr_edgeZl_edgeZ	seg_widthr#   Zsegment_sliceZrv1Zlv1Zxr_oddZxr_evenZorig_slrvZxl_oddZxl_evenZlvr   r   r   r      s    



*






Tc             C   sd  |dkr,t | d dkr,t| | d ff} dt |  }tt | d|  }t| ||f|d}|||d || |dkr||||t |  d  | dd d n||||t |   | d td}|}|rt | d }	td	d
}
n|d8 }t | }	td	d
}
|dkr"tdd}
x<|
D ]4}||||	  | |	 d |
 d gd q(W dS )z<Plot an illustration of the boundary mode in a subplot axis.rE   r   r   rI   )rD   zk.Nzr.rJ      g      ?)rH   rG   rF   r   zk-)r3   rA   ZconcatenateZaranger   r/   Z	set_titleZonesr   rO   rB   )rR   rD   r7   ZsymwZnpadtrS   Zo2leftsteprngZrepr   r   r   r	      s,    
,




)T)__doc__	itertoolsr   ZnumpyrA   Z
matplotlibr   r,   __all__r   r   r   r'   r   r>   r   r   r	   r   r   r   r   <module>   s    
f