o
    i                     @  s   d dl mZ d dlmZ d dlmZ d dlZd dlm	Z	 d dl
Z
d dlmZ dd Zd	d
 Zdd Zdd Z	ddddddddddZdS )    )annotations)PathversionN)wraps)Modulec                 C  s   | d uS N vr	   r	   P/home/ubuntu/.local/lib/python3.10/site-packages/torch_einops_utils/save_load.pyexists   s   r   c                   sP   t |ttfrt| fdd|D S t |tr$ fdd| D } |S )Nc                 3  s    | ]}t  |V  qd S r   
map_values).0elfnr	   r   	<genexpr>   s    zmap_values.<locals>.<genexpr>c                   s   i | ]
\}}|t  |qS r	   r   )r   keyvalr   r	   r   
<dictcomp>   s    zmap_values.<locals>.<dictcomp>)
isinstancelisttupletypedictitems)r   r   r	   r   r   r      s
   
r   c                   s    fdd}t || S )Nc                   s4   t | trt|  rtd| jtt|   dS | S )NT)__save_load_module__klassconfig)r   r   hasattrr   	__class__dehydrate_configgetattrr
   config_instance_var_namer	   r   	dehydrate   s   z#dehydrate_config.<locals>.dehydrater   )r    r&   r'   r	   r%   r   r#      s   
r#   c                 C  s   dd }t || S )Nc                 S  s<   t | tr| ddr| d }| d \}}||i |S | S )Nr   Fr   r    )r   r   get)r   r   argskwargsr	   r	   r   	rehydrate(   s
   z#rehydrate_config.<locals>.rehydrater   )r    r+   r	   r	   r   rehydrate_config'   s   
	r,   saveload_configinit_and_load)save_method_nameload_method_namer&   init_and_load_classmethod_namer   r   
str | Nonec                  s(    fdd}t | r|| S |S )Nc                   s   t | ts	J d| jtfdd}dfdd	}dfdd	 td fd	d
	}|| _t| | t|   t| | | S )Nz7save_load should decorate a subclass of torch.nn.Modulec                   s*   t | ||f  | g|R i | d S r   )setattr)selfr)   r*   )
_orig_initr&   r	   r   __init__A   s   z/save_load.<locals>._save_load.<locals>.__init__Tc                   sT   t |}|s| rJ t|  }t|  tt| d}t	|t
| d S )N)modelr    r   )r   r   r$   r   
state_dictpickledumpsr#   torchr-   str)r6   path	overwriter    pkg)r&   r   r	   r   _saveF   s   
z,save_load.<locals>._save_load.<locals>._savec                   s   t |}| s
J tjt|dd}t r5t|d r5t t|d kr5td|d  d   | j|d |d d S )Ncpumap_locationr   zloading saved model at version z!, but current package version is r9   strict)	r   r   r=   r.   r>   packaging_versionparseprintload_state_dict)r6   r?   rG   rA   r   r	   r   _loadS   s   ,z,save_load.<locals>._save_load.<locals>._loadc                   sp   t |}| s
J tjt|dd}d|v sJ dt|d }t|\}}| |i |} |||d |S )NrC   rD   r    z5model configs were not found in this saved checkpointrF   )r   r   r=   r.   r>   r;   loadsr,   )clsr?   rG   rA   r    r)   r*   r9   )rL   r	   r   _init_and_load_froma   s   z:save_load.<locals>._save_load.<locals>._init_and_load_from)T)
issubclassr   r8   r   classmethodr5   )r   r8   rB   rO   r&   r3   r2   r1   r   )rL   r7   r   
_save_load<   s   zsave_load.<locals>._save_load)r   )maybe_fnr1   r2   r&   r3   r   rS   r	   rR   r   	save_load3   s   	?rU   r   )r   r4   )
__future__r   pathlibr   	packagingr   rH   r;   	functoolsr   r=   torch.nnr   r   r   r#   r,   rU   r	   r	   r	   r   <module>   s&    	