Skip to content

Commit ca16661

Browse files
Better log messages
1 parent 56d415b commit ca16661

File tree

4 files changed

+57
-6
lines changed

4 files changed

+57
-6
lines changed

hwcomponents/_logging.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ def _init_logger(self, name: str = None):
7474

7575
@property
7676
def logger(self) -> logging.Logger:
77+
if getattr(self.__class__, "_hwcomponents_logger", None) is not None:
78+
return self.__class__._hwcomponents_logger
7779
if getattr(self, "_logger", None) is None:
7880
if hasattr(self, "__name__"):
7981
self._logger = get_logger(self.__name__)

hwcomponents/_model_wrapper.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -323,10 +323,24 @@ def get_initialized_subclass(self, query: ModelQuery) -> ComponentModel:
323323
self.logger.info(
324324
f"Initializing {self.model_cls.__name__} from {self.model_cls.__module__}"
325325
)
326-
subclass = self.init_function.call(
327-
query.component_attributes, self.component_name
328-
)
329-
subclass._init_logger()
326+
try:
327+
self.model_cls._hwcomponents_logger = self.logger
328+
subclass = self.init_function.call(
329+
query.component_attributes, self.component_name
330+
)
331+
except Exception:
332+
raise
333+
finally:
334+
self.model_cls._hwcomponents_logger = None
335+
336+
for message in pop_all_messages(subclass.logger):
337+
self.logger.info(f"{message}")
338+
339+
for subcomponent in subclass.subcomponents:
340+
self.logger.info(f"Log for subcomponent {subcomponent.__class__.__name__}:")
341+
for message in pop_all_messages(subcomponent.logger):
342+
if message:
343+
self.logger.info(f"\t{message}")
330344
return subclass
331345

332346
def get_matching_actions(self, query: ModelQuery) -> List[CallableFunction]:

hwcomponents/model.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from numbers import Number
44
from functools import wraps
55
from typing import Any, Callable, List, Type, Union, TypeVar
6-
from hwcomponents._logging import ListLoggable
6+
from hwcomponents._logging import ListLoggable, pop_all_messages
77
from hwcomponents._util import parse_float
88

99
T = TypeVar("T", bound="ComponentModel")
@@ -52,10 +52,15 @@ def action(
5252

5353
@wraps(func)
5454
def wrapper(self: "ComponentModel", *args, **kwargs):
55+
self.logger.info("")
56+
self.logger.info(
57+
f"Calling action {self.__class__.__name__}.{func.__name__} with arguments {args} and {kwargs}"
58+
)
5559
for subcomponent in self.subcomponents:
5660
subcomponent._energy_used = 0
5761
subcomponent._latency_used = 0
5862
scale = 1
63+
scalestr = None
5964
if bits_per_action is not None and "bits_per_action" in kwargs:
6065
nominal_bits = None
6166
try:
@@ -69,6 +74,7 @@ def wrapper(self: "ComponentModel", *args, **kwargs):
6974
f"are defined in the class."
7075
)
7176
scale = kwargs["bits_per_action"] / nominal_bits
77+
scalestr = f"Scaling by {kwargs['bits_per_action']=} / {nominal_bits=}"
7278
kwargs = {k: v for k, v in kwargs.items() if k not in additional_kwargs}
7379
returned_value = func(self, *args, **kwargs)
7480
# Normalize return to (energy, latency)
@@ -89,21 +95,48 @@ def wrapper(self: "ComponentModel", *args, **kwargs):
8995
f"Expected a tuple of (energy, latency), got {returned_value}."
9096
)
9197

98+
self.logger.info(
99+
f"Function {func.__name__} returned energy {energy_val} and latency {latency_val}"
100+
)
101+
if scalestr is not None:
102+
self.logger.info(scalestr)
103+
92104
energy_val *= self.energy_scale
105+
if self.energy_scale != 1:
106+
self.logger.info(f"Scaling energy by {self.energy_scale=}")
93107
for subcomponent in self.subcomponents:
108+
self.logger.info(
109+
f"Adding subcomponent {subcomponent.__class__.__name__} energy {subcomponent._energy_used}"
110+
)
94111
energy_val += subcomponent._energy_used
95112
subcomponent._energy_used = 0
96113
energy_val *= scale
97114
self._energy_used += energy_val
98115

99116
latency_val *= self.latency_scale
117+
if self.latency_scale != 1:
118+
self.logger.info(f"Scaling latency by {self.latency_scale=}")
100119
target_func = max if pipelined_subcomponents else sum
120+
x = "Max" if pipelined_subcomponents else "Summ"
101121
for subcomponent in self.subcomponents:
122+
self.logger.info(
123+
f"{x}ing subcomponent {subcomponent.__class__.__name__} latency {subcomponent._latency_used}"
124+
)
102125
latency_val = target_func((latency_val, subcomponent._latency_used))
103126
subcomponent._latency_used = 0
104127
latency_val *= scale
105128
self._latency_used += latency_val
106129

130+
for subcomponent in self.subcomponents:
131+
self.logger.info(f"Log for subcomponent {subcomponent.__class__.__name__}:")
132+
for message in pop_all_messages(subcomponent.logger):
133+
if message:
134+
self.logger.info(f"\t{message}")
135+
136+
self.logger.info(
137+
f"** Final return value for {self.__class__.__name__}.{func.__name__}: energy {energy_val} and latency {latency_val}"
138+
)
139+
107140
return energy_val, latency_val
108141

109142
wrapper._is_component_action = True
@@ -544,4 +577,4 @@ def resolve_multiple_ways_to_calculate_value(
544577
+ "\n\t".join(f"{fname}: {value}" for fname, value in success_values)
545578
)
546579

547-
return next(iter(values))
580+
return next(iter(values))

hwcomponents/select_models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ def _call_model(
4242
# Add the full traceback
4343
import traceback
4444

45+
estimation.add_messages(pop_all_messages(model.logger))
46+
4547
estimation.add_messages(traceback.format_exc().split("\n"))
4648
return estimation
4749

0 commit comments

Comments
 (0)