a
    dTA                     @   s  d Z ddlZddlZddlZddlZddlZddl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mZmZmZmZmZ ddlZddlmZ ddlZddlmZ ddlmZmZmZ z<ddl Z!dd	l"m#Z# dd
l$m%Z% ddl&m'Z'm(Z(m)Z)m*Z* W n e+y   dZ!dZ%Y n0 ddl,m-Z- ddl.m/Z/ ddl0m1Z1 e2e3Z4e5ej67ddZ8d,ddZ9e	G dd dZ:e;edddZ<dd Z=d-d d!Z>dddde=fd"d#Z?d$d% Z@e!durG d&d' d'e!jAZBndZBG d(d) d)eZCG d*d+ d+e/ZDdS ).zR Dataset reader for webdataset

Hacked together by / Copyright 2022 Ross Wightman
    N)	dataclass)partial)islice)AnyCallableDictListOptionalTuple)Image)DatasetIterableDatasetget_worker_info)_shuffle)expand_urls)base_plus_ext
url_openertar_file_expandervalid_sample   )load_class_map)Reader)SharedCountZWDS_SHUFFLE_SIZEi    infoc              
   C   s   t j| |d }t j| |d }d}z:t|}t|}W d    n1 sT0    Y  |W S  ty } zt|}W Y d }~n
d }~0 0 z:t|}t	
|}W d    n1 s0    Y  |W S  ty   Y n0 td| d| d| d i S )Nz.jsonz.yaml zDataset info file not found at z or z	. Error: z.. Falling back to provided split and size arg.)ospathjoinwdsZgopenjsonload	ExceptionstryamlZ	safe_load_loggerwarning)rootbasenameZ	info_jsonZ	info_yamlerr_strfZ	info_dicte r+   e/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/data/readers/reader_wds.py
_load_info)   s&    ((r-   c                   @   sJ   e Zd ZU eed< ee ed< dZee ed< dZeed< dZ	eed< dS )		SplitInfonum_samples	filenamesr+   shard_lengthsr   	alt_labelnameN)
__name__
__module____qualname__int__annotations__r
   r"   r1   r2   r3   r+   r+   r+   r,   r.   ?   s
   
r.   )splitr   c           	         sz  dd }d| v sd| v r$|  d} d}d}t| dkrDt| d }| d } d	| vr|  d
d}t|d }|rd|v r|| |d v r|| }t| }|r|d | }|s
dd t|d |d D  t fdd|D }t  |d< t  |d< ||d< ||}nt	|||d}nRd|vs<| |d vr^t
d|  d|di   d| } |d |  }||}|S )Nc                 S   s2   t | d t| d t| d | dd| d dS )Nr/   r0   r1   r2   r   r3   )r/   r0   r1   r2   r3   )r.   tupleget)Z	dict_infor+   r+   r,   _info_convertI   s    


z(_parse_split_info.<locals>._info_converttarz..|r   r   r   z::-   splitsc                 S   s   i | ]\}}||qS r+   r+   ).0r)   cr+   r+   r,   
<dictcomp>e       z%_parse_split_info.<locals>.<dictcomp>r0   r1   c                 3   s   | ]} | V  qd S Nr+   rB   r)   Z_fcr+   r,   	<genexpr>f   rE   z$_parse_split_info.<locals>.<genexpr>r/   )r3   r/   r0   zsplit z not found in info ())r9   lenr7   r   zipsumr:   keysvaluesr.   RuntimeErrorr;   )	r9   r   r<   r/   Z
split_namesplit_partsZ	split_idxZsplit_filenames
split_infor+   rH   r,   _parse_split_infoH   sD    	

"rS   c                 C   s   t dt|  d dS )zUCall in an exception handler to ignore any exception, isssue a warning, and continue.zHandling webdataset error (z). Ignoring.T)r$   r%   repr)exnr+   r+   r,   log_and_continue{   s    rV   jpgRGBclsr   c           
      C   s   |r,t | d }t|| }|dk r8dS nt| | }t| | "}t|}|  W d   n1 sn0    Y  |r||}t	||| 
