o
    i                     @   s   d dl Z d dlmZ d dlmZmZmZ d dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZ ddd	ZG d
d deZG dd deZdS )    N)partial)AnySequenceUnion)
DataLoader)check_argument_types)AbsIterFactory)
AbsSamplerc                 C   s"   ||  }t | tj | dS )z.Set random seed for each worker in DataLoader.N)randomseednp)	worker_id	base_seedr    r   [/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/iterators/sequence_iter_factory.pyworker_init_fn   s   
r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )

RawSamplerc                 C   s
   || _ d S N)batches)selfr   r   r   r   __init__      
zRawSampler.__init__c                 C   
   t | jS r   )lenr   r   r   r   r   __len__   r   zRawSampler.__len__c                 C   r   r   )iterr   r   r   r   r   __iter__   r   zRawSampler.__iter__c                 C   r   r   )listr   )r   r   r   r   r   generate   r   zRawSampler.generateN)__name__
__module____qualname__r   r   r   r   r   r   r   r   r      s
    r   c                   @   sh   e Zd ZdZ						ddeeeee  f dedede	d	ed
e	fddZ
ddede	defddZdS )SequenceIterFactorya  Build iterator for each epoch.

    This class simply creates pytorch DataLoader except for the following points:
    - The random seed is decided according to the number of epochs. This feature
      guarantees reproducibility when resuming from middle of training process.
    - Enable to restrict the number of samples for one epoch. This features
      controls the interval number between training and evaluation.

    Nr   Fr   num_iters_per_epochr   shufflenum_workers
pin_memoryc	           	      C   sT   t  sJ t|tst|| _n|| _|| _|| _|| _|| _|| _	|| _
|| _d S r   )r   
isinstancer	   r   samplerdatasetr$   r%   r   r&   
collate_fnr'   )	r   r*   r   r$   r   r%   r&   r+   r'   r   r   r   r   -   s   


zSequenceIterFactory.__init__epochreturnc              
   C   sz  |d u r| j }| jd urt| j}| j|k rt| j}t| j| |\}}|| jkrK| j|| j }|rAtj	|| j  | ||| j | }n| j|d | j }| j|| j }|r{tj	|d | j  | tj	|| j  | ||| j d  |d |  }nt| j|d  |\}	}
| j}g }| j|	| j }|rtj	|	| j  | |dkr||
|
|  }||7 }|
| |kr|	d7 }	d}
| j|	| j }|rtj	|	| j  | n|
| }
|t|8 }|dkst|| jksJ n| j|| j }|rtj	|| j  | | j
d ur$t| j
d}ni }td| j|| j| jtt|| j dd|S )N   r   )r+   )r   )r*   batch_samplerr&   r'   r   r   )r%   r$   r   r)   divmodr   r   r   r
   RandomStater+   dictr   r*   r&   r'   r   r   )r   r,   r%   N
real_epochoffsetcurrent_batchesr   prev_batches_epoch_cursor_remain_batcheskwargsr   r   r   
build_iterH   s   





zSequenceIterFactory.build_iter)Nr   Fr   NFr   )r    r!   r"   __doc__r   r	   r   r   intboolr   r   r=   r   r   r   r   r#   "   s,    	
r#   )r   )r
   	functoolsr   typingr   r   r   numpyr   torch.utils.datar   	typeguardr   "espnet2.iterators.abs_iter_factoryr   espnet2.samplers.abs_samplerr	   r   r   r#   r   r   r   r   <module>   s    
