@@ -463,8 +463,11 @@ def reason(interpretations_node, interpretations_edge, predicate_map_node, predi
463463 for idx , i in enumerate (rules_to_be_applied_edge ):
464464 if i [0 ] == t :
465465 comp , l , bnd , set_static = i [1 ], i [2 ], i [3 ], i [4 ]
466+ print ('applying edge rule at time' , t , 'for component' , comp , 'label' , l , 'bound' , bnd , 'set_static' , set_static )
466467 sources , targets , edge_l = edges_to_be_added_edge_rule [idx ]
468+ print ("adding edges:" , sources , targets , edge_l )
467469 edges_added , changes = _add_edges (sources , targets , neighbors , reverse_neighbors , nodes , edges , edge_l , interpretations_node , interpretations_edge , predicate_map_edge , num_ga , t )
470+ print ('after adding, edges are:' , edges )
468471 changes_cnt += changes
469472
470473 # Update bound for newly added edges. Use bnd to update all edges if label is specified, else use bnd to update normally
@@ -475,7 +478,7 @@ def reason(interpretations_node, interpretations_edge, predicate_map_node, predi
475478 if check_consistent_edge (interpretations_edge , e , (edge_l , bnd )):
476479 override = True if update_mode == 'override' else False
477480 u , changes = _update_edge (interpretations_edge , predicate_map_edge , e , (edge_l , bnd ), ipl , rule_trace_edge , fp_cnt , t , set_static , convergence_mode , atom_trace , save_graph_attributes_to_rule_trace , rules_to_be_applied_edge_trace , idx , facts_to_be_applied_edge_trace , rule_trace_edge_atoms , store_interpretation_changes , num_ga , mode = 'rule' , override = override )
478-
481+ print ( 'updating edge' , e , 'label' , edge_l , 'to bound' , bnd )
479482 update = u or update
480483
481484 # Update convergence params
@@ -545,6 +548,12 @@ def reason(interpretations_node, interpretations_edge, predicate_map_node, predi
545548 rules_to_be_applied_node_trace_threadsafe = numba .typed .List ([numba .typed .List .empty_list (rules_to_be_applied_trace_type ) for _ in range (len (rules ))])
546549 rules_to_be_applied_edge_trace_threadsafe = numba .typed .List ([numba .typed .List .empty_list (rules_to_be_applied_trace_type ) for _ in range (len (rules ))])
547550 edges_to_be_added_edge_rule_threadsafe = numba .typed .List ([numba .typed .List .empty_list (edges_to_be_added_type ) for _ in range (len (rules ))])
551+ # Threadsafe flags for in_loop and update within prange; merge after loop
552+ in_loop_threadsafe = numba .typed .List .empty_list (numba .types .boolean )
553+ update_threadsafe = numba .typed .List .empty_list (numba .types .boolean )
554+ for _ in range (len (rules )):
555+ in_loop_threadsafe .append (False )
556+ update_threadsafe .append (True )
548557
549558 for i in prange (len (rules )):
550559 rule = rules [i ]
@@ -571,8 +580,8 @@ def reason(interpretations_node, interpretations_edge, predicate_map_node, predi
571580
572581 # If delta_t is zero we apply the rules and check if more are applicable
573582 if delta_t == 0 :
574- in_loop = True
575- update = False
583+ in_loop_threadsafe [ i ] = True
584+ update_threadsafe [ i ] = False
576585
577586 for applicable_rule in applicable_edge_rules :
578587 e , annotations , qualified_nodes , qualified_edges , edges_to_add = applicable_rule
@@ -593,22 +602,38 @@ def reason(interpretations_node, interpretations_edge, predicate_map_node, predi
593602
594603 # If delta_t is zero we apply the rules and check if more are applicable
595604 if delta_t == 0 :
596- in_loop = True
597- update = False
605+ in_loop_threadsafe [ i ] = True
606+ update_threadsafe [ i ] = False
598607
599- # Update lists after parallel run
608+ # Update lists after parallel run
609+ print ("len" , len (rules_to_be_applied_edge_threadsafe ))
610+ for i in rules_to_be_applied_edge_threadsafe :
611+ print (i )
600612 for i in range (len (rules )):
601613 if len (rules_to_be_applied_node_threadsafe [i ]) > 0 :
602614 rules_to_be_applied_node .extend (rules_to_be_applied_node_threadsafe [i ])
603615 if len (rules_to_be_applied_edge_threadsafe [i ]) > 0 :
616+ print ('here, edge rules' )
604617 rules_to_be_applied_edge .extend (rules_to_be_applied_edge_threadsafe [i ])
618+ print ("rules_to_be_applied_edge" , rules_to_be_applied_edge )
605619 if atom_trace :
606620 if len (rules_to_be_applied_node_trace_threadsafe [i ]) > 0 :
607621 rules_to_be_applied_node_trace .extend (rules_to_be_applied_node_trace_threadsafe [i ])
608622 if len (rules_to_be_applied_edge_trace_threadsafe [i ]) > 0 :
609623 rules_to_be_applied_edge_trace .extend (rules_to_be_applied_edge_trace_threadsafe [i ])
610624 if len (edges_to_be_added_edge_rule_threadsafe [i ]) > 0 :
625+ print ('here, edge add' )
611626 edges_to_be_added_edge_rule .extend (edges_to_be_added_edge_rule_threadsafe [i ])
627+ print ("edges_to_be_added_edge_rule" , edges_to_be_added_edge_rule )
628+
629+ # Merge threadsafe flags for in_loop and update
630+ in_loop = in_loop
631+ update = update
632+ for i in range (len (rules )):
633+ if in_loop_threadsafe [i ]:
634+ in_loop = True
635+ if not update_threadsafe [i ]:
636+ update = False
612637
613638 # Check for convergence after each timestep (perfect convergence or convergence specified by user)
614639 # Check number of changed interpretations or max bound change
@@ -1964,4 +1989,4 @@ def str_to_int(value):
19641989 for i , v in enumerate (value ):
19651990 result += (ord (v ) - 48 ) * (10 ** (final_index - i ))
19661991 result = - result if negative else result
1967- return result
1992+ return result
0 commit comments