Skip to content

Commit

Permalink
⬆️ Algorithmic Bias Model steady state iteration method
Browse files Browse the repository at this point in the history
  • Loading branch information
GiulioRossetti committed Nov 25, 2020
1 parent 4f3adf5 commit 2b73427
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 3 deletions.
32 changes: 32 additions & 0 deletions ndlib/models/opinions/AlgorithmicBiasModel.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import numpy as np
import future.utils
from collections import defaultdict
import tqdm

__author__ = ["Alina Sirbu", "Giulio Rossetti"]
__email__ = ["alina.sirbu@unipi.it", "giulio.rossetti@isti.cnr.it"]
Expand Down Expand Up @@ -178,3 +179,34 @@ def iteration(self, node_status=True):
else:
return {"iteration": self.actual_iteration - 1, "status": {},
"node_count": node_count.copy(), "status_delta": status_delta.copy()}

def steady_state(self, max_iterations, nsteady=1000, sensibility=0.00001, node_status=True):
"""
Execute a bunch of model iterations
:param max_iterations: the maximum number of iterations to execute
:param nsteady: number of required stable states
:param sensibility: sensibility check for a steady state
:param node_status: if the incremental node status has to be returned.
:return: a list containing for each iteration a dictionary {"iteration": iteration_id, "status": dictionary_node_to_status}
"""
system_status = []
steady_it = 0
for it in tqdm.tqdm(range(0, max_iterations)):
its = self.iteration(node_status)

if it > 0:
old = np.array(list(system_status[-1]['status'].values()))
actual = np.array(list(its['status'].values()))
res = np.abs(old-actual)
if np.all((res < sensibility)):
steady_it += 1
else:
steady_it = 0

system_status.append(its)
if steady_it == nsteady:
return system_status[:-nsteady]

return system_status
10 changes: 7 additions & 3 deletions ndlib/test/test_ndlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@

def get_graph(er=False):
if not er:
g = nx.complete_graph(250)
g = nx.complete_graph(100)
else:
g = nx.erdos_renyi_graph(250, 0.1)
g = nx.erdos_renyi_graph(1000, 0.1)
gi = ig.Graph(directed=False)
gi.add_vertices(list(g.nodes()))
gi.add_edges(list(g.edges()))
Expand Down Expand Up @@ -129,15 +129,19 @@ def test_utldr(self):

def test_algorithmic_bias_model(self):

for g in get_graph(er=True):
for g in get_graph():
model = opn.AlgorithmicBiasModel(g, seed=0)
config = mc.Configuration()
config.add_model_parameter("epsilon", 0.32)
config.add_model_parameter("gamma", 1)
model.set_initial_status(config)
iterations = model.iteration_bunch(10)
self.assertEqual(len(iterations), 10)
iterations = model.iteration_bunch(100, node_status=False)
self.assertEqual(len(iterations), 100)

_ = model.steady_state(max_iterations=100)

def test_voter_model(self):
for g in get_graph():
model = opn.VoterModel(g, seed=0)
Expand Down

0 comments on commit 2b73427

Please sign in to comment.