o
    ©Ì³ii  ã                	   @   s˜   d dl mZmZmZmZ d dlZdZdZdZdZ	dZ
dd	ed
edeeef fdd„Zdeeef fdd„ZG dd„ dƒZG dd„ dƒZG dd„ dƒZdS )é    )ÚAnyÚDictÚOptionalÚTupleNÚ	worker_idÚfetcher_stateÚfetcher_endedÚdataset_stateÚdataset_iter_state© ÚdataÚkey_lineageÚreturnc                 C   sV   i }t | tƒr%t| ƒdkr%|  ¡ D ]\}}t|||f ƒ}| |¡ q|S | ||< |S )Nr   )Ú
isinstanceÚdictÚlenÚitemsÚ_flattenÚupdate)r   r   Ú	flat_dataÚkeyÚvalueÚflatr   r   úc/home/ubuntu/.local/lib/python3.10/site-packages/torchdata/stateful_dataloader/incremental_state.pyr      s   ÿr   r   c                 C   sœ   i }|   ¡ D ]1\}}t|ƒdkr|  S |d }t|ƒdkr#|||< q|dd … }||vr1i ||< ||| |< q|  ¡ D ]\}}t|tƒrKt|ƒ||< q<|S )Nr   é   )r   r   r   r   Ú
_unflatten)r   Únested_datar   r   ÚprefixÚsuffixÚkÚvr   r   r   r       s"   
€r   c                   @   s   e Zd ZdS )Ú
_TombstoneN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r!   8   s    r!   c                   @   sp   e Zd Zdeeeef  fdd„Zdeeef fdd„Zdee	ef dd	fd
d„Z
deeeef  fdd„Zd	S )Ú_IncrementalStateÚinitial_statec                 C   s   t |ƒ| _d S ©N)r   Ú
flat_state)Úselfr&   r   r   r   Ú__init__=   s   z_IncrementalState.__init__Ú	new_statec              	   C   sè   t |ƒ}i }tƒ }| jrt| j ¡ ƒ}| | ¡ ¡}|D ]R}| jd u s(|| jvr/|| ||< q||vr9tƒ ||< q| j| || }}zt|tjƒrYt|tjƒrYt 	||¡rXW qn||kr_W qW n	 t
yi   Y nw |||< q|| _|S r'   )r   Úsetr(   ÚkeysÚunionr!   r   ÚtorchÚTensorÚequalÚ	Exception)r)   r+   Únew_flat_stateÚdelta_flat_stateÚall_keysr   Ú
prev_valueÚ	new_valuer   r   r   Úgenerate_delta@   s8   
ÿ€þ
z _IncrementalState.generate_deltaÚflat_delta_stater   Nc                 C   sJ   |  ¡ D ]\}}| jd u ri | _t|tƒr| j |d ¡ q|| j|< qd S r'   )r   r(   r   r!   Úpop)r)   r9   r   r   r   r   r   Úapply_deltab   s   

øz_IncrementalState.apply_deltac                 C   s
   t | jƒS r'   )r   r(   )r)   r   r   r   Ú	get_statem   s   
z_IncrementalState.get_state)r"   r#   r$   r   r   Ústrr   r*   r8   r   r;   r<   r   r   r   r   r%   <   s
    "r%   c                   @   sx   e Zd Zdeeeef  fdd„Zdeeef deeef fdd„Zdeeef dd	fd
d„Z	deeef fdd„Z
d	S )Ú_IncrementalWorkerStateÚinitial_worker_state_dictc                 C   sp   d | _ d | _d }d }|r,|t | _ | td ¡}| td ¡}|d ur,|t | _| td ¡}t|ƒ| _	t|ƒ| _
d S r'   )Ú
_worker_idÚ_fetcher_endedÚ
_WORKER_IDÚgetÚ_DATASET_STATEÚ_FETCHER_STATEÚ_FETCHER_ENDEDÚ_DATASET_ITER_STATEr%   Ú_incr_dataset_stateÚ_incr_fetcher_iter_state)r)   r?   r	   Úfetcher_iter_stater   r   r   r   r*   r   s   


z _IncrementalWorkerState.__init__Únew_state_dictr   c                 C   s    t |v sJ ‚|t  | _t | jtd i}| td ¡}|d ur$| j |¡|t< | td ¡}|d urN|t | _d }| t	d ¡}|d urE| j
 |¡}t	|t| ji|t< |S r'   )rB   r@   rE   rC   rD   rH   r8   rF   rA   rG   rI   )r)   rK   Úincr_state_dictÚds_stater   Údelta_iter_stateÚ
iter_stater   r   r   r8   ƒ   s"   

þz&_IncrementalWorkerState.generate_deltaÚdelta_state_dictNc                 C   st   |t  | _| td ¡}|d ur| j |¡ | td ¡}|d ur6|t | _| t	d ¡}|d ur8| j
 |¡ d S d S d S r'   )rB   r@   rC   rD   rH   r;   rE   rF   rA   rG   rI   )r)   rP   rM   r   rO   r   r   r   r;   ›   s   

üz#_IncrementalWorkerState.apply_deltac                 C   s:   | j d urt| j t| j ¡ ind }t| jt| j ¡ t	|iS r'   )
rA   rF   rG   rI   r<   rB   r@   rD   rH   rE   )r)   r   r   r   r   r<   ¨   s   
ý
þú	
ýz!_IncrementalWorkerState.get_state)r"   r#   r$   r   r   r=   r   r*   r8   r;   r<   r   r   r   r   r>   q   s
    "r>   )r   )Útypingr   r   r   r   r/   rB   rE   rF   rD   rG   r   r   r!   r%   r>   r   r   r   r   Ú<module>   s    5