Source code for desdeo_vis.widget.widgets
#!/usr/bin/env python
# coding: utf-8
from ipywidgets import DOMWidget
from traitlets import Unicode, Dict, List, Bool, observe, default
from desdeo.utils.exceptions import DESDEOException
from desdeo.method.NIMBUS import NIMBUS
from desdeo.preference import NIMBUSClassification
from desdeo_vis._version import EXTENSION_SPEC_VERSION
from desdeo_vis.conf import get_conf
module_name = "desdeo_vis"
class InvalidNimbusPreferencesException(DESDEOException):
pass
[docs]class VegaWidget(DOMWidget):
_model_name = Unicode('VegaModel').tag(sync=True)
_model_module = Unicode(module_name).tag(sync=True)
_model_module_version = Unicode(EXTENSION_SPEC_VERSION).tag(sync=True)
_view_name = Unicode('VegaView').tag(sync=True)
_view_module = Unicode(module_name).tag(sync=True)
_view_module_version = Unicode(EXTENSION_SPEC_VERSION).tag(sync=True)
spec = Dict().tag(sync=True)
[docs]class ParplotWidget(VegaWidget):
"""
A parallel plot widget to display solutions to a multi-objective
optimization problem.
"""
_model_name = Unicode('ParplotModel').tag(sync=True)
_view_name = Unicode('ParplotView').tag(sync=True)
maximized = List().tag(sync=True)
orig_max_as_min = Bool().tag(sync=True)
cur_max_as_min = Bool().tag(sync=True)
[docs] def __init__(self, results, problem, max_as_min=None, **kwargs):
"""
Parameters
----------
results
The solutions to plot.
problem
The DESDEO problem with which the plot is made with respect to.
max_as_min
Whether to reformulate maximized functions as minimized functions.
"""
self.results = results
self.problem = problem
self.maximized = problem.maximized
if max_as_min is not None:
self.orig_max_as_min = max_as_min
else:
self.orig_max_as_min = get_conf('max_as_min')
self.update_spec()
super().__init__(**kwargs)
@default('cur_max_as_min')
def _max_as_min_default(self):
return self.orig_max_as_min
@observe('cur_max_as_min')
def update_max_as_min(self, change):
self.update_spec()
[docs] def update_spec(self):
from desdeo_vis.plot.parallel import vega3_parplot_spec
self.spec = vega3_parplot_spec(
self.results, self.problem,
max_as_min=self.cur_max_as_min,
dim_tooltips=True, dim_symbols=True)
[docs]class NimbusPrefWidget(ParplotWidget):
"""
A NIMBUS preference selection widget. This allows for graphical selection
of preferences in the form NIMBUS requires.
"""
_model_name = Unicode('NimbusPrefModel').tag(sync=True)
_view_name = Unicode('NimbusPrefView').tag(sync=True)
prefs = List(Dict()).tag(sync=True)
prob = Unicode(allow_none=True).tag(sync=True)
[docs] def __init__(self, results, problem, max_as_min=None, **kwargs):
super().__init__(results, problem, max_as_min=max_as_min, **kwargs)
[docs] def nimbus_clf(self, meth: NIMBUS) -> NIMBUSClassification:
"""
Get the NIMBUS preference currently selected with the widget as a
NIMBUSClassification. Raises a InvalidNimbusPreferencesException if an
invalid preference is chosen.
"""
if self.prob is not None:
raise InvalidNimbusPreferencesException(
"Preference is invalid: " + self.prob)
return NIMBUSClassification(
meth, [
(
pref['kind'],
float(pref['val']) if 'val' in pref else 0.0
)
for pref in self.prefs
]
)