o
    oi*                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZmZ d dlmZ edZG dd dZG d	d
 d
Ze ZG dd deZdS )    N)ConfigParser)shlex)AnyListOptionalTupleTypeTypeVarUnion)loggerTc                   @   s   e Zd Zdd ZdS )DfParamsc                 C   s   t dtddd| _t dtddd| _t dtddd| _t d	td
dd| _t dtddd| _t ddtdd| _t ddtdd| _	t ddtdd| _
t ddtdd| _t dtddd| _t dtddd| _t dddd| _d S )NSRi  DF)castdefaultsectionFFT_SIZEi  HOP_SIZEi  NB_ERB    NB_DF`   NORM_TAU   )r   LSNR_MAX#   LSNR_MINiMIN_NB_ERB_FREQS   DF_ORDER   DF_LOOKAHEADr   PAD_MODEinput)r   r   )configintsrfft_sizehop_sizenb_erbnb_dffloatnorm_taulsnr_maxlsnr_minmin_nb_freqsdf_orderdf_lookaheadpad_modeself r6   G/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/config.py__init__   s   zDfParams.__init__N)__name__
__module____qualname__r8   r6   r6   r6   r7   r      s    r   c                   @   s  e Zd ZdZdZdd Z	d(dee fdd	Zd)d
dZ	defddZ
dd Zd*dededee dee def
ddZdeddfdededee dedee defddZdd Zedfdedee dee defddZdededefd d!Zd"d# Zd$d% Zd&d' ZdS )+ConfigzAdopted from python-decouplesettingsc                 C   s   d | _ d| _d| _d| _d S )N FT)parserpathmodifiedallow_defaultsr4   r6   r6   r7   r8   /   s   
zConfig.__init__FTr@   c                 C   s   || _ | jd ur|stdt | _|| _|d ur:tj|r:t|}| j| W d    n1 s4w   Y  n
|rDtd| d| j	| j
sR| j| j
 |   |   d S )NzConfig already loadedzNo config file found at 'z'.)rB   r?   
ValueErrorr   r@   osisfileopen	read_filehas_sectionDEFAULT_SECTIONadd_section_fix_clc_fix_df)r5   r@   config_must_existrB   allow_reloadfr6   r6   r7   load5   s    
zConfig.loadc                 C   s   | j d d|d d S )NF)r@   rM   rN   )rP   )r5   rN   r6   r6   r7   use_defaultsH   s   zConfig.use_defaultsc                 C   s   | j s
td d S | jd u rt | _| j D ]}t| j| dkr)| j| qt|dd}| j	| W d    d S 1 sBw   Y  d S )Nz2Config not modified. No need to overwrite on disk.r   w)mode)
rA   r   debugr?   r   sectionslenremove_sectionrF   write)r5   r@   r   rO   r6   r6   r7   saveK   s   

"zConfig.savec                    s@   t  trt |ttfrd fdd|D d d S t|S )Nr>   c                 3       | ]
}t | j V  qd S Nstr	delimiter.0vr   r6   r7   	<genexpr>Y       zConfig.tostr.<locals>.<genexpr>)
isinstanceCsvtuplelistjoinr]   r5   valuer   r6   rb   r7   tostrW   s    zConfig.tostrNoptionrl   r   r   returnc                 C   s   |d u r| j n|}| }| j|s| j| | j||r/|| | j|||kr/|S d| _| j	||| 
|| |S )NT)rI   lowerr?   rH   rJ   
has_optionr   getrA   setrm   )r5   rn   rl   r   r   r6   r6   r7   rs   \   s   z
Config.setr   rY   c                 C   sT  |d u r| j n|}d }| jd u rtd| j| s$| j|  | tjv rAtj|  }|r@| j	||| 
|| nc| j||rP| j||}nT| j| |rc| j| |}nA| j| j |rtd| d| d | j| j |}n$|d u rtd|| js|rtd| d|}|r| 	|||| | ||S )NzNo configuration loadedzCouldn't find option z in section z+. Falling back to default settings section.zValue {} not found.zValue 'z-' not found in config (defaults not allowed).)rI   r?   rC   rH   rp   rJ   upperrD   environrs   rm   rq   rr   r   warningformatrB   r   )r5   rn   r   r   rY   r   rl   r6   r6   r7   __call__h   s8   	

zConfig.__call__c                 C   s<   |t u rt| }|dv rdS |dv rdS td||S )N>   1yonyestrueT>   0nnoofffalseFzParse error)boolr]   rp   rC   rk   r6   r6   r7   r      s   zConfig.castc                 C   sR   |d u r| j n|}| j|st|| j||st|| | j|||S r[   )rI   r?   rH   KeyErrorrq   r   rr   )r5   rn   r   r   r6   r6   r7   rr      s   z
Config.getc                 C   sf   | j |std| dS | j ||s td| d| dS d| _t|}| j ||| ||S )NzSection not found: ''zOption not found 'z' in section 'T)r?   rH   rC   rq   rA   typers   rm   )r5   r   rn   rl   r   r6   r6   r7   	overwrite   s   zConfig.overwritec                 C   s   | j dr0| j dr0| j d }| j d }d|v r#|d |d< |d= d|v r0|d |d< |d= | j dr]d| j d v r_| j dsI| j d | j d d | j d d< | j d d= dS dS dS )	BRenaming of some groups/options for compatibility with old models.deepfilternetdfr1   r2   trainp_reverb
distortionN)r?   rH   rJ   )r5   sec_deepfilternetsec_dfr6   r6   r7   rL      s   

zConfig._fix_dfc              	   C   s   | j ds.| j dr.| j dddkr.| ddd | j d | j d | j d< | j d= | j dsF| j drF| j d | j d< | j d= | j  D ](}| j |  D ]\}}d| v rr| j || 	dd| | j | |= qTqKdS )	r   r   r   modelconvgru5convgrur   clcN)
r?   rH   rr   r   rJ   rU   itemsrp   rs   replace)r5   r   kra   r6   r6   r7   rK      s(   

zConfig._fix_clcc                 C   sT   d}| j  D ] }|| d7 }| j |  D ]\}}|d| d| d7 }qq|S )Nr>   z:
z  z: 
)r?   rU   r   )r5   msgr   r   ra   r6   r6   r7   __repr__   s   zConfig.__repr__)FTF)Fr[   )r9   r:   r;   __doc__rI   r8   r   r]   rP   rQ   rY   rm   r   r   rs   r   r   rx   r   rr   r   rL   rK   r   r6   r6   r6   r7   r<   *   sF    

(
'(	r<   c                   @   sV   e Zd ZdZedejefdee	 fddZ
deeee	 ee	 f dee	 fdd	Zd
S )rg   za
    Produces a csv parser that return a list of transformed elements. From python-decouple.
    ,r   c                 C   s   || _ || _|| _|| _dS )ai  
        Parameters:
        cast -- callable that transforms the item just before it's added to the list.
        delimiter -- string of delimiters chars passed to shlex.
        strip -- string of non-relevant characters to be passed to str.strip after the split.
        post_process -- callable to post process all casted values. Default is `list`.
        N)r   r^   strippost_process)r5   r   r^   r   r   r6   r6   r7   r8      s   

zCsv.__init__rl   ro   c                    sl   t |ttfrd fdd|D dd } fddt|dd	} j|_d|_ fd
d|D S )zThe actual transformationr>   c                 3   rZ   r[   r\   r_   r4   r6   r7   rc      rd   zCsv.__call__.<locals>.<genexpr>Nre   c                    s     |  jS r[   )r   r   )sr4   r6   r7   	transform   s   zCsv.__call__.<locals>.transformT)posixc                 3   s    | ]} |V  qd S r[   r6   )r`   r   )r   r6   r7   rc      s    )	rf   rh   ri   rj   r   r^   
whitespacewhitespace_splitr   )r5   rl   splitterr6   )r5   r   r7   rx      s    zCsv.__call__N)r9   r:   r;   r   r]   stringr   ri   r   r   r8   r
   r   r   rx   r6   r6   r6   r7   rg      s    

,rg   )rD   r   configparserr   r   typingr   r   r   r   r   r	   r
   logurur   r   r   r<   r%   objectrg   r6   r6   r6   r7   <module>   s    $ 0