Source code for cereeberus.compute.degree

import numpy as np
import networkx as nx

[docs] def up_degree(R, fx = {}): """ Compute Upper Degree of Reeb Graph degree.up_degree is deprecated. Instead use R.up_degree() to compute the up degree of a node in a Reeb graph. Args: R (reeb graph): networkx or reeb graph to use for reeb graph computation Returns: up_deg (dict): dictionary of up degrees by node """ n = len(R.nodes) up_adj = np.zeros((n,n)) i = 0 RCopy = list(R.nodes) for inode in R.nodes: RCopy.remove(inode) j = i+1 for jnode in RCopy: if fx[inode] < fx[jnode]: e = list(R.edges(inode)) if (inode,jnode) in e: up_adj[j,i]+=1 if fx[inode] > fx[jnode]: e = list(R.edges(inode)) if (inode,jnode) in e: up_adj[i,j]+=1 j+=1 i+=1 d = sum(up_adj) up_deg = {} i = 0 for node in R.nodes: up_deg[node] = int(d[i]) i+=1 return up_deg
[docs] def down_degree(R, fx ={ }): """ Compute Down Degree of Reeb Graph degree.down_degree is deprecated. Instead use R.down_degree() to compute the down degree of a node in a Reeb graph. Args: R (reeb graph): networkx or reeb graph to use for reeb graph computation Returns: down_deg (dict): dictionary of down degrees by node """ n = len(R.nodes) down_adj = np.zeros((n,n)) i = 0 RCopy = list(R.nodes) for inode in R.nodes: RCopy.remove(inode) j = i+1 for jnode in RCopy: if fx[inode] > fx[jnode]: e = list(R.edges(inode)) if (inode,jnode) in e: down_adj[j,i]+=1 if fx[inode] < fx[jnode]: e = list(R.edges(inode)) if (inode,jnode) in e: down_adj[i,j]+=1 j+=1 i+=1 d = sum(down_adj) down_deg = {} i = 0 for node in R.nodes: down_deg[node] = int(d[i]) i+=1 return down_deg
[docs] def add_nodes(R, fx, x=0): """ Function to add nodes to a Reeb Graph degree.add_nodes is deprecated. You can now use R.add_node() to add nodes to a Reeb graph. """ print('degree.add_nodes is deprecated. You can now use R.add_node() to add nodes to a Reeb graph.') from cereeberus.reeb.reebgraph import ReebGraph r = len(R.edges) e = list(R.edges) c = 0 for i in range(0,r): pt0 = e[i][0] pt1 = e[i][1] f0 = R.fx[pt0] f1 = R.fx[pt1] if f0 < fx < f1 or f1 < fx < f0: R.fx[r+c] = fx R.G.add_edge(pt0, r+c) R.G.add_edge(pt1, r+c) R.G.add_node(r+c, fx = fx, pos = (x, fx)) R.G.remove_edge(pt0, pt1) c+=1 return ReebGraph(R.G)
[docs] def minimal_reeb(R): """ Function to create minimal Reeb Graph """ print("degree.minimal_reeb is deprecated. You can now use R.remove_regular_vertices() to remove regular vertices from a Reeb graph.") R.remove_all_regular_vertices() return R
# from cereeberus.reeb.reebgraph import ReebGraph # H = R.G.copy() # for i in H.nodes: # if R.up_deg[i] == R.down_deg[i] == 1: # e = list(H.edges(i)) # pt0 = e[0][1] # pt1 = e[1][1] # H.add_edge(pt0, pt1) # H.remove_edge(i, pt0) # H.remove_edge(i, pt1) # for i in R.nodes: # if R.up_deg[i] == R.down_deg[i] == 1: # H.remove_node(i) # H = nx.convert_node_labels_to_integers(H) # return ReebGraph(H)
[docs] def remove_isolates(R): """ Function to remove isolates from Reeb Graph. Important for computation of Merge Tree """ from cereeberus.reeb.reebgraph import ReebGraph H = R.G.copy() for i in R.nodes: if R.up_deg[i] == R.down_deg[i] == 0: H.remove_node(i) H = nx.convert_node_labels_to_integers(H) return ReebGraph(H)
[docs] def heights(graph): h = [] for i in graph.nodes: pt = (i, graph.fx[i]) h.append(pt) h.sort(key = lambda x: x[1]) return h