Skip to content

Commit

Permalink
Improve performance
Browse files Browse the repository at this point in the history
  • Loading branch information
edan-bainglass committed Oct 10, 2024
1 parent 0c5f1c8 commit 1dd1c05
Show file tree
Hide file tree
Showing 17 changed files with 320 additions and 249 deletions.
52 changes: 29 additions & 23 deletions src/aiidalab_qe/app/configuration/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS
from aiidalab_qe.app.utils import get_entry_items
from aiidalab_qe.common.panel import Panel
from aiidalab_qe.common.panel import Panel, SettingPanel
from aiidalab_widgets_base import WizardAppWidgetStep

from .advanced import AdvancedSettings
Expand All @@ -23,12 +23,6 @@
class ConfigureQeAppWorkChainStep(ipw.VBox, WizardAppWidgetStep):
previous_step_state = tl.UseEnum(WizardAppWidgetStep.State)

_no_structure_warning = """
<div style="color: red;">
Please set the input structure first.
</div>
"""

def __init__(self, model: ConfigurationModel, **kwargs):
from aiidalab_qe.common.widgets import LoadingWidget

Expand All @@ -51,8 +45,15 @@ def __init__(self, model: ConfigurationModel, **kwargs):
"protocol",
)

self.workchain_settings = WorkChainSettings(model=model)
self.advanced_settings = AdvancedSettings(model=model)
self.missing_structure_message = """
<div class="alert alert-info">
<b>Please set the input structure first.</b>
</div>
"""
self.structure_set_message = ipw.HTML(self.missing_structure_message)

self.workchain_settings = WorkChainSettings(config_model=model)
self.advanced_settings = AdvancedSettings(config_model=model)

self.built_in_settings = [
self.workchain_settings,
Expand All @@ -72,20 +73,13 @@ def render(self):
if self.rendered:
return

self.structure_set_message = ipw.HTML()
ipw.dlink(
(self._model, "input_structure"),
(self.structure_set_message, "value"),
lambda structure: self._no_structure_warning if structure is None else "",
)

self.tab = ipw.Tab(
children=self.built_in_settings,
layout=ipw.Layout(min_height="250px"),
selected_index=None,
)
self.tab.set_title(0, "Basic settings")
self.tab.set_title(1, "Advanced settings")
for i, setting in enumerate(self.built_in_settings):
self.tab.set_title(i, setting.title)
self.tab.observe(
self._on_tab_change,
"selected_index",
Expand Down Expand Up @@ -123,16 +117,16 @@ def set_configuration_parameters(self, parameters):
self._model.set_model_state(parameters)

def is_saved(self):
# TODO reduce calls to model state
new_parameters = self.get_configuration_parameters()
return new_parameters == self._model.configuration_parameters
return self._model.confirmed

def confirm(self, _=None):
self._model.configuration_parameters = self.get_configuration_parameters()
self._model.confirmed = True

def reset(self):
self._model.reset()
if self.rendered:
self.tab.selected_index = 0
for _, settings in self.settings.items():
settings.reset()

Expand All @@ -141,17 +135,22 @@ def _on_previous_step_state_change(self, _):
self._update_state()

def _on_tab_change(self, change):
if (tab := change["new"]) is None:
if (tab_index := change["new"]) is None:
return
self.tab.children[tab].render() # type: ignore
tab: SettingPanel = self.tab.children[tab_index] # type: ignore
tab.render()
tab.update()

def _on_input_structure_change(self, _):
self._update_missing_structure_warning()
self.reset()

def _on_protocol_change(self, _):
self._model.advanced.update()

def _on_confirmation_change(self, _):
if not self._model.confirmed:
self._model.configuration_parameters = {}
self._update_state()

def _fetch_setting_entries(self):
Expand Down Expand Up @@ -203,6 +202,13 @@ def toggle_plugin(change, identifier=identifier, info=info):
config_model=self._model,
)

def _update_missing_structure_warning(self):
self.structure_set_message.value = (
self.missing_structure_message
if self._model.input_structure is None
else ""
)

def _update_panel(self, _=None):
self.tab.children = self.built_in_settings
for identifier in self.properties:
Expand Down
69 changes: 32 additions & 37 deletions src/aiidalab_qe/app/configuration/advanced.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import ipywidgets as ipw

from aiidalab_qe.common.panel import Panel
from aiidalab_qe.common.panel import SettingPanel

from .hubbard import HubbardSettings
from .magnetization import MagnetizationSettings
Expand All @@ -14,26 +14,21 @@
from .smearing import SmearingSettings


class AdvancedSettings(Panel):
class AdvancedSettings(SettingPanel):
title = "Advanced Settings"
identifier = "advanced"

def __init__(self, model: ConfigurationModel, **kwargs):
from aiidalab_qe.common.widgets import LoadingWidget

def __init__(self, config_model: ConfigurationModel, **kwargs):
super().__init__(
config_model=config_model,
layout={"justify_content": "space-between", **kwargs.get("layout", {})},
children=[LoadingWidget("Loading advanced settings widget")],
**kwargs,
)

self._model = model

self.smearing = SmearingSettings(model=model)
self.magnetization = MagnetizationSettings(model=model)
self.hubbard = HubbardSettings(model=model)
self.pseudos = PseudoSettings(model=model)

self.rendered = False
self.smearing = SmearingSettings(model=config_model)
self.magnetization = MagnetizationSettings(model=config_model)
self.hubbard = HubbardSettings(model=config_model)
self.pseudos = PseudoSettings(model=config_model)

def render(self):
if self.rendered:
Expand All @@ -46,7 +41,7 @@ def render(self):
layout=ipw.Layout(max_width="20px"),
)
ipw.link(
(self._model.advanced, "clean_workdir"),
(self._model, "clean_workdir"),
(self.clean_workdir, "value"),
)
# Override setting widget
Expand All @@ -56,11 +51,11 @@ def render(self):
layout=ipw.Layout(max_width="10%"),
)
ipw.link(
(self._model.advanced, "override"),
(self._model, "override"),
(self.override, "value"),
)
ipw.dlink(
(self._model, "input_structure"),
(self._config_model, "input_structure"),
(self.override, "disabled"),
lambda structure: structure is None,
)
Expand All @@ -80,7 +75,7 @@ def render(self):
style={"description_width": "initial"},
)
ipw.link(
(self._model.advanced, "kpoints_distance"),
(self._model, "kpoints_distance"),
(self.kpoints_distance, "value"),
)
ipw.dlink(
Expand All @@ -94,7 +89,7 @@ def render(self):
)
self.mesh_grid = ipw.HTML()
ipw.dlink(
(self._model.advanced, "mesh_grid"),
(self._model, "mesh_grid"),
(self.mesh_grid, "value"),
)

