diff options
Diffstat (limited to 'ricky/param/multiselect.py')
| -rw-r--r-- | ricky/param/multiselect.py | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/ricky/param/multiselect.py b/ricky/param/multiselect.py new file mode 100644 index 0000000..d7db80f --- /dev/null +++ b/ricky/param/multiselect.py @@ -0,0 +1,56 @@ +import random +from ricky.param import Param + +class MultiSelect(Param): + def __init__(self, **kwargs): + self._options = [] + if 'options' in kwargs: self._options = kwargs['options'] or [] + super(MultiSelect, self).__init__(**kwargs) + if len(self._options): + self._validate_options() + self.default(self._choose_heaviest()) + + + def options(self): + return self._options + def _validate_options(self): + try: + int(self._options[0]['weight']) + self._options[0]['value'] + except Exception as e: + raise ValueError + + def get_value(self): + return super(MultiSelect, self).get_value() + def set_value(self, value): + if not any([ value == i['value'] for i in self._options ]) and value != None: + raise ValueError + super(MultiSelect, self).set_value(value) + value = property(get_value, set_value) + + + def randomize(self): + weights_total = sum(map(lambda x: x["weight"], self.options())) + choice = random.randint(0, weights_total) + position = 0 + for elem in self.options(): + position += elem["weight"] + if position >= choice: + self.value = elem["value"] + break + + def _choose_heaviest(self): + heaviest_idx = 0 + heaviest_weight = 0 + idx = 0 + if (len(self.options())): + for elem in self.options(): + if elem["weight"] > heaviest_weight: + heaviest_weight = elem["weight"] + heaviest_idx = idx; + idx += 1 + return self.options()[heaviest_idx]["value"] + else: + self.randomize() + def heaviest(self): + self.value = self._choose_heaviest() |
