U
    <c                     @   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mZ dgZeddd	Zed
G dd dee ZdS )    )CallableIteratorOptionalTypeVar)functional_datapipe)IterDataPipe)dataframe_wrapper)_check_unpickable_fn_deprecation_warningStreamWrappervalidate_input_colFilterIterDataPipeT_coT)	covariantfilterc                       s|   e Zd ZU dZeed< eed< eed< deeee dd fddZ	ed	d
dZ
ee d	ddZdd Zdd Z  ZS )r   a  
    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.
        drop_empty_batches (Deprecated): By default, drops a batch if it is empty after filtering instead of keeping an empty list
        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_fndrop_empty_batchesN)r   r   r   returnc                    s\   t    || _t| || _|d kr,d}ntt| jdddd || _|| _	t
|| d S )NTz1.12z1.14r   )Zdeprecation_versionZremoval_versionZold_argument_name)super__init__r   r	   r   r
   type__name__r   	input_colr   )selfr   r   r   r   	__class__ M/tmp/pip-unpacked-wheel-gikjz4vx/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 Nr   ).0coldatar   r   	<genexpr>O   s     z6FilterIterDataPipe._apply_filter_fn.<locals>.<genexpr>)r   r   
isinstancelisttuple)r   r#   argsr   r"   r   _apply_filter_fnK   s    


z#FilterIterDataPipe._apply_filter_fnc                 c   s6   | j D ]*}| |}| |r&|V  qt| qd S r   )r   _returnIfTrue_isNonEmptyr   Zclose_streams)r   r#   filteredr   r   r   __iter__T   s
    


zFilterIterDataPipe.__iter__c                 C   s   |  |}t|r\g }tt|D ]\}}|r&|t|| q&t|rXt|S d S t	|t
sttdt||r||S d S )NzEBoolean output is required for `filter_fn` of FilterIterDataPipe, got)r)   
df_wrapperZ	is_column	enumerateZiterateappendZget_itemlenconcatr%   bool
ValueErrorr   )r   r#   	conditionresultidxmaskr   r   r   r*   \   s    



z FilterIterDataPipe._returnIfTruec                 C   s8   t |rdS |d k	o2t|to0t|dko0| j }|S )NTr   )r.   Zis_dataframer%   r&   r1   r   )r   r#   rr   r   r   r+   o   s    
zFilterIterDataPipe._isNonEmpty)NN)r   
__module____qualname____doc__r   __annotations__r   r3   r   r   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   r   __all__r   r   r   r   r   r   <module>   s   