
    &`i#                         d dl Z d dlmZmZmZmZ d dlZd dlm	Z	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlmZ  e j        e          Z e
            \  ZZ e	            \  ZZZe G d d	e                      ZdS )
    N)AnyDictListUnion)try_import_tftry_import_torch)	StatsBase)
safe_isnansingle_value_to_cpu)log_once)DeveloperAPIc            
       H    e Zd ZdZdZ	 ddef fdZdefdZde	d          dd	fd
Z
dedd	fdZdefdZ	 ddededeee	e         f         fdZddedeed f         fdZdefdZdeeef         f fdZdeeef         dd	f fdZeddeeef         fd            Z xZS )EmaStatsz`A Stats object that tracks the exponential average of a series of singular values (not vectors).ema{Gz?	ema_coeffc                      t                      j        |i | t          j        | _        | j        sg | _        || _        dS )a  Initializes a EmaStats instance.

        We calculate the EMA in parallel components.
        Also, we potentially aggregate them multiple times per reduction cycle.
        We therefore aggregate by taking the mean of all collected EMAs.
        We do this for simplicity and accept this limitation because EMAs
        inherently only approximate.

        Example to illustrate this limitation:
        Using an ema coefficient of 0.01:
        First incoming ema: [1, 2, 3, 4, 5] -> 1.1
        Second incoming ema: [15] -> 15
        Mean of both merged ema values: [1.1, 15] -> 8.05
        True mean of all values: [1, 2, 3, 4, 5, 15] -> 5

        Args:
            ema_coeff: The EMA coefficient to use. Defaults to 0.01.
        N)super__init__npnan_valueis_leaf_values_to_merge
_ema_coeff)selfr   argskwargs	__class__s       u/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/rllib/utils/metrics/stats/ema.pyr   zEmaStats.__init__   sG    0 	$)&)))f| 	'$&D!#    returnc                     dS )z/Returns the length of the internal values list.    )r   s    r    __len__zEmaStats.__len__6   s    qr!   incoming_statsNc                     | j         r
J d            d |D             }t          |          dk    rdS | j                            |           | j         s	|| _        dS dS )zMerges EmaStats objects.

        Args:
            incoming_stats: The list of EmaStats objects to merge.

        Returns:
            None. The merge operation modifies self in place.
        zKEmaStats should only be merged at aggregation stages (root or intermediate)c                     g | ]	}|j         
S r%   )r   ).0stats     r    
<listcomp>z"EmaStats.merge.<locals>.<listcomp>G   s    ===ddk===r!   r   N)r   lenr   extendlatest_merged)r   r'   
all_valuess      r    mergezEmaStats.merge:   s     	Y 	YX	Y 	Y >=n===
z??aF$$Z000 | 	,!+D	, 	,r!   valuec                 z   t           r.t                               |          r|                                }t          |          rdS t          r.t          |t          j                  r|                                }t          | j                  r	|| _        dS | j	        |z  d| j	        z
  | j        z  z   | _        dS )a  Pushes a value into this Stats object.

        Args:
            value: The value to be pushed. Can be of any type.
                PyTorch GPU tensors are kept on GPU until reduce() or peek().
                TensorFlow tensors are moved to CPU immediately.
        Ng      ?)
tf	is_tensornumpyr
   torch
isinstanceTensordetachr   r   )r   r2   s     r    pushzEmaStats.pushR   s      	"",,u%% 	"KKMME e 	F 	#Zu|44 	#LLNNE dk"" 	DKKK %'3+@DK*OO KKKr!   c                    t          j        | j                  s-t          d          rt                              d|  d           t          | j                  dk    rt           j        S t          rkt          | j        d         t          j                  rFt                              t          | j                            }t                              |          S t          j        | j                  S )z%Reduces the internal values to merge.ema_stats_merge_pushzMerging values in zv but self._value is not NaN. This leads to an inaccurate metric. Not erroring out to avoid breaking older checkpoints.r   )r   isnanr   r   loggerwarningr-   r   r   r7   r8   r9   stacklistnanmean)r   stackeds     r    _reduce_values_to_mergez EmaStats._reduce_values_to_mergeo   s    x$$ 	2H)I)I 	NN bT  b  b  b   t$%%**6M 	*Z 5a 8%,GG 	*kk$t'<"="=>>G==)))z$/000r!   TFcompilelatest_merged_onlyc                    |r| j         rt          d          |r| j        |rt          j        S t          j        gS | j        }t          |          dk    rt          j        }nt          rbt          |d         t          j                  rBt          	                    t          |                    }t                              |          }nat          j        |          }nLt          | d          r5t          | j                  dk    r| j        }n|                                 }n| j        }t!          |          }|r|n|gS )a  Returns the current EMA value.

        If value is a GPU tensor, it's converted to CPU.

        Args:
            compile: If True, the result is compiled into a single value if possible.
            latest_merged_only: If True, only considers the latest merged values.
                This parameter only works on aggregation stats (root or intermediate nodes).
                When enabled, peek() will only use the values from the most recent merge operation.
        zQlatest_merged_only can only be used on aggregation stats objects (is_leaf=False).Nr   r   )r   
