Skip to content

Commit edb69a6

Browse files
committed
#558: output: add output to JSON for vt-tv for dervied stats
1 parent c7130e7 commit edb69a6

File tree

4 files changed

+62
-13
lines changed

4 files changed

+62
-13
lines changed

src/lbaf/IO/lbsVTDataWriter.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import multiprocessing as mp
4545
import os
4646
import sys
47+
import math
4748
from logging import Logger
4849
from typing import Optional
4950

@@ -131,6 +132,20 @@ def __create_tasks(self, rank_id, objects, migratable):
131132
user_defined = o.get_user_defined()
132133
if user_defined:
133134
task_data["user_defined"] = dict(sorted(user_defined.items()))
135+
else:
136+
task_data["user_defined"] = dict()
137+
138+
task_data["user_defined"]["object_memory"] = o.get_size()
139+
task_data["user_defined"]["object_overhead_memory"] = o.get_overhead()
140+
task_data["user_defined"]["rank_id"] = o.get_rank_id()
141+
task_data["user_defined"]["sent_volume"] = o.get_sent_volume()
142+
task_data["user_defined"]["received_volume"] = o.get_received_volume()
143+
task_data["user_defined"]["max_volume"] = o.get_max_volume()
144+
145+
if o.get_shared_id() is not None:
146+
task_data["user_defined"]["shared_id"] = o.get_shared_id()
147+
else:
148+
task_data["user_defined"]["shared_id"] = -1
134149

135150
tasks.append(task_data)
136151

@@ -243,7 +258,31 @@ def _json_serializer(self, rank_phases_double) -> str:
243258

244259
# Create data to be outputted for current phase
245260
self.__logger.debug(f"Writing phase {p_id} for rank {r_id}")
261+
rank_info : Rank = [r for r in current_phase.get_ranks() if r.get_id() == r_id][0]
262+
# JSON can not handle nan so make this ratio -1 when it's not valid
263+
homed_ratio = -1
264+
if not math.isnan(rank_info.get_homed_blocks_ratio()):
265+
homed_ratio = rank_info.get_homed_blocks_ratio()
246266
phase_data= {"id": p_id,
267+
"user_defined": {
268+
"id": rank_info.get_id(),
269+
"load": rank_info.get_load(),
270+
"num_shared_blocks": rank_info.get_number_of_shared_blocks(),
271+
"num_homed_blocks": rank_info.get_number_of_homed_blocks(),
272+
"num_uprooted_blocks": rank_info.get_number_of_uprooted_blocks(),
273+
"num_homed_ratio": homed_ratio,
274+
"num_homed_blocks": rank_info.get_number_of_homed_blocks(),
275+
"shared_memory": rank_info.get_shared_memory(),
276+
"num_objects": rank_info.get_number_of_objects(),
277+
"num_migratable_objects": len(rank_info.get_migratable_objects()),
278+
"num_sentinel_objects": len(rank_info.get_sentinel_objects()),
279+
"migratable_load": rank_info.get_migratable_load(),
280+
"sentinel_load": rank_info.get_sentinel_load(),
281+
"sent_volume": rank_info.get_sent_volume(),
282+
"received_volume": rank_info.get_received_volume(),
283+
"max_object_level_memory": rank_info.get_max_object_level_memory(),
284+
"max_memory_usage": rank_info.get_max_memory_usage()
285+
},
247286
"tasks": sorted(
248287
self.__create_tasks(
249288
r_id, rank.get_migratable_objects(), migratable=True) +

src/lbaf/Model/lbsBlock.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ def __init__(
5454
o_ids = set()
5555

5656
# Block index
57-
if not isinstance(b_id, int) or isinstance(b_id, bool):
58-
raise TypeError(
59-
f"b_id: incorrect type {type(b_id)}")
60-
self.__index = b_id
57+
# if not isinstance(b_id, int) or isinstance(b_id, bool):
58+
# raise TypeError(
59+
# f"b_id: incorrect type {type(b_id)}")
60+
self.__index = int(b_id)
6161

6262
# Rank to which block is initially assigned
6363
if not isinstance(h_id, int) or isinstance(h_id, bool):

src/lbaf/Model/lbsObject.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,21 @@ def get_received(self) -> dict:
205205

206206
def get_received_volume(self) -> float:
207207
"""Return volume of communications received by object."""
208-
return sum(v for v in self.__communicator.get_received().values()) if self.__communicator else 0
208+
v : float = 0.0
209+
v += sum(v for v in self.__communicator.get_received().values()) if self.__communicator else 0.0
210+
return v
209211

210212
def get_sent_volume(self) -> float:
211213
"""Return volume of communications sent by object."""
212-
return sum(v for v in self.__communicator.get_sent().values()) if self.__communicator else 0
214+
v : float = 0.0
215+
v += sum(v for v in self.__communicator.get_sent().values()) if self.__communicator else 0.0
216+
return v
213217

214218
def get_max_volume(self) -> float:
215219
"""Return the maximum bytes received or sent by object."""
216-
return self.__communicator.get_max_volume() if self.__communicator else 0
220+
v : float = 0.0
221+
v += self.__communicator.get_max_volume() if self.__communicator else 0.0
222+
return v
217223

218224
def set_rank_id(self, r_id: int) -> None:
219225
"""Assign object to rank ID"""

src/lbaf/Model/lbsRank.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -247,16 +247,20 @@ def get_load(self) -> float:
247247

248248
def get_migratable_load(self) -> float:
249249
"""Return migratable load on rank."""
250-
return sum(o.get_load() for o in self.__migratable_objects)
250+
val : float = 0.0
251+
val += sum(o.get_load() for o in self.__migratable_objects)
252+
return val
251253

252254
def get_sentinel_load(self) -> float:
253255
"""Return sentinel load on rank."""
254-
return sum(o.get_load() for o in self.__sentinel_objects)
256+
val : float = 0.0
257+
val += sum(o.get_load() for o in self.__sentinel_objects)
258+
return val
255259

256-
def get_received_volume(self):
260+
def get_received_volume(self) -> float:
257261
"""Return volume received by objects assigned to rank from other ranks."""
258262
# Iterate over all objects assigned to rank
259-
volume = 0
263+
volume : float = 0.0
260264
obj_set = self.__migratable_objects.union(self.__sentinel_objects)
261265
for o in obj_set:
262266
# Skip objects without communication
@@ -269,10 +273,10 @@ def get_received_volume(self):
269273
# Return computed volume
270274
return volume
271275

272-
def get_sent_volume(self):
276+
def get_sent_volume(self) -> float:
273277
"""Return volume sent by objects assigned to rank to other ranks."""
274278
# Iterate over all objects assigned to rank
275-
volume = 0
279+
volume = 0.0
276280
obj_set = self.__migratable_objects.union(self.__sentinel_objects)
277281
for o in obj_set:
278282
# Skip objects without communication

0 commit comments

Comments
 (0)