U
    ‰d}  ã                   @   sˆ   d dl Z d dlZd dlmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZ dgZeeef ZdZdd„ Zdd	„ Zddd„Zdd„ ZdS )é    N)ÚIterDataPipeÚMapDataPipe)ÚDILL_AVAILABLE)ÚAnyÚDictÚSetÚTupleÚTypeÚUnionÚtraversec                   C   s   dS )NZSTUB© r   r   r   ú:/tmp/pip-unpacked-wheel-ua33x9lu/torch/utils/data/graph.pyÚ_stub_unpickler   s    r   c              
      s  t  ¡ }t |¡}tr,ddlm} ||ƒ}nd }dd„ }g ‰dd„ }‡ ‡‡fdd„}	ttf}
zd|
D ]}| |	¡ |rb| 	|¡ qbz| ˆ¡ W n. tjttfk
r¼   tr¶| ˆ¡ n‚ Y nX W 5 |
D ]}| d ¡ |rÆ| 	d ¡ qÆtrüdd	lm
} |d
ƒ X ˆS )Nr   )ÚPicklerc                 S   s   t dfS ©Nr   )r   ©Úobjr   r   r   Ústub_pickler   s    z/_list_connected_datapipes.<locals>.stub_picklerc                 S   s4   i }| j  ¡ D ] \}}t|tttfƒr|||< q|S ©N)Ú__dict__ÚitemsÚ
isinstancer   r   Útuple)r   ÚstateÚkÚvr   r   r   Úgetstate_hook"   s
    
z0_list_connected_datapipes.<locals>.getstate_hookc                    s,   | ˆks| ˆ krt ‚nˆ | ¡ tdfS d S r   )ÚNotImplementedErrorÚappendr   r   ©ÚcacheZcaptured_connectionsÚscan_objr   r   Úreduce_hook)   s    
z._list_connected_datapipes.<locals>.reduce_hook)ÚextendF)ÚioÚBytesIOÚpickler   r   Zdillr   r   Zset_reduce_ex_hookZset_getstate_hookr#   ÚdumpÚPickleErrorÚAttributeErrorÚ	TypeError)r!   Úonly_datapiper    ÚfÚpZdill_PicklerÚdr   r   r"   Zdatapipe_classesÚclsZdill_extendr   r   r   Ú_list_connected_datapipes   s<    




r0   Fc                 C   s   t ƒ }t| ||ƒS r   )ÚsetÚ_traverse_helper)Údatapiper+   r    r   r   r   r   I   s    c                 C   sf   t | ttfƒs td t| ƒ¡ƒ‚| | ¡ t| ||ƒ}| i i}|D ]}||   t	||| 
¡ ƒ¡ qB|S )Nz9Expected `IterDataPipe` or `MapDataPipe`, but {} is found)r   r   r   ÚRuntimeErrorÚformatÚtypeÚaddr0   Úupdater2   Úcopy)r3   r+   r    r   r.   Úitemr   r   r   r2   O   s    
r2   )F)r$   r&   Ztorch.utils.datar   r   Z%torch.utils.data._utils.serializationr   Útypingr   r   r   r   r	   r
   Ú__all__ZDataPipeZreduce_ex_hookr   r0   r   r2   r   r   r   r   Ú<module>   s    5