ValueErrorr/   r   r   r-   r7   r8   r9   rA   rB   rC   hasattrr   r   rE   r   )r   rF   rG   r/   r2   rD   s         r    peekzEmaStats.peek~   sF     	$, 	c  
  	$!) $6MF8O .M=!!Q&&  6Za(8%,GG 6#kk$}*=*=>>G!MM'22EEJ}55EE t/00 $ t,--22 KEE 88::EE#E**,uueW,r!   c                 l   t          | d          r<t          | j                  dk    r| j        }n|                                 }g | _        n| j        }t
          r)t          |t
          j                  rt          |          }t          j
        | _        |r|S |                                 }||_        |S )zReduces the internal value.

        If value is a GPU tensor, it's converted to CPU.

        Args:
            compile: If True, the result is compiled into a single value if possible.

        Returns:
            The reduced value.

        r   r   )rJ   r-   r   r   rE   r7   r8   r9   r   r   r   clone)r   rF   r2   return_statss       r    reducezEmaStats.reduce   s     4+,, 		  4())Q..4466$&D!!KE  	/Zu|44 	/'..Ef 	Lzz||#r!   c           	          t          | d          rt          | j                  nd}d|                                  d| d| j         d| j         d	S )Nr   r   z	EmaStats(z; number_of_values_to_merge=(z); ema_coeff=z, value=))rJ   r-   r   rK   r   r   )r   values_to_merge_lens     r    __repr__zEmaStats.__repr__   s    *1$8J*K*KRC%&&&QR 	A		 A ABU A AA A26+A A A	
r!   c                     t                                                      }| j        |d<   | j        |d<   | j        s
| j        |d<   |S Nr   r2   values_to_merge)r   	get_stater   r   r   r   r   stater   s     r    rW   zEmaStats.get_state   sL    !!##!_kg| 	='+'<E#$r!   rY   c                     t                                          |           |d         | _        |d         | _        | j        s|                    dg           | _        d S d S rU   )r   	set_stater   r   r   getr   rX   s     r    r[   zEmaStats.set_state   sf    %   ,Gn| 	E$)II.?$D$DD!!!	E 	Er!   c                     t          j        | |          }|i |d|d         iS | i |d| j        iS t          d          )z;Returns the initialization arguments for this Stats object.)stats_objectrY   Nr   z-Either stats_object or state must be provided)r	   _get_init_argsr   rI   )r^   rY   
super_argss      r    r_   zEmaStats._get_init_args   s     -<uUUU
U;/   #\4  
 LMMMr!   )r   )TF)T)NN)__name__
__module____qualname____doc__stats_cls_identifierfloatr   intr&   r   r1   r   r;   rE   boolr   rK   rO   strrS   r   rW   r[   staticmethodr_   __classcell__)r   s   @r    r   r      s       jj   $ $$ $ $ $ $ $<    ,D$4 , , , , ,0# $    :1 1 1 1 1  @E4- 4-4-8<4-	sDI~	4- 4- 4- 4-l" "d "eCO.D " " " "H
# 
 
 
 
4S>      EtCH~ E$ E E E E E E N Nc3h N N N \N N N N Nr!   r   )loggingtypingr   r   r   r   r6   r   ray.rllib.utils.frameworkr   r   "ray.rllib.utils.metrics.stats.baser	   #ray.rllib.utils.metrics.stats.utilsr
   r   ray.utilr   ray.util.annotationsr   	getLoggerra   r?   r7   _r4   r   r%   r!   r    <module>ru      s-    ) ) ) ) ) ) ) ) ) ) ) )     E E E E E E E E 8 8 8 8 8 8 O O O O O O O O       - - - - - -		8	$	$q=??2q mN mN mN mN mNy mN mN mN mN mNr!   