Skip to content

Commit 5e77e50

Browse files
committed
#591: initial commit (wip)
1 parent 3203329 commit 5e77e50

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
from typing import Set, List
2+
3+
class JSONSpecFileMaker:
4+
5+
def __init__(self):
6+
self.tasks = {}
7+
self.ranks = {}
8+
self.phases = {}
9+
10+
self.current_ids = {
11+
"seq": 0,
12+
"shared": 0,
13+
"rank": 0,
14+
"phase": 0,
15+
}
16+
17+
self.id_sets = {
18+
"seq": set(),
19+
"shared": set(),
20+
"rank": set(),
21+
"phase": set(),
22+
}
23+
24+
def generateNextID_(self, key: str) -> int:
25+
""" Generic function to generate and update the next available ID for a given category. """
26+
if key not in self.current_ids or key not in self.id_sets:
27+
raise ValueError(f"Invalid key: {key}")
28+
29+
while self.current_ids[key] in self.id_sets[key]:
30+
self.current_ids[key] += 1
31+
32+
next_id = self.current_ids[key]
33+
self.current_ids[key] += 1
34+
return next_id
35+
36+
def generateMetadata_(self, rank_id: int) -> dict:
37+
return {
38+
"rank": rank_id,
39+
"type": "LBDatafile"
40+
}
41+
42+
def assertIDExists(self, test_id: int, id_type: str):
43+
assert test_id in self.id_sets[id_type], f"Task {test_id} has not been created yet. Use createTask() method."
44+
45+
def createTask(self, time: float, seq_id: int = -1, collection_id: int = 7, migratable: bool = True, home = -1, node = -1, user_defined: dict = None) -> dict:
46+
if seq_id < 0:
47+
seq_id = self.generateNextID_("seq")
48+
49+
task = {
50+
"entity": {
51+
"collection_id": collection_id,
52+
"home": home,
53+
"migratable": migratable,
54+
"seq_id": seq_id,
55+
"type": "object"
56+
},
57+
"node": node,
58+
"resource": "cpu",
59+
"time": time,
60+
}
61+
62+
if user_defined is not None:
63+
task["user_defined"] = user_defined
64+
65+
self.tasks[seq_id] = tasks
66+
67+
return task
68+
69+
def createSharedBlock(self, bytes: float, tasks: List[dict]):
70+
shared_id = generateNextID("shared")
71+
shared_block = {}
72+
for task in tasks:
73+
self.assertIDExists(task["entity"]["seq_id"], "seq")
74+
# Create a shared block?
75+
return shared_block
76+
77+
def createPhase(self, p_id: int = -1) -> dict:
78+
if p_id < 0:
79+
p_id = generateNextID_("phase")
80+
phase = {
81+
"id": p_id
82+
}
83+
self.phases[p_id] = phase
84+
return phase
85+
86+
def createRank(self, r_id: int = -1) -> dict:
87+
if r_id < 0:
88+
r_id = generateNextID_("rank")
89+
rank = {
90+
"metadata": generateMetadata_(r_id),
91+
"phases": {} # this is for indexing while building, we need this to be a list by the end
92+
}
93+
self.ranks[r_id] = rank
94+
return rank
95+
96+
def assignTask(self, task: dict, phase: dict, rank: dict):
97+
seq_id = task["entity"]["seq_id"]
98+
self.assertIDExists(seq_id, "seq")
99+
p_id = phase["id"]
100+
self.assertIDExists(p_id, "phase")
101+
r_id = rank["metadata"]["rank"]
102+
self.assertIDExists(r_id, "rank")
103+
104+
r = self.ranks[r_id]
105+
p = self.phases[p_id]
106+
107+
p["tasks"].append(self.tasks[seq_id])
108+
r["phases"][p_id] = p
109+
110+
def write(self):
111+
for r in self.ranks:
112+
formatted_r = {
113+
"metadata": r["metadata"],
114+
"phases": r["phases"].values()
115+
}
116+
# Then write out

0 commit comments

Comments
 (0)