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
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
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())