Beispiel #1
0
def AttributedTrussness(graph,Wq,attrTE,attrSupE):
    attrTE = {}
    attrSupE = {}
    if '' not in attrTE.keys() or '' not in attrSupE.keys():
        attrTE[''],attrSupE[''] = StructuralTrussness(graph)
    for w in Wq:
        if w not in attrTE.keys() or w not in attrSupE.keys():
            flag = [v for v in graph.keys() if w in graph[v][1]]
            subgraph = GraphFunc.buildNewGraph(graph, flag)
            attrTE[w], attrSupE[w] = StructuralTrussness(subgraph)
    return attrTE, attrSupE
Beispiel #2
0
def computeGainFunc(k, graph, Wq):
    gain = {}
    fHWq = attributeScore(graph, Wq)
    for v in graph.keys():
        flagv = {}
        for u in graph[v][0]:
            if len(graph[u][0]) == k - 1:
                flagv[u] = 0
            else:
                flagv[u] = 1
        flagv[v] = 0
        flagset = []
        for u in graph.keys():
            if flagv.get(u) is None: flagset.append(u)
            elif flagv[u] == 1: flagset.append(u)
        newG = GraphFunc.buildNewGraph(graph, flagset)
        if len(newG) == 0:
            gain[v] = INF
        else:
            gain[v] = fHWq - attributeScore(
                GraphFunc.buildNewGraph(graph, flagset), Wq)
    return gain
Beispiel #3
0
    def BULK(self, graph, Q, Wq, k, d):
        l = 0
        Gl1 = copy.deepcopy(graph)
        distG = GraphFunc.getDistG(graph, Q)
        d = max(max(distG.values()), d)
        S = [v for v in Gl1.keys() if distG[v] <= d]
        Gl2 = GraphFunc.buildNewGraph(Gl1, S)
        ktemp = self.INF
        TE, supE = ATindex.StructuralTrussness(Gl2)
        for q in Q:
            ktmp = max(TE[self.cedge(q, v)] for v in Gl2[q][0])
            k = min(ktemp, ktmp)
        k = min(ktemp, k)
        while True:
            if k == 2: break
            if GraphFunc.connected(self.MaintainKDTruss(k, d, Gl2, Q, Wq), Q):
                break
            k -= 1
        Gl = self.MaintainKDTruss(k, d, Gl2, Q, Wq)
        maxfunc, ansg = -self.INF, None
        while GraphFunc.connected(Gl, Q):
            attriscore = AttributeScoreFunc.attributeScore(Gl, Wq)
            if maxfunc < attriscore:
                maxfunc, ansg = attriscore, copy.deepcopy(Gl)

            gain = AttributeScoreFunc.computeGainFunc(k, Gl, Wq)
            mingain = self.INF
            for v in gain:
                if gain[v] < mingain and not v in Q: mingain = gain[v]
            if mingain == self.INF:
                break
            S = [v for v in gain.keys() if gain[v] == mingain and not v in Q]
            if len(S) == 0:
                break
            S = random.sample(
                S, max(1, int(len(S) * self.erlta / (self.erlta + 1))))
            edgesToDelete = GraphFunc.getNeighborEdges(Gl, S)
            Gl = GraphFunc.deleteEdges(Gl, edgesToDelete)
            Gl = self.MaintainKDTruss(k, d, Gl, Q, Wq)
        return list(ansg.keys())