Skip to content

Commit

Permalink
Move context variables from experiment set to context object
Browse files Browse the repository at this point in the history
Creates a context object and moves context variables from
the experiment set indexed by context to a dict of context
objects indexed by context.
  • Loading branch information
dapomeroy committed Aug 21, 2023
1 parent 54a2b1c commit c371dc2
Show file tree
Hide file tree
Showing 6 changed files with 806 additions and 815 deletions.
75 changes: 46 additions & 29 deletions lib/ramble/ramble/cmd/workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import ramble.workspace
import ramble.workspace.shell
import ramble.experiment_set
import ramble.context
import ramble.experimental.uploader
import ramble.software_environments
import ramble.util.colors as rucolor
Expand Down Expand Up @@ -399,38 +400,52 @@ def workspace_info(args):
# The base experiment_set is used to list *all* experiments.
color.cprint('')
color.cprint(rucolor.section_title('Experiments:'))
for app, workloads, app_vars, app_env_vars, app_internals, app_template, app_chained_exps, \
app_mods in ws.all_applications():
for workload, experiments, workload_vars, workload_env_vars, workload_internals, \
workload_template, workload_chained_exps, workload_mods \
in ws.all_workloads(workloads):
for exp, _, exp_vars, exp_env_vars, exp_zips, exp_matrices, exp_internals, \
exp_template, exp_chained_exps, exp_mods, exp_excludes \
in ws.all_experiments(experiments):
for workloads, application_context in ws.all_applications():
for experiments, workload_context in ws.all_workloads(workloads):
for _, experiment_context in ws.all_experiments(experiments):
print_experiment_set = ramble.experiment_set.ExperimentSet(ws)
print_experiment_set.set_application_context(app, app_vars,
app_env_vars, app_internals,
app_template, app_chained_exps,
app_mods)
print_experiment_set.set_workload_context(workload, workload_vars,
workload_env_vars, workload_internals,
workload_template, workload_chained_exps,
workload_mods)
print_experiment_set.set_experiment_context(exp,
exp_vars,
exp_env_vars,
exp_zips,
exp_matrices,
exp_internals,
exp_template,
exp_chained_exps,
exp_mods,
exp_excludes)

# application_context = ramble.context.Context()
# application_context.context_names = app
# application_context.variables = app_vars
# application_context.env_variables = app_env_vars
# application_context.internals = app_internals
# application_context.templates = app_template
# application_context.chained_experiments = app_chained_exps
# application_context.modifiers = app_mods

print_experiment_set.set_application_context(application_context)

# workload_context = ramble.context.Context()
# workload_context.context_names = workload
# workload_context.variables = workload_vars
# workload_context.env_variables = workload_env_vars
# workload_context.internals = workload_internals
# workload_context.templates = workload_template
# workload_context.chained_experiments = workload_chained_exps
# workload_context.modifiers = workload_mods

print_experiment_set.set_workload_context(workload_context)

# experiment_context = ramble.context.Context()
# experiment_context.context_names = exp
# experiment_context.variables = exp_vars
# experiment_context.env_variables = exp_env_vars
# experiment_context.zips = exp_zips
# experiment_context.matrices = exp_matrices
# experiment_context.internals = exp_internals
# experiment_context.templates = exp_template
# experiment_context.chained_experiments = exp_chained_exps
# experiment_context.modifiers = exp_mods
# experiment_context.exclude = exp_excludes

print_experiment_set.set_experiment_context(experiment_context)

print_experiment_set.build_experiment_chains()

color.cprint(rucolor.nested_1(' Application: ') + app)
color.cprint(rucolor.nested_2(' Workload: ') + workload)
color.cprint(rucolor.nested_1(' Application: ') +
application_context.context_names)
color.cprint(rucolor.nested_2(' Workload: ') + workload_context.context_names)

# Define variable printing groups.
var_indent = ' '
Expand All @@ -453,7 +468,9 @@ def workspace_info(args):

