예제 #1
0
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")
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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()
예제 #5
0
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