o
    ci}                     @   sx   d dl Zd dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZ e \ZZZG dd der7ejjjZdS eZdS )    N)get_activation_fn)get_variabletry_import_tf
TensorTypeTensorShape)deprecation_warning)log_oncec                	       sh   e Zd ZdZ	ddedededef fddZd	efd
dZ	de
de
fddZde
de
fddZ  ZS )
NoisyLayera  A Layer that adds learnable Noise to some previous layer's outputs.

    Consists of:
    - a common dense layer: y = w^{T}x + b
    - a noisy layer: y = (w + \epsilon_w*\sigma_w)^{T}x +
        (b+\epsilon_b*\sigma_b)
    , where \epsilon are random variables sampled from factorized normal
    distributions and \sigma are trainable variables which are expected to
    vanish along the training procedure.
    reluprefixout_sizesigma0
activationc                    sT   t    || _|| _|| _|| _d| _d| _d| _d| _	t
dr(tdd dS dS )zInitializes a NoisyLayer object.

        Args:
            prefix:
            out_size: Output size for Noisy Layer
            sigma0: Initialization value for sigma_b (bias noise)
            non_linear: Non-linear activation for Noisy Layer
        Nnoisy_layerz!rllib.models.tf.layers.NoisyLayer)old)super__init__r   r   r   r   wbsigma_wsigma_br   r   )selfr   r   r   r   	__class__ Z/home/ubuntu/.local/lib/python3.10/site-packages/ray/rllib/models/tf/layers/noisy_layer.pyr      s   

zNoisyLayer.__init__input_shapec                 C   s   t |d }ttjjjdtt| dtt| dd| j	d || j
gtjd| _ttjj| jtt| d| j	d | j
gtjd| _ttjj | j	d	 d|| j
gtjd
| _ttjj | j	d d| j
gtjd
| _d S )N   g      g      ?)minvalmaxvalT_sigma_w)value	trainabletf_nameshapedtype_sigma_b_fc_w)r!   r#   r"   r$   r%   _fc_b)intr   tfkerasinitializersRandomUniformnpsqrtfloatr   r   float32r   Constantr   r   GlorotUniformr   Zerosr   )r   r   in_sizer   r   r   build9   s@   

zNoisyLayer.buildinputsreturnc           	      C   s   t |jd }tjj|gd}tjj| jgd}| |}| |}tjt|dt|dd}|}t|| j	| j
|  | j | j|  }t| jdd}|d urV||}|S )Nr   )r$   r   )ar   r*   )	framework)r)   r$   r*   randomnormalr   
_f_epsilonmatmulexpand_dimsr   r   r   r   r   r   )	r   r7   r5   
epsilon_inepsilon_out	epsilon_w	epsilon_baction_activationfnr   r   r   call_   s&   

zNoisyLayer.callxc                 C   s    t j|t jt j| S )N)r*   mathsignr/   abs)r   rH   r   r   r   r>   u   s    zNoisyLayer._f_epsilon)r
   )__name__
__module____qualname____doc__strr)   r0   r   r   r6   r   rG   r>   __classcell__r   r   r   r   r	      s    &r	   )numpyr.   ray.rllib.models.utilsr   ray.rllib.utils.frameworkr   r   r   r   ray.rllib.utils.deprecationr   ray.utilr   tf1r*   tfvr+   layersLayerobjectr	   r   r   r   r   <module>   s    (