summaryrefslogtreecommitdiff
path: root/ricky/param/multiselect.py
diff options
context:
space:
mode:
Diffstat (limited to 'ricky/param/multiselect.py')
-rw-r--r--ricky/param/multiselect.py56
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()