
    kh                     ~   d Z ddlZddlZddlmZmZmZmZmZ ddl	Z		 ddl
ZdZ ej                  e      Zg dZdeded	efd
Zdeeef   d	eeef   fdZ	 	 	 ddededeee	j,                  f   ded	eeef   f
dZ	 	 	 	 	 	 dde	j0                  j2                  dededeee	j,                  f   dededee   ded	efdZ	 ddeeef   de	j0                  j2                  ded	eeef   fdZ	 	 	 d de	j0                  j2                  dedee	j8                  j:                     dee   ded	ee   fdZy# e$ r dZY w xY w)!zi Model creation / weight loading / state_dict helpers

Hacked together by / Copyright 2020 Ross Wightman
    N)AnyCallableDictOptionalUnionTF)clean_state_dictload_state_dictload_checkpointremap_state_dictresume_checkpointtextprefixreturnc                 D    | j                  |      r| t        |      d  S | S )N)
startswithlen)r   r   s     P/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/_helpers.py_remove_prefixr      s$    vCKL!!K    
state_dictc                 n    i }d}| j                         D ]  \  }}|D ]  }t        ||      } |||<    |S )N)zmodule.z
_orig_mod.)itemsr   )r   cleaned_state_dict	to_removekvrs         r   r   r      s[    I   " "1 	%Aq!$A	% !1" r   checkpoint_pathuse_emadeviceweights_onlyc                    | rt         j                  j                  |       rt        |       j	                  d      r/t
        sJ d       t        j                  j                  | |      }n	 t        j                  | ||      }d}t        |t              r;|r|j                  dd      d}n$|r|j                  d	d      d	}nd
|v rd
}nd|v rd}t        |r||   n|      }t        j!                  dj#                  ||              |S t        j%                  dj#                  |              t'               # t        $ r t        j                  | |      }Y w xY w)a_  Load state dictionary from checkpoint file.

    Args:
        checkpoint_path: Path to checkpoint file.
        use_ema: Whether to use EMA weights if available.
        device: Device to load checkpoint to.
        weights_only: Whether to load only weights (torch.load parameter).

    Returns:
        State dictionary loaded from checkpoint.
    z.safetensorsz-`pip install safetensors` to use .safetensors)r    map_locationr!   )r$    state_dict_emaN	model_emar   modelzLoaded {} from checkpoint '{}'No checkpoint found at '{}')ospathisfilestrendswith_has_safetensorssafetensorstorch	load_fileload	TypeError
isinstancedictgetr   _loggerinfoformaterrorFileNotFoundError)r   r   r    r!   
checkpointstate_dict_keyr   s          r   r	   r	   ,   s@   " 277>>/:((8#T%TT#$**44_V4TJN"ZZf[gh
 j$':>>*:DAM!1Z^^K>J!,+!-J&!(%Nj&@Xbc
5<<^_]^3::?KL!!%  N"ZZfM
Ns   -D9 9 EEr(   strictremap	filter_fnc                 4   t         j                  j                  |      d   j                         dv r)t	        | d      r| j                  |       yt        d      t        ||||      }|rt        ||       }n|r	 |||       }| j                  ||      }	|	S )a<  Load checkpoint into model.

    Args:
        model: Model to load checkpoint into.
        checkpoint_path: Path to checkpoint file.
        use_ema: Whether to use EMA weights if available.
        device: Device to load checkpoint to.
        strict: Whether to strictly enforce state_dict keys match.
        remap: Whether to remap state dict keys by order.
        filter_fn: Optional function to filter state dict.
        weights_only: Whether to load only weights (torch.load parameter).

    Returns:
        Incompatible keys from model.load_state_dict().
    )z.npzz.npyload_pretrainedz"Model cannot load numpy checkpointN)r    r!   )r?   )	r*   r+   splitextlowerhasattrrD   NotImplementedErrorr	   r   )
r(   r   r   r    r?   r@   rA   r!   r   incompatible_keyss
             r   r
   r
   Z   s    2 
ww(,2248HH5+,!!/2 	 &&JKK !'&WcdJ%j%8
	z51
--j-Hr   allow_reshapec                    i }t        |j                         j                         | j                               D ]  \  \  }}\  }}|j                         |j                         k(  s(J d| d|j                   d| d|j                   d	       |j                  |j                  k7  rF|r|j                  |j                        }n(J d| d|j                   d| d|j                   d	       |||<    |S )a  Remap checkpoint by iterating over state dicts in order (ignoring original keys).

    This assumes models (and originating state dict) were created with params registered in same order.

    Args:
        state_dict: State dict to remap.
        model: Model whose state dict keys to use.
        allow_reshape: Whether to allow reshaping tensors to match.

    Returns:
        Remapped state dictionary.
    zTensor size mismatch z: z vs z. Remap failed.zTensor shape mismatch )zipr   r   numelshapereshape)r   r(   rJ   out_dictkavakbvbs           r   r   r      s    " H!%"2"2"4":":"<j>N>N>PQ R(2rxxzRXXZ't+@BrxxjPTUWTXXZ[][c[cZdds)tt'88rxxZZ)j 6rd"RXXJd2$bQSQYQYPZZijju Or   	optimizerloss_scalerlog_infoc                 P   d}t         j                  j                  |      rWt        j                  |dd      }t        |t              rd|v r|rt        j                  d       t        |d         }| j                  |       |/d|v r+|rt        j                  d       |j                  |d          |C|j                  |v r5|rt        j                  d	       |j                  ||j                            d
|v r@|d
   }d|v r|d   dkD  r|dz  }|r(t        j                  dj                  ||d
                |S | j                  |       |r$t        j                  dj                  |             |S t        j                  dj                  |             t               )az  Resume training from checkpoint.

    Args:
        model: Model to load checkpoint into.
        checkpoint_path: Path to checkpoint file.
        optimizer: Optional optimizer to restore state.
        loss_scaler: Optional AMP loss scaler to restore state.
        log_info: Whether to log loading info.

    Returns:
        Resume epoch number if available, else None.
    NcpuFr#   r   z(Restoring model state from checkpoint...rU   z,Restoring optimizer state from checkpoint...z2Restoring AMP loss scaler state from checkpoint...epochversion   z!Loaded checkpoint '{}' (epoch {})zLoaded checkpoint '{}'r)   )r*   r+   r,   r1   r3   r5   r6   r8   r9   r   r	   r>   r:   r;   r<   )r(   r   rU   rV   rW   resume_epochr=   r   s           r   r   r      s   & L	ww~~o&ZZeRWX
j$'LJ,FGH)*\*BCJ!!*-$
)BLL!OP))*[*AB&;+E+E+SLL!UV++J{7Q7Q,RS*$)'2
*z)/Dq/H A%LLL!D!K!KO]gho]p!qr
  !!*-5<<_MN3::?KL!!r   )TrY   F)TrY   TFNF)T)NNT) __doc__loggingr*   typingr   r   r   r   r   r1   safetensors.torchr0   r/   ImportError	getLogger__name__r8   __all__r-   r   r   boolr    r	   nnModuler
   r   optim	Optimizerintr    r   r   <module>rm      s%    	 7 7  '

H
%
m c c c3h DcN   +0"	+"+"+" c5<<'(+" 	+"
 
#s(^+"b +0(,"'xx'' ' c5<<'(	'
 ' ' H%' ' 	'Z #cNxx  
#s(^	@ 6:%)4"xx4"4" EKK1124" c]	4"
 4" c]4"e  s   D1 1D<;D<