Newer
Older
import networkx as nx
import numpy as np
import random
import matplotlib.pyplot as plt
from robustness import *
def recover_to_initial_diameter(initial_diameter, initial_lcc, attacked_graph, recovery_option=0):
d, lcc, av_cc = get_robustness(attacked_graph)
new_diameter = d
num_edges = 0
recovered_graph = attacked_graph.copy()
# Fist we have to make sure there is only 1 LCC
while lcc < initial_lcc:
recovered_graph = recover_edge(recovery_option, recovered_graph)
num_edges += 1
lcc = get_LCC_size(recovered_graph)
# Then recover the diameter
while new_diameter > initial_diameter:
recovered_graph = recover_edge(recovery_option, recovered_graph)
num_edges += 1
new_diameter = get_diameter(recovered_graph)
# print_robustness(recovered_graph)
# print("\nNumber of edges needed to recover:", num_edges)
return recovered_graph, num_edges
def recover_to_initial_diameter_lcc_ratio(initial_diameter, initial_lcc, attacked_graph, recovery_option=RANDOM_ADD):
d, lcc, av_cc = get_robustness(attacked_graph)
num_edges = 0
initial_d_lcc = initial_diameter/initial_lcc
new_d_lcc = d/lcc
recovered_graph = attacked_graph.copy()
size = recovered_graph.size()
stop = 0
# Give up if too many edges are added or the robustness doesn't increase anymore
while new_d_lcc > initial_d_lcc and num_edges < size*2 and stop < size*0.1:
recovered_graph = recover_edge(recovery_option, recovered_graph)
num_edges += 1
d, lcc, av_cc = get_robustness(recovered_graph)
# print_robustness(recovered_graph)
# print("\nNumber of edges needed to recover:", num_edges)
return recovered_graph, num_edges
def recover_edge(recovery_option, recovered_graph):
# Edge addition
if recovery_option == RANDOM_ADD:
recovered_graph = add_random_edge(recovered_graph)
elif recovery_option == PREFERENTIAL_MIN_MIN:
recovered_graph = add_preferential_edge_min_min(recovered_graph)
elif recovery_option == PREFERENTIAL_MIN_MAX:
recovered_graph = add_preferential_edge_min_max(recovered_graph)
elif recovery_option == PREFERENTIAL_MAX_MAX:
recovered_graph = add_preferential_edge_max_max(recovered_graph)
elif recovery_option == PREFERENTIAL_MAX_RAND:
recovered_graph = add_preferential_edge_max_rand(recovered_graph)
# Edge rewiring
elif recovery_option == RANDOM_REWIRE:
recovered_graph = random_rewire(recovered_graph)
recovered_graph = pref_rewire(recovered_graph)
elif recovery_option == PREFERENTIAL_RANDOM:
recovered_graph = pref_random_rewire(recovered_graph)
# Do nothing
elif recovery_option == NO_REWIRE or recovery_option == NO_ADD:
pass