Expand All @@ -110,11 +105,11 @@ def render(self):
style={"description_width": "initial"},
)
ipw.link(
(self._model.advanced, "total_charge"),
(self._model, "total_charge"),
(self.total_charge, "value"),
)
ipw.dlink(
(self._model.advanced, "override"),
(self._model, "override"),
(self.total_charge, "disabled"),
lambda override: not override,
)
Expand All @@ -133,11 +128,11 @@ def render(self):
style={"description_width": "initial"},
)
ipw.link(
(self._model.advanced, "van_der_waals"),
(self._model, "van_der_waals"),
(self.van_der_waals, "value"),
)
ipw.dlink(
(self._model.advanced, "override"),
(self._model, "override"),
(self.van_der_waals, "disabled"),
lambda override: not override,
)
Expand All @@ -153,15 +148,15 @@ def render(self):
style={"description_width": "initial"},
)
ipw.link(
(self._model.advanced, "scf_conv_thr"),
(self._model, "scf_conv_thr"),
(self.scf_conv_thr, "value"),
)
ipw.dlink(
(self._model.advanced, "scf_conv_thr_step"),
(self._model, "scf_conv_thr_step"),
(self.scf_conv_thr, "step"),
)
ipw.dlink(
(self._model.advanced, "override"),
(self._model, "override"),
(self.scf_conv_thr, "disabled"),
lambda override: not override,
)
Expand All @@ -172,15 +167,15 @@ def render(self):
style={"description_width": "initial"},
)
ipw.link(
(self._model.advanced, "forc_conv_thr"),
(self._model, "forc_conv_thr"),
(self.forc_conv_thr, "value"),
)
ipw.dlink(
(self._model.advanced, "forc_conv_thr_step"),
(self._model, "forc_conv_thr_step"),
(self.forc_conv_thr, "step"),
)
ipw.dlink(
(self._model.advanced, "override"),
(self._model, "override"),
(self.forc_conv_thr, "disabled"),
lambda override: not override,
)
Expand All @@ -191,15 +186,15 @@ def render(self):
style={"description_width": "initial"},
)
ipw.link(
(self._model.advanced, "etot_conv_thr"),
(self._model, "etot_conv_thr"),
(self.etot_conv_thr, "value"),
)
ipw.dlink(
(self._model.advanced, "etot_conv_thr_step"),
(self._model, "etot_conv_thr_step"),
(self.etot_conv_thr, "step"),
)
ipw.dlink(
(self._model.advanced, "override"),
(self._model, "override"),
(self.etot_conv_thr, "disabled"),
lambda override: not override,
)
Expand All @@ -214,11 +209,11 @@ def render(self):
style={"description_width": "initial"},
)
ipw.link(
(self._model.advanced, "spin_orbit"),
(self._model, "spin_orbit"),
(self.spin_orbit, "value"),
)
ipw.dlink(
(self._model.advanced, "override"),
(self._model, "override"),
(self.spin_orbit, "disabled"),
lambda override: not override,
)
Expand Down Expand Up @@ -297,15 +292,15 @@ def render(self):

def reset(self):
with self.hold_trait_notifications():
self._model.advanced.reset()
self._model.reset()
self.smearing.reset()
self.hubbard.reset()
self.magnetization.reset()
self.pseudos.reset()
self._model.advanced.update()
self._model.update()

def _on_kpoints_distance_change(self, _=None):
self._model.advanced.update_kpoints_mesh()
self._model.update_kpoints_mesh()

def _on_override_change(self, change):
if not change["new"]:
Expand Down
Loading

0 comments on commit 1dd1c05

Please sign in to comment.