def test_add_update(self): s = Scheme(lambda x: x, {'lower_bound': 0, 'upper_bound': 10, 'updates': []}) cfg_options = { 'condition': None, 'get_nodes': False, 'update_type': UpdateType.STATE } u = Update(lambda x: x, UpdateConfiguration(cfg_options)) s.add_update(u) self.assertEqual(len(s.updates), 1)
def clear(self): ''' Initialize all internal variables as empty ''' self.state_map = {} self.state_names = [] self.node_states = np.array([]) self.new_node_states = np.array([]) self.property_functions = [] self.properties = {} self.schemes: List[Scheme] = [ Scheme(lambda graph: graph.nodes, { 'args': { 'graph': self.graph }, 'lower_bound': 0 }) ] self.edge_utility = np.array([]) self.new_edge_utility = np.array([]) self.edge_values_map = {} self.edge_values_names = [] self.edge_values = np.array([]) self.new_edge_values = np.array([]) self.current_iteration = 0
return {'status_1': {node: node_update}} def update_2(): s2 = model.get_state('status_2') + 0.1 return {'status_2': s2} update_cfg = UpdateConfiguration({ 'arguments': {}, # No other arguments 'get_nodes': True, # We want the nodes as argument 'update_type': UpdateType.STATE }) u = Update(update_1, update_cfg ) # Create an Update object that contains the object function # Create a scheme with the correct sample function, parameters, bounds, and update function model.add_scheme( Scheme( sample_state_weighted, { 'args': { 'graph': model.graph }, 'lower_bound': 2, 'upper_bound': 3, 'updates': [u] })) # Add update 2 to the model, which will increase status_1 by 0.5 each iteration model.add_update(update_2) model.set_initial_state(initial_state) output = model.simulate(5) print(output)
def test_sample(self): s = Scheme(lambda x: x[:-1], {'args': {'x': [1, 2, 3, 4]}, 'lower_bound': 0, 'upper_bound': 10, 'updates': []}) self.assertEqual(s.sample(), [1, 2, 3])
def test_set_bounds(self): s = Scheme(lambda x: x, {'lower_bound': 0, 'upper_bound': 10, 'updates': []}) s.set_bounds(10, 100) self.assertEqual(s.lower_bound, 10) self.assertEqual(s.upper_bound, 100)
def test_init(self): s = Scheme(lambda x: x, {'lower_bound': 0, 'upper_bound': 10, 'updates': []}) self.assertTrue(isinstance(s, Scheme))
def __init__(self): n = 400 g = nx.watts_strogatz_graph(n, 2, 0.02) cfg = { 'utility': False, } self.model = Model(g, ModelConfiguration(cfg)) constants = { 'dt': 0.01, 'A_min': -0.5, 'A_star': 1, 's_O': 0.01, 's_I': 0, 'd_A': 0, 'p': 1, 'r_min': 0, 't_O': np.inf, 'N': n } def initial_I(constants): return np.random.normal(0, 0.3, constants['N']) def initial_O(constants): return np.random.normal(0, 0.2, constants['N']) initial_state = { 'I': initial_I, 'O': initial_O, 'A': 1 } def update_I_A(nodes, constants): node = nodes[0] nb = np.random.choice(self.model.get_neighbors(node)) if abs(self.model.get_node_state(node, 'O') - self.model.get_node_state(nb, 'O')) > constants['t_O']: return {'I': self.model.get_node_state(node, 'I')} else: # Update information r = constants['r_min'] + (1 - constants['r_min']) / (1 + np.exp(-1 * constants['p'] * (self.model.get_node_state(node, 'O') - self.model.get_node_state(nb, 'O')))) inf = r * self.model.get_node_state(node, 'I') + (1-r) * self.model.get_node_state(nb, 'I') + np.random.normal(0, constants['s_I']) # Update attention node_A = self.model.get_node_state(node, 'A') + constants['d_A'] * (2 * constants['A_star'] - self.model.get_node_state(node, 'A')) nb_A = self.model.get_node_state(nb, 'A') + constants['d_A'] * (2 * constants['A_star'] - self.model.get_node_state(nb, 'A')) return {'I': [inf], 'A': {node: node_A, nb: nb_A}} def update_A(constants): return {'A': self.model.get_state('A') - 2 * constants['d_A'] * self.model.get_state('A')/constants['N']} def update_O(constants): noise = np.random.normal(0, constants['s_O'], constants['N']) x = self.model.get_state('O') - constants['dt'] * (self.model.get_state('O')**3 - (self.model.get_state('A') + constants['A_min']) * self.model.get_state('O') - self.model.get_state('I')) + noise return {'O': x} def shrink_I(): return {'I': self.model.get_state('I') * 0.999} def shrink_A(): return {'A': self.model.get_state('A') * 0.999} def sample_attention_weighted(graph): probs = [] A = self.model.get_state('A') factor = 1.0/sum(A) for a in A: probs.append(a * factor) return np.random.choice(graph.nodes, size=1, replace=False, p=probs) # Model definition self.model.constants = constants self.model.set_states(['I', 'A', 'O']) update_cfg = UpdateConfiguration({ 'arguments': {'constants': self.model.constants}, 'get_nodes': True }) up_I_A = Update(update_I_A, update_cfg) s_I = Update(shrink_I) s_A = Update(shrink_A) self.model.add_scheme(Scheme(sample_attention_weighted, {'args': {'graph': self.model.graph}, 'updates': [up_I_A]})) self.model.add_scheme(Scheme(lambda graph: graph.nodes, {'args': {'graph': self.model.graph}, 'lower_bound': 5000, 'updates': [s_I]})) self.model.add_scheme(Scheme(lambda graph: graph.nodes, {'args': {'graph': self.model.graph}, 'lower_bound': 10000, 'updates': [s_A]})) self.model.add_update(update_A, {'constants': self.model.constants}) self.model.add_update(update_O, {'constants': self.model.constants}) self.model.set_initial_state(initial_state, {'constants': self.model.constants})
model.set_states(['I', 'A', 'O']) update_cfg = UpdateConfiguration({ 'arguments': { 'constants': model.constants }, 'get_nodes': True }) up_I_A = Update(update_I_A, update_cfg) s_I = Update(shrink_I) s_A = Update(shrink_A) model.add_scheme( Scheme(sample_attention_weighted, { 'args': { 'graph': model.graph }, 'updates': [up_I_A] })) model.add_scheme( Scheme(lambda graph: graph.nodes, { 'args': { 'graph': model.graph }, 'lower_bound': 5000, 'updates': [s_I] })) model.add_scheme( Scheme(lambda graph: graph.nodes, { 'args': { 'graph': model.graph },
model.set_states(['I', 'A', 'O']) model.add_update(update, {'constants': model.constants}) update_network_cfg = UpdateConfiguration({ 'arguments': { 'constants': model.constants }, 'get_nodes': True, 'update_type': UpdateType.NETWORK }) update_network = Update(network_update, update_network_cfg) model.add_scheme( Scheme(sample_attention_weighted, { 'args': { 'graph': model.graph }, 'updates': [update_network] })) activism_update = Update(activism) model.add_scheme( Scheme( lambda graph: graph.nodes, { 'args': { 'graph': model.graph }, 'lower_bound': 300, 'upper_bound': 301, 'updates': [activism_update] }))