ddd}	|	S )z Custom sample decode
    * decode and convert PIL Image
    * cls byte string label to int
    * pass through JSON byte string (if it exists) without parse
    r   r   N)rW   rY   r   )r   loadsr7   ioBytesIOr   openr    convertdictr;   )
sample	image_keyimage_format
target_keyr2   metaZclass_labelbimgdecodedr+   r+   r,   _decode   s    
&
rh   c           	      c   s   | D ]}zt |||||d}W nH tyf } z0||rDW Y d}~qnW Y d}~ qW Y d}~n
d}~0 0 |durt|trt|tr|d|d< |V  qdS )zDecode samples with skip.)ra   rb   rc   r2   N__key__)rh   r!   
isinstancer_   r;   )	datara   rb   rc   r2   handlerr`   resultrU   r+   r+   r,   _decode_samples   s"    
$rn   c                  C   s   t  } | dur| jS tj S )z'get dataloader worker seed from pytorchN)r   seedr   utilspytorch_worker_seed)worker_infor+   r+   r,   rq      s    rq   c                   @   s   e Zd Zd
ddZdd Zd	S )detshuffle2  d   r   c                 C   s   || _ || _|| _|| _d S rF   )bufsizeinitialro   epoch)selfrw   rx   ro   ry   r+   r+   r,   __init__   s    zdetshuffle2.__init__c                 C   sf   t | jtr| jj}n|  jd7  _| j}| jdk r@t | }n
| j| }t|}t|| j	| j
|S Nr   r   )rj   ry   r   valuero   rq   randomRandomr   rw   rx   )rz   srcry   ro   rngr+   r+   r,   run   s    



zdetshuffle2.runN)rt   ru   r   rv   )r4   r5   r6   r{   r   r+   r+   r+   r,   rs      s       
rs   c                       s4   e Zd ZdZejdddf fdd	Zdd Z  ZS )	ResampledShards2z,An iterable dataset yielding a list of urls.NTrv   c                    sb   t    tj|}|| _t| jd ts0J || _t	
 | _|du rLtn|| _|| _|| _dS )zSample shards from the shard list with replacement.

        :param urls: a list of URLs as a Python list or brace notation string
        r   N)superr{   r   Z
shardlistsr   urlsrj   r"   nshardsr~   r   r   rq   worker_seeddeterministicry   )rz   r   r   r   r   ry   	__class__r+   r,   r{      s    

zResampledShards2.__init__c                 c   s   t | jtr| jj}n|  jd7  _| j}| jrDt|  | | _t	| j
D ].}| jdt| jd }t| j| dV  qNdS )z#Return an iterator over the shards.r   r   )urlN)rj   ry   r   r}   r   r~   r   r   r   ranger   randintrK   r   r_   )rz   ry   _indexr+   r+   r,   __iter__	  s    
zResampledShards2.__iter__)	r4   r5   r6   __doc__sysmaxsizer{   r   __classcell__r+   r+   r   r,   r      s   r   c                       sv   e Zd Zd fd	d
	Zdd Zdee dddZdd Zdd Z	dd Z
dd Zdd Zd ddZd!ddZ  ZS )"	ReaderWdsFNr   *   rW   rX   rY   r   c                    s2  t    td u rtd|| _|| _|| _|| _|| _d| _	|pDt
| _|	| _|
| _|| _d| _d| _t| j| _t|| j| _| jj| _| jstdd| _|rt|| _d| _ni | _d| _d	| _t rt rt d	krt | _t | _d | _ d| _!|| _"d	| _#d| _$d	| _%d| _&t' | _(d | _)d S )
NzcPlease install webdataset 0.2.x package `pip install git+https://github.com/webdataset/webdataset`.i  filenamez.JPEGz+Invalid split definition, no samples found.FTr   r   )*r   r{   r   rP   r&   is_training
batch_sizerepeatscommon_seedshard_shuffle_sizeSHUFFLE_SIZEsample_shuffle_sizera   rb   rc   filename_keykey_extr-   r   rS   rR   r/   remap_classr   class_to_idx	dist_rankdist_num_replicasdistZis_availableZis_initializedZget_world_sizeZget_rankrr   	worker_idr   num_workersglobal_worker_idglobal_num_workersZ
init_countr   epoch_countds)rz   r&   r3   r9   r   r   r   ro   	class_mapZ
input_nameZinput_imageZtarget_nameZtarget_imageZprefetch_sizeZshuffle_sizer   r+   r,   r{     sR    





zReaderWds.__init__c                 C   s   || j _d S rF   )r   r}   )rz   countr+   r+   r,   	set_epocha  s    zReaderWds.set_epoch)r   c                 C   s.   | j d urd S |d ur*|| _| j| j | _d S rF   )r   r   r   r   )rz   r   r+   r+   r,   set_loader_cfgd  s
    
