o
    
j                     @   s:  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlZd dlZdejdejfddZdd	 Zd
d Zdd Zdd Zdd Zdd Zdd ZdededefddZdedefddZdedefddZdd  Zd!d" Zd#e
d$e
de
fd%d&ZG d'd( d(Zd)d* Zej d+d+fd,d-Z!dS ).    N)Path)Dictxreturnc                 C   s8   | d u rd S t | r|  } t j r| jdd} | S )NT)non_blocking)torch	is_tensor
contiguouscudais_available)r    r   J/home/kuhnn/.local/lib/python3.10/site-packages/TTS/utils/generic_utils.pyto_cuda   s   

r   c                  C   s*   t j } t t j rdnd}| |fS )Nzcuda:0cpu)r   r
   r   device)use_cudar   r   r   r   get_cuda   s   
r   c                  C   s   zt ddgd} tdd | dD }|dd W |S  t jy,   d	}Y |S  ty7   d
}Y |S  tyB   d
}Y |S w )Ngitbranchutf8c                 s   s    | ]
}| d r|V  qdS )*N)
startswith).0liner   r   r   	<genexpr>#       z!get_git_branch.<locals>.<genexpr>
z*  inside_dockerunknown)	
subprocesscheck_outputdecodenextsplitreplaceCalledProcessErrorFileNotFoundErrorStopIteration)outcurrentr   r   r   get_git_branch    s   r+   c               	   C   s<   zt g d  } W | S  t jtfy   d} Y | S w )zXhttps://stackoverflow.com/questions/14989858/get-the-current-git-hash-in-a-python-script)r   z	rev-parsez--shortHEAD0000000)r    r!   r"   stripr&   r'   )commitr   r   r   get_commit_hash.   s   r0   c                 C   s8   t j  d}t }tj| |d | d | }|S )z<Get an experiment folder path with the current date and timez%B-%d-%Y_%I+%M%p-)datetimenowstrftimer0   ospathjoin)	root_path
model_namedate_strcommit_hashoutput_folderr   r   r   get_experiment_folder_path>   s   r=   c                 C   s^   t | j}|| d }|s&|| r$|j| dd td|  dS dS td|  dS )zBCheck folder if there is a checkpoint, otherwise remove the folderz/*.pthT)	recursivez ! Run is removed from {}z ! Run is kept in {}N)fsspec
get_mapperfsglobexistsrmprintformat)experiment_pathrA   checkpoint_filesr   r   r   remove_experiment_folderF   s   
rI   c                 C   s   t dd |  D S )z1Count number of trainable parameters in a networkc                 s   s    | ]
}|j r| V  qd S N)requires_gradnumel)r   pr   r   r   r   T   r   z#count_parameters.<locals>.<genexpr>)sum
parameters)modelr   r   r   count_parametersR   s   rQ   c                 C   s6   |   } tddd | } | dd} | dd} | S )Nz(?!^)_([a-zA-Z])c                 S   s   |  d S )N   )groupupper)mr   r   r   <lambda>Y   s    zto_camel.<locals>.<lambda>TtsTTSvcVC)
capitalizeresubr%   )textr   r   r   to_camelW   s
   r_   module_pathmodule_namec                 C   s,   |  }t| d | }t|}t||S )N.)lower	importlibimport_moduler_   getattr)r`   ra   module
class_namer   r   r   find_module_   s   
ri   c                 C   s:   |  dd }d|  ddd } t| }t||S )zImport a class from a module path.

    Args:
        module_path (str): The module path of the class.

    Returns:
        object: The imported class.
    rb   N)r$   r7   rd   re   rf   )r`   rh   rg   r   r   r   import_classf   s   	

rk   objc                 C   s   d t| jt| jgS )zGet the import path of a class.

    Args:
        obj (object): The class object.

    Returns:
        str: The import path of the class.
    rb   )r7   type
__module____name__)rl   r   r   r   get_import_pathu   s   	rp   c                 C   s   t jd}t jd}|d urt| jdd}nC|d ur*t| jdd}n4tjdkrKdd l}|	|j
d}||d\}}t|jdd}ntjd	krWtd
 }nt d}|| S )NTTS_HOMEXDG_DATA_HOMEF)strictwin32r   z@Software\Microsoft\Windows\CurrentVersion\Explorer\Shell FolderszLocal AppDatadarwinz~/Library/Application Support/z.local/share)r5   environgetr   
expanduserresolvesysplatformwinregOpenKeyHKEY_CURRENT_USERQueryValueExhomejoinpath)appnamerq   rr   ansr|   keydir__r   r   r   get_user_data_dir   s"   


r   c                    s   |  D ]\}}| vrtd| q fdd|  D } fdd|  D }|drE|jd urE|jD ]fdd|  D }q7 | tdt|t   S )Nz. | > Layer missing in the model definition: {}c                    s   i | ]\}}| v r||qS r   r   r   kv
model_dictr   r   
<dictcomp>       z!set_init_dict.<locals>.<dictcomp>c                    s*   i | ]\}}|   |   kr||qS r   )rL   r   r   r   r   r      s   * reinit_layersc                    s   i | ]\}} |vr||qS r   r   r   )reinit_layer_namer   r   r      r   z! | > {} / {} layers are restored.)itemsrE   rF   hasr   updatelen)r   checkpoint_statecr   r   pretrained_dictr   )r   r   r   set_init_dict   s   

r   def_argskwargsc                 C   s6   |  }| D ]}||vs|| du r| | ||< q|S )aL  Format kwargs to hande auxilary inputs to models.

    Args:
        def_args (Dict): A dictionary of argument names and their default values if not defined in `kwargs`.
        kwargs (Dict): A `dict` or `kwargs` that includes auxilary inputs to the model.

    Returns:
        Dict: arguments with formatted auxilary inputs.
    N)copy)r   r   namer   r   r   format_aux_input   s   
r   c                   @   sH   e Zd Zdd Zdd Zdd Zddd	ZdddZdd Zdd Z	dS )KeepAveragec                 C   s   i | _ i | _d S rJ   
avg_valuesitersselfr   r   r   __init__   s   
zKeepAverage.__init__c                 C   s
   | j | S rJ   )r   )r   r   r   r   r   __getitem__      
zKeepAverage.__getitem__c                 C   s
   | j  S rJ   )r   r   r   r   r   r   r      r   zKeepAverage.itemsr   c                 C   s   || j |< || j|< d S rJ   r   )r   r   init_val	init_iterr   r   r   	add_value   s   
zKeepAverage.add_valueFc                 C   s   || j vr| j||d d S |r)d| j |  d|  | j |< | j|  d7  < d S | j | | j|  | | j |< | j|  d7  < | j |  | j|   < d S )Nr   gGz?g{Gz?rR   )r   r   r   )r   r   valueweighted_avgr   r   r   update_value   s   
zKeepAverage.update_valuec                 C   s$   |  D ]\}}| j||d qd S )Nr   )r   r   )r   	name_dictr   r   r   r   r   
add_values   s   zKeepAverage.add_valuesc                 C   s"   |  D ]
\}}| || qd S rJ   )r   r   )r   
value_dictr   r   r   r   r   update_values   s   zKeepAverage.update_valuesN)r   r   )F)
ro   rn   __qualname__r   r   r   r   r   r   r   r   r   r   r   r      s    

r   c                   C   s   t  dS )Nz%y%m%d-%H%M%S)r2   r3   r4   r   r   r   r   get_timestamp   s   r   Fc                 C   s   t | }t jddd}|| |r1tj||dt  }t j	|dd}	|	
| ||	 |rCt  }
|

| ||
 d S d S )Nz4%(asctime)s.%(msecs)03d - %(levelname)s: %(message)sz%y-%m-%d %H:%M:%S)datefmtz_{}.logw)mode)logging	getLogger	FormattersetLevelr5   r6   r7   rF   r   FileHandlersetFormatter
addHandlerStreamHandler)logger_namerootphaselevelscreentofilelg	formatterlog_filefhshr   r   r   setup_logger   s   




r   )"r2   rd   r   r5   r\   r    rz   pathlibr   typingr   r?   r   Tensorr   r   r+   r0   r=   rI   rQ   r_   strobjectri   rk   rp   r   r   r   r   r   INFOr   r   r   r   r   <module>   s8   
&