@@ -129,8 +129,9 @@ def __init__(
129129 self .__generating_set = None
130130 self .__all_subgraph_weights = None
131131 self .__given_weights_model = None
132+ self .__source_flow = None
132133
133- utils .logger .info (f"{ __name__ } : initialized with graph id = { id (G )} " )
134+ utils .logger .info (f"{ __name__ } : initialized with graph id = { utils . fpid (G )} " )
134135
135136 def solve (self ) -> bool :
136137 """
@@ -236,6 +237,21 @@ def __solve_with_given_weights(self) -> bool:
236237 self .__given_weights_model = given_weights_kfd_solver
237238 sol = self .__given_weights_model .get_solution (remove_empty_paths = True )
238239 utils .logger .info (f"{ __name__ } : found an MFD solution with given weights in { len (sol ['paths' ])} paths weights { sol ['weights' ]} " )
240+ else :
241+ utils .logger .info (f"{ __name__ } : did NOT found an MFD solution with given weights" )
242+
243+ def __get_source_flow (self ):
244+ if self .__source_flow is None :
245+ self .__source_flow = 0
246+ for v in self .G .nodes ():
247+ if self .G .in_degree (v ) == 0 :
248+ for _ , _ , data in self .G .out_edges (v , data = True ):
249+ if self .flow_attr in data :
250+ self .__source_flow += data [self .flow_attr ]
251+ utils .logger .debug (f"{ __name__ } : source_flow = { self .__source_flow } " )
252+ return self .__source_flow
253+ else :
254+ return self .__source_flow
239255
240256 def __get_partition_constraints_for_min_gen_set (
241257 self ,
@@ -271,7 +287,7 @@ def __get_partition_constraints_for_min_gen_set(
271287 for i in range (level [u ], level [v ]):
272288 level_edges [i ].append ((u , v ))
273289
274- source_flow = sum ( self .G . nodes [ n ]. get ( self . flow_attr , 0 ) for n in self . G . nodes () if self . G . in_degree ( n ) == 0 )
290+ source_flow = self .__get_source_flow ( )
275291
276292 # Now we create the partition constraints
277293 for i in range (max_level ):
@@ -306,7 +322,10 @@ def __get_lowerbound_with_min_gen_set(self) -> int:
306322
307323 start_time = time .time ()
308324 all_weights = list (set ({self .G .edges [e ][self .flow_attr ] for e in self .G .edges () if self .flow_attr in self .G .edges [e ]}))
309- source_flow = sum (self .G .nodes [n ].get (self .flow_attr , 0 ) for n in self .G .nodes () if self .G .in_degree (n ) == 0 )
325+ # Get the source_flow as the sum of the flow values on all the edges exiting the source nodes
326+ # (i.e., nodes with in-degree 0)
327+ source_flow = self .__get_source_flow ()
328+ # source_flow = sum(self.G.nodes[n].get(self.flow_attr, 0) for n in self.G.nodes() if self.G.in_degree(n) == 0)
310329 current_lowerbound_k = self .__lowerbound_k if self .__lowerbound_k is not None else 1
311330 min_gen_set_lowerbound = None
312331
@@ -332,6 +351,9 @@ def __get_lowerbound_with_min_gen_set(self) -> int:
332351 self .__generating_set = mingenset_model .get_solution ()
333352 min_gen_set_lowerbound = len (self .__generating_set )
334353 utils .logger .info (f"{ __name__ } : found a min gen set solution with { min_gen_set_lowerbound } elements ({ self .__generating_set } )" )
354+ else :
355+ utils .logger .info (f"{ __name__ } : did NOT find a min gen set solution" )
356+ exit (0 )
335357
336358 self .solve_statistics ["min_gen_set_solve_time" ] = time .time () - start_time
337359
0 commit comments