if args.verbose >= 1:
var_groups = [config_vars, workspace_vars,
app_vars, workload_vars, exp_vars]
application_context.variables,
workload_context.variables,
experiment_context.variables]

# Print each group that has variables in it
for group, name in zip(var_groups, var_group_names):
Expand Down
142 changes: 142 additions & 0 deletions lib/ramble/ramble/context.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
# Copyright 2022-2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
# https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
# <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
# option. This file may not be copied, modified, or distributed
# except according to those terms.

from ramble.namespace import namespace
import ramble.util.matrices

import spack.util.spack_yaml as syaml


class Context(object):
"""Class to represent a context
This class contains variable definitions to store any individual context
(such as application, workload, or experiment) and logic to merge in
additional contexts by order of precedence."""

def __init__(self):
"""Constructor for a Context
Create a Context object, which holds context attributes.
"""
self.env_variables = []
self.variables = syaml.syaml_dict()
self.internals = {}
self.templates = None
self.chained_experiments = []
self.modifiers = []
self.context_names = None
self.exclude = {}
self.zips = {}
self.matrices = []
self.is_template = False

def merge_context(self, in_context):
"""Merges another Context into this Context."""

internal_sections = [namespace.custom_executables,
namespace.executables]

if in_context.variables:
self.variables.update(in_context.variables)
if in_context.env_variables:
self.env_variables.append(in_context.env_variables)
if in_context.internals:
for internal_section in internal_sections:
if internal_section in in_context.internals:
if isinstance(in_context.internals[internal_section], dict):
if internal_section not in self.internals:
self.internals[internal_section] = {}
section_dict = in_context.internals[internal_section]
for key, val in section_dict.items():
self.internals[internal_section][key] = val
elif isinstance(in_context.internals[internal_section], list):
if internal_section not in self.internals:
self.internals[internal_section] = []
self.internals[internal_section].extend(
in_context.internals[internal_section])
else:
self.internals[internal_section] = \
in_context.internals[internal_section]
if in_context.chained_experiments:
for chained_exp in in_context.chained_experiments:
self.chained_experiments.append(chained_exp.copy())
if in_context.modifiers:
for modifier in in_context.modifiers:
self.modifiers.append(modifier.copy())
if in_context.templates is not None:
self.is_template = in_context.templates
if in_context.exclude:
self.exclude = in_context.exclude
if in_context.zips:
self.zips = in_context.zips
if in_context.matrices:
self.matrices = in_context.matrices


def from_dict(context_name, in_dict):
"""Creates a new Context object from a dictionary of variables
Dictionaries should follow the below format:
in_dict = {
'env_vars': [],
'variables': {},
'internals': {},
'templates': '',
'chained_experiments': [],
'modifiers': [],
'context_names': '',
'exclude': {},
'zips': {},
'matrices': {} or [],
Args:
context_name: The name of the context (e.g., application name)
in_dict: A dictionary representing the variable definitions
Returns:
Context(object)
"""

new_context = Context()

new_context.context_names = context_name

if namespace.env_var in in_dict:
new_context.env_variables = in_dict[namespace.env_var]

if namespace.variables in in_dict:
new_context.variables = in_dict[namespace.variables]

if namespace.internals in in_dict:
new_context.internals = in_dict[namespace.internals]

if namespace.template in in_dict:
new_context.templates = in_dict[namespace.template]

if namespace.chained_experiments in in_dict:
new_context.chained_experiments = in_dict[namespace.chained_experiments]

if namespace.modifiers in in_dict:
new_context.modifiers = in_dict[namespace.modifiers]

if namespace.exclude in in_dict:
new_context.exclude = in_dict[namespace.exclude]

if namespace.zips in in_dict:
new_context.zips = in_dict[namespace.zips]

if namespace.matrices in in_dict:
new_context.matrices = in_dict[namespace.matrices]
else:
new_context.matrices = ramble.util.matrices.extract_matrices('experiment creation',
context_name,
in_dict)

return new_context
Loading

0 comments on commit c371dc2

Please sign in to comment.