summaryrefslogtreecommitdiff
path: root/ilpscheduling/model.py
diff options
context:
space:
mode:
Diffstat (limited to 'ilpscheduling/model.py')
-rw-r--r--ilpscheduling/model.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/ilpscheduling/model.py b/ilpscheduling/model.py
new file mode 100644
index 0000000..baa02d1
--- /dev/null
+++ b/ilpscheduling/model.py
@@ -0,0 +1,56 @@
+# vim: set fileencoding=utf-8 :
+
+import yaml
+
+class WorkerSlotModel:
+ def __init__ (self, slots, worker, env):
+ self._slots = slots
+ self._worker = worker
+ self._env = env
+
+ # generated properties, public, read-only
+ self.slotNames = set (slots.keys ())
+ assert len (self.slotNames) == len (slots.keys ()), "slot names must be unique"
+ self.workerNames = set (worker.keys ())
+ assert len (self.workerNames) == len (worker.keys ()), "worker names must be unique"
+ self.minTotalSlots = self._env.get ('minSlots', 0)
+ self.maxTotalSlots = self._env.get ('maxSlots', len (self.slotNames))
+
+ @classmethod
+ def fromYaml (obj, fd):
+ """
+ Import from YAML file. Structured like this:
+
+ """
+ data = yaml.load (fd)
+ o = obj (data['slots'], data['worker'], data.get ('env', {}))
+ return o
+
+ def available (self, worker, slot):
+ """
+ Is worker available for slot?
+ """
+ return self.priority (worker, slot) is not None
+
+ def priority (self, worker, slot):
+ """
+ Get worker’s preferences/priority for slot, priority is higher for
+ smaller numbers and must be >= 1
+ """
+ return self._worker[worker]['prio'].get (slot, None)
+
+ def maxSlots (self, worker):
+ return self._worker[worker]['slots']['max']
+
+ def minSlots (self, worker):
+ return self._worker[worker]['slots']['min']
+
+ def maxWorker (self, slot):
+ return self._slots[slot]['max']
+
+ def minWorker (self, slot):
+ return self._slots[slot]['min']
+
+ def dump (self, fd):
+ yaml.dump ({'worker': self._worker, 'slots': self._slots, 'env': self._env}, fd)
+