def TestBansal(): G = syn.InitRandom(10, makeInt=True) WG = G.copy() WG.remove_edges_from([(u, v) for (u, v, d) in WG.edges(data=True) if d['weight'] < 0.0]) viz.DrawGraph(WG, title='original') print("Trying Bansal") ban = bansal.BansalSolver(WG) components = ban.run() labels = dict() ci = 1 for component in components: for v in component: labels[v] = ci ci = ci + 1 E = seg.GetLabelEnergy(G, labels) print("Bansal energy is " + str(E)) L = seg.GetLabelsAtThreshold(G, theta=0) E = seg.GetLabelEnergy(G, L) print("CC at zero is " + str(E)) thresh, minE = seg.FindMinEnergyThreshold(G) print("CC min is " + str(minE)) plt.show() print("Done")
def FindBestThreshold(NG, RG, WCLabels): edgeWeights = [(u, v, w) for (u, v, w) in NG.edges(data='weight')] sortedEdges = sorted(edgeWeights, reverse=True, key=lambda edge: edge[2]) bestL = WCLabels.copy() bestE = seg.GetLabelEnergy(RG, bestL) bestT = sortedEdges[0][2] + DELTA_TOLERANCE print("E = " + str(bestE) + " from T = " + str(bestT)) for e in sortedEdges: t = e[2] - DELTA_TOLERANCE L = seg.GetLabelsAtThreshold(NG, theta=t) lowerL = WCLabels.copy() for n in lowerL: lowerL[n] = L[lowerL[n]] lowerE = seg.GetLabelEnergy(RG, lowerL) if lowerE < bestE: bestE = lowerE bestL = lowerL.copy() bestT = t print("E = " + str(bestE) + " from T = " + str(bestT)) return bestL, bestE, bestT
def Minimize(G, width, theta=None, minType=None): if minType is None: minType = 'kl' # kl (heurestic) or lp if theta is None: theta = 0.5 # Used to round the result (note.. if all results are integer already that tells us its optimal for sure (I think)) ExportGraph(G, width) cmd = "graphCluster -n " + str(len(G)) + " -c " + minType print(cmd) os.system(cmd) edgeLabels = ImportEdgeLabels(width) # label the nodes lg = G.copy() for (u, v, d) in lg.edges(data=True): d['weight'] = edgeLabels[(u, v)] lg.remove_edges_from([(u, v) for (u, v, d) in lg.edges(data=True) if d['weight'] >= theta]) nodeLabels = { node: color for color, comp in enumerate(nx.connected_components(lg)) for node in comp } minE = seg.GetLabelEnergy(G, nodeLabels) return nodeLabels, minE
def TestKruskal(): #np.random.seed(1) WG = syn.InitRandom(10, 1, False) viz.DrawGraph(WG, title='original') # Get the labeling at threshold 0 and calculate energy L = seg.GetLabelsAtThreshold(WG, theta=0) E = seg.GetLabelEnergy(WG, L) print("Energy at zero is " + str(E)) viz.DrawGraph(WG, labels=LG, title='original') # Find the best threshold and check it thresh, minE = seg.FindMinEnergyThreshold(WG) print("Minimum energy at " + str(thresh) + " is " + str(minE)) # check to see if that's correct L = seg.GetLabelsAtThreshold(WG, theta=thresh) E2 = seg.GetLabelEnergy(WG, L) print("Energy check: " + str(E2)) viz.DrawGraph(WG, labels=LG, title='bestThresh') plt.show()
def Minimize(WG, nodeType=None): if nodeType is None: nodeType = 'CC' #print("DsnNode: Minimizing...") param = dict() param['nodeType'] = nodeType if nodeType == 'CC': thresh, minE = seg.FindMinEnergyThreshold(WG) #print("WS Min Energy: " + str(minE) + " @ t=" + str(thresh)) param['threshold'] = thresh L = seg.GetLabelsAtThreshold(WG, theta=thresh) #E2 = seg.GetLabelEnergy(WG, L) #print("Energy check: " + str(minE) + " verse " + str(E2)) elif nodeType == 'WC': WC = seg.GetWatershedGraph(WG) thresh, minE = seg.FindMinEnergyThreshold(WC, eval=WG) #print("WS Min Energy: " + str(minE) + " @ t=" + str(thresh)) param['threshold'] = thresh L = seg.GetLabelsAtThreshold(WC, theta=thresh) #E2 = seg.GetLabelEnergy(WG, L) #print("Energy check: " + str(E2)) elif nodeType == 'WS': # fixed threshold WC WC = seg.GetWatershedGraph(WG) param['threshold'] = 0.0 L = seg.GetLabelsAtThreshold(WC, theta=0.0) minE = seg.GetLabelEnergy(WG, L) #print("Energy check: " + str(E2)) #print("DsnNode: Done") return L, minE, param