aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2012-02-20 03:17:47 -0500
committerBjoern Brandenburg <bbb@mpi-sws.org>2012-02-20 03:17:47 -0500
commitb99084aaaf78b4e87ca41b310121b87630239377 (patch)
tree969ea71438ebd5a73972955813dea9f5a1c36be7
parent5740e3a7d6e8da4bc803f936fc826d355772fbc9 (diff)
Add convenience wrapper to find_connected_components()
-rw-r--r--schedcat/locking/partition.py14
-rw-r--r--tests/locking.py21
2 files changed, 33 insertions, 2 deletions
diff --git a/schedcat/locking/partition.py b/schedcat/locking/partition.py
index 833ff6a..d6277e0 100644
--- a/schedcat/locking/partition.py
+++ b/schedcat/locking/partition.py
@@ -1,5 +1,7 @@
1from collections import defaultdict 1from collections import defaultdict
2 2
3from schedcat.model.tasks import TaskSystem
4
3def find_connected_components(taskset): 5def find_connected_components(taskset):
4 """Determine sets of tasks that do not share any resources.""" 6 """Determine sets of tasks that do not share any resources."""
5 by_res = defaultdict(set) 7 by_res = defaultdict(set)
@@ -25,3 +27,15 @@ def find_connected_components(taskset):
25 by_task[t] = c 27 by_task[t] = c
26 28
27 return by_task, by_res 29 return by_task, by_res
30
31def find_independent_tasksubsets(taskset):
32 by_task, by_res = find_connected_components(taskset)
33 done = set()
34 subsets = []
35
36 for t in by_task:
37 if not t in done:
38 subsets.append(TaskSystem(by_task[t]))
39 done.update(by_task[t])
40
41 return subsets
diff --git a/tests/locking.py b/tests/locking.py
index 3f75646..095d44c 100644
--- a/tests/locking.py
+++ b/tests/locking.py
@@ -534,7 +534,7 @@ class Test_partition(unittest.TestCase):
534 self.assertEqual(len(by_task), len(self.ts)) 534 self.assertEqual(len(by_task), len(self.ts))
535 for t in self.ts: 535 for t in self.ts:
536 self.assertEqual(len(by_task[t]), 4) 536 self.assertEqual(len(by_task[t]), 4)
537 self.assertTrue(t in by_task[t]) 537 self.assertIn(t, by_task[t])
538 538
539 def test_merge2(self): 539 def test_merge2(self):
540 self.ts[0].resmodel[0].add_request(1) 540 self.ts[0].resmodel[0].add_request(1)
@@ -554,4 +554,21 @@ class Test_partition(unittest.TestCase):
554 self.assertEqual(len(by_task), len(self.ts)) 554 self.assertEqual(len(by_task), len(self.ts))
555 for t in self.ts: 555 for t in self.ts:
556 self.assertEqual(len(by_task[t]), 2) 556 self.assertEqual(len(by_task[t]), 2)
557 self.assertTrue(t in by_task[t]) 557 self.assertIn(t, by_task[t])
558
559 def test_subsets(self):
560 self.ts[0].resmodel[0].add_request(1)
561 self.ts[0].resmodel[1].add_request(1)
562 self.ts[1].resmodel[1].add_request(1)
563
564 self.ts[2].resmodel[2].add_request(1)
565 self.ts[2].resmodel[3].add_request(1)
566 self.ts[3].resmodel[3].add_request(1)
567
568 subsets = lp.find_independent_tasksubsets(self.ts)
569 self.assertEqual(len(subsets), 2)
570 subsets.sort(key=lambda x: x.utilization())
571 self.assertIn(self.ts[0], subsets[0])
572 self.assertIn(self.ts[1], subsets[0])
573 self.assertIn(self.ts[2], subsets[1])
574 self.assertIn(self.ts[3], subsets[1])