Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 37 additions & 42 deletions dashboard/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
from trame.widgets import plotly, router, vuetify3 as vuetify, html

from model_manager import ModelManager
from outputs_manager import OutputManager
from outputs_manager import OutputsManager
from optimization_manager import OptimizationManager
from parameters_manager import ParametersManager
from inputs_manager import InputsManager
from calibration_manager import SimulationCalibrationManager
from sfapi_manager import initialize_sfapi, load_sfapi_card
from state_manager import server, state, ctrl, initialize_state
Expand All @@ -27,9 +27,9 @@
# Globals
# -----------------------------------------------------------------------------

out_manager = None
inputs_manager = None
outputs_manager = None
mod_manager = None
par_manager = None
opt_manager = None
cal_manager = None

Expand All @@ -43,8 +43,8 @@

def update(
reset_model=True,
reset_output=True,
reset_parameters=True,
reset_inputs=True,
reset_outputs=True,
reset_calibration=True,
reset_plots=True,
reset_gui_route_home=True,
Expand All @@ -55,30 +55,28 @@ def update(
):
print("Updating...")
global mod_manager
global out_manager
global par_manager
global inputs_manager
global outputs_manager
global opt_manager
global cal_manager
# load input and output variables
input_variables, output_variables, simulation_calibration = load_variables(
state.experiment
)
inputs, outputs, simulation_calibration = load_variables(state.experiment)
# load data
db = load_database(state.experiment)
exp_data, sim_data = load_data(db)
# reset output
if reset_output:
out_manager = OutputManager(output_variables)
# reset outputs
if reset_outputs:
outputs_manager = OutputsManager(outputs)
# reset model
if reset_model:
mod_manager = ModelManager(db)
opt_manager = OptimizationManager(mod_manager)
# reset parameters
if reset_parameters:
par_manager = ParametersManager(mod_manager, input_variables)
# reset inputs
if reset_inputs:
inputs_manager = InputsManager(mod_manager, inputs)
elif reset_model:
# if resetting only model, model attribute must be updated
par_manager.model = mod_manager
inputs_manager.model = mod_manager
# reset calibration
if reset_calibration:
cal_manager = SimulationCalibrationManager(simulation_calibration)
Expand Down Expand Up @@ -112,8 +110,8 @@ def update_on_change_experiment(**kwargs):
print("Experiment changed...")
update(
reset_model=True,
reset_output=True,
reset_parameters=True,
reset_inputs=True,
reset_outputs=True,
reset_calibration=True,
reset_plots=True,
reset_gui_route_home=True,
Expand All @@ -130,8 +128,8 @@ def update_on_change_model(**kwargs):
print("Model type changed...")
update(
reset_model=True,
reset_output=False,
reset_parameters=False,
reset_inputs=False,
reset_outputs=False,
reset_calibration=False,
reset_plots=True,
reset_gui_route_home=True,
Expand All @@ -143,22 +141,19 @@ def update_on_change_model(**kwargs):

@state.change(
"displayed_output",
"parameters",
"inputs_new",
"opacity",
"parameters_min",
"parameters_max",
"parameters_show_all",
"simulation_calibration",
"use_inferred_calibration",
)
def update_on_change_others(**kwargs):
# skip if triggered on server ready (all state variables marked as modified)
if len(state.modified_keys) == 1:
print("Parameters, opacity changed...")
print("Inputs, opacity changed...")
update(
reset_model=False,
reset_output=False,
reset_parameters=False,
reset_inputs=False,
reset_outputs=False,
reset_calibration=False,
reset_plots=True,
reset_gui_route_home=False,
Expand All @@ -175,12 +170,12 @@ def find_simulation(event, db):
# find the document with matching ID from the experiment collection
documents = list(db[state.experiment].find({"_id": ObjectId(this_point_id)}))
if len(documents) == 1:
this_point_parameters = {
parameter: documents[0][parameter]
for parameter in state.parameters.keys()
if parameter in documents[0]
this_point_inputs = {
input: documents[0][input]
for input in state.inputs_new.keys()
if input in documents[0]
}
print(f"Clicked on data point ({this_point_parameters})")
print(f"Clicked on data point ({this_point_inputs})")
else:
title = "Unable to find database document"
msg = f"Error occurred when searching for database document that matches ID {this_point_id}"
Expand Down Expand Up @@ -277,23 +272,23 @@ def home_route():
with vuetify.VCol(cols=4):
with vuetify.VCard():
with vuetify.VTabs(
v_model=("active_tab", "parameters_tab"),
v_model=("active_tab", "inputs_tab"),
color="primary",
mandatory=True,
):
vuetify.VTab("Parameters", value="parameters_tab")
vuetify.VTab("Inputs", value="inputs_tab")
vuetify.VTab("Optimization", value="optimization_tab")
vuetify.VTab("ML", value="ml_tab")
with vuetify.VWindow(v_model=("active_tab",), mandatory=True):
with vuetify.VWindowItem(value="parameters_tab"):
# output control panel
with vuetify.VWindowItem(value="inputs_tab"):
# outputs control panel
with vuetify.VRow():
with vuetify.VCol():
out_manager.panel()
# parameters control panel
outputs_manager.panel()
# inputs control panel
with vuetify.VRow():
with vuetify.VCol():
par_manager.panel()
inputs_manager.panel()
# plots control panel
with vuetify.VRow():
with vuetify.VCol():
Expand All @@ -317,7 +312,7 @@ def home_route():
with vuetify.VCard():
with vuetify.VCardTitle("Plots"):
with vuetify.VContainer(
style=f"height: {400 * len(state.parameters)}px;"
style=f"height: {400 * len(state.inputs_new)}px;"
):
figure = plotly.Figure(
display_mode_bar="true",
Expand Down
4 changes: 2 additions & 2 deletions dashboard/calibration_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ def convert(value, alpha, beta):
add_error(title, msg)
print(msg)

def convert_exp_to_sim(self, exp_dict):
def convert_exp_to_sim(self, exp_dict): # FIXME
"""
Apply calibration to the experimental points, to be passed as
parameters for simulations on NERSC.
inputs for simulations on NERSC.
"""

def convert(value, alpha, beta):
Expand Down
93 changes: 46 additions & 47 deletions dashboard/parameters_manager.py → dashboard/inputs_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,31 +14,23 @@
from state_manager import state, EXPERIMENTS_PATH


class ParametersManager:
def __init__(self, model, input_variables):
print("Initializing parameters manager...")
class InputsManager:
def __init__(self, model, inputs):
print("Initializing inputs manager...")
# save model
self.__model = model
# define state variables
state.parameters = dict()
state.parameters_min = dict()
state.parameters_max = dict()
state.parameters_show_all = dict()
self.parameters_step = dict()
state.simulatable = (
self.simulation_scripts_base_path / "submission_script_single"
).is_file()
for parameter_dict in input_variables.values():
key = parameter_dict["name"]
pmin = float(parameter_dict["value_range"][0])
pmax = float(parameter_dict["value_range"][1])
pval = float(parameter_dict["default"])
state.parameters[key] = pval
state.parameters_min[key] = pmin
state.parameters_max[key] = pmax
state.parameters_show_all[key] = False
self.parameters_step[key] = (pmax - pmin) / 100
state.parameters_init = copy.deepcopy(state.parameters)
state.inputs_new = copy.deepcopy(inputs)
for input_dict in state.inputs_new.values():
input_dict["value"] = float(input_dict["default"])
input_dict["step"] = (
input_dict["value_range"][1] - input_dict["value_range"][0] / 100
)
input_dict["show_all"] = False
state.inputs_init = copy.deepcopy(state.inputs_new)

@property
def model(self):
Expand All @@ -53,11 +45,11 @@ def simulation_scripts_base_path(self):
return EXPERIMENTS_PATH / f"synapse-{state.experiment}/simulation_scripts/"

def reset(self):
print("Resetting parameters to default values...")
# reset parameters to initial values
state.parameters = copy.deepcopy(state.parameters_init)
print("Resetting inputs to default values...")
# reset inputs to initial values
state.inputs_new = copy.deepcopy(state.inputs_init)
# push again at flush time
state.dirty("parameters")
state.dirty("inputs_new")

async def simulation_kernel(self):
try:
Expand All @@ -71,13 +63,13 @@ async def simulation_kernel(self):
[target_path] = await perlmutter.ls(target_path, directory=True)
# set the base path where auxiliary files are copied from
with tempfile.TemporaryDirectory() as temp_dir:
# store the current simulation parameters in a YAML temporary file
# store the current simulation inputs in a YAML temporary file
temp_file_path = (
Path(temp_dir) / "single_simulation_parameters.yaml"
)
_, _, simulation_calibration = load_variables(state.experiment)
sim_cal = SimulationCalibrationManager(simulation_calibration)
sim_dict = sim_cal.convert_exp_to_sim(state.parameters)
sim_dict = sim_cal.convert_exp_to_sim(state.inputs_new)
with open(temp_file_path, "w") as temp_file:
yaml.dump(sim_dict, temp_file)
temp_file.flush()
Expand Down Expand Up @@ -148,19 +140,20 @@ def simulation_trigger(self):
print(msg)

def panel(self):
print("Setting parameters card...")
with vuetify.VExpansionPanels(v_model=("expand_panel_control_parameters", 0)):
print("Setting inputs card...")
with vuetify.VExpansionPanels(v_model=("expand_panel_control_inputs", 0)):
with vuetify.VExpansionPanel(
title="Control: Parameters",
title="Control: Inputs",
style="font-size: 20px; font-weight: 500;",
):
with vuetify.VExpansionPanelText():
with client.DeepReactive("parameters"):
for count, key in enumerate(state.parameters.keys()):
# create a row for the parameter label
with client.DeepReactive("inputs_new"):
for count, key in enumerate(state.inputs_new.keys()):
print(key)
# create a row for the input label
with vuetify.VRow():
vuetify.VListSubheader(
key,
state.inputs_new[key]["name"],
style=(
"margin-top: 16px;"
if count == 0
Expand All @@ -169,35 +162,39 @@ def panel(self):
)
with vuetify.VRow(no_gutters=True):
with vuetify.VSlider(
v_model_number=(f"parameters['{key}']",),
change="flushState('parameters')",
v_model_number=(f"inputs_new['{key}']['value']",),
change="flushState('inputs_new')",
hide_details=True,
min=(f"parameters_min['{key}']",),
max=(f"parameters_max['{key}']",),
min=(f"inputs_new['{key}']['value_range'][0]",),
max=(f"inputs_new['{key}']['value_range'][1]",),
step=(
f"(parameters_max['{key}'] - parameters_min['{key}']) / 100",
f"(inputs_new['{key}']['value_range'][1] - inputs_new['{key}']['value_range'][0]) / 100",
),
style="align-items: center;",
):
with vuetify.Template(v_slot_append=True):
vuetify.VTextField(
v_model_number=(f"parameters['{key}']",),
v_model_number=(
f"inputs_new['{key}']['value']",
),
density="compact",
hide_details=True,
readonly=True,
single_line=True,
style="margin-top: 0px; padding-top: 0px; width: 100px;",
type="number",
)
step = self.parameters_step[key]
step = state.inputs_new[key]["step"]
with vuetify.VRow(no_gutters=True):
with vuetify.VCol():
vuetify.VTextField(
v_model_number=(f"parameters_min['{key}']",),
change="flushState('parameters_min')",
v_model_number=(
f"inputs_new['{key}']['value_range'][0]",
),
change="flushState('inputs_new')",
density="compact",
hide_details=True,
disabled=(f"parameters_show_all['{key}']",),
disabled=(f"inputs_new['{key}']['show_all']",),
step=step,
__properties=["step"],
style="width: 100px;",
Expand All @@ -206,11 +203,13 @@ def panel(self):
)
with vuetify.VCol():
vuetify.VTextField(
v_model_number=(f"parameters_max['{key}']",),
change="flushState('parameters_max')",
v_model_number=(
f"inputs_new['{key}']['value_range'][1]",
),
change="flushState('inputs_new')",
density="compact",
hide_details=True,
disabled=(f"parameters_show_all['{key}']",),
disabled=(f"inputs_new['{key}']['show_all']",),
step=step,
__properties=["step"],
style="width: 100px;",
Expand All @@ -220,11 +219,11 @@ def panel(self):
with vuetify.VCol(style="min-width: 100px;"):
vuetify.VCheckbox(
v_model=(
f"parameters_show_all['{key}']",
f"inputs_new['{key}']['show_all']",
False,
),
density="compact",
change="flushState('parameters_show_all')",
change="flushState('inputs_new')",
label="Show all",
)
with vuetify.VRow(align="center"):
Expand Down
Loading