
    &`i&                         d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZ d dlZd dl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e                      ZdS )    )ABCMeta)deque)chain)AnyDictListOptionalUnionN)5OverrideToImplementCustomLogic_CallToSuperRecommended)try_import_tftry_import_torch)	StatsBase)batch_values_to_cpusingle_value_to_cpu)DeveloperAPIc            
           e Zd ZdZdZdZ	 ddeeee	f                  f fdZ
deeef         f fdZdeeef         ddf fdZeeddeeef         fd	                        Zddedeed f         fdZdefdZd ZdeddfdZded          ddfdZ	 ddededeeee         f         fdZdee         fdZddee         fdZ xZS )SeriesStatszPA base class for Stats that represent a series of singular values (not vectors).Nwindowc                      t                      j        |i | || _        g | _        |                     g            dS )zoInitializes a SeriesStats instance.

        Args:
            window: The window size to reduce over.
        N)super__init___windowvalues_set_values)selfr   argskwargs	__class__s       x/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/rllib/utils/metrics/stats/series.pyr   zSeriesStats.__init__   sI     	$)&)))46    returnc                     t                                                      }i |t          | j                  | j        d}|S )N)r   r   )r   	get_stater   r   r   r   stater   s     r   r#   zSeriesStats.get_state/   sO    !!##

)$+66l
 
 

 r    r%   c                     t                                          |           |                     |d                    |d         | _        d S )Nr   r   )r   	set_stater   r   r$   s     r   r'   zSeriesStats.set_state8   sB    %   x)))Xr    c                     t          j        | |          }|i |d|d         iS | i |d| j        iS t          d          )N)stats_objectr%   r   z-Either stats_object or state must be provided)r   _get_init_argsr   
ValueError)r)   r%   
super_argss      r   r*   zSeriesStats._get_init_args=   s     -<uUUU
%/   %,.  
 LMMMr    Tcompilec                 v   | j         Dt          | j                  dk    s|st          | j                  }n)|                                 }n|                                 }|                     g            |r't          |          dk    rt          j        S |d         S |                                 }||_        |S )zGReduces the internal values list according to the constructor settings.N   r   )	r   lenr   r   window_reducer   npnanclone)r   r-   reduced_valuesreturn_statss       r   reducezSeriesStats.reduceN   s    <4;1$$G$!4T[!A!A!%!3!3!5!5!//11N 	)>""a''v%a((zz||,r    c                 *    t          | j                  S )z/Returns the length of the internal values list.)r0   r   )r   s    r   __len__zSeriesStats.__len__d   s    4;r    c                 j    | j         r$| j        rt          || j                   | _        d S || _        d S )N)maxlen)r   is_leafr   r   )r   
new_valuess     r   r   zSeriesStats._set_valuesh   s>     < 	%DL 	%
4<@@@DKKK %DKKKr    valuec                    t           r.t                               |          r|                                }t          r.t	          |t          j                  r|                                }| j        U| j        s| 	                    |g           dS | 	                    | 
                    | j        d         |                     dS | j                            |           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.
        Nr   )tf	is_tensornumpytorch
isinstanceTensordetachr   r   r   running_reduceappend)r   r>   s     r   pushzSeriesStats.pushr   s      	"",,u%% 	"KKMME 	#Zu|44 	#LLNNE<; M  %)))))  !4!4T[^U!K!KLLLLL Ku%%%%%r    incoming_statsc                 x   | j         r
J d            t          |          dk    rdS d |D             }t          t          j        |                    }t          | j                  t          |          z   }|| _        | j         s4t          t          j        d |D                                 }|| _        dS dS )zMerges SeriesStats objects.

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

        Returns:
            None. The merge operation modifies self in place.
        zNSeriesStats should only be merged at aggregation stages (root or intermediate)r   Nc                     g | ]	}|j         
S  r   .0ss     r   
<listcomp>z%SeriesStats.merge.<locals>.<listcomp>   s    666!QX666r    c                     g | ]	}|j         
S rM   rN   rO   s     r   rR   z%SeriesStats.merge.<locals>.<listcomp>   s    $F$F$F!QX$F$F$Fr    )r<   r0   listr   from_iterabler   latest_merged)r   rJ   	all_itemsmerged_valuess       r   mergezSeriesStats.merge   s     	\ 	\[	\ 	\ ~!##F66~666	,Y7788	 %%Y7	 | 	/ #$F$F~$F$F$FGG M "/D	/ 	/r    Flatest_merged_onlyc                    |rk| j         rt          d          | j        |rt          j        S g S | j        }t          |          dk    rt          j        g}nJ|                     |          }n4t          | j                  dk    r| j        }n|                                 }|r't          |          dk    rt          j        S |d         S |S )a_  Returns the result of reducing the internal values list.

        Note that this method does NOT alter the internal values list.

        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, is_leaf=False).
                When enabled, peek() will only use the values from the most recent merge operation.

        Returns:
            The result of reducing the internal values list.
        zPlatest_merged_only can only be used on aggregation stats objects (is_leaf=False)Nr   r/   )r<   r+   rV   r2   r3   r0   r1   r   )r   r-   rZ   rV   r5   s        r   peekzSeriesStats.peek   s    "  	6|  &   !) 6MI .M=!!Q&&"$&!%!3!3M!B!B 4;1$$!%!%!3!3!5!5 	">""a''v%a((!!r    c                     t           rZt          |t           j                  r@t          | d          r0|                     t                               ||g                    gS |                     ||g          gS )af  Reduces two values through a reduce function.

        If values are PyTorch tensors, reduction happens on GPU.
        Result stays on GPU (or CPU if values were CPU).

        Args:
            value_1: The first value to reduce.
            value_2: The second value to reduce.

        Returns:
            The reduced value (may be GPU tensor).
        _torch_reduce_fn)rC   rD   rE   hasattrr^   stack_np_reduce_fn)r   value_1value_2s      r   rG   zSeriesStats.running_reduce   s~     	L7EL11	L 011	L
 ))%++w6H*I*IJJKK""GW#56677r    c                 n   ||n| j         }t          |          dk    rt          j        gS t          rt          |d         t          j                  rt          | d          rt                              t          |                    }t          
                    t                              |                    rt          j        gS |                     |          }t          |          gS t          j
        t          j        |                    rt          j        gS |                     |          gS )an  Reduces the internal values list according to the constructor settings.

        If values are PyTorch GPU tensors, reduction happens on GPU and result
        is moved to CPU. Otherwise returns CPU value.

        Args:
            values: The list of values to reduce. If not None, use `self.values`

        Returns:
            The reduced value on CPU.
        Nr   r^   )r   r0   r2   r3   rC   rD   rE   r_   r`   rT   allisnanr^   r   ra   )r   r   stackedresults       r   r1   zSeriesStats.window_reduce   s    "-4; v;;!F8O 
	16!9el33
	1 011
	1
 kk$v,,//GyyW--..  x**733F'//00 6"(6""## 	0F8O&&v..//r    )N)NN)T)TF)__name__
