o
    qoi(                     @   s\  U 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	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
l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) d dl*m+Z+ e"eee e&e$gZ,eee"  e-d< e	G dd dZ.G dd dedZ/dede0fddZ1dS )    N)defaultdict)	dataclassfield)default_timer)AnyDictListOptionalTupleType)
DictConfig)SourcesRegistry)	Singleton)CompletionPlugin)ConfigSource)Launcher)Plugin)SearchPathPlugin)Sweeper)HydraContextTaskFunction)instantiatePLUGIN_TYPESc                   @   s@   e Zd ZU dZeed< dZeed< eedZ	e
eef ed< dS )	ScanStatsr   
total_timetotal_modules_import_time)default_factorymodules_import_timeN)__name__
__module____qualname__r   float__annotations__r   r   dictr   r   str r%   r%   F/home/ubuntu/.local/lib/python3.10/site-packages/hydra/core/plugins.pyr   $   s   
 r   c                   @   s:  e Zd Zedededd fddZd&ddZd&d	d
Zdee	 ddfddZ
dee	 ddfddZdede	fddZededefddZdedededefddZdedededefddZedee deeee	  ef fddZdee fddZ	d'd eee	  deee	  fd!d"Zed#eddfd$d%ZdS )(Pluginsargskwargsreturnc                  O   s*   t jtg| R i |}t|tsJ |S N)r   instancer'   
isinstance)r(   r)   retr%   r%   r&   r,   ,   s   zPlugins.instanceNc                 C   s   i | _ i | _d | _|   d S r+   )plugin_type_to_subclass_listclass_name_to_classstats_initializeselfr%   r%   r&   __init__2   s   zPlugins.__init__c                 C   s~   g }t d}|| zt d}|| W n	 ty!   Y nw tt| _i | _| j|d\}| _	|D ]}| 
| q5d S )Nzhydra._internal.core_pluginshydra_plugins)modules)	importlibimport_moduleappendImportErrorr   listr/   r0   _scan_all_pluginsr1   	_register)r4   	top_levelcore_pluginsr6   scanned_pluginsclazzr%   r%   r&   r2   8   s   



zPlugins._initializerB   c                 C   s   t |std| | dS )za
        Call Plugins.instance().register(MyPlugin) to manually register a plugin class.
        zNot a valid Hydra PluginN)_is_concrete_plugin_type
ValueErrorr>   )r4   rB   r%   r%   r&   registerK   s   zPlugins.registerc                 C   sz   t |sJ tD ]}t||r|| j| vr| j| | q|j d|j }|| j|< t|tr;t	
 | d S d S )N.)rC   r   
issubclassr/   r:   r   r   r0   r   r   r,   rE   )r4   rB   plugin_typenamer%   r%   r&   r>   S   s   


zPlugins._registerconfigc              
   C   s   ddl m} |j|dd}z9|d u rtd| |s#td| d|| j vr2td| d	| j| }t||d
}t	|t
sDJ W |S  ty_ } ztd| dt| dd }~ww )Nr   )utilsF)popzclass not configuredzInvalid plugin 'z ': not the hydra_plugins packagezUnknown plugin class : '')rJ   _target_zCould not instantiate plugin  : z

	IS THE PLUGIN INSTALLED?

)hydra._internalrK   _get_cls_namer;   is_in_toplevel_plugins_moduleRuntimeErrorr0   keysr   r-   r   r$   )r4   rJ   internal_utils	classnamerB   pluginer%   r%   r&   _instantiate^   s*   


