o
    biM                     @   sb   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 dZdS )    N)	dataclassfield)DictIteratorListOptionalType)Rule)DeveloperAPIc                   @   s   e Zd ZdZeddG dd dZddeeee	   fdd	Z
d
ee	 fddZd
ee	 fddZdeee	  fddZded fddZdefd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                   @   s0   e Zd ZU ee ed< eedZe	d  ed< dS )Ruleset._Noderule)default_factory
dependentsN)
__name__
__module____qualname__r   r	   __annotations__r   listr   r    r   r   V/home/ubuntu/.local/lib/python3.10/site-packages/ray/data/_internal/logical/ruleset.py_Node   s   
 r   Nrulesc                 C   s   |d u rg }t || _d S N)r   _rules)selfr   r   r   r   __init__   s   zRuleset.__init__r   c                 C   s:   || 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   r   r   r   add   s   
zRuleset.addc                 C   s*   || j vrtd| d| j | d S )Nr   z not found in ruleset)r   r   remover"   r   r   r   r$   %   s   
zRuleset.removereturnc                 c   s@    |   }t|}|r| }|jV  ||j |sd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noder   r   r   __iter__+   s   
zRuleset.__iter__r   c                 C   s   dd | j D }| j D ],}|| }| D ]}||v r#|| j| q| D ]}||v r6|j||  q(qt| }| D ]}|jD ]}||v rR|| qGqB|S )Nc                 S   s   i | ]}|t |qS r   )r   r   ).0r   r   r   r   
<dictcomp>=   s    z(Ruleset._build_graph.<locals>.<dictcomp>)r   dependenciesr   r    r   valuesr$   )r   rule_to_noder   r-   
dependency	dependentr+   r   r   r   r&   8   s,   


zRuleset._build_graphc                 C   s   | j sd S |  }| S r   )r   r&   )r   r+   r   r   r   r!   V   s   zRuleset._contains_cycler   )r   r   r   __doc__r   r   r   r   r   r	   r   r#   r$   r   r.   r&   boolr!   r   r   r   r   r   	   s    	r   )r'   dataclassesr   r   typingr   r   r   r   r   %ray.data._internal.logical.interfacesr	   ray.util.annotationsr
   r   r   r   r   r   <module>   s    