o
    {i:                     @   s|  d dl Z d dlZd dlZd dlZd dlmZmZmZmZ d dl	Z
d dlZd dlmZmZ e dZdee deeeee  ee f fddZd	ed
eee  dee dee fddZ			d'dedejdedededejfddZ			d'dedejdedededejfddZd(defddZdefddZdeee ee f fd d!Zdejdefd"d#Zd$ejdefd%d&ZdS ))    N)CallableListOptionalTuple)Tensornndinov3x_listreturnc                 C   s:   dd | D }dd | D }t dd | D }|||fS )Nc                 S   s   g | ]}|j qS  )shape.0xr   r   >/data/cameron/keygrip/volume_dino_tracks/dinov3/utils/utils.py
<listcomp>   s    z#cat_keep_shapes.<locals>.<listcomp>c                 S   s   g | ]}|j d dd qS )r   )dimindex)selectnumelr   r   r   r   r      s    c                 S   s   g | ]}| d dqS )r   )flattenr   r   r   r   r      s    )torchcat)r	   shapes
num_tokens	flattenedr   r   r   cat_keep_shapes   s   
r   r   r   r   c                    s:   t j |dd} fdd|D }dd t||D }|S )Nr   )r   c                    s*   g | ]}|d d t  jd g qS )Nr   )r   Sizer   )r   r   r   r   r   r      s   * z%uncat_with_shapes.<locals>.<listcomp>c                 S   s   g | ]	\}}| |qS r   )reshape)r   or   r   r   r   r      s    )r   split_with_sizeszip)r   r   r   Zoutputs_splittedZshapes_adjustedZoutputs_reshapedr   r    r   uncat_with_shapes   s   r%    TFfnmodulenamedepth_firstinclude_rootc           	      C   sv   |s
|r
| ||d}t | D ]\}}|rd||fn|}t| |||dd}t||| q|r9|r9| ||d}|S N)r(   r)   .T)r'   r(   r)   r*   r+   )listnamed_childrenjoinnamed_replacesetattr)	r'   r(   r)   r*   r+   Zchild_name_ochild_module
child_name	new_childr   r   r   r1   !   s   r1   c                 C   sf   |s
|r
| ||d |  D ]\}}|rd||fn|}t| |||dd q|r1|r1| ||d |S r,   )r/   r0   named_apply)r'   r(   r)   r*   r+   r4   r3   r   r   r   r6   :   s   r6      seedc                 C   s0   t |  t j|  tj|  t|  dS )z
    Fix random seeds.
    N)r   manual_seedcudamanual_seed_allnprandomr8   )r8   r   r   r   fix_random_seedsQ   s   
r>   c                     s   t jt jt  fdd} d}d}d}z#| g d}tjddg d | g d	}|r0d
nd}| g d}W n	 tyB   Y nw d| d| d| }|S )Nc                    s   t j|  dd S )Ncwdascii)
subprocesscheck_outputdecodestrip)commandr?   r   r   _run^   s   zget_sha.<locals>._runzN/Aclean)git	rev-parseHEADrI   diffr?   )rI   z
diff-indexrK   zhas uncommited changes)rI   rJ   z--abbrev-refrK   zsha: z
, status: z
, branch: )ospathdirnameabspath__file__rB   rC   	Exception)rG   sharL   branchmessager   r?   r   get_sha[   s    rV   c                  C   s    t jd} t jd}| |fS )NZCONDA_DEFAULT_ENVCONDA_PREFIX)rM   environget)Zconda_env_nameZconda_env_pathr   r   r   get_conda_envp   s   rZ   c                 C   s"   d}|   D ]}|| 7 }q|S )Nr   )
parametersnelement)r(   cmr   r   r   count_parametersv   s   r_   modelc                 C   s:   t jt jt jt jf}|  D ]\}}t||r dS qdS )NTF)r   BatchNorm1dBatchNorm2dBatchNorm3dSyncBatchNormnamed_modules
isinstance)r`   Zbn_types_r(   r   r   r   has_batchnorms}   s   
rh   )r&   TF)r7   )loggingrM   r=   rB   typingr   r   r   r   numpyr<   r   r   r   	getLoggerloggerintr   r%   Modulestrboolr1   r6   r>   rV   rZ   r_   rh   r   r   r   r   <module>   s`   
,*



