def delete_nodes(G, type='deg', percent_remove=0.01): total_nodes = G.number_of_nodes() remove_count = int(percent_remove * total_nodes) print(' Adversary removes {} nodes'.format(remove_count)) if type == 'deg': deg = dict(G.degree()) deg_sorted = _mylib.sortDictByValues(deg, reverse=True) l = deg_sorted elif type == 'pr': pr = dict(nx.pagerank(G)) pr_sorted = _mylib.sortDictByValues(pr, reverse=True) l = pr_sorted elif type == 'betweeness': betweeness = dict(nx.betweenness_centrality(G)) betweeness_sorted = _mylib.sortDictByValues(betweeness, reverse=True) l = betweeness_sorted G_copy = G.copy() for idx, i in enumerate(l): if idx == remove_count: break node = i[0] d = i[1] G_copy.remove_node(node) print(' {} Remove node {}'.format(idx, node)) return G_copy
def delete_hub_nodes_connect(G, percent_remove=.01): total_node = G.number_of_nodes() remove_count = int(percent_remove * total_node) print('Remove total:' + str(remove_count)) G_copy = G.copy() i = 0 possible_nodes = set(G_copy.nodes()) while i < remove_count: deg = dict(G_copy.degree(possible_nodes)) deg_sorted = _mylib.sortDictByValues(deg, reverse=True) selected_node = deg_sorted[0][0] G_tmp = G_copy.copy() G_tmp.remove_node(selected_node) isConnected = nx.is_connected(G_tmp) if isConnected: G_copy.remove_node(selected_node) i += 1 else: print('Cannot remove this node \t {} / {}'.format(i, remove_count)) possible_nodes.remove(selected_node) return G_copy
def randomFromLargeCommunity(self, G, dataset): com_fname = './data/pickle/communities_{}.pickle'.format(dataset) if os.path.isfile(com_fname): partition = pickle.load(open(com_fname, 'rb')) else: partition = community.best_partition(G) pickle.dump(partition, open(com_fname, 'wb')) count_members = {} for p in set(partition.values()): members = _mylib.get_members_from_com(p, partition) count_members[p] = len(members) selected_p, i = _mylib.get_max_values_from_dict( count_members, count_members.keys()) members = _mylib.get_members_from_com(selected_p, partition) degree = self._graph.degree(members) degree_sorted = _mylib.sortDictByValues(degree, reverse=True) size = int(.5 * len(degree)) degree_sorted = degree_sorted[:size] return random.choice(degree_sorted)[0]
def randomHighDegreeNode(self): degree = self._graph.degree() degree_sorted = _mylib.sortDictByValues(degree, reverse=True) size = int(.3 * len(degree)) degree_sorted = degree_sorted[:size] return random.choice(degree_sorted)[0]