B
    `                 @   s   d Z ddlmZ ddlmZ ddlmZ ddlZddlm  mZ	 ddl
mZ ddlmZ dd	d
gZG dd	 d	e	jZG dd
 d
eZG dd deZG dd deZdd Zdd Zdd ZdddZdd ZdS )z*Base classes for building neural networks.    )absolute_import)division)print_functionN)util)	name_utilLambdaLayer
Sequentialc                   s   e Zd ZdZd fdd	Zedd Zedd Zed	d
 ZdddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd Z  ZS )r   z8A `callable` `tf.Module` characterized by `eval(input)`.Nc                sP   t |pt| j}|d kr g n|g| _tt| j|d d | _d | _	d| _
d S )N)nameF)r   Zstrip_invalid_charstype__name___also_tracksuperr   __init___extra_loss_extra_result_trace)self
also_trackr
   )	__class__ c/home/dcms/DCMS/lib/python3.7/site-packages/tensorflow_probability/python/experimental/nn/layers.pyr   &   s    zLayer.__init__c             C   s   | j S )N)r   )r   r   r   r   
extra_loss.   s    zLayer.extra_lossc             C   s   | j S )N)r   )r   r   r   r   extra_result2   s    zLayer.extra_resultc             C   s
   t | jS )N)listr   )r   r   r   r   r   6   s    zLayer.also_trackTc             K   s   |  d  | d  |S )N)_set_extra_loss_set_extra_result)r   inputsis_trainingkwargsr   r   r   eval:   s    

z
Layer.evalc             C   s   t | j| jS )N)nn_util_libZvariables_summary	variablesr
   )r   r   r   r   summary?   s    zLayer.summaryc             C   s   t || jS )N)r!   Zvariables_saver"   )r   filenamer   r   r   saveB   s    z
Layer.savec             C   s   t || jS )N)r!   Zvariables_loadr"   )r   r$   r   r   r   loadE   s    z
Layer.loadc             K   s6   t |rt|| gf|S d  | _| _| j|f|}|S )N)callabler	   r   r   r    )r   r   r   yr   r   r   __call__H   s
    zLayer.__call__c             C   s   d t| j| jS )Nz<{}: name={}>)formatr   r   r
   )r   r   r   r   __repr__Q   s    zLayer.__repr__c             C   s
   || _ d S )N)r   )r   valuer   r   r   r   T   s    zLayer._set_extra_resultc             C   s
   || _ d S )N)r   )r   r,   r   r   r   r   W   s    zLayer._set_extra_loss)NN)T)r   
__module____qualname____doc__r   propertyr   r   r   r    r#   r%   r&   r)   r+   r   r   __classcell__r   r   )r   r   r   #   s   
	c                   sH   e Zd ZdZd fdd	Zdd Zedd Zdd
dZdd Z	  Z
S )r	   z7A `Layer` characterized by iteratively given functions.Nc                sR   t |}|stjd|p.ddd |D }t || _tt| j||d d S )Nz4Argument `layers` must contain at least one element._c             S   s   g | ]}t |qS r   )_try_get_name).0xr   r   r   
<listcomp>c   s    z'Sequential.__init__.<locals>.<listcomp>)r   r
   )	tupletferrorsInvalidArgumentErrorjoin_layersr   r	   r   )r   layersr   r
   )r   r   r   r   ^   s    
zSequential.__init__c             C   s   t || _| S )N)boolr   )r   tracer   r   r   	set_traceg   s    
zSequential.set_tracec             C   s   | j S )N)r<   )r   r   r   r   r=   k   s    zSequential.layersTc             K   s   | d|i g }|}| jr(t| |d xlt| jD ]^\}}t|d d d t||g|}| jrjt||| t|\}}	|||	f t|||	d q4W dd |D }
|
rt|
nd }| 	| | 
d  |S )Nr   )lossresultc             S   s   g | ]\}}|d k	r|qS )Nr   )r4   r   r2   r   r   r   r6   }   s    z#Sequential.eval.<locals>.<listcomp>)updater   	enumerater=   _try_set_extra_results	_try_call_try_get_extra_resultsappendsumr   r   )r   r   r   r   Z
all_extrasr5   ilayerr   r   Znon_none_extra_lossesZsum_extra_lossesr   r   r   r    o   s$    

zSequential.evalc             C   s    t | j| | jd}| j|_|S )N)r
   )r	   r=   r
   r   )r   rK   rr   r   r   __getitem__   s    zSequential.__getitem__)NN)T)r   r-   r.   r/   r   r@   r0   r=   r    rN   r1   r   r   )r   r   r	   [   s   	
c                   s,   e Zd ZdZd fdd	Zd	ddZ  ZS )
r   z&A `Layer` which can be defined inline.Nc                sD   t |stjd|pt|}|| _|| _tt| j	||d d S )Nz&Argument `eval_fn` must be `callable`.)r   r
   )
r'   r8   r9   r:   r3   _eval_fn_extra_loss_fnr   r   r   )r   Zeval_fnZextra_loss_fnr   r
   )r   r   r   r      s    zLambda.__init__Tc             K   sf   | d|i | jd k	r*t| j|g|}n|}|| _| | jd krFd nt| j|g| | d  |S )Nr   )rD   rO   rG   Z
_last_callr   rP   r   )r   r   r   r   rM   r   r   r   r       s    

zLambda.eval)NNNN)T)r   r-   r.   r/   r   r    r1   r   r   )r   r   r      s      	c                   sd   e Zd ZdZdejdf fdd	Zedd Zedd Z	ed	d
 Z
edd ZdddZ  ZS )KernelBiasLayerzLinear layer.Nc                s4   || _ || _|| _|| _|| _tt| j|d d S )N)r
   )_kernel_bias_activation_fn_apply_kernel_fn_dtyper   rQ   r   )r   kernelbiasZapply_kernel_fnactivation_fndtyper
   )r   r   r   r      s    zKernelBiasLayer.__init__c             C   s   | j S )N)rV   )r   r   r   r   rZ      s    zKernelBiasLayer.dtypec             C   s   | j S )N)rR   )r   r   r   r   rW      s    zKernelBiasLayer.kernelc             C   s   | j S )N)rS   )r   r   r   r   rX      s    zKernelBiasLayer.biasc             C   s   | j S )N)rT   )r   r   r   r   rY      s    zKernelBiasLayer.activation_fnTc             C   sZ   t j|| jdd}|}| jd k	r.| || j}| jd k	rB|| j }| jd k	rV| |}|S )Nr5   )Z
dtype_hintr
   )r8   Zconvert_to_tensorrZ   rW   rU   rX   rY   )r   r5   r   r(   r   r   r   r       s    




zKernelBiasLayer.eval)T)r   r-   r.   r/   r8   float32r   r0   rZ   rW   rX   rY   r    r1   r   r   )r   r   rQ      s   rQ   c             C   s<   t | dd}t|r|| t | dd}t|r8|| dS )z;Convenience function for maybe calling `_set_extra_result`.r   Nr   )getattrr'   )rL   rB   rC   Zset_fnr   r   r   rF      s    rF   c             C   s   t | ddt | ddfS )z+Convenience function for getting side data.r   Nr   )r\   )rL   r   r   r   rH      s    
rH   c             C   s^   y8| dkr|d S y
| ||S  t k
r0   Y nX | | S    tdt|   Y nX dS )z2Convenience function for evaluating argument `fn`.Nr   z------ EXCEPTION in {} ------)	TypeErrorprintr*   r3   )fnargsr   r   r   r   rG      s    
rG   unknownc             C   s,   t t| dd p(t| dd p(tt| d|S )Nr   r
   )strr\   r   )r_   Zname_fallbackr   r   r   r3      s    r3   c             C   s:   t | }tjdd |}td||| tj  d S )Nc          	   S   s0   d t| ttt| ddtt| d| dS )Nz{:14} {:<24} {:>10}shape?rZ   )r*   r3   rb   r   r\   )Zx_r   r   r   <lambda>  s   z_trace.<locals>.<lambda>z--- TRACE{:02}:  {:<24} {})	r3   r8   ZnestZmap_structurer^   r*   sysstdoutflush)rL   r5   rK   r
   zr   r   r   r      s
    r   )ra   )r/   
__future__r   r   r   rf   Ztensorflow.compat.v2compatZv2r8   Z-tensorflow_probability.python.experimental.nnr   r!   Z&tensorflow_probability.python.internalr   __all__Moduler   r	   r   rQ   rF   rH   rG   r3   r   r   r   r   r   <module>   s&   80-

