U
    Mh                     @   s   d dl mZmZ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 )    )CallableIteratorTupleTypeVar)functional_datapipe)IterDataPipe)dataframe_wrapper)_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ee edd fddZe	dd	d
Z
ee dddZeee	ef d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)r   r   returnc                    s2   t    || _t| || _|| _t|| d S N)super__init__r   r	   r   	input_colr   )selfr   r   r   	__class__ [/var/www/html/venv/lib/python3.8/site-packages/torch/utils/data/datapipes/iter/selecting.pyr   0   s    
zFilterIterDataPipe.__init__)r   c                    sZ   | j d kr|  S t| j ttfrFt fdd| j D }| j| S |  | j  S d S )Nc                 3   s   | ]} | V  qd S r   r   ).0coldatar   r   	<genexpr>C   s     z6FilterIterDataPipe._apply_filter_fn.<locals>.<genexpr>)r   r   
isinstancelisttuple)r   r    argsr   r   r   _apply_filter_fn?   s    


z#FilterIterDataPipe._apply_filter_fnc                 c   s4   | j D ](}| |\}}|r$|V  qt| qd S r   )r   _returnIfTruer
   Zclose_streams)r   r    	conditionfilteredr   r   r   __iter__H   s
    
zFilterIterDataPipe.__iter__)r    r   c                 C   s   |  |}t|r`g }tt|D ]\}}|r&|t|| q&t|r\dt|fS dS t	|t
sxt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'   P   s    


z FilterIterDataPipe._returnIfTrue)N)__name__
__module____qualname____doc__r   r   __annotations__r   r   r0   r&   r   r*   r   r   r'   __classcell__r   r   r   r   r      s   
 	N)typingr   r   r   r   Z%torch.utils.data.datapipes._decoratorr   Z#torch.utils.data.datapipes.datapiper   Z$torch.utils.data.datapipes.dataframer   r+   Z'torch.utils.data.datapipes.utils.commonr	   r
   r   __all__r   r   r   r   r   r   r   <module>   s   