
    &`iM                     |    d dl Z d dlmZmZ d dlmZmZmZmZm	Z	 d dl
mZ d dlmZ e G d d                      ZdS )    N)	dataclassfield)DictIteratorListOptionalType)Rule)DeveloperAPIc                       e Zd ZdZ ed           G d d                      Zddeeee	                           fdZ
d	ee	         fd
Zd	ee	         fdZdeee	                  fdZded         fdZdefdZdS )RulesetzA collection of rules to apply to a plan.

    This is a utility class to ensure that, if rules depend on each other, they're
    applied in a correct order.
    T)frozenc                   T    e Zd ZU ee         ed<    ee          Ze	d          ed<   dS )Ruleset._Noderule)default_factory
dependentsN)
__name__
__module____qualname__r	   r
   __annotations__r   listr   r        v/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/data/_internal/logical/ruleset.py_Noder      sD         4j,1E$,G,G,G
D)GGGGGr   r   Nrulesc                 6    |g }t          |          | _        d S N)r   _rules)selfr   s     r   __init__zRuleset.__init__   s    =E5kkr   r   c                     || j         v rt          d| d          | j                             |           |                                 rt          d          d S )NRule z already in rulesetz)Cannot add rule that would create a cycle)r    
ValueErrorappend_contains_cycler!   r   s     r   addzRuleset.add   so    4;>T>>>???4   !! 	JHIII	J 	Jr   c                 r    || j         vrt          d| d          | j                             |           d S )Nr$   z not found in ruleset)r    r%   remover(   s     r   r+   zRuleset.remove%   sE    t{""@T@@@AAA4     r   returnc              #      K   |                                  }t          j        |          }|r;|                                }|j        V  |                    |j                   |9dS dS )zIterate over the rules in this ruleset.

        This method yields rules in dependency order. For example, if B depends on A,
        then this method yields A before B. The order is otherwise undefined.
        N)_build_graphcollectionsdequepopleftr   extendr   )r!   rootsqueuenodes       r   __iter__zRuleset.__iter__+   s{       !!##!%(( 	*==??D)OOOLL)))  	* 	* 	* 	* 	*r   r   c                    d | j         D             }| j         D ]}||         }|                                D ]&}||v r ||         j                            |           '|                                D ]&}||v r |j                            ||                    't	          |                                          }|                                D ]%}|j        D ]}||v r|                    |           &|S )Nc                 D    i | ]}|t                               |          S r   )r   r   ).0r   s     r   
<dictcomp>z(Ruleset._build_graph.<locals>.<dictcomp>=   s3     ;
 ;
 ;
*.D'--%%;
 ;
 ;
r   )r    dependenciesr   r&   r   valuesr+   )r!   rule_to_noder   r5   
dependency	dependentr3   s          r   r.   zRuleset._build_graph8   sC   
;
 ;
26+;
 ;
 ;
 K 	D 	DD%D #//11 E E
-- ,7>>tDDD "__.. D D	,,O**<	+BCCCD
 \((**++ '')) 	, 	,D!_ , ,	%%LL+++, r   c                 B    | j         sd S |                                 }| S r   )r    r.   )r!   r3   s     r   r'   zRuleset._contains_cycleV   s,    { 	F !!##yr   r   )r   r   r   __doc__r   r   r   r   r	   r
   r"   r)   r+   r   r6   r.   boolr'   r   r   r   r   r   	   s8         YdH H H H H H H H" "htDJ'78 " " " "JT
 J J J J!4: ! ! ! !*(4:. * * * *d?3    <      r   r   )r/   dataclassesr   r   typingr   r   r   r   r	   %ray.data._internal.logical.interfacesr
   ray.util.annotationsr   r   r   r   r   <module>rG      s        ( ( ( ( ( ( ( ( 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 - - - - - - S S S S S S S S S Sr   