Пример #1
0
    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")
Пример #2
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")
Пример #3
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
Пример #4
0
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']))
Пример #5
0
    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)