Skip to content

Commit 422e63c

Browse files
committed
Define a lighter-weight method for building used variables
Split experiment-building into two parts, such that the `build_used_variables` part doesn't need to build up a complete experiment.
1 parent e7aab6a commit 422e63c

File tree

1 file changed

+73
-46
lines changed

1 file changed

+73
-46
lines changed

lib/ramble/ramble/experiment_set.py

Lines changed: 73 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)