diff options
author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2012-02-20 03:17:47 -0500 |
---|---|---|
committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2012-02-20 03:17:47 -0500 |
commit | b99084aaaf78b4e87ca41b310121b87630239377 (patch) | |
tree | 969ea71438ebd5a73972955813dea9f5a1c36be7 | |
parent | 5740e3a7d6e8da4bc803f936fc826d355772fbc9 (diff) |
Add convenience wrapper to find_connected_components()
-rw-r--r-- | schedcat/locking/partition.py | 14 | ||||
-rw-r--r-- | tests/locking.py | 21 |
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 @@ | |||
1 | from collections import defaultdict | 1 | from collections import defaultdict |
2 | 2 | ||
3 | from schedcat.model.tasks import TaskSystem | ||
4 | |||
3 | def find_connected_components(taskset): | 5 | def 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 | |||
31 | def 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]) | ||