__module____qualname____doc__ra   r^   r	   r
   intfloatr   r   strr   r#   r'   r   staticmethodr*   boolr7   r9   r   rI   r   rY   r\   rG   r1   __classcell__)r   s   @r   r   r      sD       ZZ M /3 sEz*+     $4S>      'tCH~ '$ ' ' ' ' ' '
 ;N Nc3h N N N \ ;:N d eC4F.G    ,         % % %&# &$ & & & &0/D$7 /D / / / /@ @E1" 1"1"8<1"	sDI~	1" 1" 1" 1"f8$s) 8 8 8 8.#0 #0DI #0 #0 #0 #0 #0 #0 #0 #0r    r   )	metaclass)abcr   collectionsr   	itertoolsr   typingr   r   r   r	   r
   rB   r2   ray.rllib.utils.annotationsr   ray.rllib.utils.frameworkr   r   "ray.rllib.utils.metrics.stats.baser   #ray.rllib.utils.metrics.stats.utilsr   r   ray.util.annotationsr   rC   _r@   r   rM   r    r   <module>r~      s[                     3 3 3 3 3 3 3 3 3 3 3 3 3 3          F E E E E E E E 8 8 8 8 8 8 X X X X X X X X - - - - - -q=??2q A0 A0 A0 A0 A0)w A0 A0 A0 A0 A0 A0r    