zReaderWds.set_loader_cfgc              
      s   j du r^tjj }|dur<| _ |j _|j _|j	 _	 j
 j	  _ j j	  j  _ fdd jjD }t|g} jr|t j j jd jtjtdtj jt jdg n| jtjtdg |tt  j! j" jj#dg tj$|  _%dS )z8 Lazily initialize worker (in worker processes)
        Nc                    s   g | ]}t j j|qS r+   )r   r   r   r&   rG   rz   r+   r,   
<listcomp>|  rE   z(ReaderWds._lazy_init.<locals>.<listcomp>)ro   ry   )rl   )r   )ra   rb   r2   )&rr   torchrp   rk   r   idr   ro   r   r   r   r   r   r   rR   r0   r   ZSimpleShardListr   extendrs   r   r   r   _split_by_node_and_workerZtarfile_to_samplesrV   shuffler   r~   r   r   rn   ra   rb   r2   ZDataPipeliner   )rz   rr   Zabs_shard_filenamesZpipeliner+   r   r,   
_lazy_initn  sD    




zReaderWds._lazy_initc                 c   s>   | j dkr*t|| jd | j D ]
}|V  qn|D ]
}|V  q.d S Nr   )r   r   r   )rz   r   sr+   r+   r,   r     s
    

z#ReaderWds._split_by_node_and_workerc                 C   s\   | j t| j| j }| js$| jdkr.t|}| jrT| jd urTt|| j | j }t|S r   )	r/   maxr   r   r   mathceilr   r7   )rz   num_worker_samplesr+   r+   r,   _num_samples_per_worker  s    
z!ReaderWds._num_samples_per_workerc                 c   s   | j d u r|   |  }| js*| jdkr8| j |}n| j }d}|D ]6}|| j }| jrd| j| }|| j	 |fV  |d7 }qFd S r|   )
r   r   r   r   r   Z
with_epochrc   r   r   ra   )rz   r   r   ir`   targetr+   r+   r,   r     s    


zReaderWds.__iter__c                 C   s   |   | j }|S rF   )r   r   )rz   r/   r+   r+   r,   __len__  s    zReaderWds.__len__c                 C   s   dsJ dd S )NFzNot supportedr+   )rz   r   r'   absoluter+   r+   r,   	_filename  s    zReaderWds._filenamec                 C   s|   | j du r|   g }| j D ]Z}| j|v r6|| j }n$d|v rN|d | j }ndsZJ d|| t|| jkr qxq|S )z0 Return all filenames in dataset, overrides baseNri   FzNo supported name field present)r   r   r   r   appendrK   r/   )rz   r'   r   namesr`   r3   r+   r+   r,   r0     s    



zReaderWds.filenames)FNr   r   NrW   rX   rY   r   NN)N)FF)FF)r4   r5   r6   r{   r   r	   r7   r   r   r   r   r   r   r   r0   r   r+   r+   r   r,   r     s0              D 
+
r   )r   )rW   rX   rY   r   )Er   r[   r   loggingr   r   r~   r   Zdataclassesr   	functoolsr   	itertoolsr   typingr   r   r   r   r	   r
   r   Ztorch.distributedZdistributedr   r#   ZPILr   Ztorch.utils.datar   r   r   Z
webdatasetr   Zwebdataset.filtersr   Zwebdataset.shardlistsr   Zwebdataset.tariteratorsr   r   r   r   ImportErrorr   r   readerr   Zshared_countr   	getLoggerr4   r$   r7   environr;   r   r-   r.   r"   rS   rV   rh   rn   rq   ZPipelineStagers   r   r   r+   r+   r+   r,   <module>   sf    


3    
%


,