Source code for schrodinger.application.jaguar.jaguar_config_dialog

"""
Module containing the param-based JaguarConfigDialog class.

NOTE: The classic AF2-based config dialog is located at
schrodinger/application/jaguar/gui/base_panel.py
"""

from schrodinger import get_maestro
from schrodinger.models import mappers
from schrodinger.Qt import QtWidgets
from schrodinger.tasks import jobtasks
from schrodinger.ui.qt import swidgets
from schrodinger.ui.qt import basewidgets
from schrodinger.ui.qt import mapperwidgets
from schrodinger.ui.qt.tasks import configwidgets
from schrodinger.ui.qt.config_dialog import FIXED_SB_WIDTH

maestro = get_maestro()


[docs]class JaguarHostSettings(jobtasks.HostSettings): limit_subjobs: int = None # Default is no limit
# Inherited from base class: # host, num_subjobs, allowed_host_types
[docs]class JaguarHostSelector(configwidgets.HostSelector): """ Host selector with additional option for limiting number of simultaneous subjobs. Similar to configwidgets.HostSelector, except UI is as follows: Host: <combo menu> Maximum # processors: <spinbox> [x] Limit number of simultaneous subjobs Max: <spinbox> (i) """ model_class = JaguarHostSettings
[docs] def initSetUp(self): super().initSetUp() # NOTE: Names for widgets are chosen to be consistent with base # HostSelector class, as well as classic JaguarConfigDialog class. self._label = QtWidgets.QLabel('Host: ') self._host_combo = mapperwidgets.MappableComboBox() self._num_subjobs_sb = QtWidgets.QSpinBox() self._num_subjobs_sb.setMinimum(1) self._num_subjobs_sb.setFixedWidth(FIXED_SB_WIDTH) self.max_procs_label = QtWidgets.QLabel('Maximum # processors:') self.max_label = QtWidgets.QLabel('Max:') self._subjob_widgets = (self._num_subjobs_sb, self.max_procs_label, self.max_label) self.mp_limit_subjobs_cb = QtWidgets.QCheckBox( 'Limit number of simultaneous subjobs') self.mp_limit_subjobs_cb.setToolTip( "Each simultaneous subjob will require its own license tokens.\n" + "Limit the number of simultaneous subjobs to reduce license usage.") self.mp_limit_subjobs_cb.toggled.connect(self._updateOpenMPInfo) self.mp_max_subjobs_sb = QtWidgets.QSpinBox() self.mp_max_subjobs_sb.setMinimum(1) self._num_subjobs_sb.valueChanged.connect( self.mp_max_subjobs_sb.setMaximum) self.mp_max_subjobs_sb.setFixedWidth(FIXED_SB_WIDTH) self.info_btn = swidgets.InfoButton() self._updateOpenMPInfo()
def _updateUnitsLabel(self): # This subclass doesn't have unit label, since GPUs are not supported. pass def _updateOpenMPInfo(self): """ Enable/disable the limit subjobs widgets based on whether the checkbox is checked or not. """ limit_subjobs = self.mp_limit_subjobs_cb.isChecked() self.max_label.setEnabled(limit_subjobs) self.mp_max_subjobs_sb.setEnabled(limit_subjobs) if limit_subjobs: tip = ("If not limited, subjobs may run simultaneously on each of" " the processors.\nEach simultaneous subjob will require" " its own license tokens.") else: tip = ("Each simultaneous subjob will require its own license " " tokens.\nLimit the number of simultaneous subjobs to " " reduce license usage.") self.info_btn.setToolTip(tip)
[docs] def initLayOut(self): # Call init methods of the subclass, without calling custom init # code in the HostSelector itself: # TODO PANEL-20711: Fix this inheritance weirdness basewidgets.BaseWidget.initLayOut(self) mappers.MapperMixin.initLayOut(self) host_layout = QtWidgets.QHBoxLayout() host_layout.addWidget(self._label) host_layout.addWidget(self._host_combo) host_layout.addStretch() cpus_layout = QtWidgets.QHBoxLayout() cpus_layout.addWidget(self.max_procs_label) cpus_layout.addWidget(self._num_subjobs_sb) cpus_layout.addStretch() limit_subjobs_layout = QtWidgets.QHBoxLayout() limit_subjobs_layout.addWidget(self.mp_limit_subjobs_cb) limit_subjobs_layout.addWidget(self.max_label) limit_subjobs_layout.addWidget(self.mp_max_subjobs_sb) limit_subjobs_layout.addWidget(self.info_btn) limit_subjobs_layout.addStretch() layout = QtWidgets.QVBoxLayout() layout.addLayout(host_layout) layout.addLayout(cpus_layout) layout.addLayout(limit_subjobs_layout) self.main_layout.addLayout(layout)
[docs] def defineMappings(self): M = self.model_class mappings = super().defineMappings() limit_subjobs_target = mappers.TargetSpec( self.mp_limit_subjobs_cb, getter=self._limitSubjobGetter, setter=self._limitSubjobSetter) max_subjobs_target = mappers.TargetSpec(self.mp_max_subjobs_sb, getter=self._limitSubjobGetter, setter=self._limitSubjobSetter) return mappings + [ (limit_subjobs_target, M.limit_subjobs), (max_subjobs_target, M.limit_subjobs), ] # yapf:disable
def _limitSubjobGetter(self): """ Returns the number of max simultaneous subjobs, or None if no limit. """ if self.mp_limit_subjobs_cb.isChecked(): return self.mp_max_subjobs_sb.value() else: return None def _limitSubjobSetter(self, new_val): """ Set the number of subjobs to given value. If None, disables limiting. """ if not new_val: self.mp_limit_subjobs_cb.setChecked(False) self.mp_max_subjobs_sb.setValue(1) else: assert new_val > 0 self.mp_limit_subjobs_cb.setChecked(True) self.mp_max_subjobs_sb.setValue(new_val)
[docs]class JaguarConfigDialog(configwidgets.ConfigDialog): """ Config dialog with additional setting for limiting number of simultaneous subjobs. """ def _setUpHostSelector(self): # @overrides: ConfigDialog self.host_selector = JaguarHostSelector(parent=self)