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