o
    wZh                     @   s   d dl mZ d dlmZmZ d dlmZ d dlmZ	 d dl
mZ d dlmZmZmZ dgZedZed	d
dZedG dd dee ZdS )    )Iterator)CallableTypeVar)functional_datapipe)dataframe_wrapper)IterDataPipe)_check_unpickable_fnStreamWrappervalidate_input_colFilterIterDataPipe_T_T_coT)	covariantfilterc                       s   e Zd ZU dZee ed< eed< 	ddee deddf fddZde	fdd	Z
dee fd
dZdedee	ef fddZ  ZS )r   a3  
    Filters out elements from the source datapipe according to input ``filter_fn`` (functional name: ``filter``).

    Args:
        datapipe: Iterable DataPipe being filtered
        filter_fn: Customized function mapping an element to a boolean.
        input_col: Index or indices of data which ``filter_fn`` is applied, such as:

            - ``None`` as default to apply ``filter_fn`` to the data directly.
            - Integer(s) is used for list/tuple.
            - Key(s) is used for dict.

    Example:
        >>> # xdoctest: +SKIP
        >>> from torchdata.datapipes.iter import IterableWrapper
        >>> def is_even(n):
        ...     return n % 2 == 0
        >>> dp = IterableWrapper(range(5))
        >>> filter_dp = dp.filter(filter_fn=is_even)
        >>> list(filter_dp)
        [0, 2, 4]
    datapipe	filter_fnNreturnc                    s2   t    || _t| || _|| _t|| d S N)super__init__r   r   r   	input_colr
   )selfr   r   r   	__class__ X/var/www/auris/lib/python3.10/site-packages/torch/utils/data/datapipes/iter/selecting.pyr   2   s   
zFilterIterDataPipe.__init__c                    sV   | j d u r
|  S t| j ttfr#t fdd| j D }| j| S |  | j  S )Nc                 3   s    | ]} | V  qd S r   r   ).0coldatar   r   	<genexpr>E   s    z6FilterIterDataPipe._apply_filter_fn.<locals>.<genexpr>)r   r   
isinstancelisttuple)r   r   argsr   r   r   _apply_filter_fnA   s   


z#FilterIterDataPipe._apply_filter_fnc                 c   s6    | j D ]}| |\}}|r|V  qt| qd S r   )r   _returnIfTruer	   Zclose_streams)r   r   	conditionfilteredr   r   r   __iter__J   s   
zFilterIterDataPipe.__iter__r   c                 C   s   |  |}t|r0g }tt|D ]\}}|r"|t|| qt|r.dt|fS dS t	|t
s<tdt|||fS )NT)FNzEBoolean output is required for `filter_fn` of FilterIterDataPipe, got)r%   
df_wrapperZ	is_column	enumerateZiterateappendZget_itemlenconcatr!   bool
ValueErrortype)r   r   r'   resultidxmaskr   r   r   r&   R   s    


z FilterIterDataPipe._returnIfTruer   )__name__
__module____qualname____doc__r   r   __annotations__r   r   r/   r%   r   r)   r   r#   r&   __classcell__r   r   r   r   r      s   
 	"N)collections.abcr   typingr   r   Z%torch.utils.data.datapipes._decoratorr   Z$torch.utils.data.datapipes.dataframer   r*   Z#torch.utils.data.datapipes.datapiper   Z'torch.utils.data.datapipes.utils.commonr   r	   r
   __all__r   r   r   r   r   r   r   <module>   s   