zPlugins._instantiatec                 C   s   |  dp	|  dS )Nzhydra_plugins.zhydra._internal.core_plugins.)
startswith)rB   r%   r%   r&   rR   z   s   z%Plugins.is_in_toplevel_plugins_modulehydra_contexttask_functionc                C   N   t |  |jjd u rtd| |jj}t|tsJ |j|||d |S )NzHydra sweeper is not configuredr[   r\   rJ   )	r'   check_usagehydrasweeperrS   rY   r-   r   setup)r4   r[   r\   rJ   ra   r%   r%   r&   instantiate_sweeper   s   
zPlugins.instantiate_sweeperc                 C   r]   )Nz Hydra launcher is not configuredr^   )	r'   r_   r`   launcherrS   rY   r-   r   rb   )r4   r[   r\   rJ   rd   r%   r%   r&   instantiate_launcher   s   
zPlugins.instantiate_launcherr7   c                 C   s2  t  }t |_g }| D ]}tj|j|jd dd dD ]\}}}z|ddd }|dr6|ds6W qt }t	j
d	d
I}	tjdk rV||}
|
d usPJ |
|}n+||}|d usaJ |tjv rltj| }ntj|}|d ur|j| |tj|< W d    n1 sw   Y  t | }t|	dkrtjd| d |	D ]}t	j|j|j|j|j|j|jd q| j |7  _ ||j!vsJ ||j!|< |d urt"#|D ]\}}t$|r|%| qW q t&y } zt	j'd| dt(|j d| t)d W Y d }~qd }~ww qt |j |_||fS )NrF   c                 S   s   d S r+   r%   )xr%   r%   r&   <lambda>   s    z+Plugins._scan_all_plugins.<locals>.<lambda>)pathprefixonerror   ___T)record)   
   r   z)[Hydra plugins scanner] : warnings from 'z#'. Please report to plugin author.
)messagecategoryfilenamelinenofilelinez
	Error importing 'zl'.
	Plugin is incompatible with this Hydra version or buggy.
	Recommended to uninstall or upgrade plugin.
		rO   )rr   rs   )*r   timerr   pkgutilwalk_packages__path__r   rsplitrZ   warningscatch_warningssysversion_infofind_moduleload_module	find_specr7   r8   utilmodule_from_specloaderexec_modulelenstderrwriteshowwarningrr   rs   rt   ru   rv   rw   r   r   inspect
getmembersrC   r:   r;   warntypeUserWarning)r7   r1   rA   mdlimportermodnameispkgmodule_nameimport_timerecorded_warningsm
loaded_modspecwrI   objrX   r%   r%   r&   r=      s   







	

>zPlugins._scan_all_pluginsc                 C   s   | j S r+   )r1   r3   r%   r%   r&   	get_stats   s   zPlugins.get_statsrH   c                 C   sT   t |  g }|du rt}t|tsJ || jvrg S | j| D ]}|| q |S )z
        :param plugin_type: class of plugin to discover, None for all
        :return: a list of plugins implementing the plugin type (or all if plugin type is None)
        N)r'   r_   r   rG   r/   r:   )r4   rH   r.   rB   r%   r%   r&   discover   s   

zPlugins.discoverself_c                 C   s*   t | tstdt d d  dd S )Nz6Plugins is now a Singleton. usage: Plugins.instance().rk   rp   z(...))r-   r'   rD   r   stack)r   r%   r%   r&   r_     s
   
zPlugins.check_usage)r*   Nr+   )r   r   r    staticmethodr   r,   r5   r2   r   r   rE   r>   r   rY   r$   boolrR   r   r   r   rc   r   re   r   r
   r   r=   r	   r   r   r_   r%   r%   r%   r&   r'   +   sV    



J


r'   )	metaclassr   r*   c                 C   s    t | ot| tot |  S r+   )r   isclassrG   r   
isabstract)r   r%   r%   r&   rC     s   rC   )2r8   importlib.utilr   ry   r   r}   collectionsr   dataclassesr   r   timeitr   rx   typingr   r   r   r	   r
   r   	omegaconfr    hydra._internal.sources_registryr   hydra.core.singletonr   hydra.plugins.completion_pluginr   hydra.plugins.config_sourcer   hydra.plugins.launcherr   hydra.plugins.pluginr    hydra.plugins.search_path_pluginr   hydra.plugins.sweeperr   hydra.typesr   r   hydra.utilsr   r   r"   r   r'   r   rC   r%   r%   r%   r&   <module>   sB   
 
 a