o
    2ѹgS^                     @   s  U 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m	Z	m
Z
mZmZmZmZmZmZ d dlmZmZmZmZ d dlmZmZ d dlmZ d dlm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' d dl(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> da?eej@ eAd< G dd dZBdS )    N)ArgumentParser)defaultdict)AnyCallableDefaultDictListOptionalSequenceTypeUnion)	Container
DictConfig	OmegaConfflag_override)get_column_widthsrun_and_report)ConfigLoader)ConfigSearchPath)HydraConfig)Plugins)	JobReturn
JobRuntimeconfigure_logrun_jobsetup_globalssimple_stdout_log_config)CompletionPlugin)ConfigSource)Launcher)SearchPathPlugin)Sweeper)HydraContextRunModeTaskFunction   )DefaultsTreeNodeInputDefault   )	Callbacks)ConfigLoaderImpl)#create_automatic_config_search_pathlogc                   @   s&  e Zd Zeded  dee dee dee dedd fddZed	ed
edd fddZ	d	ede
ddfddZdee dee defddZ	dgdee dedee dedef
ddZ	dgdee dedee dedef
ddZededefddZded edefd!d"Z	#dhdee dee d ed$ee d%eddfd&d'Zede
deeee f fd(d)Zdee dee ddfd*d+Zed,edefd-d.Zdid0edee fd1d2Z 	dgd3e!egef d4edefd5d6Z"d7eded,ed%edef
d8d9Z#dee d,ed:eddfd;d<Z$dee d,ed:eddfd=d>Z%edjd@edAedBeddfdCdDZ&edjd@edAedBeddfdEdFZ'dkdGdHZ(e)j*fdee dee dIe)ddfdJdKZ+dLe,ddfdMdNZ-e)j*fdee dee dIe)ddfdOdPZ.e)j*fdee dee dIe)ddfdQdRZ/e)j*fdee dee dIe)ddfdSdTZ0	#		dldee dee dIe)dedUedVedefdWdXZ1e)j*fdee dee dIe)ddfdYdZZ2e)j*fdee dee dIe)ddfd[d\Z3	]dmd^e4e5e6f d_e,ddfd`daZ7e)j*fdee dee dIe)ddfdbdcZ8e)j*fddedee dee dIe)ddf
dedfZ9dS )nHydraclscalling_filecalling_moduleconfig_pathjob_namereturnc                 C   s   t |||}t||S N)r*   r,   create_main_hydra2)r-   r.   r/   r0   r1   config_search_path r6   Y/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/hydra/_internal/hydra.py create_main_hydra_file_or_module)   s   z&Hydra.create_main_hydra_file_or_module	task_namer5   c                 C   s4   t |d}| ||d}ddlm} | | |S )N)r5   )r9   config_loaderr   )GlobalHydra)r)   Zhydra.core.global_hydrar;   instanceZ
initialize)r-   r9   r5   r:   hydrar;   r6   r6   r7   r4   7   s   zHydra.create_main_hydra2r:   Nc                 C   s   t   || _t d| dS )zY
        :param task_name: task name
        :param config_loader: config loader
        nameN)r   r:   r   set)selfr9   r:   r6   r6   r7   __init__G   s   zHydra.__init__config_name	overridesc                 C   s6   z| j ||dtjdd}|jjW S  ty   Y d S w )NF)rB   rC   with_log_configurationrun_modevalidate_sweep_overrides)compose_configr"   MULTIRUNr=   mode	Exception)r@   rB   rC   cfgr6   r6   r7   get_modeQ   s   
zHydra.get_modeTtask_functionrD   c           	      C   s   | j |||tjd}|jjd u rtj|j_n	|jjtjksJ t|}|j||d tt| j	|d||dd |d}|j
|||d |j}|S )NrB   rC   rD   rE   configrB   r:   	callbackszhydra.run.dir)hydra_contextrM   rP   Zjob_dir_keyZjob_subdir_keyZconfigure_logging)rP   rB   Z
job_return)rG   r"   RUNr=   rI   r(   Zon_run_startr   r!   r:   Z
on_run_endreturn_value)	r@   rB   rM   rC   rD   rK   rR   ret_r6   r6   r7   runb   s0   
z	Hydra.runc           
      C   s   | j |||tjd}t|}|j||d t j|t| j	|d|d}t
