ó
¾÷Xc           @   sr   d  d l  m Z d  d l Z d d l m Z d „  Z d „  Z d „  Z	 d „  Z
 d	 d
 „ Z d „  Z d „  Z d S(   iÿÿÿÿ(   t   rangeNi   (   t   backendc         C   s4  t  |  t ƒ r |  f | Sy t |  ƒ } Wn= t k
 ri t d | d t | ƒ d t |  ƒ ƒ ‚ n Xt | ƒ | k r« t d | d t | ƒ d t |  ƒ ƒ ‚ n  x‚ | D]z } y t | ƒ Wq² t k
 r+t d | d t | ƒ d t |  ƒ d t | ƒ d d t t | ƒ ƒ ƒ ‚ q² Xq² W| S(   s  Transforms a single int or iterable of ints into an int tuple.

    # Arguments
        value: The value to validate and convert. Could an int, or any iterable
          of ints.
        n: The size of the tuple to be returned.
        name: The name of the argument being validated, e.g. "strides" or
          "kernel_size". This is only used to format error messages.

    # Returns
        A tuple of n integers.

    # Raises
        ValueError: If something else than an int/long or iterable thereof was
        passed.
    s   The `s   ` argument must be a tuple of s    integers. Received: s    including element s    of typet    (   t
   isinstancet   intt   tuplet	   TypeErrort
   ValueErrort   strt   lent   type(   t   valuet   nt   namet   value_tuplet   single_value(    (    s5   /tmp/pip-build-isqEY4/keras/keras/utils/conv_utils.pyt   normalize_tuple   s"    -,Wc         C   sV   |  d  k r t j ƒ  }  n  |  j ƒ  } | d d h k rR t d t |  ƒ ƒ ‚ n  | S(   Nt   channels_firstt   channels_lastsW   The `data_format` argument must be one of "channels_first", "channels_last". Received: (   t   Nonet   Kt   image_data_formatt   lowerR   R   (   R   t   data_format(    (    s5   /tmp/pip-build-isqEY4/keras/keras/utils/conv_utils.pyt   normalize_data_format-   s    c         C   sf   |  j  ƒ  } d d d h } t j ƒ  d k r= | j d ƒ n  | | k rb t d t | ƒ ƒ ‚ n  | S(   Nt   validt   samet   causalt   theanot   fullsZ   The `padding` argument must be one of "valid", "same" (or "causal" for Conv1D). Received: (   R   R   R   t   addR   R   (   R   t   paddingt   allowed(    (    s5   /tmp/pip-build-isqEY4/keras/keras/utils/conv_utils.pyt   normalize_padding8   s    c         C   s›   d |  j  k o d k n s4 t d |  j ƒ ‚ n  g  t |  j  ƒ D] } t d d d ƒ ^ qD } t d d ƒ t d d ƒ f } | | d )t j |  | ƒ S(   sW  Converts a Numpy kernel matrix from Theano format to TensorFlow format.

    Also works reciprocally, since the transformation is its own inverse.

    # Arguments
        kernel: Numpy array (4D or 5D).

    # Returns
        The converted kernel.

    # Raises
        ValueError: in case of invalid kernel shape or invalid data_format.
    i   i   s   Invalid kernel shape:iÿÿÿÿiþÿÿÿN(   t   ndimR   t   shapeR    t   sliceR   t   npt   copy(   t   kernelt   _t   slicest   no_flip(    (    s5   /tmp/pip-build-isqEY4/keras/keras/utils/conv_utils.pyt   convert_kernelC   s    .
i   c         C   s¸   |  d k r d S| d d d d h k s. t ‚ | | d | d } | d k rY |  } nO | d k rv |  | d } n2 | d k r‹ |  } n | d k r¨ |  | d } n  | | d | S(   s8  Determines output length of a convolution given input length.

    # Arguments
        input_length: integer.
        filter_size: integer.
        padding: one of "same", "valid", "full".
        stride: integer.
        dilation: dilation rate, integer.

    # Returns
        The output length (integer).
    R   R   R   R   i   N(   R   t   AssertionError(   t   input_lengtht   filter_sizeR   t   stridet   dilationt   dilated_filter_sizet   output_length(    (    s5   /tmp/pip-build-isqEY4/keras/keras/utils/conv_utils.pyt   conv_output_lengthY   s    		c         C   sŠ   |  d k r d S| d d d h k s+ t ‚ | d k rD | d } n. | d k rY d } n | d k rr | d } n  |  d | d | | S(   s  Determines input length of a convolution given output length.

    # Arguments
        output_length: integer.
        filter_size: integer.
        padding: one of "same", "valid", "full".
        stride: integer.

    # Returns
        The input length (integer).
    R   R   R   i   i    i   N(   R   R,   (   R2   R.   R   R/   t   pad(    (    s5   /tmp/pip-build-isqEY4/keras/keras/utils/conv_utils.pyt   conv_input_lengthv   s    	c         C   s|   |  d  k r d  S| d k r: |  | t | | d ƒ }  n> | d k r_ |  | | | d }  n | d k rx |  | }  n  |  S(   NR   i    R   i   R   (   R   t   max(   t   dim_sizet   stride_sizet   kernel_sizeR   (    (    s5   /tmp/pip-build-isqEY4/keras/keras/utils/conv_utils.pyt   deconv_lengthŽ   s    (   t	   six.movesR    t   numpyR%   t    R   R   R   R   R!   R+   R3   R5   R:   (    (    (    s5   /tmp/pip-build-isqEY4/keras/keras/utils/conv_utils.pyt   <module>   s   	'				