@@ -263,6 +263,50 @@ def _expand(var):
263263 if not n_threads :
264264 variables [self .keywords .n_threads ] = 1
265265
266+ def _setup_experiment_minimal (
267+ self ,
268+ workload_template_name ,
269+ variables ,
270+ context ,
271+ ):
272+ """Perform minimal setup for an experiment instance."""
273+ expander = ramble .expander .Expander (variables , self )
274+ self ._compute_mpi_vars (expander , variables )
275+
276+ final_app_name = expander .expand_var_name (
277+ self .keywords .application_name , allow_passthrough = False
278+ )
279+
280+ # Define some standard variables before the application is created
281+ # to ensure variables and variants can be defined correctly.
282+ variables [self .keywords .workload_template_name ] = workload_template_name
283+ variables [self .keywords .application_name ] = final_app_name
284+
285+ # Setup the application instance
286+ app_inst = ramble .repository .get (final_app_name )
287+ app_inst .set_variables_and_variants (variables , context .variants , self )
288+
289+ app_inst .set_required_variables ()
290+ app_inst .set_active_workload ()
291+ app_inst .set_modifiers (context .modifiers )
292+ app_inst .set_internals (context .internals )
293+ app_inst .set_chained_experiments (context .chained_experiments )
294+ app_inst .set_env_variable_sets (context .env_variables )
295+ app_inst .set_template (context .is_template )
296+ app_inst .set_tags (context .tags )
297+ app_inst .set_formatted_executables (context .formatted_executables )
298+
299+ if app_inst .package_manager is not None :
300+ app_inst .define_variable (
301+ self .keywords .env_path ,
302+ os .path .join (
303+ app_inst .package_manager .package_manager_dir (self ._workspace ),
304+ Expander .expansion_str (self .keywords .env_name ),
305+ ),
306+ )
307+
308+ return app_inst
309+
266310 def _prepare_experiment (
267311 self ,
268312 workload_template_name ,
@@ -295,46 +339,14 @@ def _prepare_experiment(
295339 else :
296340 variables [self .keywords .repeat_index ] = 0
297341
298- expander = ramble .expander .Expander (variables , self )
299- self ._compute_mpi_vars (expander , variables )
300-
301- final_app_name = expander .expand_var_name (
302- self .keywords .application_name , allow_passthrough = False
303- )
342+ app_inst = self ._setup_experiment_minimal (workload_template_name , variables , context )
304343
305- final_wl_name = expander .expand_var_name (
344+ final_wl_name = app_inst . expander .expand_var_name (
306345 self .keywords .workload_name , allow_passthrough = False
307346 )
347+ app_inst .define_variable (self .keywords .workload_name , final_wl_name )
308348
309- # Define some standard variables before the application is created
310- # to ensure variables and variants can be defined correctly.
311- variables [self .keywords .workload_template_name ] = workload_template_name
312- variables [self .keywords .application_name ] = final_app_name
313- variables [self .keywords .workload_name ] = final_wl_name
314-
315- # Setup the application instance
316- app_inst = ramble .repository .get (final_app_name )
317- app_inst .set_variables_and_variants (variables , context .variants , self )
318-
319- app_inst .set_required_variables ()
320- app_inst .set_active_workload ()
321- app_inst .set_env_variable_sets (context .env_variables )
322- app_inst .set_internals (context .internals )
323- app_inst .set_template (context .is_template )
324349 app_inst .repeats = repeats
325- app_inst .set_chained_experiments (context .chained_experiments )
326- app_inst .set_modifiers (context .modifiers )
327- app_inst .set_tags (context .tags )
328- app_inst .set_formatted_executables (context .formatted_executables )
329-
330- if app_inst .package_manager is not None :
331- app_inst .define_variable (
332- self .keywords .env_path ,
333- os .path .join (
334- app_inst .package_manager .package_manager_dir (self ._workspace ),
335- Expander .expansion_str (self .keywords .env_name ),
336- ),
337- )
338350
339351 # Setup experiment name after modifiers are defined
340352 final_exp_name = app_inst .expander .expand_var (
@@ -344,8 +356,6 @@ def _prepare_experiment(
344356 app_inst .define_variable (
345357 self .keywords .experiment_template_name , exp_template_name + experiment_suffix
346358 )
347- app_inst .define_variable (self .keywords .application_name , final_app_name )
348- app_inst .define_variable (self .keywords .workload_name , final_wl_name )
349359 app_inst .define_variable (self .keywords .experiment_name , final_exp_name )
350360
351361 app_inst .define_variable (self .keywords .experiment_index , len (self .experiments ) + 1 )
@@ -357,20 +367,20 @@ def _prepare_experiment(
357367 self .keywords .simplified_application_namespace ,
358368 (
359369 spack .util .naming .simplify_name (
360- expander .expand_var_name (self .keywords .application_namespace )
370+ app_inst . expander .expand_var_name (self .keywords .application_namespace )
361371 )
362372 ),
363373 )
364374 app_inst .define_variable (
365375 self .keywords .simplified_workload_namespace ,
366376 spack .util .naming .simplify_name (
367- expander .expand_var_name (self .keywords .workload_namespace )
377+ app_inst . expander .expand_var_name (self .keywords .workload_namespace )
368378 ),
369379 )
370380 app_inst .define_variable (
371381 self .keywords .simplified_experiment_namespace ,
372382 spack .util .naming .simplify_name (
373- expander .expand_var_name (self .keywords .experiment_namespace )
383+ app_inst . expander .expand_var_name (self .keywords .experiment_namespace )
374384 ),
375385 )
376386 for name , value in self ._workspace .workspace_paths ().items ():
@@ -384,6 +394,28 @@ def _prepare_experiment(
384394
385395 return app_inst
386396
397+ def _get_used_variables (
398+ self ,
399+ workload_template_name ,
400+ exp_template_name ,
401+ variables ,
402+ context ,
403+ ):
404+ app_inst = self ._setup_experiment_minimal (workload_template_name , variables , context )
405+
406+ # The `_get_used_variables` is only called for the base experiment,
407+ # so no need to consider repeat suffix.
408+ exp_name = app_inst .expander .expand_var (exp_template_name , allow_passthrough = False )
409+
410+ app_inst .define_variable (self .keywords .experiment_template_name , exp_template_name )
411+ app_inst .define_variable (self .keywords .experiment_name , exp_name )
412+
413+ app_inst .define_variable (
414+ self .keywords .log_file , os .path .join ("{experiment_run_dir}" , "{experiment_name}.out" )
415+ )
416+ app_inst .set_success_list (context .success_criteria )
417+ return app_inst .build_used_variables (self ._workspace )
418+
387419 def _ingest_experiments (self , die_on_validate_error = True ):
388420 """Ingest experiments based on the current context.
389421
@@ -494,17 +526,12 @@ def _ingest_experiments(self, die_on_validate_error=True):
494526 ):
495527 if repeats .repeat_index :
496528 continue
497- app_inst = self ._prepare_experiment (
529+ exp_used_variables = self ._get_used_variables (
498530 workload_template_name ,
499531 experiment_template_name ,
500532 tracking_vars ,
501533 final_context ,
502- repeats ,
503534 )
504-
505- app_inst .set_success_list (final_context .success_criteria )
506-
507- exp_used_variables = app_inst .build_used_variables (self ._workspace )
508535 used_variables = used_variables .union (exp_used_variables )
509536 render_group .used_variables = used_variables .copy ()
510537
0 commit comments