j|jjjdd}t|ts5J |j|d}	|j||d |	S )NrN   rO   rQ   )rP   rS   rM   Fresolve	arguments)rG   r"   rH   r(   Zon_multirun_startr   r<   Zinstantiate_sweeperr!   r:   r   Zto_containerr=   rC   task
isinstancelistZsweepZon_multirun_end)
r@   rB   rM   rC   rD   rK   rR   ZsweeperZtask_overridesrV   r6   r6   r7   multirun   s(   zHydra.multirunsrc_cfgc                 C   s   t | }t|ddgddg t| D ]	}|dkr||= qW d    n1 s*w   Y  t|jddgd |jd= |jd= W d    |S 1 sLw   Y  |S )NstructreadonlyFr=   
hydra_helphelp)copydeepcopyr   r_   keysr=   )ra   rK   keyr6   r6   r7   get_sanitized_hydra_cfg   s   


zHydra.get_sanitized_hydra_cfgrK   cfg_typec                 C   sj   |dv sJ |dkr*t |ddgddg |d= W d    |S 1 s#w   Y  |S |dkr3| |}|S )N)jobr=   allrl   rb   rc   Fr=   )r   rj   )r@   rK   rk   r6   r6   r7   get_sanitized_cfg   s   

zHydra.get_sanitized_cfgFpackagerZ   c                 C   s   | j ||tjdd}t | t|jd  | 	||}|dkr$d }|d u r+|}nt
||}|d u rDtjd| d td t|tsOt| d S |d urZtd|  |rat| tjt| d S )NFrB   rC   rE   rD   Z_global_z	package 'z' not found in config
r'   z# @package )rG   r"   rT   r   r<   
set_configr   Zset_readonlyr=   rn   selectsysstderrwriteexitr^   r   printrZ   stdoutto_yaml)r@   rB   rC   rk   ro   rZ   rK   rV   r6   r6   r7   show_cfg   s0   


