
    &`i'                         d dl Z d dlmZmZmZm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  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)DeveloperAPIc            
           e Zd ZdZdZ	 ddef fdZedefd            Zde	dd	fd
Z
eddeeef         fd            Zedeee	f         fd            ZdefdZ	 ddededeeee         f         fdZdeeef         f fdZdeeef         dd	f fdZdedd	fdZede	fd            Zede	fd            Zd dedeed f         fdZded          dd	fdZdefdZ xZS )!LifetimeSumStatszPA Stats object that tracks the sum of a series of singular values (not vectors).lifetime_sumFwith_throughputc                      t                      j        |i | d| _        || _        d| _        d| _        t          j                    | _        t          j                    | _	        dS )zInitializes a LifetimeSumStats instance.

        Args:
            with_throughput: If True, track the throughput since the last restore from a checkpoint.
                N)
super__init___lifetime_sumtrack_throughputs_value_at_last_reduce_value_at_last_restoretimeperf_counter_last_reduce_time_last_restore_time)selfr   argskwargs	__class__s       ~/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/rllib/utils/metrics/stats/lifetime_sum.pyr   zLifetimeSumStats.__init__   sm     	$)&))) !0 &)"&)# "&!2!4!4"&"3"5"5    returnc                     | j         S )N)r   r   s    r!   has_throughputsz LifetimeSumStats.has_throughputs,   s    %%r"   r   Nc                 D    | j         r
J d            || _        || _        d S )NzEinitialize_throughput_reference_time can only be called on root stats)is_leafr   r   )r   r   s     r!   $initialize_throughput_reference_timez5LifetimeSumStats.initialize_throughput_reference_time0   s;    	S 	SR	S 	S!%"&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_objectstateNr   r   z-Either stats_object or state must be provided)r	   _get_init_argsr   
ValueError)r+   r,   
super_argss      r!   r-   zLifetimeSumStats._get_init_args7   s     -<uUUU
!5)<#=   %!<#A  
 LMMMr"   c                 \    | j         s
J d            d| j        i}| j        r
| j        |d<   |S )z{Returns the throughput since the last reduce.

        For root stats, also returns throughput since last restore.
        z7Throughput tracking is not enabled on this Stats objectthroughput_since_last_reducethroughput_since_last_restore)r&   r1   is_rootr2   )r   results     r!   throughputszLifetimeSumStats.throughputsH   sY      	E 	ED	E 	E  +D,M
 < 	Y6:6XF23r"   c                     dS )N    r%   s    r!   __len__zLifetimeSumStats.__len__Y   s    qr"   Tcompilelatest_merged_onlyc                     |r| j         rt          d          |r| j        d}n| j        }n| j        }t          r)t          |t          j                  rt          |          }|r|n|gS )a  Returns the current lifetime sum 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 return the sum that was added in the most recent merge operation.
        zQlatest_merged_only can only be used on aggregation stats objects (is_leaf=False).Nr   )r(   r.   latest_mergedr   torch
isinstanceTensorr   )r   r:   r;   values       r!   peekzLifetimeSumStats.peek\   s      	$, 	c  
  		'!) * &E  	/Zu|44 	/'..E,uueW,r"   c                     t                                                      }t          | j                  |d<   | j        |d<   |S Nr   r   )r   	get_stater   r   r   r   r,   r    s     r!   rE   zLifetimeSumStats.get_state   s@    !!## 3D4F G Gn%)%;!"r"   r,   c                     t                                          |           |d         | _        |d         | _        | j        | _        | j        | _        d S rD   )r   	set_stater   r   r   r   rF   s     r!   rH   zLifetimeSumStats.set_state   sT    %   ">2!&':!; '+&8#%)%7"""r"   rA   c                    t           r.t                               |          r|                                }t          |          rdS t          r.t          |t          j                  r|                                }| xj        |z  c_        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.
        N)	tf	is_tensornumpyr
   r>   r?   r@   detachr   )r   rA   s     r!   pushzLifetimeSumStats.push   s      	"",,u%% 	"KKMMEe 	F 	#Zu|44 	#LLNNEe#r"   c                     | j         r]| j        }t          r)t          |t          j                  rt          |          }|| j        z
  t          j                    | j	        z
  z  S t          d          )z2Returns the throughput since the last reduce call.zLTracking of throughput since last reduce is not enabled on this Stats object)r   r   r>   r?   r@   r   r   r   r   r   r.   r   r   s     r!   r1   z-LifetimeSumStats.throughput_since_last_reduce   s     ! 	-L AL%,?? A2<@@ 4#==!##d&<<  ^  r"   c                    | j         st          d          | j        r]| j        }t          r)t          |t          j                  rt          |          }|| j        z
  t          j
                    | j        z
  z  S t          d          )zReturns the total throughput since the last restore.

        Only available for root stats, as restoring from checkpoints only happens at the root.
        z>throughput_since_last_restore is only available for root statszMTracking of throughput since last restore is not enabled on this Stats object)r3   r.   r   r   r>   r?   r@   r   r   r   r   r   rP   s     r!   r2   z.LifetimeSumStats.throughput_since_last_restore   s     | 	P   ! 	-L AL%,?? A2<@@ 4#>>!##d&==  _  r"   c                    | j         }t          r)t          |t          j                  rt	          |          }| j        sat          rKt          | j         t          j                  r,t                              d| j         j                  | _         nd| _         d| _        n|| _        | j	        rt          j                    | _        |r|S |                                 }||_         |S )z^Reduces the internal value.

        If value is a GPU tensor, it's converted to CPU.
        r   )device)r   r>   r?   r@   r   r3   tensorrS   r   r   r   r   r   clone)r   r:   rA   return_statss       r!   reducezLifetimeSumStats.reduce   s    
 " 	/Zu|44 	/'..E
 | 	/ )D$6EE )%*\\#d>P>W\%X%X""%("),D&&).D& ! 	9%)%6%8%8D" 	Lzz||%*"r"   incoming_statsc                 n   | j         r
J d            t          d |D                       }t          r.t          |t          j                  r|                                }t          r.t                              |          r|                                }| xj	        |z  c_	        | j         s	|| _
        dS dS )zMerges LifetimeSumStats objects.

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

        Returns:
            None. The merge operation modifies self in place.
        zSLifetimeSumStats should only be merged at aggregation stages (root or intermediate)c                     g | ]	}|j         
S r8   )r   ).0stats     r!   
<listcomp>z*LifetimeSumStats.merge.<locals>.<listcomp>   s    JJJ4D.JJJr"   N)r(   sumr>   r?   r@   rM   rJ   rK   rL   r   r=   )r   rX   incoming_sums      r!   mergezLifetimeSumStats.merge   s     	a 	a`	a 	aJJ>JJJKK  	1Zel;; 	1'..00L 	0",,|,, 	0'--//Ll* | 	.!-D	. 	.r"   c                 B    d|                                   d| j         dS )NzLifetimeSumStats(z; track_throughputs=))rB   r   r%   s    r!   __repr__zLifetimeSumStats.__repr__  s&    ]499;;]]DDZ]]]]r"   )F)NN)TF)T)__name__
__module____qualname____doc__stats_cls_identifierboolr   propertyr&   floatr)   staticmethodr   strr   r-   r5   intr9   r   r   rB   rE   rH   rN   r1   r2   rW   r`   rc   __classcell__)r    s   @r!   r   r      s       ZZ) !&6 66 6 6 6 6 62 & & & & X&' '4 ' ' ' ' N Nc3h N N N \N  T#u*-    X      @E"- "-"-8<"-	sDI~	"- "- "- "-H4S>      8tCH~ 8$ 8 8 8 8 8 8$# $$ $ $ $ $& e    X  u    X.   d  eC9K4K.L        D.D);$< . . . . .6^# ^ ^ ^ ^ ^ ^ ^ ^r"   r   )r   typingr   r   r   r   ray.rllib.utils.frameworkr   r   "ray.rllib.utils.metrics.stats.baser	   #ray.rllib.utils.metrics.stats.utilsr
   r   ray.util.annotationsr   r>   _rJ   r   r8   r"   r!   <module>rv      s     ) ) ) ) ) ) ) ) ) ) ) ) E E E E E E E E 8 8 8 8 8 8 O O O O O O O O - - - - - -q=??2q {^ {^ {^ {^ {^y {^ {^ {^ {^ {^r"   