1- from collections import defaultdict
21from collections .abc import Mapping as MappingABC
3- from dataclasses import dataclass
42import logging
53from numbers import Number
64from numbers import Real
75
86from accelforge .frontend import arch
9- from accelforge .frontend .mapping .mapping import MappingNode
107from accelforge .frontend .spec import Spec
118from accelforge .model ._looptree .reuse .symbolic import SymbolicAnalysisOutput
129from accelforge .util ._base_analysis_types import (
1310 ActionCount ,
1411 ActionKey ,
1512 VerboseActionKey ,
1613)
17- from accelforge .frontend .workload import Workload
18- from accelforge .frontend .mapping import Mapping
14+ from accelforge .model ._looptree .types import Network
1915
2016
2117def gather_actions (
@@ -29,6 +25,7 @@ def gather_actions(
2925
3026 buffet_keyer = _get_buffet_keyer (verbose , use_name , bindings )
3127 compute_keyer = _get_compute_keyer (verbose , use_name , bindings )
28+ network_keyer = _get_network_keyer (verbose , use_name , bindings )
3229
3330 for buffet , accesses in looptree_results .buffet_stats .items ():
3431 if buffet .level in compute_levels :
@@ -60,6 +57,13 @@ def gather_actions(
6057 actions [key ].total += ops .total_ops
6158 actions [key ].max_per_unit += ops .max_per_unit_ops
6259
60+ for network , stats in looptree_results .network_stats .items ():
61+ key = network_keyer (network , "hops" )
62+ if key not in actions :
63+ actions [key ] = ActionCount .default ()
64+ actions [key ].total += stats .total_hops
65+ actions [key ].max_per_unit += stats .max_hops
66+
6367 return actions
6468
6569
@@ -111,6 +115,22 @@ def compute_keyer(compute, action_name):
111115 return compute_keyer
112116
113117
118+ def _get_network_keyer (verbose , use_name , bindings ):
119+ if not verbose :
120+ def network_keyer (network : Network , action_name : str ):
121+ component = network .component
122+ if not use_name :
123+ component = bindings [component ]
124+ return ActionKey (component , action_name )
125+ else :
126+ def network_keyer (network : Network , action_name : str ):
127+ component = network .component
128+ if not use_name :
129+ component = bindings [component ]
130+ return VerboseActionKey (component , action_name , network .tensor , network .einsum )
131+ return network_keyer
132+
133+
114134def compute_energy_from_actions (
115135 spec : Spec ,
116136 action_counts : MappingABC [ActionKey , Real ],
@@ -135,7 +155,7 @@ def compute_energy_from_actions(
135155 energy_per_ac = component_obj .actions [key .action ].energy
136156 except KeyError as e :
137157 raise KeyError (
138- f"Action { key .action } not found in component { key .component } . Action occurred "
158+ f"Action { key .action } not found in component { key .level } . Action occurred "
139159 f"{ counts .total } times."
140160 ) from None
141161 energy_result [key ] = counts .total * energy_per_ac
0 commit comments