zHydra.show_cfgc                 C   s   t t}t tD ]}t|tsJ || }||  | q|	 D ]\}}t
|dkrDddd |D }td| d| q&|S )Nr'   ,c                 S   s   g | ]}t |jqS r6   )type__name__).0pluginr6   r6   r7   
<listcomp>   s    z1Hydra.get_shell_to_plugin_map.<locals>.<listcomp>zMultiple plugins installed for  : )r   r_   r   r<   discoverr   
issubclassprovidesappenditemslenjoin
ValueError)r:   shell_to_pluginZclazzr   shellpluginslstr6   r6   r7   get_shell_to_plugin_map   s   zHydra.get_shell_to_plugin_mapc                    s   g d}t | t fdd|D }|dkr td| d| | jdtdtffd	d
}d v r@| j}|  d S d v rO| j	}|	  d S d v r`| j
}|j
|d d S d S )N)install	uninstallqueryc                 3   s    | ]	}| v rd V  qdS )r'   Nr6   )r~   ri   r[   r6   r7   	<genexpr>   s    z)Hydra.shell_completion.<locals>.<genexpr>r'   zExpecting one subcommand from z
 to be setcmdr2   c                    s@   |  vrd dd   D }td|  d|  |  d S )N
c                 S      g | ]}d | qS )	r6   r~   xr6   r6   r7   r          z?Hydra.shell_completion.<locals>.find_plugin.<locals>.<listcomp>zNo completion plugin for 'z' found, available : 
r   )r   rh   r   )r   r   )r   r6   r7   find_plugin   s   z+Hydra.shell_completion.<locals>.find_pluginr   r   r   )rB   )r   Zfrom_dotlistsumr   r   r:   strr   r   r   r   )r@   rB   rC   subcommandsZnum_commandsr   r   r6   )r\   r   r7   shell_completion   s"   



zHydra.shell_completionargs_parserc                 C   sX   d}d }| j D ]}t|jdkr|}q|d|j d|j d7 }q|d|j 7 }|S )N r   r{   r   r   zOverrides : )Z_actionsr   option_stringsr   re   )r   srC   actionr6   r6   r7   format_args_help  s   
 zHydra.format_args_helpr   parentc                 C   s   ddl m} g }| j|D ]8}|dkr|}nd||}| j||j}| j||j}t|dkr8|	| t|dkrF|
| | q|S )Nr   )
ObjectTyper   z{}/{})Zhydra.core.object_typer   r:   Zlist_groupsformatget_group_optionsCONFIGZGROUPr   r   extendlist_all_config_groups)r@   r   r   groupsgroupZ
group_namefilesdirsr6   r6   r7   r     s   
zHydra.list_all_config_groups	predicatecompactc           	         s    fdd|   D }d}t|D ].}t| j|}|r)d|}d||}nddd |D }d||}||d 7 }q|S )	Nc                    s   g | ]} |r|qS r6   r6   r   r   r6   r7   r   .  s    z.Hydra.format_config_groups.<locals>.<listcomp>r   z, z{}: {}r   c                 S   r   )  r6   )r~   or6   r6   r7   r   6  r   z{}:
{})r   sortedr:   r   r   r   )	r@   r   r   r   r   r   optionsr   liner6   r   r7   format_config_groups+  s   
zHydra.format_config_groupshelp_cfgc                    sf   t |j}dtdtfdd dtdtf fdd}|j| ||  | |tj	||dd}|S )	Nr   r2   c                 S   s   |  dp| dkS )Nzhydra/r=   )
startswithr   r6   r6   r7   is_hydra_groupE  s   z&Hydra.get_help.<locals>.is_hydra_groupc                    s
    |  S r3   r6   r   r   r6   r7   is_not_hydra_groupH  s   
z*Hydra.get_help.<locals>.is_not_hydra_grouprY   )Z
FLAGS_HELPZHYDRA_CONFIG_GROUPSZAPP_CONFIG_GROUPSr   )
stringTemplatetemplater   bool
substituter   r   r   ry   )r@   r   rK   r   rZ   r   r   	help_textr6   r   r7   get_help<  s   zHydra.get_helpargsc                 C   sF   | j d |jtjdd}|jj}| |}| j|||dd}t| d S )NTrp   FrY   )	rG   rC   r"   rT   r=   rd   rj   r   rw   )r@   rB   r   r   rK   r   r   r6   r6   r7   rd   S  s   
zHydra.hydra_helpc                 C   sb   | j ||jtjdd}t | |jj}t	
|}| |d}| j||||jd}t| d S )NTrp   rl   rY   )rG   rC   r"   rT   r   r<   rq   r=   re   rf   rg   rn   r   rZ   rw   )r@   rB   r   r   rK   r   Z	clean_cfgr   r6   r6   r7   app_helpa  s   

zHydra.app_help-headerprefixfillerc                 C   s8   t d usJ t ||   t |dt| |  d S Nr   r+   debugljustr   r   r   r   r6   r6   r7   _log_headert  s   zHydra._log_headerc                 C   s*   t d usJ t |dt| |  d S r   r   r   r6   r6   r7   _log_footerz  s   zHydra._log_footerc                 C   s   t d usJ | jddd dd t  D }ttttt	fD ]3}t |}t
|dkrRtj|j ddd	 |D ]}t d
|j |j|v rQ||j q;qt
|dkrmtjddd	 |D ]}t d
| qbd S d S )NzInstalled Hydra Plugins*r   r   c                 S   s   h | ]}|j qS r6   )r}   )r~   pr6   r6   r7   	<setcomp>  s    z'Hydra._print_plugins.<locals>.<setcomp>r   :r   )r   r   z		{}zGeneric plugins: )r+   r   r   r<   r   r   r   r   r    r   r   r,   r}   r   r   remove)r@   Zall_pluginsZplugin_typer   r   Zplugin_namer6   r6   r7   _print_plugins  s.   
zHydra._print_pluginsrE   c              	   C   s
  t d usJ t d | jddd ddgg}| j|||dd}t | | j|d	d
}|jj	j
}|D ]}||j|j d|j g q5t|\}}	dd|d|	}
| j|
dd |D ]}t d|j||j d|j |	 qb| j|
dd d S )Nr   zConfig search pathr   r   ZProviderzSearch pathFrp   r=   )rk   z://z| {} | {} |r   )r+   r   r   rG   r   r<   rq   rn   r=   ZruntimeZconfig_sourcesr   providerZschemapathr   r   r   r   )r@   rB   rC   rE   boxrK   sourcesspZprovider_padZsearch_path_padr   sourcer6   r6   r7   _print_search_path  s8   


 
zHydra._print_search_pathtop_nc                 C   sr  t d usJ t  }|d u rd S t|j }tdd |}t|dd dd}t	t
||}ddgg}|d| D ]}||d |d	 d
g q;t|}t d | jddd | jd|jd
ddd d|d d |d  d|d d	 |d	  d}	| j|	dd |d= |D ] }
|
d |d }|
d	 |d	 }t d| d| d q| j|	dd d S )Nc                 S   s   | d dkS )Nr'   gMb@?r6   r   r6   r6   r7   <lambda>  s    z5Hydra._print_plugins_profiling_info.<locals>.<lambda>c                 S   s   | d S )Nr'   r6   r   r6   r6   r7   r     s    T)ri   reverseModuleZSecr   r'   z.3fr   zProfiling informationr   r   zTotal plugins scan time : z secondsr   z| z | z |)r+   r   r<   Z	get_statsr_   Zmodules_import_timer   filterr   maxr   r   r   r   r   Z
total_timer   r   )r@   r   statsr   filteredsorted_itemsr   itempaddingr   rowabr6   r6   r7   _print_plugins_profiling_info  s4   

6z#Hydra._print_plugins_profiling_infoc                    s   t d usJ j d j d j d t fdd}t | jddd t	|dd	gd
d
g |d= W d    n1 sMw   Y  t 
t| d S )NrB   rC   rE   )rB   rC   c                      s   j  ddS )NFrp   )rG   r6   rB   rC   rE   r@   r6   r7   r     s    z*Hydra._print_config_info.<locals>.<lambda>ZConfigr   r   rb   rc   Fr=   )r+   r   _print_defaults_tree_print_defaults_listr   r   r<   rq   r   r   infor   ry   )r@   rB   rC   rE   rK   r6   r   r7   _print_config_info  s   zHydra._print_config_infoc           
      C   s>  t d usJ | jj|||d}g dg}|jD ]}|j|j|jr"dnd|jg}dd |D }|| qt	|}|d= t 
d | jd	d
d dd|d d|d d|d d|d }	| j|	dd |D ])}t 
d|d |d |d |d |d |d |d |d  ql| j|	dd d S )Nr   )Config pathPackage_self_ParentTrueFalsec                 S   s   g | ]
}|d ur
|ndqS r   r6   r   r6   r6   r7   r     s    z.Hydra._print_defaults_list.<locals>.<listcomp>r   r   zDefaults Listr   r   z| {} | {} | {} | {} | r   r   r'   r   r$   r      r   r   z| {} | {} | {} | {} |)r+   r:   compute_defaults_listdefaultsr0   ro   Zis_selfr   r   r   r   r   r   r   r   )
r@   rB   rC   rE   r   r   dr   r   r   r6   r6   r7   r      sJ   

	zHydra._print_defaults_listc                 C   s.   t d usJ t tjr| ||| d S d S r3   )r+   isEnabledForloggingDEBUG_print_all_infor@   rB   rC   rE   r6   r6   r7   _print_debug_info6  s   zHydra._print_debug_info
from_shellrF   c                 C   sH   | j j|||||d}|r"t|jj|jj tta	| 
||| |S )ae  
        :param config_name:
        :param overrides:
        :param run_mode: compose config for run or for multirun?
        :param with_log_configuration: True to configure logging subsystem from the loaded config
        :param from_shell: True if the parameters are passed from the shell. used for more helpful error messages
        :return:
        )rB   rC   rE   r  rF   N)r:   Zload_configurationr   r=   Zhydra_loggingverboser  	getLoggerr}   r+   r  )r@   rB   rC   rE   rD   r  rF   rK   r6   r6   r7   rG   @  s   
zHydra.compose_configc                 C   s   |    | jdd d S )N
   )r   )r   r   r  r6   r6   r7   _print_plugins_info`  s   zHydra._print_plugins_infoc                 C   s:   ddl m} | jd| dd |   | ||| d S )Nr$   )__version__zHydra =r   )r   r  r   r   r   )r@   rB   rC   rE   r  r6   r6   r7   r  i  s   zHydra._print_all_infor   treeindentc                    s   t d usJ ddlm m}m d|dtf fdd}d| }t|trY||j}|j	d urNt
