
    i \              
          S r SSKrSSKrSSKrSSKJr  SSKJrJrJ	r	J
r
Jr  SSKJrJr  SSKJrJrJr  SSKJr  SSKJr  SS	KJrJrJr  \R6                  " S
5       " S S5      5       r\R6                  " S
5       " S S5      5       rS\S\	\   S\
\   S\SS4
S jrS\S\	\   S\
\   S\SS4
S jr S\S\	\   S\
\   S\SS4
S jr!\R6                  " S
5       " S S5      5       r"g)z)
Common test functions testing launchers
    N)Path)AnyCallableListOptionalSet)
DictConfig	OmegaConf)markparamraises)TaskFunction)HydraException)TSweepRunnerintegration_testverify_dir_outputshydra_restore_singletonsc            
       x   \ rS rSrS\\\/\4      4S jrS\S\	S\
\	   S\SS4
S	 jrS\S\	S\
\	   S\SS4
S
 jrS\S\	S\
\	   S\SS4
S jrS\S\	S\
\	   S\SS4
S jrS\S\	S\
\	   S\SS4
S jrS\S\	S\
\	   S\SS4
S jrS\S\	S\
\	   S\SS4
S jrS\S\	S\
\	   S\SS4
S jrS\S\	S\
\	   S\SS4
S jrSrg)LauncherTestSuite   returnc                 (    S[         S[        4S jnU$ )N_r   c                     g)Nd    )r   s    e/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/hydra/test_utils/launcher_common_tests.py	task_func6LauncherTestSuite.get_task_function.<locals>.task_func   s        )r	   r   )selfr   s     r   get_task_function#LauncherTestSuite.get_task_function   s    	 	 	 r    hydra_sweep_runnerlauncher_name	overridestmpdirNc                 F    [        USU-   /U-   U R                  5       US9  g Nhydra/launcher=r&   task_functiontemp_dirsweep_1_jobr"   r!   r$   r%   r&   r'   s        r   test_sweep_1_job"LauncherTestSuite.test_sweep_1_job   .     	(=89IE002		
r    c                 F    [        USU-   /U-   U R                  5       US9  g r)   )sweep_2_jobsr"   r0   s        r   test_sweep_2_jobs#LauncherTestSuite.test_sweep_2_jobs-   s.     	(=89IE002		
r    c                     [        [        [        R                  " S5      S9   U" S SS SSUSU-   SS/-   US	9    S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)
NzQSweeping over Hydra's configuration is not supported : 'hydra.verbose=true,false')matchhydra.test_utils.a_moduleconfigscompose.yamlr*   +a=0,1zhydra.verbose=true,falsecalling_filecalling_moduler,   config_pathconfig_namer&   r-   )r   r   reescaper0   s        r   !test_not_sweeping_hydra_overrides3LauncherTestSuite.test_not_sweeping_hydra_overrides;   s     ))c
 $!:"%*#%5.   
 
 
 
s!   AAA
A	A
A+c                 F    [        USU-   /U-   U R                  5       US9  g r)   r.   r0   s        r   test_sweep_1_job_strict)LauncherTestSuite.test_sweep_1_job_strictX   r3   r    c                     [        [        5         [        USU-   S/U-   U R                  5       US9  S S S 5        g ! , (       d  f       g = f)Nr*   zboo=barr+   )r   	Exceptionr/   r"   r0   s        r   #test_sweep_1_job_strict_and_bad_key5LauncherTestSuite.test_sweep_1_job_strict_and_bad_keyf   sD     I",}<iH9T"446	 s	   #<
A
c                 F    [        USU-   /U-   U R                  5       US9  g r)   )sweep_two_config_groupsr"   r0   s        r   test_sweep_2_optimizers)LauncherTestSuite.test_sweep_2_optimizersw   s.     	 (=89IE002		
r    c           
      
   SU-   S/nU" S SU R                  5       SSXS-   US9nS/S//n[        R                  " S	S
05      [        R                  " S	S05      /nU   UR                  c   e[	        UR                  S   5      S:X  d   e[        S5       HR  n	UR                  S   U	   n
U
R                  Xy   :X  d   eU
R                  X   :X  d   e[        XR                  5        MT     S S S 5        g ! , (       d  f       g = f)Nr*   group1=file1,file2r:   r;   unspecified_mandatory_defaultr>   group1=file1group1=file2foo
      r      )	r"   r
   createreturnslenranger&   cfgr   r!   r$   r%   r&   r'   base_overridessweepexpected_overridesexpected_confijob_rets              r   -test_sweep_over_unspecified_mandatory_default?LauncherTestSuite.test_sweep_over_unspecified_mandatory_default   s    ,m;=QR"6002!7$0
  ..0@A"))5"+6	8H8H%QS8UV==,,,u}}Q'(A---1X--*1-((,>,AAAA{{m&6666"7,=,=>	  UUs   BC44
