def reset_simulation(self): """ Resets the simulation between each run """ self.graph_ = self.graph.copy() self.attacked = [] self.protected = [] self.connectivity = [] # attacked nodes or edges if self.prm['attack'] is not None and self.prm['steps'] > 0: self.attacked = run_attack_method(self.graph_, self.prm['attack'], self.prm['steps'], approx=self.prm['attack_approx'], seed=self.prm['seed']) elif self.prm['attack'] is not None: print(self.prm['attack'], "not available or k <= 0") # defended nodes or edges if self.prm['defense'] is not None and self.prm['k_d'] > 0: from graph_tiger.defenses import get_defense_category, run_defense_method if get_defense_category(self.prm['defense']) == 'node': self.protected = run_defense_method(self.graph_, self.prm['defense'], self.prm['k_d'], seed=self.prm['seed']) elif get_defense_category(self.prm['defense']) == 'edge': protected = run_defense_method(self.graph_, self.prm['defense'], self.prm['k_d'], seed=self.prm['seed']) self.graph_.add_edges_from(protected['added']) if 'removed' in protected: self.graph_.remove_edges_from(protected['removed']) elif self.prm['defense'] is not None: print(self.prm['defense'], "not available or k <= 0")
def reset_simulation(self): """ Resets the simulation between each run """ self.graph = self.graph_og.copy() self.vaccinated = set() self.sim_info = defaultdict() self.infected = set( np.random.choice(list(self.graph.nodes), size=int(self.prm['c'] * len(self.graph)), replace=False).tolist()) # decrease network diffusion if self.prm['diffusion'] == 'min' and self.prm['k'] > 0: if get_attack_category(self.prm['method']) == 'node': self.vaccinated = set( run_attack_method(self.graph, self.prm['method'], self.prm['k'], seed=self.prm['seed'])) self.infected = self.infected.difference(self.vaccinated) elif get_attack_category(self.prm['method']) == 'edge': edge_info = run_attack_method(self.graph, self.prm['method'], self.prm['k'], seed=self.prm['seed']) self.graph.remove_edges_from(edge_info) else: print(self.prm['method'], 'not available') # increase network diffusion elif self.prm['diffusion'] == 'max' and self.prm['k'] > 0: if get_defense_category(self.prm['method']) == 'edge': edge_info = run_defense_method(self.graph, self.prm['method'], self.prm['k'], seed=self.prm['seed']) self.graph.add_edges_from(edge_info['added']) self.graph.remove_edges_from(edge_info['removed']) else: print(self.prm['method'], 'not available') elif self.prm['diffusion'] is not None: print(self.prm['diffusion'], "not available or k <= 0")
def test_defense_strength(): """ check that valid nodes are returned :return: """ graph = karate() methods = get_defense_methods() strength = list(range(1, 20)) for method in methods: if get_defense_category(method) == 'node': for k in strength: nodes = run_defense_method(graph, method=method, k=k) # print(method, k, nodes) assert len(nodes) == k
def test_method_selection(): """ check that valid nodes are returned :return: """ ground_truth = { # karate graph top 4 nodes to be monitored or top 4 edges to added/rewired 'ns_node': [33, 0, 2, 32], 'pr_node': [33, 0, 32, 2], 'eig_node': [33, 0, 2, 32], 'id_node': [33, 0, 32, 2], 'rd_node': [33, 0, 32, 1], 'ib_node': [0, 33, 32, 2], 'rb_node': [0, 33, 32, 2], 'rnd_node': [14, 19, 3, 27], 'add_edge_pr': { 'added': [(33, 0), (0, 32), (33, 2), (33, 1)] }, 'add_edge_eig': { 'added': [(33, 0), (33, 2), (0, 32), (33, 1)] }, 'add_edge_deg': { 'added': [(33, 0), (0, 32), (33, 2), (33, 1)] }, 'add_edge_random': { 'added': [(14, 19), (16, 22), (29, 20), (31, 15)] }, 'add_edge_preferential': { 'added': [(11, 9), (12, 14), (15, 16), (17, 18)] }, 'rewire_edge_random': { 'added': [(21, 26), (30, 31), (18, 26), (17, 29)], 'removed': [(27, 33), (32, 33), (9, 33), (2, 9)] }, 'rewire_edge_random_neighbor': { 'added': [(16, 22), (9, 12), (3, 23), (16, 30)], 'removed': [(14, 33), (19, 1), (3, 12), (27, 2)] }, 'rewire_edge_preferential': { 'added': [(18, 12), (10, 9), (28, 5), (1, 16)], 'removed': [(33, 18), (0, 10), (33, 28), (0, 1)] }, 'rewire_edge_preferential_random': { 'added': [(27, 19), (32, 8), (9, 32), (9, 10)], 'removed': [(27, 33), (32, 33), (9, 33), (2, 9)] } } graph = karate() k = 4 methods = get_defense_methods() for method in methods: values = run_defense_method(graph, method=method, k=k, seed=1) # print(method, values) if get_defense_category(method) == 'node': assert (values == ground_truth[method]) else: assert np.array_equal(values['added'], ground_truth[method]['added']) if 'removed' in values: assert (np.array_equal(values['removed'], ground_truth[method]['removed']))
def reset_simulation(self): """ Resets the simulation between each run """ self.protected = set() self.failed = set() self.load = defaultdict() self.sim_info = defaultdict() self.capacity = self.capacity_og.copy() for n in self.graph.nodes: self.load[n] = self.capacity[n] * np.random.uniform( 0, self.prm['l'] ) # self.capacity[n] * np.random.uniform(0, self.prm['l']) # self.capacity[n] * self.capacity[n] = self.capacity[n] * (1.0 + self.prm['r']) self.track_simulation(step=0) # attacked nodes or edges if self.prm['attack'] is not None and self.prm['k_a'] > 0: self.failed = set( run_attack_method(self.graph, self.prm['attack'], self.prm['k_a'], approx=self.prm['attack_approx'], seed=self.prm['seed'])) if get_attack_category(self.prm['attack']) == 'node': for n in self.failed: self.load[n] = 2 * self.load[ n] # increase load by 2x when attacked elif get_attack_category(self.prm['attack']) == 'edge': self.graph.remove_edges_from(self.failed) # defended nodes or edges if self.prm['defense'] is not None and self.prm['k_d'] > 0: if get_defense_category(self.prm['defense']) == 'node': self.protected = run_defense_method(self.graph, self.prm['defense'], self.prm['k_d'], seed=self.prm['seed']) for n in self.protected: self.capacity[n] = 2 * self.capacity[ n] # double the capacity when defended elif get_defense_category(self.prm['defense']) == 'edge': edge_info = run_defense_method(self.graph, self.prm['defense'], self.prm['k_d'], seed=self.prm['seed']) self.graph.add_edges_from(edge_info['added']) if 'removed' in edge_info: self.graph.remove_edges_from(edge_info['removed']) elif self.prm['defense'] is not None: print(self.prm['defense'], "not available or k <= 0") self.track_simulation(step=1)