|j	dkrNt || d	  |j	D ]}| j||d
 d qBt ||  d S d S t||s`J t |||  d S )Nr$   )GroupDefaultr&   VirtualRootnoder2   c                    sH   t | r	|  S t |  r |  }|d u rd}|  d | S |  S )Nnullz: )r^   Zget_config_pathget_nameZget_override_key)r  r>   r  r  r6   r7   to_str}  s   

z/Hydra._print_defaults_tree_impl.<locals>.to_strr   r   r   r'   )r  r  )r+   core.default_elementr  r&   r  r   r^   r%   r  childrenr   r   _print_defaults_tree_impl)r@   r  r  r&   r  padZnode_strchildr6   r  r7   r  u  s   


zHydra._print_defaults_tree_implc                 C   sF   t d usJ | jj|||d}t d | jddd | |j d S )Nr   r   zDefaults Treer   r   )r+   r:   r   r   r   r  Zdefaults_tree)r@   rB   rC   rE   r   r6   r6   r7   r     s   
zHydra._print_defaults_treer   c                 C   sz   | j | j| j| j| j| jd}ttjd t	t
a||vr2t| }tdd| d d S || |||d d S )N)rm   r   zdefaults-treerP   r   Z
searchpath)levelzInfo usage: --info [|]r   )r  r   r   r   r  r   r   r  r  r	  r}   r+   r   rh   errorr   )r@   r   rB   rC   rE   r   optsr6   r6   r7   	show_info  s   

zHydra.show_info)T)F)r   )r   r   )r2   N)FTT)r   ):r}   
__module____qualname__classmethodr
   r   r   r8   r   r4   r   rA   r   r   rL   r#   r   r   rX   r`   staticmethodr   rj   rn   rz   r   r   r   r   r   r   r	   r   r   r   r   rd   r   r   r   r   r"   rT   r   intr   r   r   r  rG   r  r  r   r%   r&   r  r   r!  r6   r6   r6   r7   r,   (   s   


+

%






)(

:

$



%
r,   )Crf   r  r   rs   argparser   collectionsr   typingr   r   r   r   r   r	   r
   r   Z	omegaconfr   r   r   r   Zhydra._internal.utilsr   r   Zhydra.core.config_loaderr   Zhydra.core.config_search_pathr   Zhydra.core.hydra_configr   Zhydra.core.pluginsr   Zhydra.core.utilsr   r   r   r   r   r   Zhydra.plugins.completion_pluginr   Zhydra.plugins.config_sourcer   Zhydra.plugins.launcherr   Z hydra.plugins.search_path_pluginr   Zhydra.plugins.sweeperr    Zhydra.typesr!   r"   r#   r  r%   r&   rR   r(   Zconfig_loader_implr)   utilsr*   r+   Logger__annotations__r,   r6   r6   r6   r7   <module>   s4   
( 