@@ -113,16 +113,72 @@ def compute(self, rank: Rank):
113113
114114 def __update_load (self , rank : Rank , o_snd : list , o_rcv : list ):
115115 """Update total load if objects are to be sent and received."""
116- return rank .get_load () + sum (
117- o .get_load () for o in o_rcv ) - sum (
118- o .get_load () for o in o_snd )
116+ return rank .get_load () - sum (
117+ o .get_load () for o in o_snd ) + sum (
118+ o .get_load () for o in o_rcv )
119+
120+ def __update_homing (self , rank : Rank , o_snd : list , o_rcv : list ):
121+ """Update homing costs if objects are to be sent and received."""
122+
123+ # Keep track of rank id and objects
124+ r_id = rank .get_id ()
125+ r_obj = rank .get_objects ().copy ()
126+
127+ # Retrieve current homing cost
128+ homing = rank .get_homing ()
129+
130+ # Iterate over all sent objects
131+ for o in o_snd :
132+ # Update set of blocks on rank
133+ r_obj .discard (o )
134+
135+ # Skip locally homed blocks
136+ b = o .get_shared_block ()
137+ if b .get_home_id () == r_id :
138+ continue
139+
140+ # Determine set of removed non-homed blocks
141+ S = set ({b })
142+ for o_oth in r_obj :
143+ if o_oth .get_shared_block () == b :
144+ S = set ()
145+ break
146+
147+ # Update homing cost
148+ for b in S :
149+ homing -= b .get_size ()
150+
151+ # Iterate over all received objects
152+ for o in o_rcv :
153+ # Skip locally homed blocks
154+ b = o .get_shared_block ()
155+ if b .get_home_id () == r_id :
156+ continue
157+
158+ # Determine set of added non-homed blocks
159+ S = set ({b })
160+ for o_oth in r_obj :
161+ if o_oth .get_shared_block () == b :
162+ S = set ()
163+ break
164+
165+ # Update homing cost
166+ for b in S :
167+ homing += b .get_size ()
168+
169+ # Update set of blocks on rank
170+ r_obj .add (o )
171+
172+ # Return updated value
173+ return homing
119174
120175 def update (self , rank : Rank , o_snd : list , o_rcv : list ):
121176 """Update work if objects are to be sent and received."""
177+
122178 # Return combination of load and volumes
123179 return self .affine_combination (
124180 rank .get_alpha (),
125181 self .__update_load (rank , o_snd , o_rcv ),
126182 rank .get_received_volume (),
127183 rank .get_sent_volume (),
128- rank . get_homing ( ))
184+ self . __update_homing ( rank , o_snd , o_rcv ))
0 commit comments