def rule_1(hypergraph, return_features=False, compute_string=True):
     modified = False
     pendant_features = ReducibleFeature.extract_rule_1_features(hypergraph)
     if return_features:
         pendant_features = list(pendant_features)
     
     affected_nodes = set()
     
     for feature in pendant_features:
         if not modified:
             modified = True
         feature.reduce(hypergraph, compute_string)
         affected_nodes |= set(feature.reducible_nodes) | set(feature.peripheral_nodes)
     
     hypergraph.update_nodes_with_n_neighbors(affected_nodes)
     
     return modified, pendant_features if return_features else None
 def rule_2(hypergraph, return_features=False, compute_string=True):
     modified = False
     series_features = ReducibleFeature.extract_rule_2_features(hypergraph)
     if return_features:
         series_features = list(series_features)
     
     affected_nodes = set()
     new_edges = set()
     
     for feature in series_features:
         if not modified:
             modified = True
         _new_edges = feature.reduce(hypergraph, compute_string)
         affected_nodes |= set(feature.reducible_nodes) | set(feature.peripheral_nodes)
         new_edges |= _new_edges
     
     hypergraph.update_parallel_edges_groups(new_edges)
     hypergraph.update_nodes_with_n_neighbors(affected_nodes)
     
     return modified, series_features if return_features else None
 def rules_4_5_6_7(hypergraph, return_features=False, compute_string=True):
     modified = False
     degree_3_features = ReducibleFeature.extract_degree_3_features(hypergraph)
     if return_features:
         degree_3_features = list(degree_3_features)
     
     affected_nodes = set()
     new_edges = set()
     
     for feature in degree_3_features:
         if not modified:
             modified = True
         _new_edges = feature.reduce(hypergraph, compute_string)
         affected_nodes |= set(feature.reducible_nodes) | set(feature.peripheral_nodes)
         new_edges |= _new_edges
     
     new_hedges = set(filter(lambda edge_id: edge_id.startswith(u"he_"), new_edges))
     
     hypergraph.update_parallel_edges_groups(new_edges - new_hedges)
     hypergraph.update_parallel_hedges_groups(new_hedges)
     hypergraph.update_nodes_with_n_neighbors(affected_nodes)
     
     return modified, degree_3_features if return_features else None