Dc           
         SU-   SS/nU" SSSSSXS-   US9nS	S/S
S//nSSSSS.0SSSSSS.0/nU   UR                   c   e[        UR                   S   5      S:X  d   e[        S5       HR  n	UR                   S   U	   n
U
R                  Xy   :X  d   eU
R                  X   :X  d   e[        XR                  5        MT     SSS5        g! , (       d  f       g= f)a>  
Tests that we can override things in the configs merged in only during the sweep config construction
db.user=someone does not exist db_conf.yaml, and is only appear when we merge in db=mysql or db=postgresql.
This presents a tricky situation when operating in strict mode, this tests verifies it's handled correctly.
r*   zdb=mysql,postgresqlzdb.user=someoneNr:   r;   zdb_conf.yamlr>   zdb=mysqlzdb=postgresqldbmysqlsecretsomeone)driverpassworduser
postgresqldrowssaprX   )rp   rn   ro   timeoutr   rZ   )r\   r]   r^   r&   r_   r   r`   s              r   test_sweep_and_override)LauncherTestSuite.test_sweep_and_override   s!    -!

 #6!&$0
 *+/0

 g8YOP%* *!	

 ==,,,u}}Q'(A---1X--*1-((,>,AAAA{{m&6666"7,=,=>	  UUs   BC


Cc           
      V   SU-   /U-   nS[         S[        4S jnU" S SUSSUUS9nS[        4S	 jn[        R                  " S
U5        U   UR                  c   eUR                  S   n	[        U	5      S:X  d   eU	S   R                  S:X  d   e S S S 5        g ! , (       d  f       g = f)Nr*   cr   c                     U R                   $ )N)x)rw   s    r   r   DLauncherTestSuite.test_sweep_with_custom_resolver.<locals>.task_func   s    33Jr    r:   r;   custom_resolverr>   c                      g)NrW   r   r   r    r   my_custom_resolverMLauncherTestSuite.test_sweep_with_custom_resolver.<locals>.my_custom_resolver   s    r    r}   r      rW   )r	   r   r
   register_new_resolverr\   r]   return_value)
r!   r$   r%   r&   r'   
overrides1r   rb   r}   rf   s
             r   test_sweep_with_custom_resolver1LauncherTestSuite.test_sweep_with_custom_resolver   s     (-789D
	 	 	 #6#!) 
	C 	 	''(<>PQ==,,,mmA&Gw<1$$$1:**e333	 UUs   AB
B(r   )__name__
__module____qualname____firstlineno__r   r   r   r"   r   strr   r   r1   r6   rE   rH   rL   rP   rg   rt   r   __static_attributes__r   r    r   r   r      s    8HcUCZ,@#A 
(
 
 9	

 
 


(
 
 9	

 
 

(  9	
  
:
(
 
 9	

 
 

(  9	
  
"
(
 
 9	

 
 

?(? ? 9	?
 ? 
?80?(0? 0? 9	0?
 0? 
0?d4(4 4 9	4
 4 
4r    r   c            
       8    \ rS rSrS\S\S\\   S\SS4
S jrS	r	g)
BatchedSweeperTestSuite   r$   r%   r&   r'   r   Nc           
         SS/nSU-   /nUR                  U5        UR                  U5        U" S SS SSUUS9nSS	/SS
/SS/SS	/SS
/SS//nSSS.SSS.SSS.SSS.SSS.SSS./n	[        5       n
U   UR                  nUc   e[        U5      S-  nUR	                  5       (       d   e[
        R                  " U5      nUR                  R                  R                  U:X  d   eUR                  c   e[        UR                  5      S:X  d   eUR                   H  n[        U5      S:X  a  M   e   UR                   VVs/ s H  o  H  oPM     M     nnn[        U5      S:X  d   e[        U5       Ha  u  nnUR                  UU   :X  d   eUR                  U	U   :X  d   eU
R                  UR                  5        [!        UUR                  5        Mc     S S S 5        [        U
5      S:X  d   eg s  snnf ! , (       d  f       N&= f)NrS   zbar=100,200,300r*   r:   r;   r<   r>   rU   zbar=100zbar=200zbar=300rV   rX   r   rW   bar   i,  rY   multirun.yaml   rZ      )extendsetr-   r   existsr
   loadhydrar&   taskr\   r]   	enumerater_   addworking_dirr   )r!   r$   r%   r&   r'   job_overrideshydra_overridesrb   rc   rd   dirsr-   multirun_cfg_pathmultirun_cfgbatchrtflatidxrf   s                      r   test_sweep_2_jobs_2_batches3BatchedSweeperTestSuite.test_sweep_2_jobs_2_batches   s?    ./@A,}<=')"6!&
 Y'Y'Y'Y'Y'Y'
 s#s#s#s#s#s#
 ~~H''' $X @$++----$>>*;<L%%//44EEE==,,,u}}%***5zQ& ' %*MMBM5EbBEBMDBt9>!> )$W((,>s,CCCC{{mC&8888,,-"7G,=,=>	 !0! * 4yA~~ C Us&   3B9G;0G;G5BG;5G;;
H	r   )
r   r   r   r   r   r   r   r   r   r   r   r    r   r   r      s;    <(< < 9	<
 < 
<r    r   r$   r&   r,   r-   r   c           
         U " SSUSSUUS9nU   UR                   c   eUR                   S   n[        U5      S:X  d   eUS   R                  / :X  d   eUS   R                  SS	S
.:X  d   eUS   R                  R
                  R                  R                  S:X  d5   SUS   R                  R
                  R                  R                  -   5       eUS   R                  R
                  R                  R                  c   eUS   R                  R
                  R                  R                  c   e[        UR                   S   S   5        SSS5        g! , (       d  f       g= f)z
Runs a sweep with one job
Nr:   r;   r<   r>   r   r   rX   r   r   a_moduleUnexpected job name: )r\   r]   r&   r_   	hydra_cfgr   jobnameidnumr   )r$   r&   r,   r-   rb   rf   s         r   r/   r/   5  sR    2#"E 
}}(((--"7|q   qz##r)))qz~~C!8888qz##))--22j@ 	
#gaj&:&:&@&@&D&D&I&II	
@ qz##))--00<<<qz##))--11===5==+A./ 
s   D>E
E$c           
      "   S/nUR                  U5        U " SSUSSUUS9nSSS	S
.nU   UR                  c   eUR                  c   e[        UR                  5      nUS-  nUR	                  5       (       d   e[
        R                  " U5      nUR                  R                  R                  U:X  d   e[        UR                  S	   5      S:X  d   e[        S5       GH  n	UR                  S	   U	   n
[
        R                  " U5      nXl        U
R                  SU	 3/:X  d   eU
R                  U:X  d   eU
R                  R                  R                   R"                  S:X  d2   SU
R                  R                  R                   R"                  -   5       eU
R                  R                  R                   R$                  c   eU
R                  R                  R                   R&                  c   e[)        XR                  5        U[+        U	5      -  nUR-                  5        Vs/ s H  oR/                  5       (       d  M  UPM     nnUR	                  5       (       a  GM   SU SU 35       e   SSS5        gs  snf ! , (       d  f       g= f)z
Runs a sweep with two jobs
r=   Nr:   r;   composer>   rX   r   r   )rW   r   ar   rZ   z+a=r   r   'z' does not exist, dirs: )r   r-   r\   r   r   r
   r   r   r&   r   r]   r^   r[   r   r_   r   r   r   r   r   r   r   iterdiris_dir)r$   r&   r,   r-   r   rb   base_cfgr   r   re   rf   rd   pathry   lsts                  r   r5   r5   V  sV    JM]#2#E #A.H	~~)))}}((('$6 '')))) ~~&78!!++00MAAA5==#$)))qAmmA&q)G%,,X6MO$$3qc333;;-///$$**..33zA ''*;*;*A*A*E*E*J*JJA $$**..11===$$**..22>>>w(9(9:c!f$D&..0?0HHJ10C?;;==IAdV+CC5"II=  
4 @5 
s*   G>J 'I;I;	J #J ;J  
Jc           
      0   [         R                  " U5      nUR                  S/5        U " SSUSSUUS9nS/S//n[        R                  " S	S
S.5      [        R                  " SS
S.5      /nU   UR
                  c   e[        UR
                  S   5      S:X  d   e[        S5       HR  nUR
                  S   U   nUR                  XW   :X  d   eUR                  Xg   :X  d   e[        XR                  5        MT     SSS5        g! , (       d  f       g= f)zB
Make sure that optimizers=adam,nesterov is interpreted correctly
rS   Nr:   r;   r   r>   rU   rV   rX   r   r   rY   r   rZ   )copydeepcopyr   r
   r[   r\   r]   r^   r&   r_   r   )	r$   r&   r,   r-   rb   rc   rd   re   rf   s	            r   rO   rO     s    i(I*+,2#E **^,<=C01C01M 
}}(((5==#$)))qAmmA&q)G$$(:(====;;-"2222w(9(9:	  
s   /BD
Dc                   r   \ rS rSrS\\   4S jrS\S\4S jrS\S\	\
   4   4S jr\R                  " S\" S	/ S
SSS9\" S	S/S
SSS9\" SSSS000/ SSSS9\" SSSS000S/SSSS9/5      S\S\S\	\
   S\
S\
S\S\	\
   SS	4S j5       r\R                  " S\" SSS S!S".00/ S#S$S9\" 0 S%S&/S'S(S9\" SSS S!S".00S%S&/S'S)S9\" SS*S+S".0S,S-S..S/S0/S1S2S9\" S*S+S".S3S4S5S6S7/S8.00S9.S,S-S:S;./ S<QS=S>S9/5      S\S\
S\	\
   S?\
S\S\	\
   SS	4S@ j5       rS\S\S\	\
   SS	4SA jrS\S\S\	\
   SS	4SB jrSCrg	)DIntegrationTestSuitei  r   c                     g)z
By default test applications working dir is tmpdir, override this method if that's not the case.
This could be helpful when the tests kick off applications on remote machines.
Nr   )r!   s    r   get_test_app_working_dir-IntegrationTestSuite.get_test_app_working_dir  s    
 r    r'   c                     U$ )zf
By default test applications will use tmpdir provided by the
This can be customized by applications.
r   )r!   r'   s     r   get_test_scratch_dir)IntegrationTestSuite.get_test_scratch_dir  s	    
 r    .c                 P    S[         [           S[        S[         [           4S jnU$ )zy
By default this does nothing, but it allows custom execution commands.
Useful if the tests are not kicked off by python
cmdfilenamer   c                     U $ )z
param cmd: old python commands in list of strings
param filename: file name to be executed as main hydra module
return: new commands to be executed in list of strings
r   )r   r   s     r   fun5IntegrationTestSuite.generate_custom_cmd.<locals>.fun  s	     Jr    )r   r   )r!   r   s     r   generate_custom_cmd(IntegrationTestSuite.generate_custom_cmd  s+    	T#Y 	# 	$s) 	 
r    z/task_config, overrides, filename, expected_nameNzno_config.py	no_config)r   zhydra.job.name=overridden_nameoverridden_namedifferent_filenamer   r   r   name_from_config_filezwith_config.py0different_filename_and_config_file_name_overrideJdifferent_filename_and_config_file_name_override_and_command_line_overridetask_configr&   r   expected_nametask_launcher_cfgextra_flagsc           
      :   Xs-   n[         R                  " U=(       d    0 5      n[         R                  " U=(       d    0 5      n[         R                  " Xb5      n[        U[        5      (       d   e[        U R                  U5      UUSUUU R                  5       S9  g )NzHydraConfig.get().job.name)r'   r   r&   printsexpected_outputsr   r   )r
   r[   merge
isinstancer	   r   r   r   )	r!   r'   r   r&   r   r   r   r   r_   s	            r   test_custom_task_name*IntegrationTestSuite.test_custom_task_name  s    J  +	%,,->-D"E&&{'8b9oo/=#z****,,V4/* $ 8 8 :	
r    z$task_config, overrides, expected_dirrb   task_cfgztask_cfg_${hydra.job.num})dirsubdirztask_cfg/task_cfg_0sweep_dir_config_overridehydra.sweep.dir=cli_dir+hydra.sweep.subdir=cli_dir_${hydra.job.num}cli_dir/cli_dir_0sweep_dir_cli_override sweep_dir_cli_overridding_configr   z${hydra.job.override_dirname}hellorY   )r   r   ba=1b=2zhydra_cfg/a=1,b=2zsubdir:override_dirnameconfigoverride_dirnamer   +seed)kv_sepitem_sepexclude_keys)rb   r   z???)r   r   r   r   )r   r   zseed=10zhydra_cfg/a_1+b_2zsubdir:custom_override_dirnameexpected_dirc           	         Xc-   n[         R                  " U=(       d    0 5      n[         R                  " U=(       d    0 5      n[         R                  " XR5      n[        U[        5      (       d   eU R                  5       nU(       a  [        U R                  U5      U-  5      O[        U R                  U5      U-  5      n	[        U R                  U5      UUS/-   SU	U R                  5       S9  g )Nhydra.job.chdir=Trueos.getcwd()r'   r   r&   r   r   r   )
r
   r[   r   r   r	   r   r   r   r   r   )
r!   r'   r   r&   r   r   r   r_   test_app_dirr   s
             r   test_custom_sweeper_run_workdir4IntegrationTestSuite.test_custom_sweeper_run_workdir  s    z  +	%,,->-D"E&&{'8b9oo/=#z****446  )),7,FGT..v6EF 	 	,,V4#9":: - $ 8 8 :	
r    c                    Un[         R                  " U=(       d    0 5      n[         R                  " 5       n[         R                  " X%5      n[        U[        5      (       d   e[        U R                  U5      UUS[        R                  R                  [        U R                  U5      5      5      U R                  5       S9  g )Nzhydra.utils.get_original_cwd()r   )r
   r[   r   r   r	   r   r   osr   realpathr   r   )r!   r'   r   r   r&   r   r_   s          r   test_get_orig_dir_multirun/IntegrationTestSuite.test_get_orig_dir_multirunt  s      	%,,->-D"E&&(oo/=#z****,,V43WW--c$2K2KF2S.TU $ 8 8 :	
r    c           	         SnU/ SQ-   n[         R                  " U=(       d    0 5      n[         R                  " 5       n[         R                  " X&5      n[        U[        5      (       d   e[        [        S5      R                  5       5      n[        U R                  U5      UUSUU R                  5       S9  U R                  5       n	U	(       a  U	OUn
[        R                  R                  [        U R                  U5      S-  5      5      [        U R                  U
5      U-  5      /n[        U R                  U5      UUSS/UU R                  5       S9  g )	Nr   )r   r   r   z/foo/barz(hydra.utils.to_absolute_path('/foo/bar')r   zfoo/barz'hydra.utils.to_absolute_path('foo/bar')r   )r
   r[   r   r   r	   r   r   absoluter   r   r   r   r   r   r   )r!   r'   r   r   r   r&   r   r_   r   r   r   outputss               r   test_to_absolute_path_multirun3IntegrationTestSuite.test_to_absolute_path_multirun  s=    + #
 
	
 &,,->-D"E&&(oo/=#z****4
#,,./,,V4=! $ 8 8 :	
 446&2l GGS!:!:6!BY!NOP))+6EF
 	,,V4=}M$ $ 8 8 :	
r    r   )r   r   r   r   r   r   r   r   r   r   r   r   r   parametrizer   r	   r   r   r   r  r   r   r    r   r   r     s"   (4. 4 D Xc49n%=   
9$NKKH12!' 56+B"CDE 'E 56+B"CDE12 !_!	
6

  
 9	

 
 
 &
 #Y
 

76
4 
.#-&A" %. -A $+ #-&A" .A $5    #.&E" !	 #, 
 $/&E"
 % 2.1035;H5"'  !!%( *#31mP	
Sh

 
 9	

 
 &
 #Y
 

iSh
<

/9
HLS	
	
$$
$
/9$
HLS	$
	$
r    r   )#__doc__r   r   rC   pathlibr   typingr   r   r   r   r   	omegaconfr	   r
   pytestr   r   r   r   r   hydra.errorsr   hydra.test_utils.test_utilsr   r   r   usefixturesr   r   r   r/   r5   rO   r   r   r    r   <module>r     sk    	 	  5 5 + & &  '  ,-Y4 Y4 .Y4x ,-= = .=@0$0Cy0 L)0 	0
 
0B1J$1JCy1J L)1J 	1J
 
1Jh ;$ ;Cy ; L) ; 	 ;
 
 ;F ,-|
 |
 .|
r    