ó
¾÷Xc           @@  sñ   d  Z  d d l m Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l	 Z
 d d l Z i  Z d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d d d	 d
 „ Z d „  Z d „  Z d d d d „ Z d e f d „  ƒ  YZ d S(   s#   Python utilities required by Keras.i    (   t   absolute_importNt   CustomObjectScopec           B@  s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   su  Provides a scope that changes to `_GLOBAL_CUSTOM_OBJECTS` cannot escape.

    Code within a `with` statement will be able to access custom objects
    by name. Changes to global custom objects persist
    within the enclosing `with` statement. At end of the `with` statement,
    global custom objects are reverted to state
    at beginning of the `with` statement.

    # Example

    Consider a custom object `MyObject`

    ```python
        with CustomObjectScope({"MyObject":MyObject}):
            layer = Dense(..., W_regularizer="MyObject")
            # save, load, etc. will recognize custom object by name
    ```
    c         G@  s   | |  _  d  |  _ d  S(   N(   t   custom_objectst   Nonet   backup(   t   selft   args(    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt   __init__$   s    	c         C@  s4   t  j ƒ  |  _ x |  j D] } t  j | ƒ q W|  S(   N(   t   _GLOBAL_CUSTOM_OBJECTSt   copyR   R   t   update(   R   t   objects(    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt	   __enter__(   s    c         O@  s   t  j ƒ  t  j |  j ƒ d  S(   N(   R   t   clearR
   R   (   R   R   t   kwargs(    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt   __exit__.   s    
(   t   __name__t
   __module__t   __doc__R   R   R   (    (    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyR      s   		c          G@  s
   t  |  Œ  S(   sc  Provides a scope that changes to `_GLOBAL_CUSTOM_OBJECTS` cannot escape.

    Convenience wrapper for `CustomObjectScope`.
    Code within a `with` statement will be able to access custom objects
    by name. Changes to global custom objects persist
    within the enclosing `with` statement. At end of the `with` statement,
    global custom objects are reverted to state
    at beginning of the `with` statement.

    # Example

    Consider a custom object `MyObject`

    ```python
        with custom_object_scope({"MyObject":MyObject}):
            layer = Dense(..., W_regularizer="MyObject")
            # save, load, etc. will recognize custom object by name
    ```

    # Arguments
        *args: Variable length list of dictionaries of name,
            class pairs to add to custom objects.

    # Returns
        Object of type `CustomObjectScope`.
    (   R   (   R   (    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt   custom_object_scope3   s    c           C@  s   t  S(   sÑ  Retrieves a live reference to the global dictionary of custom objects.

    Updating and clearing custom objects using `custom_object_scope`
    is preferred, but `get_custom_objects` can
    be used to directly access `_GLOBAL_CUSTOM_OBJECTS`.

    # Example

    ```python
        get_custom_objects().clear()
        get_custom_objects()["MyObject"] = MyObject
    ```

    # Returns
        Global dictionary of names to classes (`_GLOBAL_CUSTOM_OBJECTS`).
    (   R   (    (    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt   get_custom_objectsQ   s    c         C@  sf   |  d  k r d  St |  d ƒ r= i |  j j d 6|  j ƒ  d 6St |  d ƒ rS |  j St d |  ƒ ‚ d  S(   Nt
   get_configt
   class_namet   configR   s   Cannot serialize(   R   t   hasattrt	   __class__R   R   t
   ValueError(   t   instance(    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt   serialize_keras_objecte   s    t   objectc   
      C@  s  t  |  t ƒ ra|  } d | k s- d | k rF t d t | ƒ ƒ ‚ n  | d } | ro | | k ro | | } n[ | t k rˆ t | } nB | p‘ i  } | j | ƒ } | d  k rÊ t d | d | ƒ ‚ n  t | d ƒ rPt j	 | j
 ƒ } d | j k r?| pi  } | j
 | d d t t t j ƒ  ƒ t | j ƒ  ƒ ƒ ƒS| j
 | d ƒ S| | d   Sn¦ t  |  t j ƒ rï|  } | r| | k r| j | ƒ }	 nN | t k r¶t | }	 n5 | j | ƒ }	 |	 d  k rët d | d | ƒ ‚ n  |	 St d	 | d |  ƒ ‚ d  S(
   NR   R   s   Improper config format: s   Unknown s   : t   from_configR   t   :s   Could not interpret serialized (   t
   isinstancet   dictR   t   strR   t   getR   R   t   inspectt
   getargspecR   R   t   listt   itemst   sixt   string_types(
   t
   identifiert   module_objectsR   t   printable_module_nameR   R   t   clst   arg_spect   function_namet   fn(    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt   deserialize_keras_objects   sH    

c          G@  s   |  S(   N(    (   R   (    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt
   make_tuple¤   s    c         C@  s\   t  j |  j ƒ j d ƒ } |  j } |  j rI t d „  |  j Dƒ ƒ } n d } | | | f S(   sž   Serializes a user defined function.

    # Arguments
        func: the function to serialize.

    # Returns
        A tuple `(code, defaults, closure)`.
    t   raw_unicode_escapec         s@  s   |  ] } | j  Vq d  S(   N(   t   cell_contents(   t   .0t   c(    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pys	   <genexpr>´   s    N(   t   marshalt   dumpst   __code__t   decodet   __defaults__t   __closure__t   tupleR   (   t   funct   codet   defaultst   closure(    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt	   func_dump¨   s    			c      	   C@  sš   t  |  t t f ƒ rE |  \ }  } } t  | t ƒ rE t | ƒ } qE n  t j |  j d ƒ ƒ }  | d k ru t ƒ  } n  t j	 |  | d |  j
 d | d | ƒS(   s  Deserializes a user defined function.

    # Arguments
        code: bytecode of the function.
        defaults: defaults of the function.
        closure: closure of the function.
        globs: dictionary of global objects.

    # Returns
        A function object.
    R3   t   namet   argdefsRA   N(   R    R=   R&   R7   t   loadst   encodeR   t   globalst   python_typest   FunctionTypet   co_name(   R?   R@   RA   t   globs(    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt	   func_loadº   s    	t   Progbarc           B@  s;   e  Z d  Z d d d d „ Z d e d „ Z d d „ Z RS(   s¦   Displays a progress bar.

    # Arguments
        target: Total number of steps expected.
        interval: Minimum visual progress update interval (in seconds).
    i   i   gš™™™™™©?c         C@  sd   | |  _  | |  _ i  |  _ g  |  _ t j ƒ  |  _ d |  _ | |  _ d |  _ d |  _	 | |  _
 d  S(   Ni    (   t   widtht   targett
   sum_valuest   unique_valuest   timet   startt   last_updatet   intervalt   total_widtht   seen_so_fart   verbose(   R   RO   RN   RX   RU   (    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyR   Û   s    								c         C@  so  | p	 g  } x› | D]“ \ } } | |  j  k rf | | |  j | |  j g |  j  | <|  j j | ƒ q |  j  | d c | | |  j 7<|  j  | d c | |  j 7<q W| |  _ t j ƒ  } |  j d k r£| rï | |  j |  j k  rï d S|  j } t	 j
 j d | ƒ t	 j
 j d ƒ t t j t j |  j ƒ ƒ ƒ d } d | | f }	 |	 | |  j f }
 t | ƒ |  j } t |  j | ƒ } | d k rÑ|
 d | d 7}
 | |  j k  rÄ|
 d 7}
 qÑ|
 d 7}
 n  |
 d	 |  j | 7}
 |
 d
 7}
 t	 j
 j |
 ƒ t |
 ƒ |  _ | r)| |  j | } n d } | |  j | } d } | |  j k  rf| d | 7} n | d | |  j 7} x§ |  j D]œ } | d | 7} t |  j  | t ƒ r|  j  | d t d |  j  | d ƒ } t | ƒ d k rû| d | 7} q!| d | 7} q…| d |  j  | 7} q…W|  j t | ƒ 7_ | |  j k ra| | |  j d 7} n  t	 j
 j | ƒ t	 j
 j ƒ  | |  j k r£t	 j
 j d ƒ q£n  |  j d k rb| |  j k rbd | |  j } xs |  j D]h } | d | 7} |  j  | d t d |  j  | d ƒ } | d k r6| d | 7} qÜ| d | 7} qÜWt	 j
 j | d ƒ qbn  | |  _ d S(   s(  Updates the progress bar.

        # Arguments
            current: Index of current step.
            values: List of tuples (name, value_for_last_step).
                The progress bar will display averages for these values.
            force: Whether to force visual progress update.
        i    i   Ns   s   s   %%%dd/%%%dd [t   =t   >t   .t   ]t    s    - ETA: %dss    - %dss    - %s:gü©ñÒMbP?s    %.4fs    %.4es    %st    s   
i   s   %ds(   RP   RW   RQ   t   appendRR   RX   RT   RU   RV   t   syst   stdoutt   writet   intt   npt   floort   log10RO   t   floatRN   t   lenRS   R    R&   t   maxt   abst   flush(   R   t   currentt   valuest   forcet   kt   vt   nowt   prev_total_widtht	   numdigitst   barstrt   bart   progt
   prog_widtht   time_per_unitt   etat   infot   avg(    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyR
   ç   s€    	""		%
))c         C@  s   |  j  |  j | | ƒ d  S(   N(   R
   RW   (   R   t   nRm   (    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt   addA  s    N(   R   R   R   R   R   t   FalseR
   R}   (    (    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyRM   Ó   s   Z(   R   t
   __future__R    t   numpyRd   RR   R`   R(   R7   t   typesRH   R$   R   R   R   R   R   R   R   R1   R2   RB   RL   RM   (    (    (    s8   /tmp/pip-build-isqEY4/keras/keras/utils/generic_utils.pyt   <module>   s(   #			/		