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())
def MaintainKDTruss(self, k, d, graph, Q, Wq): Gt = copy.deepcopy(graph) while GraphFunc.connected(Gt, Q): TE, supE = ATindex.StructuralTrussness(Gt) distG = GraphFunc.getDistG(Gt, Q) edgestodelete = {} for v in distG: if distG[v] > d: for u in Gt[v][0]: edgestodelete[self.cedge(u, v)] = 1 for e in supE: if supE[e] < k - 2: edgestodelete[e] = 1 if len(edgestodelete) == 0: return Gt Gt = GraphFunc.deleteEdges(Gt, edgestodelete) if len(Gt) == 0: break return Gt