From 1a8313e4f6a9404a9e2788076353d9f4a6dd7478 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Mon, 21 Mar 2022 12:53:40 +0100
Subject: [PATCH 01/39] WIP
---
docs/requirements.txt | 2 +-
requirements.txt | 4 ++--
setup.py | 1 +
soil/environment.py | 25 ++++++++++++++++++-------
soil/exporters.py | 6 +++---
soil/simulation.py | 17 ++++++++++++-----
soil/stats.py | 2 +-
soil/utils.py | 18 ++++++++++--------
test-requirements.txt | 2 +-
tests/test_analysis.py | 1 +
tests/test_exporters.py | 3 ++-
tests/test_main.py | 33 +++++++++++++++++++++++++++++----
12 files changed, 81 insertions(+), 33 deletions(-)
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 28a6674..654cff4 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1 +1 @@
-ipython==7.31.1
+ipython>=7.31.1
diff --git a/requirements.txt b/requirements.txt
index 5a1d973..9d28021 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,5 +5,5 @@ pyyaml>=5.1
pandas>=0.23
SALib>=1.3
Jinja2
-Mesa>=0.8
-tsih>=0.1.5
+Mesa>=0.8.9
+tsih>=0.1.6
diff --git a/setup.py b/setup.py
index 7748e28..151ae7e 100644
--- a/setup.py
+++ b/setup.py
@@ -49,6 +49,7 @@ setup(
extras_require=extras_require,
tests_require=test_reqs,
setup_requires=['pytest-runner', ],
+ pytest_plugins = ['pytest_profiling'],
include_package_data=True,
entry_points={
'console_scripts':
diff --git a/soil/environment.py b/soil/environment.py
index 45453fc..47e0997 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -13,7 +13,7 @@ from networkx.readwrite import json_graph
import networkx as nx
-from tsih import History, Record, Key, NoHistory
+from tsih import History, NoHistory, Record, Key
from mesa import Model
@@ -33,7 +33,7 @@ class Environment(Model):
params, which are used as shared state between agents.
The environment parameters and the state of every agent can be accessed
- both by using the environment as a dictionary or with the environment's
+ both by using the environment as a dictionary or with the environment's
:meth:`soil.environment.Environment.get` method.
"""
@@ -49,7 +49,7 @@ class Environment(Model):
schedule=None,
initial_time=0,
environment_params=None,
- history=True,
+ history=False,
dir_path=None,
**kwargs):
@@ -82,10 +82,12 @@ class Environment(Model):
self._env_agents = {}
self.interval = interval
+
if history:
history = History
else:
history = NoHistory
+
self._history = history(name=self.name,
backup=True)
self['SEED'] = seed
@@ -298,6 +300,9 @@ class Environment(Model):
else:
raise ValueError('Unknown format: {}'.format(f))
+ def df(self):
+ return self._history[None, None, None].df()
+
def dump_sqlite(self, f):
return self._history.dump(f)
@@ -316,8 +321,14 @@ class Environment(Model):
key=k,
value=v)
- def history_to_tuples(self):
- return self._history.to_tuples()
+ def history_to_tuples(self, agent_id=None):
+ if isinstance(self._history, NoHistory):
+ tuples = self.state_to_tuples()
+ else:
+ tuples = self._history.to_tuples()
+ if agent_id is None:
+ return tuples
+ return filter(lambda x: str(x[0]) == str(agent_id), tuples)
def history_to_graph(self):
G = nx.Graph(self.G)
@@ -329,10 +340,10 @@ class Environment(Model):
spells = []
lastvisible = False
laststep = None
- history = self[agent.id, None, None]
+ history = sorted(list(self.history_to_tuples(agent_id=agent.id)))
if not history:
continue
- for t_step, attribute, value in sorted(list(history)):
+ for _, t_step, attribute, value in history:
if attribute == 'visible':
nowvisible = value
if nowvisible and not lastvisible:
diff --git a/soil/exporters.py b/soil/exporters.py
index b526b60..cc4f03c 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -1,6 +1,6 @@
import os
import csv as csvlib
-import time
+from time import time as current_time
from io import BytesIO
import matplotlib.pyplot as plt
@@ -133,7 +133,7 @@ class dummy(Exporter):
def start(self):
with self.output('dummy', 'w') as f:
- f.write('simulation started @ {}\n'.format(time.time()))
+ f.write('simulation started @ {}\n'.format(current_time()))
def trial(self, env, stats):
with self.output('dummy', 'w') as f:
@@ -143,7 +143,7 @@ class dummy(Exporter):
def sim(self, stats):
with self.output('dummy', 'a') as f:
- f.write('simulation ended @ {}\n'.format(time.time()))
+ f.write('simulation ended @ {}\n'.format(current_time()))
diff --git a/soil/simulation.py b/soil/simulation.py
index 39d909d..0990bc9 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -1,4 +1,5 @@
import os
+from time import time as current_time, strftime
import importlib
import sys
import yaml
@@ -6,7 +7,6 @@ import traceback
import logging
import networkx as nx
-from time import strftime
from networkx.readwrite import json_graph
from multiprocessing import Pool
from functools import partial
@@ -83,8 +83,9 @@ class Simulation:
Class for the environment. It defailts to soil.environment.Environment
load_module : str, module name, deprecated
If specified, soil will load the content of this module under 'soil.agents.custom'
-
-
+ history: tsih.History subclass, optional
+ Class to use to store the history of the simulation (and environments). It defailts to tsih.History
+ If set to True, tsih.History will be used. If set to False or None, tsih.NoHistory will be used.
"""
def __init__(self, name=None, group=None, topology=None, network_params=None,
@@ -93,7 +94,7 @@ class Simulation:
max_time=100, load_module=None, seed=None,
dir_path=None, environment_agents=None,
environment_params=None, environment_class=None,
- **kwargs):
+ history=History, **kwargs):
self.load_module = load_module
self.network_params = network_params
@@ -133,7 +134,12 @@ class Simulation:
self.states = agents._validate_states(states,
self.topology)
- self._history = History(name=self.name,
+ if history == True:
+ history = History
+ elif not history:
+ history = NoHistory
+
+ self._history = history(name=self.name,
backup=False)
def run_simulation(self, *args, **kwargs):
@@ -233,6 +239,7 @@ class Simulation:
'states': self.states,
'dir_path': self.dir_path,
'default_state': self.default_state,
+ 'history': bool(self._history),
'environment_agents': self.environment_agents,
})
opts.update(kwargs)
diff --git a/soil/stats.py b/soil/stats.py
index 2a7636f..84082bd 100644
--- a/soil/stats.py
+++ b/soil/stats.py
@@ -35,7 +35,7 @@ class distribution(Stats):
self.counts = []
def trial(self, env):
- df = env[None, None, None].df()
+ df = env.df()
df = df.drop('SEED', axis=1)
ix = df.index[-1]
attrs = df.columns.get_level_values(0)
diff --git a/soil/utils.py b/soil/utils.py
index e95758c..562def1 100644
--- a/soil/utils.py
+++ b/soil/utils.py
@@ -1,5 +1,5 @@
import logging
-import time
+from time import time as current_time, strftime, gmtime, localtime
import os
from shutil import copyfile
@@ -13,13 +13,13 @@ logger = logging.getLogger('soil')
@contextmanager
def timer(name='task', pre="", function=logger.info, to_object=None):
- start = time.time()
+ start = current_time()
function('{}Starting {} at {}.'.format(pre, name,
- time.strftime("%X", time.gmtime(start))))
+ strftime("%X", gmtime(start))))
yield start
- end = time.time()
+ end = current_time()
function('{}Finished {} at {} in {} seconds'.format(pre, name,
- time.strftime("%X", time.gmtime(end)),
+ strftime("%X", gmtime(end)),
str(end-start)))
if to_object:
to_object.start = start
@@ -34,7 +34,7 @@ def safe_open(path, mode='r', backup=True, **kwargs):
os.makedirs(outdir)
if backup and 'w' in mode and os.path.exists(path):
creation = os.path.getctime(path)
- stamp = time.strftime('%Y-%m-%d_%H.%M.%S', time.localtime(creation))
+ stamp = strftime('%Y-%m-%d_%H.%M.%S', localtime(creation))
backup_dir = os.path.join(outdir, 'backup')
if not os.path.exists(backup_dir):
@@ -45,11 +45,13 @@ def safe_open(path, mode='r', backup=True, **kwargs):
return open(path, mode=mode, **kwargs)
+@contextmanager
def open_or_reuse(f, *args, **kwargs):
try:
- return safe_open(f, *args, **kwargs)
+ with safe_open(f, *args, **kwargs) as f:
+ yield f
except (AttributeError, TypeError):
- return f
+ yield f
def flatten_dict(d):
if not isinstance(d, dict):
diff --git a/test-requirements.txt b/test-requirements.txt
index cf59a7e..d95c1b1 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -1,4 +1,4 @@
pytest
-mesa>=0.8.9
+pytest-profiling
scipy>=1.3
tornado
diff --git a/tests/test_analysis.py b/tests/test_analysis.py
index 47c649b..83d6e54 100644
--- a/tests/test_analysis.py
+++ b/tests/test_analysis.py
@@ -50,6 +50,7 @@ class TestAnalysis(TestCase):
'states': [{'interval': 1}, {'interval': 2}],
'max_time': 30,
'num_trials': 1,
+ 'history': True,
'environment_params': {
}
}
diff --git a/tests/test_exporters.py b/tests/test_exporters.py
index 1583f23..790eaa8 100644
--- a/tests/test_exporters.py
+++ b/tests/test_exporters.py
@@ -2,7 +2,6 @@ import os
import io
import tempfile
import shutil
-from time import time
from unittest import TestCase
from soil import exporters
@@ -68,6 +67,7 @@ class Exporters(TestCase):
'agent_type': 'CounterModel',
'max_time': 2,
'num_trials': n_trials,
+ 'dry_run': False,
'environment_params': {}
}
output = io.StringIO()
@@ -79,6 +79,7 @@ class Exporters(TestCase):
exporters.gexf,
],
stats=[distribution,],
+ dry_run=False,
outdir=tmpdir,
exporter_params={'copy_to': output})
result = output.getvalue()
diff --git a/tests/test_main.py b/tests/test_main.py
index d7dc58c..15ad035 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -11,6 +11,7 @@ from os.path import join
from soil import (simulation, Environment, agents, serialization,
utils)
from soil.time import Delta
+from tsih import NoHistory, History
ROOT = os.path.abspath(os.path.dirname(__file__))
@@ -205,7 +206,7 @@ class TestMain(TestCase):
assert config == nconfig
def test_row_conversion(self):
- env = Environment()
+ env = Environment(history=True)
env['test'] = 'test_value'
res = list(env.history_to_tuples())
@@ -228,7 +229,14 @@ class TestMain(TestCase):
f = io.BytesIO()
env.dump_gexf(f)
- def test_save_graph(self):
+ def test_nohistory(self):
+ '''
+ Make sure that no history(/sqlite) is used by default
+ '''
+ env = Environment(topology=nx.Graph(), network_agents=[])
+ assert isinstance(env._history, NoHistory)
+
+ def test_save_graph_history(self):
'''
The history_to_graph method should return a valid networkx graph.
@@ -236,7 +244,7 @@ class TestMain(TestCase):
'''
G = nx.cycle_graph(5)
distribution = agents.calculate_distribution(None, agents.BaseAgent)
- env = Environment(topology=G, network_agents=distribution)
+ env = Environment(topology=G, network_agents=distribution, history=True)
env[0, 0, 'testvalue'] = 'start'
env[0, 10, 'testvalue'] = 'finish'
nG = env.history_to_graph()
@@ -244,6 +252,23 @@ class TestMain(TestCase):
assert ('start', 0, 10) in values
assert ('finish', 10, None) in values
+ def test_save_graph_nohistory(self):
+ '''
+ The history_to_graph method should return a valid networkx graph.
+
+ When NoHistory is used, only the last known value is known
+ '''
+ G = nx.cycle_graph(5)
+ distribution = agents.calculate_distribution(None, agents.BaseAgent)
+ env = Environment(topology=G, network_agents=distribution, history=False)
+ env.get_agent(0)['testvalue'] = 'start'
+ env.schedule.time = 10
+ env.get_agent(0)['testvalue'] = 'finish'
+ nG = env.history_to_graph()
+ values = nG.nodes[0]['attr_testvalue']
+ assert ('start', 0, None) not in values
+ assert ('finish', 10, None) in values
+
def test_serialize_class(self):
ser, name = serialization.serialize(agents.BaseAgent)
assert name == 'soil.agents.BaseAgent'
@@ -303,7 +328,7 @@ class TestMain(TestCase):
pickle.dumps(converted)
def test_pickle_agent_environment(self):
- env = Environment(name='Test')
+ env = Environment(name='Test', history=True)
a = agents.BaseAgent(model=env, unique_id=25)
a['key'] = 'test'
From 6f7481769e57a98c00e0a73ac21f6de72f8603b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Mon, 4 Apr 2022 16:00:54 +0200
Subject: [PATCH 02/39] WIP
---
soil/__init__.py | 6 +-
soil/agents/__init__.py | 13 ++-
soil/config.py | 251 ++++++++++++++++++++++++++++++++++++++++
soil/datacollection.py | 10 +-
soil/environment.py | 174 ++++++++--------------------
soil/exporters.py | 98 +++++++++++++---
soil/serialization.py | 24 +++-
soil/simulation.py | 230 ++++++------------------------------
soil/stats.py | 23 ++--
9 files changed, 467 insertions(+), 362 deletions(-)
create mode 100644 soil/config.py
diff --git a/soil/__init__.py b/soil/__init__.py
index dc79354..44b548f 100644
--- a/soil/__init__.py
+++ b/soil/__init__.py
@@ -36,13 +36,13 @@ def main():
parser.add_argument('--module', '-m', type=str,
help='file containing the code of any custom agents.')
parser.add_argument('--dry-run', '--dry', action='store_true',
- help='Do not store the results of the simulation.')
+ help='Do not store the results of the simulation to disk, show in terminal instead.')
parser.add_argument('--pdb', action='store_true',
help='Use a pdb console in case of exception.')
parser.add_argument('--graph', '-g', action='store_true',
- help='Dump GEXF graph. Defaults to false.')
+ help='Dump each trial\'s network topology as a GEXF graph. Defaults to false.')
parser.add_argument('--csv', action='store_true',
- help='Dump history in CSV format. Defaults to false.')
+ help='Dump all data collected in CSV format. Defaults to false.')
parser.add_argument('--level', type=str,
help='Logging level')
parser.add_argument('--output', '-o', type=str, default="soil_output",
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index 7555207..623c21a 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -26,7 +26,14 @@ class DeadAgent(Exception):
class BaseAgent(Agent):
"""
- A special Agent that keeps track of its state history.
+ A special type of Mesa Agent that:
+
+ * Can be used as a dictionary to access its state.
+ * Has logging built-in
+ * Can be given default arguments through a defaults class attribute,
+ which will be used on construction to initialize each agent's state
+
+ Any attribute that is not preceded by an underscore (`_`) will also be added to its state.
"""
defaults = {}
@@ -61,6 +68,9 @@ class BaseAgent(Agent):
for (k, v) in kwargs.items():
setattr(self, k, v)
+ for (k, v) in getattr(self, 'defaults', {}).items():
+ if not hasattr(self, k) or getattr(self, k) is None:
+ setattr(self, k, v)
# TODO: refactor to clean up mesa compatibility
@property
@@ -79,7 +89,6 @@ class BaseAgent(Agent):
def state(self):
'''
Return the agent itself, which behaves as a dictionary.
- Changes made to `agent.state` will be reflected in the history.
This method shouldn't be used, but is kept here for backwards compatibility.
'''
diff --git a/soil/config.py b/soil/config.py
new file mode 100644
index 0000000..390be62
--- /dev/null
+++ b/soil/config.py
@@ -0,0 +1,251 @@
+import yaml
+import os
+import sys
+import networkx as nx
+import collections.abc
+
+from . import serialization, utils, basestring, agents
+
+class Config(collections.abc.Mapping):
+ """
+
+ 1) agent type can be specified by name or by class.
+ 2) instead of just one type, a network agents distribution can be used.
+ The distribution specifies the weight (or probability) of each
+ agent type in the topology. This is an example distribution: ::
+
+ [
+ {'agent_type': 'agent_type_1',
+ 'weight': 0.2,
+ 'state': {
+ 'id': 0
+ }
+ },
+ {'agent_type': 'agent_type_2',
+ 'weight': 0.8,
+ 'state': {
+ 'id': 1
+ }
+ }
+ ]
+
+ In this example, 20% of the nodes will be marked as type
+ 'agent_type_1'.
+ 3) if no initial state is given, each node's state will be set
+ to `{'id': 0}`.
+
+ Parameters
+ ---------
+ name : str, optional
+ name of the Simulation
+ group : str, optional
+ a group name can be used to link simulations
+ topology (optional): networkx.Graph instance or Node-Link topology as a dict or string (will be loaded with `json_graph.node_link_graph(topology`).
+ network_params : dict
+ parameters used to create a topology with networkx, if no topology is given
+ network_agents : dict
+ definition of agents to populate the topology with
+ agent_type : NetworkAgent subclass, optional
+ Default type of NetworkAgent to use for nodes not specified in network_agents
+ states : list, optional
+ List of initial states corresponding to the nodes in the topology. Basic form is a list of integers
+ whose value indicates the state
+ dir_path: str, optional
+ Directory path to load simulation assets (files, modules...)
+ seed : str, optional
+ Seed to use for the random generator
+ num_trials : int, optional
+ Number of independent simulation runs
+ max_time : int, optional
+ Maximum step/time for each simulation
+ environment_params : dict, optional
+ Dictionary of globally-shared environmental parameters
+ environment_agents: dict, optional
+ Similar to network_agents. Distribution of Agents that control the environment
+ environment_class: soil.environment.Environment subclass, optional
+ Class for the environment. It defailts to soil.environment.Environment
+ """
+ __slots__ = 'name', 'agent_type', 'group', 'network_agents', 'environment_agents', 'states', 'default_state', 'interval', 'network_params', 'seed', 'num_trials', 'max_time', 'topology', 'schedule', 'initial_time', 'environment_params', 'environment_class', 'dir_path', '_added_to_path'
+
+ def __init__(self, name=None,
+ group=None,
+ agent_type='BaseAgent',
+ network_agents=None,
+ environment_agents=None,
+ states=None,
+ default_state=None,
+ interval=1,
+ network_params=None,
+ seed=None,
+ num_trials=1,
+ max_time=None,
+ topology=None,
+ schedule=None,
+ initial_time=0,
+ environment_params={},
+ environment_class='soil.Environment',
+ dir_path=None):
+
+ self.network_params = network_params
+ self.name = name or 'Unnamed'
+ self.seed = str(seed or name)
+ self.group = group or ''
+ self.num_trials = num_trials
+ self.max_time = max_time
+ self.default_state = default_state or {}
+ self.dir_path = dir_path or os.getcwd()
+ self.interval = interval
+
+ self._added_to_path = list(x for x in [os.getcwd(), self.dir_path] if x not in sys.path)
+ sys.path += self._added_to_path
+
+ self.topology = topology
+
+ self.schedule = schedule
+ self.initial_time = initial_time
+
+
+ self.environment_class = environment_class
+ self.environment_params = dict(environment_params)
+
+ #TODO: Check agent distro vs fixed agents
+ self.environment_agents = environment_agents or []
+
+ self.agent_type = agent_type
+
+ self.network_agents = network_agents or {}
+
+ self.states = states or {}
+
+
+ def validate(self):
+ agents._validate_states(self.states,
+ self._topology)
+
+ def restore_path(self):
+ for added in self._added_to_path:
+ sys.path.remove(added)
+
+ def to_yaml(self):
+ return yaml.dump(self.to_dict())
+
+ def dump_yaml(self, f=None, outdir=None):
+ if not f and not outdir:
+ raise ValueError('specify a file or an output directory')
+
+ if not f:
+ f = os.path.join(outdir, '{}.dumped.yml'.format(self.name))
+
+ with utils.open_or_reuse(f, 'w') as f:
+ f.write(self.to_yaml())
+
+ def to_yaml(self):
+ return yaml.dump(self.to_dict())
+
+ # TODO: See note on getstate
+ def to_dict(self):
+ return self.__getstate__()
+
+ def dump_yaml(self, f=None, outdir=None):
+ if not f and not outdir:
+ raise ValueError('specify a file or an output directory')
+
+ if not f:
+ f = os.path.join(outdir, '{}.dumped.yml'.format(self.name))
+
+ with utils.open_or_reuse(f, 'w') as f:
+ f.write(self.to_yaml())
+
+ def __getitem__(self, key):
+ return getattr(self, key)
+
+ def __iter__(self):
+ return (k for k in self.__slots__ if k[0] != '_')
+
+ def __len__(self):
+ return len(self.__slots__)
+
+ def dump_pickle(self, f=None, outdir=None):
+ if not outdir and not f:
+ raise ValueError('specify a file or an output directory')
+
+ if not f:
+ f = os.path.join(outdir,
+ '{}.simulation.pickle'.format(self.name))
+ with utils.open_or_reuse(f, 'wb') as f:
+ pickle.dump(self, f)
+
+ # TODO: remove this. A config should be sendable regardless. Non-pickable objects could be computed via properties and the like
+ # def __getstate__(self):
+ # state={}
+ # for k, v in self.__dict__.items():
+ # if k[0] != '_':
+ # state[k] = v
+ # state['topology'] = json_graph.node_link_data(self.topology)
+ # state['network_agents'] = agents.serialize_definition(self.network_agents,
+ # known_modules = [])
+ # state['environment_agents'] = agents.serialize_definition(self.environment_agents,
+ # known_modules = [])
+ # state['environment_class'] = serialization.serialize(self.environment_class,
+ # known_modules=['soil.environment'])[1] # func, name
+ # if state['load_module'] is None:
+ # del state['load_module']
+ # return state
+
+ # # TODO: remove, same as __getstate__
+ # def __setstate__(self, state):
+ # self.__dict__ = state
+ # self.load_module = getattr(self, 'load_module', None)
+ # if self.dir_path not in sys.path:
+ # sys.path += [self.dir_path, os.getcwd()]
+ # self.topology = json_graph.node_link_graph(state['topology'])
+ # self.network_agents = agents.calculate_distribution(agents._convert_agent_types(self.network_agents))
+ # self.environment_agents = agents._convert_agent_types(self.environment_agents,
+ # known_modules=[self.load_module])
+ # self.environment_class = serialization.deserialize(self.environment_class,
+ # known_modules=[self.load_module,
+ # 'soil.environment', ]) # func, name
+
+class CalculatedConfig(Config):
+ def __init__(self, config):
+ """
+ Returns a configuration object that replaces some "plain" attributes (e.g., `environment_class` string) into
+ a Python object (`soil.environment.Environment` class).
+ """
+ self._config = config
+ values = dict(config)
+ values['environment_class'] = self._environment_class()
+ values['environment_agents'] = self._environment_agents()
+ values['topology'] = self._topology()
+ values['network_agents'] = self._network_agents()
+ values['agent_type'] = serialization.deserialize(self.agent_type, known_modules=['soil.agents'])
+
+ return values
+
+ def _topology(self):
+ topology = self._config.topology
+ if topology is None:
+ topology = serialization.load_network(self._config.network_params,
+ dir_path=self._config.dir_path)
+
+ elif isinstance(topology, basestring) or isinstance(topology, dict):
+ topology = json_graph.node_link_graph(topology)
+
+ return nx.Graph(topology)
+
+ def _environment_class(self):
+ return serialization.deserialize(self._config.environment_class,
+ known_modules=['soil.environment', ]) or Environment
+
+ def _environment_agents(self):
+ return agents._convert_agent_types(self._config.environment_agents)
+
+ def _network_agents(self):
+ distro = agents.calculate_distribution(self._config.network_agents,
+ self._config.agent_type)
+ return agents._convert_agent_types(distro)
+
+ def _environment_class(self):
+ return serialization.deserialize(self._config.environment_class,
+ known_modules=['soil.environment', ]) # func, name
+
diff --git a/soil/datacollection.py b/soil/datacollection.py
index 075d988..979c7bd 100644
--- a/soil/datacollection.py
+++ b/soil/datacollection.py
@@ -8,19 +8,17 @@ class SoilDataCollector(MDC):
# Populate model and env reporters so they have a key per
# So they can be shown in the web interface
self.environment = environment
-
+ raise NotImplementedError()
@property
def model_vars(self):
- pass
+ raise NotImplementedError()
@model_vars.setter
def model_vars(self, value):
- pass
+ raise NotImplementedError()
@property
def agent_reporters(self):
- self.model._history._
-
- pass
+ raise NotImplementedError()
diff --git a/soil/environment.py b/soil/environment.py
index 47e0997..6635849 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -1,23 +1,20 @@
+from __future__ import annotations
import os
import sqlite3
-import csv
import math
import random
-import yaml
-import tempfile
-import logging
-import pandas as pd
from time import time as current_time
from copy import deepcopy
from networkx.readwrite import json_graph
-import networkx as nx
-from tsih import History, NoHistory, Record, Key
+import networkx as nx
from mesa import Model
-from . import serialization, agents, analysis, utils, time
+from tsih import Record
+
+from . import serialization, agents, analysis, utils, time, config
# These properties will be copied when pickling/unpickling the environment
_CONFIG_PROPS = [ 'name',
@@ -49,7 +46,6 @@ class Environment(Model):
schedule=None,
initial_time=0,
environment_params=None,
- history=False,
dir_path=None,
**kwargs):
@@ -76,20 +72,11 @@ class Environment(Model):
topology = nx.Graph()
self.G = nx.Graph(topology)
-
self.environment_params = environment_params or {}
self.environment_params.update(kwargs)
self._env_agents = {}
self.interval = interval
-
- if history:
- history = History
- else:
- history = NoHistory
-
- self._history = history(name=self.name,
- backup=True)
self['SEED'] = seed
if network_agents:
@@ -106,6 +93,19 @@ class Environment(Model):
self.logger = utils.logger.getChild(self.name)
+ @staticmethod
+ def from_config(conf: config.Config, trial_id, **kwargs) -> Environment:
+ '''Create an environment for a trial of the simulation'''
+
+ conf = config.Config(conf, **kwargs)
+ conf.seed = '{}_{}'.format(conf.seed, trial_id)
+ conf.name = '{}_trial_{}'.format(conf.name, trial_id).replace('.', '-')
+ opts = conf.environment_params.copy()
+ opts.update(conf)
+ opts.update(kwargs)
+ env = serialization.deserialize(conf.environment_class)(**opts)
+ return env
+
@property
def now(self):
if self.schedule:
@@ -212,11 +212,14 @@ class Environment(Model):
return self.logger.log(level, message, extra=extra)
def step(self):
+ '''
+ Advance one step in the simulation, and update the data collection and scheduler appropriately
+ '''
super().step()
self.schedule.step()
def run(self, until, *args, **kwargs):
- self._save_state()
+ until = until or float('inf')
while self.schedule.next_time < until:
self.step()
@@ -252,14 +255,16 @@ class Environment(Model):
def get(self, key, default=None):
'''
- Get the value of an environment attribute in a
- given point in the simulation (history).
- If key is an attribute name, this method returns
- the current value.
- To get values at other times, use a
- :meth: `soil.history.Key` tuple.
+ Get the value of an environment attribute.
+ Return `default` if the value is not set.
'''
- return self[key] if key in self else default
+ return self.environment_params.get(key, default)
+
+ def __getitem__(self, key):
+ return self.environment_params.get(key)
+
+ def __setitem__(self, key, value):
+ return self.environment_params.__setitem__(key, value)
def get_agent(self, agent_id):
return self.G.nodes[agent_id]['agent']
@@ -269,112 +274,31 @@ class Environment(Model):
return self.agents
return (self.G.nodes[i]['agent'] for i in nodes)
- def dump_csv(self, f):
- with utils.open_or_reuse(f, 'w') as f:
- cr = csv.writer(f)
- cr.writerow(('agent_id', 't_step', 'key', 'value'))
- for i in self.history_to_tuples():
- cr.writerow(i)
-
- def dump_gexf(self, f):
- G = self.history_to_graph()
- # Workaround for geometric models
- # See soil/soil#4
- for node in G.nodes():
- if 'pos' in G.nodes[node]:
- G.nodes[node]['viz'] = {"position": {"x": G.nodes[node]['pos'][0], "y": G.nodes[node]['pos'][1], "z": 0.0}}
- del (G.nodes[node]['pos'])
-
- nx.write_gexf(G, f, version="1.2draft")
-
- def dump(self, *args, formats=None, **kwargs):
- if not formats:
- return
- functions = {
- 'csv': self.dump_csv,
- 'gexf': self.dump_gexf
- }
- for f in formats:
- if f in functions:
- functions[f](*args, **kwargs)
- else:
- raise ValueError('Unknown format: {}'.format(f))
-
- def df(self):
- return self._history[None, None, None].df()
-
- def dump_sqlite(self, f):
- return self._history.dump(f)
-
- def state_to_tuples(self, now=None):
+ def _agent_to_tuples(self, agent, now=None):
if now is None:
now = self.now
+ for k, v in agent.state.items():
+ yield Record(dict_id=agent.id,
+ t_step=now,
+ key=k,
+ value=v)
+
+ def state_to_tuples(self, agent_id=None, now=None):
+ if now is None:
+ now = self.now
+
+ if agent_id:
+ agent = self.get_agent(agent_id)
+ yield from self._agent_to_tuples(agent, now)
+ return
+
for k, v in self.environment_params.items():
yield Record(dict_id='env',
t_step=now,
key=k,
value=v)
for agent in self.agents:
- for k, v in agent.state.items():
- yield Record(dict_id=agent.id,
- t_step=now,
- key=k,
- value=v)
-
- def history_to_tuples(self, agent_id=None):
- if isinstance(self._history, NoHistory):
- tuples = self.state_to_tuples()
- else:
- tuples = self._history.to_tuples()
- if agent_id is None:
- return tuples
- return filter(lambda x: str(x[0]) == str(agent_id), tuples)
-
- def history_to_graph(self):
- G = nx.Graph(self.G)
-
- for agent in self.network_agents:
-
- attributes = {'agent': str(agent.__class__)}
- lastattributes = {}
- spells = []
- lastvisible = False
- laststep = None
- history = sorted(list(self.history_to_tuples(agent_id=agent.id)))
- if not history:
- continue
- for _, t_step, attribute, value in history:
- if attribute == 'visible':
- nowvisible = value
- if nowvisible and not lastvisible:
- laststep = t_step
- if not nowvisible and lastvisible:
- spells.append((laststep, t_step))
-
- lastvisible = nowvisible
- continue
- key = 'attr_' + attribute
- if key not in attributes:
- attributes[key] = list()
- if key not in lastattributes:
- lastattributes[key] = (value, t_step)
- elif lastattributes[key][0] != value:
- last_value, laststep = lastattributes[key]
- commit_value = (last_value, laststep, t_step)
- if key not in attributes:
- attributes[key] = list()
- attributes[key].append(commit_value)
- lastattributes[key] = (value, t_step)
- for k, v in lastattributes.items():
- attributes[k].append((v[0], v[1], None))
- if lastvisible:
- spells.append((laststep, None))
- if spells:
- G.add_node(agent.id, spells=spells, **attributes)
- else:
- G.add_node(agent.id, **attributes)
-
- return G
+ yield from self._agent_to_tuples(agent, now)
def __getstate__(self):
state = {}
@@ -382,7 +306,6 @@ class Environment(Model):
state[prop] = self.__dict__[prop]
state['G'] = json_graph.node_link_data(self.G)
state['environment_agents'] = self._env_agents
- state['history'] = self._history
state['schedule'] = self.schedule
return state
@@ -391,7 +314,6 @@ class Environment(Model):
self.__dict__[prop] = state[prop]
self._env_agents = state['environment_agents']
self.G = json_graph.node_link_graph(state['G'])
- self._history = state['history']
# self._env = None
self.schedule = state['schedule']
self._queue = []
diff --git a/soil/exporters.py b/soil/exporters.py
index cc4f03c..f2bbe78 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -48,20 +48,24 @@ class Exporter:
self.simulation = simulation
outdir = outdir or os.path.join(os.getcwd(), 'soil_output')
self.outdir = os.path.join(outdir,
- simulation.group or '',
- simulation.name)
+ simulation.config.group or '',
+ simulation.config.name)
self.dry_run = dry_run
self.copy_to = copy_to
- def start(self):
+ def sim_start(self):
'''Method to call when the simulation starts'''
pass
- def end(self, stats):
+ def sim_end(self, stats):
'''Method to call when the simulation ends'''
pass
- def trial(self, env, stats):
+ def trial_start(self, env):
+ '''Method to call when a trial start'''
+ pass
+
+ def trial_end(self, env, stats):
'''Method to call when a trial ends'''
pass
@@ -80,21 +84,21 @@ class Exporter:
class default(Exporter):
'''Default exporter. Writes sqlite results, as well as the simulation YAML'''
- def start(self):
+ def sim_start(self):
if not self.dry_run:
logger.info('Dumping results to %s', self.outdir)
self.simulation.dump_yaml(outdir=self.outdir)
else:
logger.info('NOT dumping results')
- def trial(self, env, stats):
+ def trial_start(self, env, stats):
if not self.dry_run:
with timer('Dumping simulation {} trial {}'.format(self.simulation.name,
env.name)):
with self.output('{}.sqlite'.format(env.name), mode='wb') as f:
env.dump_sqlite(f)
- def end(self, stats):
+ def sim_end(self, stats):
with timer('Dumping simulation {}\'s stats'.format(self.simulation.name)):
with self.output('{}.sqlite'.format(self.simulation.name), mode='wb') as f:
self.simulation.dump_sqlite(f)
@@ -102,15 +106,14 @@ class default(Exporter):
class csv(Exporter):
+
'''Export the state of each environment (and its agents) in a separate CSV file'''
- def trial(self, env, stats):
+ def trial_end(self, env, stats):
with timer('[CSV] Dumping simulation {} trial {} @ dir {}'.format(self.simulation.name,
env.name,
self.outdir)):
- with self.output('{}.csv'.format(env.name)) as f:
- env.dump_csv(f)
- with self.output('{}.stats.csv'.format(env.name)) as f:
+ with self.output('{}.stats.{}.csv'.format(env.name, stats.name)) as f:
statwriter = csvlib.writer(f, delimiter='\t', quotechar='"', quoting=csvlib.QUOTE_ALL)
for stat in stats:
@@ -118,7 +121,7 @@ class csv(Exporter):
class gexf(Exporter):
- def trial(self, env, stats):
+ def trial_end(self, env, stats):
if self.dry_run:
logger.info('Not dumping GEXF in dry_run mode')
return
@@ -126,22 +129,32 @@ class gexf(Exporter):
with timer('[GEXF] Dumping simulation {} trial {}'.format(self.simulation.name,
env.name)):
with self.output('{}.gexf'.format(env.name), mode='wb') as f:
- env.dump_gexf(f)
+ self.dump_gexf(env, f)
+ def dump_gexf(self, env, f):
+ G = env.history_to_graph()
+ # Workaround for geometric models
+ # See soil/soil#4
+ for node in G.nodes():
+ if 'pos' in G.nodes[node]:
+ G.nodes[node]['viz'] = {"position": {"x": G.nodes[node]['pos'][0], "y": G.nodes[node]['pos'][1], "z": 0.0}}
+ del (G.nodes[node]['pos'])
+
+ nx.write_gexf(G, f, version="1.2draft")
class dummy(Exporter):
- def start(self):
+ def sim_start(self):
with self.output('dummy', 'w') as f:
f.write('simulation started @ {}\n'.format(current_time()))
- def trial(self, env, stats):
+ def trial_end(self, env, stats):
with self.output('dummy', 'w') as f:
- for i in env.history_to_tuples():
+ for i in stats:
f.write(','.join(map(str, i)))
f.write('\n')
- def sim(self, stats):
+ def sim_end(self, stats):
with self.output('dummy', 'a') as f:
f.write('simulation ended @ {}\n'.format(current_time()))
@@ -149,10 +162,57 @@ class dummy(Exporter):
class graphdrawing(Exporter):
- def trial(self, env, stats):
+ def trial_end(self, env, stats):
# Outside effects
f = plt.figure()
nx.draw(env.G, node_size=10, width=0.2, pos=nx.spring_layout(env.G, scale=100), ax=f.add_subplot(111))
with open('graph-{}.png'.format(env.name)) as f:
f.savefig(f)
+'''
+Convert an environment into a NetworkX graph
+'''
+def env_to_graph(env, history=None):
+ G = nx.Graph(env.G)
+
+ for agent in env.network_agents:
+
+ attributes = {'agent': str(agent.__class__)}
+ lastattributes = {}
+ spells = []
+ lastvisible = False
+ laststep = None
+ if not history:
+ history = sorted(list(env.state_to_tuples()))
+ for _, t_step, attribute, value in history:
+ if attribute == 'visible':
+ nowvisible = value
+ if nowvisible and not lastvisible:
+ laststep = t_step
+ if not nowvisible and lastvisible:
+ spells.append((laststep, t_step))
+
+ lastvisible = nowvisible
+ continue
+ key = 'attr_' + attribute
+ if key not in attributes:
+ attributes[key] = list()
+ if key not in lastattributes:
+ lastattributes[key] = (value, t_step)
+ elif lastattributes[key][0] != value:
+ last_value, laststep = lastattributes[key]
+ commit_value = (last_value, laststep, t_step)
+ if key not in attributes:
+ attributes[key] = list()
+ attributes[key].append(commit_value)
+ lastattributes[key] = (value, t_step)
+ for k, v in lastattributes.items():
+ attributes[k].append((v[0], v[1], None))
+ if lastvisible:
+ spells.append((laststep, None))
+ if spells:
+ G.add_node(agent.id, spells=spells, **attributes)
+ else:
+ G.add_node(agent.id, **attributes)
+
+ return G
diff --git a/soil/serialization.py b/soil/serialization.py
index 76c60fc..dd94108 100644
--- a/soil/serialization.py
+++ b/soil/serialization.py
@@ -2,6 +2,7 @@ import os
import logging
import ast
import sys
+import re
import importlib
from glob import glob
from itertools import product, chain
@@ -18,6 +19,9 @@ logger = logging.getLogger('soil')
def load_network(network_params, dir_path=None):
G = nx.Graph()
+ if not network_params:
+ return G
+
if 'path' in network_params:
path = network_params['path']
if dir_path and not os.path.isabs(path):
@@ -169,6 +173,9 @@ def serialize(v, known_modules=[]):
func = serializer(tname)
return func(v), tname
+
+IS_CLASS = re.compile(r"")
+
def deserializer(type_, known_modules=[]):
if type(type_) != str: # Already deserialized
return type_
@@ -179,6 +186,13 @@ def deserializer(type_, known_modules=[]):
if hasattr(builtins, type_): # Check if it's a builtin type
cls = getattr(builtins, type_)
return lambda x=None: ast.literal_eval(x) if x is not None else cls()
+ match = IS_CLASS.match(type_)
+ if match:
+ modname, tname = match.group(1).rsplit(".", 1)
+ module = importlib.import_module(modname)
+ cls = getattr(module, tname)
+ return getattr(cls, 'deserialize', cls)
+
# Otherwise, see if we can find the module and the class
modules = known_modules or []
options = []
@@ -189,7 +203,7 @@ def deserializer(type_, known_modules=[]):
if '.' in type_: # Fully qualified module
module, type_ = type_.rsplit(".", 1)
- options.append ((module, type_))
+ options.append((module, type_))
errors = []
for modname, tname in options:
@@ -213,10 +227,10 @@ def deserialize(type_, value=None, **kwargs):
def deserialize_all(names, *args, known_modules=['soil'], **kwargs):
- '''Return the set of exporters for a simulation, given the exporter names'''
- exporters = []
+ '''Return the list of deserialized objects'''
+ objects = []
for name in names:
mod = deserialize(name, known_modules=known_modules)
- exporters.append(mod(*args, **kwargs))
- return exporters
+ objects.append(mod(*args, **kwargs))
+ return objects
diff --git a/soil/simulation.py b/soil/simulation.py
index 0990bc9..9985d3e 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -10,8 +10,6 @@ import networkx as nx
from networkx.readwrite import json_graph
from multiprocessing import Pool
from functools import partial
-from tsih import History
-
import pickle
from . import serialization, utils, basestring, agents
@@ -20,127 +18,34 @@ from .utils import logger
from .exporters import default
from .stats import defaultStats
+from .config import Config
+
#TODO: change documentation for simulation
-
class Simulation:
"""
- Similar to nsim.NetworkSimulation with three main differences:
- 1) agent type can be specified by name or by class.
- 2) instead of just one type, a network agents distribution can be used.
- The distribution specifies the weight (or probability) of each
- agent type in the topology. This is an example distribution: ::
-
- [
- {'agent_type': 'agent_type_1',
- 'weight': 0.2,
- 'state': {
- 'id': 0
- }
- },
- {'agent_type': 'agent_type_2',
- 'weight': 0.8,
- 'state': {
- 'id': 1
- }
- }
- ]
-
- In this example, 20% of the nodes will be marked as type
- 'agent_type_1'.
- 3) if no initial state is given, each node's state will be set
- to `{'id': 0}`.
-
Parameters
---------
- name : str, optional
+ config (optional): :class:`config.Config`
name of the Simulation
- group : str, optional
- a group name can be used to link simulations
- topology : networkx.Graph instance, optional
- network_params : dict
- parameters used to create a topology with networkx, if no topology is given
- network_agents : dict
- definition of agents to populate the topology with
- agent_type : NetworkAgent subclass, optional
- Default type of NetworkAgent to use for nodes not specified in network_agents
- states : list, optional
- List of initial states corresponding to the nodes in the topology. Basic form is a list of integers
- whose value indicates the state
- dir_path: str, optional
- Directory path to load simulation assets (files, modules...)
- seed : str, optional
- Seed to use for the random generator
- num_trials : int, optional
- Number of independent simulation runs
- max_time : int, optional
- Time how long the simulation should run
- environment_params : dict, optional
- Dictionary of globally-shared environmental parameters
- environment_agents: dict, optional
- Similar to network_agents. Distribution of Agents that control the environment
- environment_class: soil.environment.Environment subclass, optional
- Class for the environment. It defailts to soil.environment.Environment
- load_module : str, module name, deprecated
- If specified, soil will load the content of this module under 'soil.agents.custom'
- history: tsih.History subclass, optional
- Class to use to store the history of the simulation (and environments). It defailts to tsih.History
- If set to True, tsih.History will be used. If set to False or None, tsih.NoHistory will be used.
+
+ kwargs: parameters to use to initialize a new configuration, if one has not been provided.
"""
- def __init__(self, name=None, group=None, topology=None, network_params=None,
- network_agents=None, agent_type=None, states=None,
- default_state=None, interval=1, num_trials=1,
- max_time=100, load_module=None, seed=None,
- dir_path=None, environment_agents=None,
- environment_params=None, environment_class=None,
- history=History, **kwargs):
+ def __init__(self, config=None,
+ **kwargs):
- self.load_module = load_module
- self.network_params = network_params
- self.name = name or 'Unnamed'
- self.seed = str(seed or name)
- self._id = '{}_{}'.format(self.name, strftime("%Y-%m-%d_%H.%M.%S"))
- self.group = group or ''
- self.num_trials = num_trials
- self.max_time = max_time
- self.default_state = default_state or {}
- self.dir_path = dir_path or os.getcwd()
- self.interval = interval
+ if bool(config) == bool(kwargs):
+ raise ValueError("Specify either a configuration or the parameters to initialize a configuration")
- sys.path += list(x for x in [os.getcwd(), self.dir_path] if x not in sys.path)
+ if kwargs:
+ config = Config(**kwargs)
- if topology is None:
- topology = serialization.load_network(network_params,
- dir_path=self.dir_path)
- elif isinstance(topology, basestring) or isinstance(topology, dict):
- topology = json_graph.node_link_graph(topology)
- self.topology = nx.Graph(topology)
+ self.config = config
-
- self.environment_params = environment_params or {}
- self.environment_class = serialization.deserialize(environment_class,
- known_modules=['soil.environment', ]) or Environment
-
- environment_agents = environment_agents or []
- self.environment_agents = agents._convert_agent_types(environment_agents,
- known_modules=[self.load_module])
-
- distro = agents.calculate_distribution(network_agents,
- agent_type)
- self.network_agents = agents._convert_agent_types(distro,
- known_modules=[self.load_module])
-
- self.states = agents._validate_states(states,
- self.topology)
-
- if history == True:
- history = History
- elif not history:
- history = NoHistory
-
- self._history = history(name=self.name,
- backup=False)
+ @property
+ def name(self) -> str:
+ return self.config.name
def run_simulation(self, *args, **kwargs):
return self.run(*args, **kwargs)
@@ -153,13 +58,13 @@ class Simulation:
if parallel and not os.environ.get('SENPY_DEBUG', None):
p = Pool()
func = partial(self.run_trial_exceptions, **kwargs)
- for i in p.imap_unordered(func, range(self.num_trials)):
+ for i in p.imap_unordered(func, range(self.config.num_trials)):
if isinstance(i, Exception):
logger.error('Trial failed:\n\t%s', i.message)
continue
yield i
else:
- for i in range(self.num_trials):
+ for i in range(self.config.num_trials):
yield self.run_trial(trial_id=i,
**kwargs)
@@ -179,50 +84,47 @@ class Simulation:
outdir=outdir,
**exporter_params)
stats = serialization.deserialize_all(simulation=self,
- names=stats,
- known_modules=['soil.stats',],
- **stats_params)
+ names=stats,
+ known_modules=['soil.stats',],
+ **stats_params)
- with utils.timer('simulation {}'.format(self.name)):
+ with utils.timer('simulation {}'.format(self.config.name)):
for stat in stats:
- stat.start()
+ stat.sim_start()
for exporter in exporters:
exporter.start()
+
for env in self._run_sync_or_async(parallel=parallel,
log_level=log_level,
**kwargs):
- collected = list(stat.trial(env) for stat in stats)
+ for exporter in exporters:
+ exporter.trial_start(env)
- saved = self.save_stats(collected, t_step=env.now, trial_id=env.name)
+ collected = list(stat.trial_end(env) for stat in stats)
+
+ saved = self._update_stats(collected, t_step=env.now, trial_id=env.name)
for exporter in exporters:
- exporter.trial(env, saved)
+ exporter.trial_end(env, saved)
yield env
-
collected = list(stat.end() for stat in stats)
- saved = self.save_stats(collected)
+ saved = self._update_stats(collected)
for exporter in exporters:
- exporter.end(saved)
+ exporter.sim_end(saved)
-
- def save_stats(self, collection, **kwargs):
+ def _update_stats(self, collection, **kwargs):
stats = dict(kwargs)
for stat in collection:
stats.update(stat)
- self._history.save_stats(utils.flatten_dict(stats))
return stats
- def get_stats(self, **kwargs):
- return self._history.get_stats(**kwargs)
-
def log_stats(self, stats):
logger.info('Stats: \n{}'.format(yaml.dump(stats, default_flow_style=False)))
-
def get_env(self, trial_id=0, **kwargs):
'''Create an environment for a trial of the simulation'''
@@ -246,18 +148,20 @@ class Simulation:
env = self.environment_class(**opts)
return env
- def run_trial(self, trial_id=0, until=None, log_level=logging.INFO, **opts):
+ def run_trial(self, trial_id=None, until=None, log_level=logging.INFO, **opts):
"""
Run a single trial of the simulation
"""
+ trial_id = trial_id if trial_id is not None else current_time()
if log_level:
logger.setLevel(log_level)
# Set-up trial environment and graph
- until = until or self.max_time
- env = self.get_env(trial_id=trial_id, **opts)
+ until = until or self.config.max_time
+
+ env = Environment.from_config(self.config, trial_id=trial_id)
# Set up agents on nodes
- with utils.timer('Simulation {} trial {}'.format(self.name, trial_id)):
+ with utils.timer('Simulation {} trial {}'.format(self.config.name, trial_id)):
env.run(until)
return env
@@ -274,64 +178,6 @@ class Simulation:
ex.message = ''.join(traceback.format_exception(type(ex), ex, ex.__traceback__)[:])
return ex
- def to_dict(self):
- return self.__getstate__()
-
- def to_yaml(self):
- return yaml.dump(self.to_dict())
-
-
- def dump_yaml(self, f=None, outdir=None):
- if not f and not outdir:
- raise ValueError('specify a file or an output directory')
-
- if not f:
- f = os.path.join(outdir, '{}.dumped.yml'.format(self.name))
-
- with utils.open_or_reuse(f, 'w') as f:
- f.write(self.to_yaml())
-
- def dump_pickle(self, f=None, outdir=None):
- if not outdir and not f:
- raise ValueError('specify a file or an output directory')
-
- if not f:
- f = os.path.join(outdir,
- '{}.simulation.pickle'.format(self.name))
- with utils.open_or_reuse(f, 'wb') as f:
- pickle.dump(self, f)
-
- def dump_sqlite(self, f):
- return self._history.dump(f)
-
- def __getstate__(self):
- state={}
- for k, v in self.__dict__.items():
- if k[0] != '_':
- state[k] = v
- state['topology'] = json_graph.node_link_data(self.topology)
- state['network_agents'] = agents.serialize_definition(self.network_agents,
- known_modules = [])
- state['environment_agents'] = agents.serialize_definition(self.environment_agents,
- known_modules = [])
- state['environment_class'] = serialization.serialize(self.environment_class,
- known_modules=['soil.environment'])[1] # func, name
- if state['load_module'] is None:
- del state['load_module']
- return state
-
- def __setstate__(self, state):
- self.__dict__ = state
- self.load_module = getattr(self, 'load_module', None)
- if self.dir_path not in sys.path:
- sys.path += [self.dir_path, os.getcwd()]
- self.topology = json_graph.node_link_graph(state['topology'])
- self.network_agents = agents.calculate_distribution(agents._convert_agent_types(self.network_agents))
- self.environment_agents = agents._convert_agent_types(self.environment_agents,
- known_modules=[self.load_module])
- self.environment_class = serialization.deserialize(self.environment_class,
- known_modules=[self.load_module, 'soil.environment', ]) # func, name
-
def all_from_config(config):
configs = list(serialization.load_config(config))
diff --git a/soil/stats.py b/soil/stats.py
index 84082bd..5de9a40 100644
--- a/soil/stats.py
+++ b/soil/stats.py
@@ -8,18 +8,23 @@ class Stats:
if you don't plan to implement all the methods.
'''
- def __init__(self, simulation):
+ def __init__(self, simulation, name=None):
+ self.name = name or type(self).__name__
self.simulation = simulation
- def start(self):
+ def sim_start(self):
'''Method to call when the simulation starts'''
pass
- def end(self):
+ def sim_end(self):
'''Method to call when the simulation ends'''
return {}
- def trial(self, env):
+ def trial_start(self, env):
+ '''Method to call when a trial starts'''
+ return {}
+
+ def trial_end(self, env):
'''Method to call when a trial ends'''
return {}
@@ -30,12 +35,12 @@ class distribution(Stats):
the mean value, and its deviation.
'''
- def start(self):
+ def sim_start(self):
self.means = []
self.counts = []
- def trial(self, env):
- df = env.df()
+ def trial_end(self, env):
+ df = pd.DataFrame(env.state_to_tuples())
df = df.drop('SEED', axis=1)
ix = df.index[-1]
attrs = df.columns.get_level_values(0)
@@ -60,7 +65,7 @@ class distribution(Stats):
return stats
- def end(self):
+ def sim_end(self):
dfm = pd.DataFrame(self.means, columns=['metric', 'key', 'value'])
dfc = pd.DataFrame(self.counts, columns=['metric', 'key', 'value', 'count'])
@@ -87,7 +92,7 @@ class distribution(Stats):
class defaultStats(Stats):
- def trial(self, env):
+ def trial_end(self, env):
c = Counter()
c.update(a.__class__.__name__ for a in env.network_agents)
From bbaed636a8cb59136407bb5203a5276d7159b129 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Tue, 10 May 2022 16:29:06 +0200
Subject: [PATCH 03/39] WIP
---
README.md | 1 +
docs/configuration.rst | 35 +-
examples/complete.yml | 61 +--
examples/newsspread/NewsSpread.yml | 29 +-
examples/rabbits/rabbits.yml | 1 -
examples/terrorism/TerroristNetworkModel.yml | 9 +-
requirements.txt | 1 +
soil/config.py | 378 ++++++++-----------
soil/config_old.py | 264 +++++++++++++
soil/environment.py | 144 +++----
soil/exporters.py | 47 ++-
soil/serialization.py | 15 +-
soil/simulation.py | 38 +-
tests/old_complete.yml | 32 ++
tests/test_config.py | 62 +++
tests/test_examples.py | 6 +-
tests/test_history.py | 128 +++++++
tests/test_main.py | 160 +++-----
18 files changed, 887 insertions(+), 524 deletions(-)
create mode 100644 soil/config_old.py
create mode 100644 tests/old_complete.yml
create mode 100644 tests/test_config.py
create mode 100644 tests/test_history.py
diff --git a/README.md b/README.md
index 714d4df..7ea6f1d 100644
--- a/README.md
+++ b/README.md
@@ -39,6 +39,7 @@ As of this writing,
This is a non-exhaustive list of tasks to achieve compatibility:
* Environments.agents and mesa.Agent.agents are not the same. env is a property, and it only takes into account network and environment agents. Might rename environment_agents to other_agents or sth like that
+
- [ ] Integrate `soil.Simulation` with mesa's runners:
- [ ] `soil.Simulation` could mimic/become a `mesa.batchrunner`
- [ ] Integrate `soil.Environment` with `mesa.Model`:
diff --git a/docs/configuration.rst b/docs/configuration.rst
index c829a2f..3d5a88d 100644
--- a/docs/configuration.rst
+++ b/docs/configuration.rst
@@ -88,9 +88,18 @@ For example, the following configuration is equivalent to :code:`nx.complete_gra
Environment
============
+
The environment is the place where the shared state of the simulation is stored.
-For instance, the probability of disease outbreak.
-The configuration file may specify the initial value of the environment parameters:
+That means both global parameters, such as the probability of disease outbreak.
+But it also means other data, such as a map, or a network topology that connects multiple agents.
+As a result, it is also typical to add custom functions in an environment that help agents interact with each other and with the state of the simulation.
+
+Last but not least, an environment controls when and how its agents will be executed.
+By default, soil environments incorporate a ``soil.time.TimedActivation`` model for agent execution (more on this on the following section).
+
+Soil environments are very similar, and often interchangeable with, mesa models (``mesa.Model``).
+
+A configuration may specify the initial value of the environment parameters:
.. code:: yaml
@@ -98,23 +107,33 @@ The configuration file may specify the initial value of the environment paramete
daily_probability_of_earthquake: 0.001
number_of_earthquakes: 0
-All agents have access to the environment parameters.
+All agents have access to the environment (and its parameters).
In some scenarios, it is useful to have a custom environment, to provide additional methods or to control the way agents update environment state.
For example, if our agents play the lottery, the environment could provide a method to decide whether the agent wins, instead of leaving it to the agent.
-
Agents
======
+
Agents are a way of modelling behavior.
Agents can be characterized with two variables: agent type (``agent_type``) and state.
-Only one agent is executed at a time (generally, every ``interval`` seconds), and it has access to its state and the environment parameters.
+The agent type is a ``soil.Agent`` class, which contains the code that encapsulates the behavior of the agent.
+The state is a set of variables, which may change during the simulation, and that the code may use to control the behavior.
+All agents provide a ``step`` method either explicitly or implicitly (by inheriting it from a superclass), which controls how the agent will behave in each step of the simulation.
+
+When and how agent steps are executed in a simulation depends entirely on the ``environment``.
+Most environments will internally use a scheduler (``mesa.time.BaseScheduler``), which controls the activation of agents.
+
+In soil, we generally used the ``soil.time.TimedActivation`` scheduler, which allows agents to specify when their next activation will happen, defaulting to a
+
+When an agent's step is executed (generally, every ``interval`` seconds), the agent has access to its state and the environment.
Through the environment, it can access the network topology and the state of other agents.
-There are three three types of agents according to how they are added to the simulation: network agents and environment agent.
+There are two types of agents according to how they are added to the simulation: network agents and environment agent.
Network Agents
##############
+
Network agents are attached to a node in the topology.
The configuration file allows you to specify how agents will be mapped to topology nodes.
@@ -125,7 +144,9 @@ Hence, every node in the network will be associated to an agent of that type.
agent_type: SISaModel
-It is also possible to add more than one type of agent to the simulation, and to control the ratio of each type (using the ``weight`` property).
+It is also possible to add more than one type of agent to the simulation.
+
+To control the ratio of each type (using the ``weight`` property).
For instance, with following configuration, it is five times more likely for a node to be assigned a CounterModel type than a SISaModel type.
.. code:: yaml
diff --git a/examples/complete.yml b/examples/complete.yml
index b3d388a..a4b5b04 100644
--- a/examples/complete.yml
+++ b/examples/complete.yml
@@ -1,27 +1,38 @@
---
-name: simple
-group: tests
-dir_path: "/tmp/"
-num_trials: 3
-max_time: 100
-interval: 1
-seed: "CompleteSeed!"
-network_params:
- generator: complete_graph
- n: 10
-network_agents:
- - agent_type: CounterModel
- weight: 1
+general:
+ name: simple
+ group: tests
+ dir_path: "/tmp/"
+ num_trials: 3
+ max_time: 100
+ interval: 1
+ seed: "CompleteSeed!"
+network:
+ group:
+ network
+ params:
+ generator: complete_graph
+ n: 10
+environment:
+ environment_class: Environment
+ params:
+ am_i_complete: true
+agents:
+ default:
+ agent_class: CounterModel
state:
- state_id: 0
- - agent_type: AggregatedCounter
- weight: 0.2
-environment_agents: []
-environment_class: Environment
-environment_params:
- am_i_complete: true
-default_state:
- incidents: 0
-states:
- - name: 'The first node'
- - name: 'The second node'
+ times: 1
+ environment:
+ fixed:
+ - agent_id: 'Environment Agent 1'
+ agent_class: CounterModel
+ state:
+ times: 10
+ network:
+ distribution:
+ - agent_class: CounterModel
+ weight: 1
+ state:
+ state_id: 0
+ - agent_class: AggregatedCounter
+ weight: 0.2
diff --git a/examples/newsspread/NewsSpread.yml b/examples/newsspread/NewsSpread.yml
index ffb1778..27f8411 100644
--- a/examples/newsspread/NewsSpread.yml
+++ b/examples/newsspread/NewsSpread.yml
@@ -1,6 +1,5 @@
---
default_state: {}
-load_module: newsspread
environment_agents: []
environment_params:
prob_neighbor_spread: 0.0
@@ -9,11 +8,11 @@ interval: 1
max_time: 300
name: Sim_all_dumb
network_agents:
-- agent_type: DumbViewer
+- agent_type: newsspread.DumbViewer
state:
has_tv: false
weight: 1
-- agent_type: DumbViewer
+- agent_type: newsspread.DumbViewer
state:
has_tv: true
weight: 1
@@ -24,7 +23,6 @@ network_params:
num_trials: 50
---
default_state: {}
-load_module: newsspread
environment_agents: []
environment_params:
prob_neighbor_spread: 0.0
@@ -33,19 +31,19 @@ interval: 1
max_time: 300
name: Sim_half_herd
network_agents:
-- agent_type: DumbViewer
+- agent_type: newsspread.DumbViewer
state:
has_tv: false
weight: 1
-- agent_type: DumbViewer
+- agent_type: newsspread.DumbViewer
state:
has_tv: true
weight: 1
-- agent_type: HerdViewer
+- agent_type: newsspread.HerdViewer
state:
has_tv: false
weight: 1
-- agent_type: HerdViewer
+- agent_type: newsspread.HerdViewer
state:
has_tv: true
weight: 1
@@ -56,7 +54,6 @@ network_params:
num_trials: 50
---
default_state: {}
-load_module: newsspread
environment_agents: []
environment_params:
prob_neighbor_spread: 0.0
@@ -65,12 +62,12 @@ interval: 1
max_time: 300
name: Sim_all_herd
network_agents:
-- agent_type: HerdViewer
+- agent_type: newsspread.HerdViewer
state:
has_tv: true
state_id: neutral
weight: 1
-- agent_type: HerdViewer
+- agent_type: newsspread.HerdViewer
state:
has_tv: true
state_id: neutral
@@ -82,7 +79,6 @@ network_params:
num_trials: 50
---
default_state: {}
-load_module: newsspread
environment_agents: []
environment_params:
prob_neighbor_spread: 0.0
@@ -92,12 +88,12 @@ interval: 1
max_time: 300
name: Sim_wise_herd
network_agents:
-- agent_type: HerdViewer
+- agent_type: newsspread.HerdViewer
state:
has_tv: true
state_id: neutral
weight: 1
-- agent_type: WiseViewer
+- agent_type: newsspread.WiseViewer
state:
has_tv: true
weight: 1
@@ -108,7 +104,6 @@ network_params:
num_trials: 50
---
default_state: {}
-load_module: newsspread
environment_agents: []
environment_params:
prob_neighbor_spread: 0.0
@@ -118,12 +113,12 @@ interval: 1
max_time: 300
name: Sim_all_wise
network_agents:
-- agent_type: WiseViewer
+- agent_type: newsspread.WiseViewer
state:
has_tv: true
state_id: neutral
weight: 1
-- agent_type: WiseViewer
+- agent_type: newsspread.WiseViewer
state:
has_tv: true
weight: 1
diff --git a/examples/rabbits/rabbits.yml b/examples/rabbits/rabbits.yml
index a78a5db..a4ec8e8 100644
--- a/examples/rabbits/rabbits.yml
+++ b/examples/rabbits/rabbits.yml
@@ -1,5 +1,4 @@
---
-load_module: rabbit_agents
name: rabbits_example
max_time: 100
interval: 1
diff --git a/examples/terrorism/TerroristNetworkModel.yml b/examples/terrorism/TerroristNetworkModel.yml
index 401b77d..45dd1aa 100644
--- a/examples/terrorism/TerroristNetworkModel.yml
+++ b/examples/terrorism/TerroristNetworkModel.yml
@@ -1,5 +1,4 @@
name: TerroristNetworkModel_sim
-load_module: TerroristNetworkModel
max_time: 150
num_trials: 1
network_params:
@@ -9,19 +8,19 @@ network_params:
# theta: 20
n: 100
network_agents:
- - agent_type: TerroristNetworkModel
+ - agent_type: TerroristNetworkModel.TerroristNetworkModel
weight: 0.8
state:
id: civilian # Civilians
- - agent_type: TerroristNetworkModel
+ - agent_type: TerroristNetworkModel.TerroristNetworkModel
weight: 0.1
state:
id: leader # Leaders
- - agent_type: TrainingAreaModel
+ - agent_type: TerroristNetworkModel.TrainingAreaModel
weight: 0.05
state:
id: terrorist # Terrorism
- - agent_type: HavenModel
+ - agent_type: TerroristNetworkModel.HavenModel
weight: 0.05
state:
id: civilian # Civilian
diff --git a/requirements.txt b/requirements.txt
index 9d28021..2660dfd 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,3 +7,4 @@ SALib>=1.3
Jinja2
Mesa>=0.8.9
tsih>=0.1.6
+pydantic>=1.9
diff --git a/soil/config.py b/soil/config.py
index 390be62..4f4ceed 100644
--- a/soil/config.py
+++ b/soil/config.py
@@ -1,251 +1,183 @@
+from __future__ import annotations
+from pydantic import BaseModel, ValidationError, validator, root_validator
+
import yaml
import os
import sys
-import networkx as nx
-import collections.abc
-from . import serialization, utils, basestring, agents
+from typing import Any, Callable, Dict, List, Optional, Union, Type
+from pydantic import BaseModel, Extra
-class Config(collections.abc.Mapping):
- """
+class General(BaseModel):
+ id: str = 'Unnamed Simulation'
+ group: str = None
+ dir_path: str = None
+ num_trials: int = 1
+ max_time: float = 100
+ interval: float = 1
+ seed: str = ""
- 1) agent type can be specified by name or by class.
- 2) instead of just one type, a network agents distribution can be used.
- The distribution specifies the weight (or probability) of each
- agent type in the topology. This is an example distribution: ::
-
- [
- {'agent_type': 'agent_type_1',
- 'weight': 0.2,
- 'state': {
- 'id': 0
- }
- },
- {'agent_type': 'agent_type_2',
- 'weight': 0.8,
- 'state': {
- 'id': 1
- }
- }
- ]
-
- In this example, 20% of the nodes will be marked as type
- 'agent_type_1'.
- 3) if no initial state is given, each node's state will be set
- to `{'id': 0}`.
-
- Parameters
- ---------
- name : str, optional
- name of the Simulation
- group : str, optional
- a group name can be used to link simulations
- topology (optional): networkx.Graph instance or Node-Link topology as a dict or string (will be loaded with `json_graph.node_link_graph(topology`).
- network_params : dict
- parameters used to create a topology with networkx, if no topology is given
- network_agents : dict
- definition of agents to populate the topology with
- agent_type : NetworkAgent subclass, optional
- Default type of NetworkAgent to use for nodes not specified in network_agents
- states : list, optional
- List of initial states corresponding to the nodes in the topology. Basic form is a list of integers
- whose value indicates the state
- dir_path: str, optional
- Directory path to load simulation assets (files, modules...)
- seed : str, optional
- Seed to use for the random generator
- num_trials : int, optional
- Number of independent simulation runs
- max_time : int, optional
- Maximum step/time for each simulation
- environment_params : dict, optional
- Dictionary of globally-shared environmental parameters
- environment_agents: dict, optional
- Similar to network_agents. Distribution of Agents that control the environment
- environment_class: soil.environment.Environment subclass, optional
- Class for the environment. It defailts to soil.environment.Environment
- """
- __slots__ = 'name', 'agent_type', 'group', 'network_agents', 'environment_agents', 'states', 'default_state', 'interval', 'network_params', 'seed', 'num_trials', 'max_time', 'topology', 'schedule', 'initial_time', 'environment_params', 'environment_class', 'dir_path', '_added_to_path'
-
- def __init__(self, name=None,
- group=None,
- agent_type='BaseAgent',
- network_agents=None,
- environment_agents=None,
- states=None,
- default_state=None,
- interval=1,
- network_params=None,
- seed=None,
- num_trials=1,
- max_time=None,
- topology=None,
- schedule=None,
- initial_time=0,
- environment_params={},
- environment_class='soil.Environment',
- dir_path=None):
-
- self.network_params = network_params
- self.name = name or 'Unnamed'
- self.seed = str(seed or name)
- self.group = group or ''
- self.num_trials = num_trials
- self.max_time = max_time
- self.default_state = default_state or {}
- self.dir_path = dir_path or os.getcwd()
- self.interval = interval
-
- self._added_to_path = list(x for x in [os.getcwd(), self.dir_path] if x not in sys.path)
- sys.path += self._added_to_path
-
- self.topology = topology
-
- self.schedule = schedule
- self.initial_time = initial_time
+ @staticmethod
+ def default():
+ return General()
- self.environment_class = environment_class
- self.environment_params = dict(environment_params)
+# Could use TypeAlias in python >= 3.10
+nodeId = int
- #TODO: Check agent distro vs fixed agents
- self.environment_agents = environment_agents or []
-
- self.agent_type = agent_type
-
- self.network_agents = network_agents or {}
-
- self.states = states or {}
+class Node(BaseModel):
+ id: nodeId
+ state: Dict[str, Any]
- def validate(self):
- agents._validate_states(self.states,
- self._topology)
+class Edge(BaseModel):
+ source: nodeId
+ target: nodeId
+ value: float = 1
- def restore_path(self):
- for added in self._added_to_path:
- sys.path.remove(added)
- def to_yaml(self):
- return yaml.dump(self.to_dict())
+class Topology(BaseModel):
+ nodes: List[Node]
+ directed: bool
+ links: List[Edge]
- def dump_yaml(self, f=None, outdir=None):
- if not f and not outdir:
- raise ValueError('specify a file or an output directory')
- if not f:
- f = os.path.join(outdir, '{}.dumped.yml'.format(self.name))
+class NetParams(BaseModel, extra=Extra.allow):
+ generator: Union[Callable, str]
+ n: int
- with utils.open_or_reuse(f, 'w') as f:
- f.write(self.to_yaml())
- def to_yaml(self):
- return yaml.dump(self.to_dict())
+class NetConfig(BaseModel):
+ group: str = 'network'
+ params: Optional[NetParams]
+ topology: Optional[Topology]
+ path: Optional[str]
- # TODO: See note on getstate
- def to_dict(self):
- return self.__getstate__()
-
- def dump_yaml(self, f=None, outdir=None):
- if not f and not outdir:
- raise ValueError('specify a file or an output directory')
-
- if not f:
- f = os.path.join(outdir, '{}.dumped.yml'.format(self.name))
-
- with utils.open_or_reuse(f, 'w') as f:
- f.write(self.to_yaml())
-
- def __getitem__(self, key):
- return getattr(self, key)
-
- def __iter__(self):
- return (k for k in self.__slots__ if k[0] != '_')
-
- def __len__(self):
- return len(self.__slots__)
-
- def dump_pickle(self, f=None, outdir=None):
- if not outdir and not f:
- raise ValueError('specify a file or an output directory')
-
- if not f:
- f = os.path.join(outdir,
- '{}.simulation.pickle'.format(self.name))
- with utils.open_or_reuse(f, 'wb') as f:
- pickle.dump(self, f)
-
- # TODO: remove this. A config should be sendable regardless. Non-pickable objects could be computed via properties and the like
- # def __getstate__(self):
- # state={}
- # for k, v in self.__dict__.items():
- # if k[0] != '_':
- # state[k] = v
- # state['topology'] = json_graph.node_link_data(self.topology)
- # state['network_agents'] = agents.serialize_definition(self.network_agents,
- # known_modules = [])
- # state['environment_agents'] = agents.serialize_definition(self.environment_agents,
- # known_modules = [])
- # state['environment_class'] = serialization.serialize(self.environment_class,
- # known_modules=['soil.environment'])[1] # func, name
- # if state['load_module'] is None:
- # del state['load_module']
- # return state
-
- # # TODO: remove, same as __getstate__
- # def __setstate__(self, state):
- # self.__dict__ = state
- # self.load_module = getattr(self, 'load_module', None)
- # if self.dir_path not in sys.path:
- # sys.path += [self.dir_path, os.getcwd()]
- # self.topology = json_graph.node_link_graph(state['topology'])
- # self.network_agents = agents.calculate_distribution(agents._convert_agent_types(self.network_agents))
- # self.environment_agents = agents._convert_agent_types(self.environment_agents,
- # known_modules=[self.load_module])
- # self.environment_class = serialization.deserialize(self.environment_class,
- # known_modules=[self.load_module,
- # 'soil.environment', ]) # func, name
-
-class CalculatedConfig(Config):
- def __init__(self, config):
- """
- Returns a configuration object that replaces some "plain" attributes (e.g., `environment_class` string) into
- a Python object (`soil.environment.Environment` class).
- """
- self._config = config
- values = dict(config)
- values['environment_class'] = self._environment_class()
- values['environment_agents'] = self._environment_agents()
- values['topology'] = self._topology()
- values['network_agents'] = self._network_agents()
- values['agent_type'] = serialization.deserialize(self.agent_type, known_modules=['soil.agents'])
+ @staticmethod
+ def default():
+ return NetConfig(topology=None, params=None)
+ @root_validator
+ def validate_all(cls, values):
+ if 'params' not in values and 'topology' not in values:
+ raise ValueError('You must specify either a topology or the parameters to generate a graph')
return values
- def _topology(self):
- topology = self._config.topology
- if topology is None:
- topology = serialization.load_network(self._config.network_params,
- dir_path=self._config.dir_path)
- elif isinstance(topology, basestring) or isinstance(topology, dict):
- topology = json_graph.node_link_graph(topology)
+class EnvConfig(BaseModel):
+ environment_class: Union[Type, str] = 'soil.Environment'
+ params: Dict[str, Any] = {}
+ schedule: Union[Type, str] = 'soil.time.TimedActivation'
- return nx.Graph(topology)
+ @staticmethod
+ def default():
+ return EnvConfig()
- def _environment_class(self):
- return serialization.deserialize(self._config.environment_class,
- known_modules=['soil.environment', ]) or Environment
- def _environment_agents(self):
- return agents._convert_agent_types(self._config.environment_agents)
+class SingleAgentConfig(BaseModel):
+ agent_class: Union[Type, str] = 'soil.Agent'
+ agent_id: Optional[Union[str, int]] = None
+ params: Dict[str, Any] = {}
+ state: Dict[str, Any] = {}
- def _network_agents(self):
- distro = agents.calculate_distribution(self._config.network_agents,
- self._config.agent_type)
- return agents._convert_agent_types(distro)
- def _environment_class(self):
- return serialization.deserialize(self._config.environment_class,
- known_modules=['soil.environment', ]) # func, name
+class AgentDistro(SingleAgentConfig):
+ weight: Optional[float] = None
+ n: Optional[int] = None
+ @root_validator
+ def validate_all(cls, values):
+ if 'weight' in values and 'count' in values:
+ raise ValueError("You may either specify a weight in the distribution or an agent count")
+ return values
+
+
+class AgentConfig(SingleAgentConfig):
+ n: Optional[int] = None
+ distribution: Optional[List[AgentDistro]] = None
+ fixed: Optional[List[SingleAgentConfig]] = None
+
+ @staticmethod
+ def default():
+ return AgentConfig()
+
+
+class Config(BaseModel, extra=Extra.forbid):
+ general: General = General.default()
+ network: Optional[NetConfig] = None
+ environment: EnvConfig = EnvConfig.default()
+ agents: Dict[str, AgentConfig] = {}
+
+
+def convert_old(old):
+ '''
+ Try to convert old style configs into the new format.
+
+ This is still a work in progress and might not work in many cases.
+ '''
+ new = {}
+
+
+ general = {}
+ for k in ['id',
+ 'group',
+ 'dir_path',
+ 'num_trials',
+ 'max_time',
+ 'interval',
+ 'seed']:
+ if k in old:
+ general[k] = old[k]
+
+ network = {'group': 'network'}
+
+
+ if 'network_params' in old and old['network_params']:
+ for (k, v) in old['network_params'].items():
+ if k == 'path':
+ network['path'] = v
+ else:
+ network.setdefault('params', {})[k] = v
+
+ if 'topology' in old:
+ network['topology'] = old['topology']
+
+ agents = {
+ 'environment': {
+ 'fixed': []
+ },
+ 'network': {},
+ 'default': {},
+ }
+
+ if 'agent_type' in old:
+ agents['default']['agent_class'] = old['agent_type']
+
+ if 'default_state' in old:
+ agents['default']['state'] = old['default_state']
+
+
+ def updated_agent(agent):
+ newagent = dict(agent)
+ newagent['agent_class'] = newagent['agent_type']
+ del newagent['agent_type']
+ return newagent
+
+ for agent in old.get('environment_agents', []):
+ agents['environment']['fixed'].append(updated_agent(agent))
+
+ for agent in old.get('network_agents', []):
+ agents['network'].setdefault('distribution', []).append(updated_agent(agent))
+
+ environment = {'params': {}}
+ if 'environment_class' in old:
+ environment['environment_class'] = old['environment_class']
+
+ for (k, v) in old.get('environment_params', {}).items():
+ environment['params'][k] = v
+
+
+ return Config(general=general,
+ network=network,
+ environment=environment,
+ agents=agents)
diff --git a/soil/config_old.py b/soil/config_old.py
new file mode 100644
index 0000000..ca4eaa9
--- /dev/null
+++ b/soil/config_old.py
@@ -0,0 +1,264 @@
+from pydantic import BaseModel, ValidationError, validator
+
+import yaml
+import os
+import sys
+import networkx as nx
+import collections.abc
+
+from . import serialization, utils, basestring, agents
+
+class Config(collections.abc.Mapping):
+ """
+
+ 1) agent type can be specified by name or by class.
+ 2) instead of just one type, a network agents distribution can be used.
+ The distribution specifies the weight (or probability) of each
+ agent type in the topology. This is an example distribution: ::
+
+ [
+ {'agent_type': 'agent_type_1',
+ 'weight': 0.2,
+ 'state': {
+ 'id': 0
+ }
+ },
+ {'agent_type': 'agent_type_2',
+ 'weight': 0.8,
+ 'state': {
+ 'id': 1
+ }
+ }
+ ]
+
+ In this example, 20% of the nodes will be marked as type
+ 'agent_type_1'.
+ 3) if no initial state is given, each node's state will be set
+ to `{'id': 0}`.
+
+ Parameters
+ ---------
+ name : str, optional
+ name of the Simulation
+ group : str, optional
+ a group name can be used to link simulations
+ topology (optional): networkx.Graph instance or Node-Link topology as a dict or string (will be loaded with `json_graph.node_link_graph(topology`).
+ network_params : dict
+ parameters used to create a topology with networkx, if no topology is given
+ network_agents : dict
+ definition of agents to populate the topology with
+ agent_type : NetworkAgent subclass, optional
+ Default type of NetworkAgent to use for nodes not specified in network_agents
+ states : list, optional
+ List of initial states corresponding to the nodes in the topology. Basic form is a list of integers
+ whose value indicates the state
+ dir_path: str, optional
+ Directory path to load simulation assets (files, modules...)
+ seed : str, optional
+ Seed to use for the random generator
+ num_trials : int, optional
+ Number of independent simulation runs
+ max_time : int, optional
+ Maximum step/time for each simulation
+ environment_params : dict, optional
+ Dictionary of globally-shared environmental parameters
+ environment_agents: dict, optional
+ Similar to network_agents. Distribution of Agents that control the environment
+ environment_class: soil.environment.Environment subclass, optional
+ Class for the environment. It defailts to soil.environment.Environment
+ """
+ __slots__ = 'name', 'agent_type', 'group', 'description', 'network_agents', 'environment_agents', 'states', 'default_state', 'interval', 'network_params', 'seed', 'num_trials', 'max_time', 'topology', 'schedule', 'initial_time', 'environment_params', 'environment_class', 'dir_path', '_added_to_path', 'visualization_params'
+
+ def __init__(self, name=None,
+ group=None,
+ agent_type='BaseAgent',
+ network_agents=None,
+ environment_agents=None,
+ states=None,
+ description=None,
+ default_state=None,
+ interval=1,
+ network_params=None,
+ seed=None,
+ num_trials=1,
+ max_time=None,
+ topology=None,
+ schedule=None,
+ initial_time=0,
+ environment_params={},
+ environment_class='soil.Environment',
+ dir_path=None,
+ visualization_params=None,
+ ):
+
+ self.network_params = network_params
+ self.name = name or 'Unnamed'
+ self.description = description or 'No simulation description available'
+ self.seed = str(seed or name)
+ self.group = group or ''
+ self.num_trials = num_trials
+ self.max_time = max_time
+ self.default_state = default_state or {}
+ self.dir_path = dir_path or os.getcwd()
+ self.interval = interval
+ self.visualization_params = visualization_params or {}
+
+ self._added_to_path = list(x for x in [os.getcwd(), self.dir_path] if x not in sys.path)
+ sys.path += self._added_to_path
+
+ self.topology = topology
+
+ self.schedule = schedule
+ self.initial_time = initial_time
+
+
+ self.environment_class = environment_class
+ self.environment_params = dict(environment_params)
+
+ #TODO: Check agent distro vs fixed agents
+ self.environment_agents = environment_agents or []
+
+ self.agent_type = agent_type
+
+ self.network_agents = network_agents or {}
+
+ self.states = states or {}
+
+
+ def validate(self):
+ agents._validate_states(self.states,
+ self._topology)
+
+ def calculate(self):
+ return CalculatedConfig(self)
+
+ def restore_path(self):
+ for added in self._added_to_path:
+ sys.path.remove(added)
+
+ def to_yaml(self):
+ return yaml.dump(self.to_dict())
+
+ def dump_yaml(self, f=None, outdir=None):
+ if not f and not outdir:
+ raise ValueError('specify a file or an output directory')
+
+ if not f:
+ f = os.path.join(outdir, '{}.dumped.yml'.format(self.name))
+
+ with utils.open_or_reuse(f, 'w') as f:
+ f.write(self.to_yaml())
+
+ def to_yaml(self):
+ return yaml.dump(self.to_dict())
+
+ # TODO: See note on getstate
+ def to_dict(self):
+ return dict(self)
+
+ def __repr__(self):
+ return self.to_yaml()
+
+ def dump_yaml(self, f=None, outdir=None):
+ if not f and not outdir:
+ raise ValueError('specify a file or an output directory')
+
+ if not f:
+ f = os.path.join(outdir, '{}.dumped.yml'.format(self.name))
+
+ with utils.open_or_reuse(f, 'w') as f:
+ f.write(self.to_yaml())
+
+ def __getitem__(self, key):
+ return getattr(self, key)
+
+ def __iter__(self):
+ return (k for k in self.__slots__ if k[0] != '_')
+
+ def __len__(self):
+ return len(self.__slots__)
+
+ def dump_pickle(self, f=None, outdir=None):
+ if not outdir and not f:
+ raise ValueError('specify a file or an output directory')
+
+ if not f:
+ f = os.path.join(outdir,
+ '{}.simulation.pickle'.format(self.name))
+ with utils.open_or_reuse(f, 'wb') as f:
+ pickle.dump(self, f)
+
+ # TODO: remove this. A config should be sendable regardless. Non-pickable objects could be computed via properties and the like
+ # def __getstate__(self):
+ # state={}
+ # for k, v in self.__dict__.items():
+ # if k[0] != '_':
+ # state[k] = v
+ # state['topology'] = json_graph.node_link_data(self.topology)
+ # state['network_agents'] = agents.serialize_definition(self.network_agents,
+ # known_modules = [])
+ # state['environment_agents'] = agents.serialize_definition(self.environment_agents,
+ # known_modules = [])
+ # state['environment_class'] = serialization.serialize(self.environment_class,
+ # known_modules=['soil.environment'])[1] # func, name
+ # if state['load_module'] is None:
+ # del state['load_module']
+ # return state
+
+ # # TODO: remove, same as __getstate__
+ # def __setstate__(self, state):
+ # self.__dict__ = state
+ # self.load_module = getattr(self, 'load_module', None)
+ # if self.dir_path not in sys.path:
+ # sys.path += [self.dir_path, os.getcwd()]
+ # self.topology = json_graph.node_link_graph(state['topology'])
+ # self.network_agents = agents.calculate_distribution(agents._convert_agent_types(self.network_agents))
+ # self.environment_agents = agents._convert_agent_types(self.environment_agents,
+ # known_modules=[self.load_module])
+ # self.environment_class = serialization.deserialize(self.environment_class,
+ # known_modules=[self.load_module,
+ # 'soil.environment', ]) # func, name
+
+class CalculatedConfig(Config):
+ def __init__(self, config):
+ """
+ Returns a configuration object that replaces some "plain" attributes (e.g., `environment_class` string) into
+ a Python object (`soil.environment.Environment` class).
+ """
+ self._config = config
+ values = dict(config)
+ values['environment_class'] = self._environment_class()
+ values['environment_agents'] = self._environment_agents()
+ values['topology'] = self._topology()
+ values['network_agents'] = self._network_agents()
+ values['agent_type'] = serialization.deserialize(self.agent_type, known_modules=['soil.agents'])
+
+ return values
+
+ def _topology(self):
+ topology = self._config.topology
+ if topology is None:
+ topology = serialization.load_network(self._config.network_params,
+ dir_path=self._config.dir_path)
+
+ elif isinstance(topology, basestring) or isinstance(topology, dict):
+ topology = json_graph.node_link_graph(topology)
+
+ return nx.Graph(topology)
+
+ def _environment_class(self):
+ return serialization.deserialize(self._config.environment_class,
+ known_modules=['soil.environment', ]) or Environment
+
+ def _environment_agents(self):
+ return agents._convert_agent_types(self._config.environment_agents)
+
+ def _network_agents(self):
+ distro = agents.calculate_distribution(self._config.network_agents,
+ self._config.agent_type)
+ return agents._convert_agent_types(distro)
+
+ def _environment_class(self):
+ return serialization.deserialize(self._config.environment_class,
+ known_modules=['soil.environment', ]) # func, name
+
diff --git a/soil/environment.py b/soil/environment.py
index 6635849..4e00cd9 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -16,13 +16,6 @@ from tsih import Record
from . import serialization, agents, analysis, utils, time, config
-# These properties will be copied when pickling/unpickling the environment
-_CONFIG_PROPS = [ 'name',
- 'states',
- 'default_state',
- 'interval',
- ]
-
class Environment(Model):
"""
The environment is key in a simulation. It contains the network topology,
@@ -34,76 +27,62 @@ class Environment(Model):
:meth:`soil.environment.Environment.get` method.
"""
- def __init__(self, name=None,
- network_agents=None,
- environment_agents=None,
- states=None,
- default_state=None,
- interval=1,
- network_params=None,
- seed=None,
- topology=None,
+ def __init__(self,
+ env_id,
+ seed='default',
schedule=None,
- initial_time=0,
- environment_params=None,
+ env_params=None,
dir_path=None,
**kwargs):
-
super().__init__()
- self.schedule = schedule
- if schedule is None:
- self.schedule = time.TimedActivation()
- self.name = name or 'UnnamedEnvironment'
+ self.seed = '{}_{}'.format(seed, env_id)
+ self.id = env_id
+
+ self.dir_path = dir_path or os.getcwd()
+
+ if schedule is None:
+ schedule = time.TimedActivation()
+ self.schedule = schedule
+
seed = seed or current_time()
+
random.seed(seed)
+
if isinstance(states, list):
states = dict(enumerate(states))
self.states = deepcopy(states) if states else {}
self.default_state = deepcopy(default_state) or {}
- if topology is None:
- network_params = network_params or {}
- topology = serialization.load_network(network_params,
- dir_path=dir_path)
- if not topology:
- topology = nx.Graph()
- self.G = nx.Graph(topology)
- self.environment_params = environment_params or {}
- self.environment_params.update(kwargs)
+ self.set_topology(topology=topology,
+ network_params=network_params)
+
+ self.agents = agents or {}
+
+ self.env_params = env_params or {}
+ self.env_params.update(kwargs)
- self._env_agents = {}
self.interval = interval
self['SEED'] = seed
- if network_agents:
- distro = agents.calculate_distribution(network_agents)
- self.network_agents = agents._convert_agent_types(distro)
- else:
- self.network_agents = []
-
- environment_agents = environment_agents or []
- if environment_agents:
- distro = agents.calculate_distribution(environment_agents)
- environment_agents = agents._convert_agent_types(distro)
- self.environment_agents = environment_agents
self.logger = utils.logger.getChild(self.name)
@staticmethod
def from_config(conf: config.Config, trial_id, **kwargs) -> Environment:
'''Create an environment for a trial of the simulation'''
-
- conf = config.Config(conf, **kwargs)
- conf.seed = '{}_{}'.format(conf.seed, trial_id)
- conf.name = '{}_trial_{}'.format(conf.name, trial_id).replace('.', '-')
- opts = conf.environment_params.copy()
+ conf = conf
+ if kwargs:
+ conf = config.Config(**conf.dict(exclude_defaults=True), **kwargs)
+ seed = '{}_{}'.format(conf.general.seed, trial_id)
+ id = '{}_trial_{}'.format(conf.general.id, trial_id).replace('.', '-')
+ opts = conf.environment.params.copy()
opts.update(conf)
opts.update(kwargs)
- env = serialization.deserialize(conf.environment_class)(**opts)
+ env = serialization.deserialize(conf.environment.environment_class)(env_id=id, seed=seed, **opts)
return env
@property
@@ -112,21 +91,30 @@ class Environment(Model):
return self.schedule.time
raise Exception('The environment has not been scheduled, so it has no sense of time')
+
+ def set_topology(self, topology, network_params=None, dir_path=None):
+ if topology is None:
+ network_params = network_params or {}
+ topology = serialization.load_network(network_params,
+ dir_path=dir_path or self.dir_path)
+ if not topology:
+ topology = nx.Graph()
+ self.G = nx.Graph(topology)
+
@property
def agents(self):
- yield from self.environment_agents
- yield from self.network_agents
+ for agents in self.agents.values():
+ yield from agents
- @property
- def environment_agents(self):
- for ref in self._env_agents.values():
- yield ref
+ @agents.setter
+ def agents(self, agents):
+ self.agents = {}
- @environment_agents.setter
- def environment_agents(self, environment_agents):
- self._environment_agents = environment_agents
-
- self._env_agents = agents._definition_to_dict(definition=environment_agents)
+ for (k, v) in agents.items():
+ self.agents[k] = agents.from_config(v)
+ for agent in self.agents.get('network', []):
+ node = self.G.nodes[agent.unique_id]
+ node['agent'] = agent
@property
def network_agents(self):
@@ -135,12 +123,6 @@ class Environment(Model):
if 'agent' in node:
yield node['agent']
- @network_agents.setter
- def network_agents(self, network_agents):
- self._network_agents = network_agents
- for ix in self.G.nodes():
- self.init_agent(ix, agent_definitions=network_agents)
-
def init_agent(self, agent_id, agent_definitions):
node = self.G.nodes[agent_id]
init = False
@@ -251,20 +233,20 @@ class Environment(Model):
value=value)
def __contains__(self, key):
- return key in self.environment_params
+ return key in self.env_params
def get(self, key, default=None):
'''
Get the value of an environment attribute.
Return `default` if the value is not set.
'''
- return self.environment_params.get(key, default)
+ return self.env_params.get(key, default)
def __getitem__(self, key):
- return self.environment_params.get(key)
+ return self.env_params.get(key)
def __setitem__(self, key, value):
- return self.environment_params.__setitem__(key, value)
+ return self.env_params.__setitem__(key, value)
def get_agent(self, agent_id):
return self.G.nodes[agent_id]['agent']
@@ -292,7 +274,7 @@ class Environment(Model):
yield from self._agent_to_tuples(agent, now)
return
- for k, v in self.environment_params.items():
+ for k, v in self.env_params.items():
yield Record(dict_id='env',
t_step=now,
key=k,
@@ -300,23 +282,5 @@ class Environment(Model):
for agent in self.agents:
yield from self._agent_to_tuples(agent, now)
- def __getstate__(self):
- state = {}
- for prop in _CONFIG_PROPS:
- state[prop] = self.__dict__[prop]
- state['G'] = json_graph.node_link_data(self.G)
- state['environment_agents'] = self._env_agents
- state['schedule'] = self.schedule
- return state
-
- def __setstate__(self, state):
- for prop in _CONFIG_PROPS:
- self.__dict__[prop] = state[prop]
- self._env_agents = state['environment_agents']
- self.G = json_graph.node_link_graph(state['G'])
- # self._env = None
- self.schedule = state['schedule']
- self._queue = []
-
SoilEnvironment = Environment
diff --git a/soil/exporters.py b/soil/exporters.py
index f2bbe78..0653517 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -2,6 +2,8 @@ import os
import csv as csvlib
from time import time as current_time
from io import BytesIO
+from sqlalchemy import create_engine
+
import matplotlib.pyplot as plt
import networkx as nx
@@ -48,8 +50,8 @@ class Exporter:
self.simulation = simulation
outdir = outdir or os.path.join(os.getcwd(), 'soil_output')
self.outdir = os.path.join(outdir,
- simulation.config.group or '',
- simulation.config.name)
+ simulation.config.general.group or '',
+ simulation.config.general.id)
self.dry_run = dry_run
self.copy_to = copy_to
@@ -84,24 +86,33 @@ class Exporter:
class default(Exporter):
'''Default exporter. Writes sqlite results, as well as the simulation YAML'''
- def sim_start(self):
- if not self.dry_run:
- logger.info('Dumping results to %s', self.outdir)
- self.simulation.dump_yaml(outdir=self.outdir)
- else:
- logger.info('NOT dumping results')
+ # def sim_start(self):
+ # if not self.dry_run:
+ # logger.info('Dumping results to %s', self.outdir)
+ # self.simulation.dump_yaml(outdir=self.outdir)
+ # else:
+ # logger.info('NOT dumping results')
- def trial_start(self, env, stats):
- if not self.dry_run:
- with timer('Dumping simulation {} trial {}'.format(self.simulation.name,
- env.name)):
- with self.output('{}.sqlite'.format(env.name), mode='wb') as f:
- env.dump_sqlite(f)
+ # def trial_start(self, env, stats):
+ # if not self.dry_run:
+ # with timer('Dumping simulation {} trial {}'.format(self.simulation.name,
+ # env.name)):
+ # engine = create_engine('sqlite:///{}.sqlite'.format(env.name), echo=False)
- def sim_end(self, stats):
- with timer('Dumping simulation {}\'s stats'.format(self.simulation.name)):
- with self.output('{}.sqlite'.format(self.simulation.name), mode='wb') as f:
- self.simulation.dump_sqlite(f)
+ # dc = env.datacollector
+ # tables = {'env': dc.get_model_vars_dataframe(),
+ # 'agents': dc.get_agent_vars_dataframe(),
+ # 'agents': dc.get_agent_vars_dataframe()}
+ # for table in dc.tables:
+ # tables[table] = dc.get_table_dataframe(table)
+ # for (t, df) in tables.items():
+ # df.to_sql(t, con=engine)
+
+ # def sim_end(self, stats):
+ # with timer('Dumping simulation {}\'s stats'.format(self.simulation.name)):
+ # engine = create_engine('sqlite:///{}.sqlite'.format(self.simulation.name), echo=False)
+ # with self.output('{}.sqlite'.format(self.simulation.name), mode='wb') as f:
+ # self.simulation.dump_sqlite(f)
diff --git a/soil/serialization.py b/soil/serialization.py
index dd94108..3a10de1 100644
--- a/soil/serialization.py
+++ b/soil/serialization.py
@@ -51,8 +51,6 @@ def load_network(network_params, dir_path=None):
return G
-
-
def load_file(infile):
folder = os.path.dirname(infile)
if folder not in sys.path:
@@ -138,7 +136,9 @@ def load_config(config):
builtins = importlib.import_module('builtins')
-def name(value, known_modules=[]):
+KNOWN_MODULES = ['soil', ]
+
+def name(value, known_modules=KNOWN_MODULES):
'''Return a name that can be imported, to serialize/deserialize an object'''
if value is None:
return 'None'
@@ -167,7 +167,7 @@ def serializer(type_):
return lambda x: x
-def serialize(v, known_modules=[]):
+def serialize(v, known_modules=KNOWN_MODULES):
'''Get a text representation of an object.'''
tname = name(v, known_modules=known_modules)
func = serializer(tname)
@@ -176,7 +176,7 @@ def serialize(v, known_modules=[]):
IS_CLASS = re.compile(r"")
-def deserializer(type_, known_modules=[]):
+def deserializer(type_, known_modules=KNOWN_MODULES):
if type(type_) != str: # Already deserialized
return type_
if type_ == 'str':
@@ -194,10 +194,9 @@ def deserializer(type_, known_modules=[]):
return getattr(cls, 'deserialize', cls)
# Otherwise, see if we can find the module and the class
- modules = known_modules or []
options = []
- for mod in modules:
+ for mod in known_modules:
if mod:
options.append((mod, type_))
@@ -226,7 +225,7 @@ def deserialize(type_, value=None, **kwargs):
return des(value)
-def deserialize_all(names, *args, known_modules=['soil'], **kwargs):
+def deserialize_all(names, *args, known_modules=KNOWN_MODULES, **kwargs):
'''Return the list of deserialized objects'''
objects = []
for name in names:
diff --git a/soil/simulation.py b/soil/simulation.py
index 9985d3e..2f346ca 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -18,7 +18,7 @@ from .utils import logger
from .exporters import default
from .stats import defaultStats
-from .config import Config
+from .config import Config, convert_old
#TODO: change documentation for simulation
@@ -34,18 +34,21 @@ class Simulation:
def __init__(self, config=None,
**kwargs):
-
- if bool(config) == bool(kwargs):
- raise ValueError("Specify either a configuration or the parameters to initialize a configuration")
-
if kwargs:
- config = Config(**kwargs)
+ cfg = {}
+ if config:
+ cfg.update(config.dict(include_defaults=False))
+ cfg.update(kwargs)
+ config = Config(**cfg)
+ if not config:
+ raise ValueError("You need to specify a simulation configuration")
self.config = config
+
@property
def name(self) -> str:
- return self.config.name
+ return self.config.general.id
def run_simulation(self, *args, **kwargs):
return self.run(*args, **kwargs)
@@ -58,13 +61,13 @@ class Simulation:
if parallel and not os.environ.get('SENPY_DEBUG', None):
p = Pool()
func = partial(self.run_trial_exceptions, **kwargs)
- for i in p.imap_unordered(func, range(self.config.num_trials)):
+ for i in p.imap_unordered(func, range(self.config.general.num_trials)):
if isinstance(i, Exception):
logger.error('Trial failed:\n\t%s', i.message)
continue
yield i
else:
- for i in range(self.config.num_trials):
+ for i in range(self.config.general.num_trials):
yield self.run_trial(trial_id=i,
**kwargs)
@@ -88,7 +91,7 @@ class Simulation:
known_modules=['soil.stats',],
**stats_params)
- with utils.timer('simulation {}'.format(self.config.name)):
+ with utils.timer('simulation {}'.format(self.config.general.id)):
for stat in stats:
stat.sim_start()
@@ -157,11 +160,11 @@ class Simulation:
if log_level:
logger.setLevel(log_level)
# Set-up trial environment and graph
- until = until or self.config.max_time
+ until = until or self.config.general.max_time
env = Environment.from_config(self.config, trial_id=trial_id)
# Set up agents on nodes
- with utils.timer('Simulation {} trial {}'.format(self.config.name, trial_id)):
+ with utils.timer('Simulation {} trial {}'.format(self.config.general.id, trial_id)):
env.run(until)
return env
@@ -194,15 +197,22 @@ def from_config(conf_or_path):
sim = Simulation(**config)
return sim
+def from_old_config(conf_or_path):
+ config = list(serialization.load_config(conf_or_path))
+ if len(config) > 1:
+ raise AttributeError('Provide only one configuration')
+ config = convert_old(config[0][0])
+ return Simulation(config)
+
def run_from_config(*configs, **kwargs):
for config_def in configs:
# logger.info("Found {} config(s)".format(len(ls)))
for config, path in serialization.load_config(config_def):
- name = config.get('name', 'unnamed')
+ name = config.general.id
logger.info("Using config(s): {name}".format(name=name))
- dir_path = config.pop('dir_path', os.path.dirname(path))
+ dir_path = config.general.dir_path or os.path.dirname(path)
sim = Simulation(dir_path=dir_path,
**config)
sim.run_simulation(**kwargs)
diff --git a/tests/old_complete.yml b/tests/old_complete.yml
new file mode 100644
index 0000000..4382935
--- /dev/null
+++ b/tests/old_complete.yml
@@ -0,0 +1,32 @@
+---
+name: simple
+group: tests
+dir_path: "/tmp/"
+num_trials: 3
+max_time: 100
+interval: 1
+seed: "CompleteSeed!"
+network_params:
+ generator: complete_graph
+ n: 10
+network_agents:
+ - agent_type: CounterModel
+ weight: 1
+ state:
+ state_id: 0
+ - agent_type: AggregatedCounter
+ weight: 0.2
+environment_agents:
+ - agent_id: 'Environment Agent 1'
+ agent_type: CounterModel
+ state:
+ times: 10
+environment_class: Environment
+environment_params:
+ am_i_complete: true
+agent_type: CounterModel
+default_state:
+ times: 1
+states:
+ - name: 'The first node'
+ - name: 'The second node'
diff --git a/tests/test_config.py b/tests/test_config.py
new file mode 100644
index 0000000..359e8ad
--- /dev/null
+++ b/tests/test_config.py
@@ -0,0 +1,62 @@
+from unittest import TestCase
+import os
+from os.path import join
+
+from soil import serialization, config
+
+ROOT = os.path.abspath(os.path.dirname(__file__))
+EXAMPLES = join(ROOT, '..', 'examples')
+
+FORCE_TESTS = os.environ.get('FORCE_TESTS', '')
+
+
+class TestConfig(TestCase):
+
+ def test_conversion(self):
+ new = serialization.load_file(join(EXAMPLES, "complete.yml"))[0]
+ old = serialization.load_file(join(ROOT, "old_complete.yml"))[0]
+ converted = config.convert_old(old).dict(skip_defaults=True)
+ for (k, v) in new.items():
+ assert v == converted[k]
+
+
+def make_example_test(path, cfg):
+ def wrapped(self):
+ root = os.getcwd()
+ s = config.Config(**cfg)
+ import pdb;pdb.set_trace()
+ # for s in simulation.all_from_config(path):
+ # iterations = s.config.max_time * s.config.num_trials
+ # if iterations > 1000:
+ # s.config.max_time = 100
+ # s.config.num_trials = 1
+ # if config.get('skip_test', False) and not FORCE_TESTS:
+ # self.skipTest('Example ignored.')
+ # envs = s.run_simulation(dry_run=True)
+ # assert envs
+ # for env in envs:
+ # assert env
+ # try:
+ # n = config['network_params']['n']
+ # assert len(list(env.network_agents)) == n
+ # assert env.now > 0 # It has run
+ # assert env.now <= config['max_time'] # But not further than allowed
+ # except KeyError:
+ # pass
+ return wrapped
+
+
+def add_example_tests():
+ for config, path in serialization.load_files(
+ join(EXAMPLES, '*', '*.yml'),
+ join(EXAMPLES, '*.yml'),
+ ):
+ p = make_example_test(path=path, cfg=config)
+ fname = os.path.basename(path)
+ p.__name__ = 'test_example_file_%s' % fname
+ p.__doc__ = '%s should be a valid configuration' % fname
+ setattr(TestConfig, p.__name__, p)
+ del p
+
+
+add_example_tests()
diff --git a/tests/test_examples.py b/tests/test_examples.py
index 6a00367..a516c27 100644
--- a/tests/test_examples.py
+++ b/tests/test_examples.py
@@ -18,10 +18,10 @@ def make_example_test(path, config):
def wrapped(self):
root = os.getcwd()
for s in simulation.all_from_config(path):
- iterations = s.max_time * s.num_trials
+ iterations = s.config.max_time * s.config.num_trials
if iterations > 1000:
- s.max_time = 100
- s.num_trials = 1
+ s.config.max_time = 100
+ s.config.num_trials = 1
if config.get('skip_test', False) and not FORCE_TESTS:
self.skipTest('Example ignored.')
envs = s.run_simulation(dry_run=True)
diff --git a/tests/test_history.py b/tests/test_history.py
new file mode 100644
index 0000000..4a76d5c
--- /dev/null
+++ b/tests/test_history.py
@@ -0,0 +1,128 @@
+from unittest import TestCase
+
+import os
+import io
+import yaml
+import copy
+import pickle
+import networkx as nx
+from functools import partial
+
+from os.path import join
+from soil import (simulation, Environment, agents, serialization,
+ utils)
+from soil.time import Delta
+from tsih import NoHistory, History
+
+
+ROOT = os.path.abspath(os.path.dirname(__file__))
+EXAMPLES = join(ROOT, '..', 'examples')
+
+
+class CustomAgent(agents.FSM):
+ @agents.default_state
+ @agents.state
+ def normal(self):
+ self.neighbors = self.count_agents(state_id='normal',
+ limit_neighbors=True)
+ @agents.state
+ def unreachable(self):
+ return
+
+class TestHistory(TestCase):
+
+ def test_counter_agent_history(self):
+ """
+ The evolution of the state should be recorded in the logging agent
+ """
+ config = {
+ 'name': 'CounterAgent',
+ 'network_params': {
+ 'path': join(ROOT, 'test.gexf')
+ },
+ 'network_agents': [{
+ 'agent_type': 'AggregatedCounter',
+ 'weight': 1,
+ 'state': {'state_id': 0}
+
+ }],
+ 'max_time': 10,
+ 'environment_params': {
+ }
+ }
+ s = simulation.from_config(config)
+ env = s.run_simulation(dry_run=True)[0]
+ for agent in env.network_agents:
+ last = 0
+ assert len(agent[None, None]) == 11
+ for step, total in sorted(agent['total', None]):
+ assert total == last + 2
+ last = total
+
+ def test_row_conversion(self):
+ env = Environment(history=True)
+ env['test'] = 'test_value'
+
+ res = list(env.history_to_tuples())
+ assert len(res) == len(env.environment_params)
+
+ env.schedule.time = 1
+ env['test'] = 'second_value'
+ res = list(env.history_to_tuples())
+
+ assert env['env', 0, 'test' ] == 'test_value'
+ assert env['env', 1, 'test' ] == 'second_value'
+
+ def test_nohistory(self):
+ '''
+ Make sure that no history(/sqlite) is used by default
+ '''
+ env = Environment(topology=nx.Graph(), network_agents=[])
+ assert isinstance(env._history, NoHistory)
+
+ def test_save_graph_history(self):
+ '''
+ The history_to_graph method should return a valid networkx graph.
+
+ The state of the agent should be encoded as intervals in the nx graph.
+ '''
+ G = nx.cycle_graph(5)
+ distribution = agents.calculate_distribution(None, agents.BaseAgent)
+ env = Environment(topology=G, network_agents=distribution, history=True)
+ env[0, 0, 'testvalue'] = 'start'
+ env[0, 10, 'testvalue'] = 'finish'
+ nG = env.history_to_graph()
+ values = nG.nodes[0]['attr_testvalue']
+ assert ('start', 0, 10) in values
+ assert ('finish', 10, None) in values
+
+ def test_save_graph_nohistory(self):
+ '''
+ The history_to_graph method should return a valid networkx graph.
+
+ When NoHistory is used, only the last known value is known
+ '''
+ G = nx.cycle_graph(5)
+ distribution = agents.calculate_distribution(None, agents.BaseAgent)
+ env = Environment(topology=G, network_agents=distribution, history=False)
+ env.get_agent(0)['testvalue'] = 'start'
+ env.schedule.time = 10
+ env.get_agent(0)['testvalue'] = 'finish'
+ nG = env.history_to_graph()
+ values = nG.nodes[0]['attr_testvalue']
+ assert ('start', 0, None) not in values
+ assert ('finish', 10, None) in values
+
+ def test_pickle_agent_environment(self):
+ env = Environment(name='Test', history=True)
+ a = agents.BaseAgent(model=env, unique_id=25)
+
+ a['key'] = 'test'
+
+ pickled = pickle.dumps(a)
+ recovered = pickle.loads(pickled)
+
+ assert recovered.env.name == 'Test'
+ assert list(recovered.env._history.to_tuples())
+ assert recovered['key', 0] == 'test'
+ assert recovered['key'] == 'test'
diff --git a/tests/test_main.py b/tests/test_main.py
index 15ad035..2e89a2d 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -3,6 +3,7 @@ from unittest import TestCase
import os
import io
import yaml
+import copy
import pickle
import networkx as nx
from functools import partial
@@ -11,8 +12,6 @@ from os.path import join
from soil import (simulation, Environment, agents, serialization,
utils)
from soil.time import Delta
-from tsih import NoHistory, History
-
ROOT = os.path.abspath(os.path.dirname(__file__))
EXAMPLES = join(ROOT, '..', 'examples')
@@ -79,9 +78,31 @@ class TestMain(TestCase):
'environment_params': {
}
}
- s = simulation.from_config(config)
+ s = simulation.from_old_config(config)
s.run_simulation(dry_run=True)
+
+ def test_network_agent(self):
+ """
+ The initial states should be applied to the agent and the
+ agent should be able to update its state."""
+ config = {
+ 'name': 'CounterAgent',
+ 'network_params': {
+ 'generator': nx.complete_graph,
+ 'n': 2,
+ },
+ 'agent_type': 'CounterModel',
+ 'states': {
+ 0: {'times': 10},
+ 1: {'times': 20},
+ },
+ 'max_time': 2,
+ 'num_trials': 1,
+ 'environment_params': {
+ }
+ }
+ s = simulation.from_old_config(config)
def test_counter_agent(self):
"""
The initial states should be applied to the agent and the
@@ -98,41 +119,13 @@ class TestMain(TestCase):
'environment_params': {
}
}
- s = simulation.from_config(config)
+ s = simulation.from_old_config(config)
env = s.run_simulation(dry_run=True)[0]
assert env.get_agent(0)['times', 0] == 11
assert env.get_agent(0)['times', 1] == 12
assert env.get_agent(1)['times', 0] == 21
assert env.get_agent(1)['times', 1] == 22
- def test_counter_agent_history(self):
- """
- The evolution of the state should be recorded in the logging agent
- """
- config = {
- 'name': 'CounterAgent',
- 'network_params': {
- 'path': join(ROOT, 'test.gexf')
- },
- 'network_agents': [{
- 'agent_type': 'AggregatedCounter',
- 'weight': 1,
- 'state': {'state_id': 0}
-
- }],
- 'max_time': 10,
- 'environment_params': {
- }
- }
- s = simulation.from_config(config)
- env = s.run_simulation(dry_run=True)[0]
- for agent in env.network_agents:
- last = 0
- assert len(agent[None, None]) == 10
- for step, total in sorted(agent['total', None]):
- assert total == last + 2
- last = total
-
def test_custom_agent(self):
"""Allow for search of neighbors with a certain state_id"""
config = {
@@ -148,7 +141,7 @@ class TestMain(TestCase):
'environment_params': {
}
}
- s = simulation.from_config(config)
+ s = simulation.from_old_config(config)
env = s.run_simulation(dry_run=True)[0]
assert env.get_agent(1).count_agents(state_id='normal') == 2
assert env.get_agent(1).count_agents(state_id='normal', limit_neighbors=True) == 1
@@ -159,7 +152,7 @@ class TestMain(TestCase):
config = serialization.load_file(join(EXAMPLES, 'torvalds.yml'))[0]
config['network_params']['path'] = join(EXAMPLES,
config['network_params']['path'])
- s = simulation.from_config(config)
+ s = simulation.from_old_config(config)
env = s.run_simulation(dry_run=True)[0]
for a in env.network_agents:
skill_level = a.state['skill_level']
@@ -178,19 +171,23 @@ class TestMain(TestCase):
def test_yaml(self):
"""
- The YAML version of a newly created simulation
- should be equivalent to the configuration file used
+ The YAML version of a newly created configuration should be equivalent
+ to the configuration file used.
+ Values not present in the original config file should have reasonable
+ defaults.
"""
with utils.timer('loading'):
config = serialization.load_file(join(EXAMPLES, 'complete.yml'))[0]
- s = simulation.from_config(config)
+ s = simulation.from_old_config(config)
with utils.timer('serializing'):
- serial = s.to_yaml()
+ serial = s.config.to_yaml()
with utils.timer('recovering'):
recovered = yaml.load(serial, Loader=yaml.SafeLoader)
with utils.timer('deleting'):
del recovered['topology']
- assert config == recovered
+ for (k, v) in config.items():
+ assert recovered[k] == v
+ # assert config == recovered
def test_configuration_changes(self):
"""
@@ -198,26 +195,13 @@ class TestMain(TestCase):
the simulation.
"""
config = serialization.load_file(join(EXAMPLES, 'complete.yml'))[0]
- s = simulation.from_config(config)
+ s = simulation.from_old_config(config)
+ init_config = copy.copy(s.config)
s.run_simulation(dry_run=True)
- nconfig = s.to_dict()
- del nconfig['topology']
- assert config == nconfig
-
- def test_row_conversion(self):
- env = Environment(history=True)
- env['test'] = 'test_value'
-
- res = list(env.history_to_tuples())
- assert len(res) == len(env.environment_params)
-
- env.schedule.time = 1
- env['test'] = 'second_value'
- res = list(env.history_to_tuples())
-
- assert env['env', 0, 'test' ] == 'test_value'
- assert env['env', 1, 'test' ] == 'second_value'
+ nconfig = s.config
+ # del nconfig['to
+ assert init_config == nconfig
def test_save_geometric(self):
"""
@@ -229,51 +213,15 @@ class TestMain(TestCase):
f = io.BytesIO()
env.dump_gexf(f)
- def test_nohistory(self):
- '''
- Make sure that no history(/sqlite) is used by default
- '''
- env = Environment(topology=nx.Graph(), network_agents=[])
- assert isinstance(env._history, NoHistory)
-
- def test_save_graph_history(self):
- '''
- The history_to_graph method should return a valid networkx graph.
-
- The state of the agent should be encoded as intervals in the nx graph.
- '''
- G = nx.cycle_graph(5)
- distribution = agents.calculate_distribution(None, agents.BaseAgent)
- env = Environment(topology=G, network_agents=distribution, history=True)
- env[0, 0, 'testvalue'] = 'start'
- env[0, 10, 'testvalue'] = 'finish'
- nG = env.history_to_graph()
- values = nG.nodes[0]['attr_testvalue']
- assert ('start', 0, 10) in values
- assert ('finish', 10, None) in values
-
- def test_save_graph_nohistory(self):
- '''
- The history_to_graph method should return a valid networkx graph.
-
- When NoHistory is used, only the last known value is known
- '''
- G = nx.cycle_graph(5)
- distribution = agents.calculate_distribution(None, agents.BaseAgent)
- env = Environment(topology=G, network_agents=distribution, history=False)
- env.get_agent(0)['testvalue'] = 'start'
- env.schedule.time = 10
- env.get_agent(0)['testvalue'] = 'finish'
- nG = env.history_to_graph()
- values = nG.nodes[0]['attr_testvalue']
- assert ('start', 0, None) not in values
- assert ('finish', 10, None) in values
-
def test_serialize_class(self):
- ser, name = serialization.serialize(agents.BaseAgent)
+ ser, name = serialization.serialize(agents.BaseAgent, known_modules=[])
assert name == 'soil.agents.BaseAgent'
assert ser == agents.BaseAgent
+ ser, name = serialization.serialize(agents.BaseAgent, known_modules=['soil', ])
+ assert name == 'BaseAgent'
+ assert ser == agents.BaseAgent
+
ser, name = serialization.serialize(CustomAgent)
assert name == 'test_main.CustomAgent'
assert ser == CustomAgent
@@ -327,20 +275,6 @@ class TestMain(TestCase):
assert converted[1]['agent_type'] == 'test_main.CustomAgent'
pickle.dumps(converted)
- def test_pickle_agent_environment(self):
- env = Environment(name='Test', history=True)
- a = agents.BaseAgent(model=env, unique_id=25)
-
- a['key'] = 'test'
-
- pickled = pickle.dumps(a)
- recovered = pickle.loads(pickled)
-
- assert recovered.env.name == 'Test'
- assert list(recovered.env._history.to_tuples())
- assert recovered['key', 0] == 'test'
- assert recovered['key'] == 'test'
-
def test_subgraph(self):
'''An agent should be able to subgraph the global topology'''
G = nx.Graph()
@@ -371,7 +305,7 @@ class TestMain(TestCase):
'num_trials': 50,
'environment_params': {}
}
- s = simulation.from_config(config)
+ s = simulation.from_old_config(config)
runs = list(s.run_simulation(dry_run=True))
over = list(x.now for x in runs if x.now>2)
assert len(runs) == config['num_trials']
From e41dc3dae2b3f26d43063c9bd08cea6b061b9b9c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Tue, 13 Sep 2022 18:16:31 +0200
Subject: [PATCH 04/39] WIP
---
CHANGELOG.md | 6 +
examples/complete.yml | 41 ++++--
requirements.txt | 1 -
soil/agents/CounterModel.py | 10 +-
soil/agents/__init__.py | 243 ++++++++++++++++++++++++++++--------
soil/config.py | 89 +++++++++----
soil/environment.py | 137 ++++++++------------
soil/serialization.py | 58 ++++-----
soil/simulation.py | 83 ++++++------
soil/time.py | 4 +-
tests/test_config.py | 54 ++++++--
tests/test_exporters.py | 6 +-
tests/test_main.py | 75 ++++++-----
13 files changed, 521 insertions(+), 286 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fe425d0..6b7dc3e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [UNRELEASED]
+### Changed
+* Configuration schema is very different now. Check `soil.config` for more information. We are using Pydantic for (de)serialization.
+* There may be more than one topology/network in the simulation
+* Agents are split into groups now. Each group may be assigned a given set of agents or an agent distribution, and a network topology to be assigned to.
+### Removed
+* Any `tsih` and `History` integration in the main classes. To record the state of environments/agents, just use a datacollector. In some cases this may be slower or consume more memory than the previous system. However, few cases actually used the full potential of the history, and it came at the cost of unnecessary complexity and worse performance for the majority of cases.
## [0.20.7]
### Changed
* Creating a `time.When` from another `time.When` does not nest them anymore (it returns the argument)
diff --git a/examples/complete.yml b/examples/complete.yml
index a4b5b04..f017075 100644
--- a/examples/complete.yml
+++ b/examples/complete.yml
@@ -1,38 +1,59 @@
---
+version: '2'
general:
- name: simple
+ id: simple
group: tests
dir_path: "/tmp/"
num_trials: 3
max_time: 100
interval: 1
seed: "CompleteSeed!"
-network:
- group:
- network
- params:
- generator: complete_graph
- n: 10
+topologies:
+ default:
+ params:
+ generator: complete_graph
+ n: 10
+ another_graph:
+ params:
+ generator: complete_graph
+ n: 2
environment:
environment_class: Environment
params:
am_i_complete: true
agents:
- default:
+# Agents are split into groups, each with its own definition
+ default: # This is a special group. Its values will be used as default values for the rest of the groups
agent_class: CounterModel
+ topology: default
state:
times: 1
environment:
+ # In this group we are not specifying any topology
fixed:
- agent_id: 'Environment Agent 1'
agent_class: CounterModel
state:
times: 10
- network:
+ general_counters:
+ topology: default
distribution:
- agent_class: CounterModel
weight: 1
state:
- state_id: 0
+ id: 0
+ times: 3
- agent_class: AggregatedCounter
weight: 0.2
+ other_counters:
+ topology: another_graph
+ fixed:
+ - agent_class: CounterModel
+ id: 0
+ state:
+ times: 1
+ total: 0
+ - agent_class: CounterModel
+ id: 1
+ # If not specified, it will use the state set in the default
+ # state:
diff --git a/requirements.txt b/requirements.txt
index 2660dfd..31f12d5 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,5 +6,4 @@ pandas>=0.23
SALib>=1.3
Jinja2
Mesa>=0.8.9
-tsih>=0.1.6
pydantic>=1.9
diff --git a/soil/agents/CounterModel.py b/soil/agents/CounterModel.py
index 528b957..d2edc1b 100644
--- a/soil/agents/CounterModel.py
+++ b/soil/agents/CounterModel.py
@@ -7,9 +7,15 @@ class CounterModel(NetworkAgent):
in each step and adds it to its state.
"""
+ defaults = {
+ 'times': 0,
+ 'neighbors': 0,
+ 'total': 0
+ }
+
def step(self):
# Outside effects
- total = len(list(self.get_agents()))
+ total = len(list(self.env.agents))
neighbors = len(list(self.get_neighboring_agents()))
self['times'] = self.get('times', 0) + 1
self['neighbors'] = neighbors
@@ -33,6 +39,6 @@ class AggregatedCounter(NetworkAgent):
self['times'] += 1
neighbors = len(list(self.get_neighboring_agents()))
self['neighbors'] += neighbors
- total = len(list(self.get_agents()))
+ total = len(list(self.env.agents))
self['total'] += total
self.debug('Running for step: {}. Total: {}'.format(self.now, total))
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index 623c21a..1b9b714 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -1,16 +1,17 @@
import logging
from collections import OrderedDict, defaultdict
+from collections.abc import Mapping, Set
from copy import deepcopy
from functools import partial, wraps
-from itertools import islice
+from itertools import islice, chain
import json
import networkx as nx
-from .. import serialization, utils, time
+from mesa import Agent as MesaAgent
+from typing import Dict, List
-from tsih import Key
+from .. import serialization, utils, time, config
-from mesa import Agent
def as_node(agent):
@@ -24,7 +25,7 @@ IGNORED_FIELDS = ('model', 'logger')
class DeadAgent(Exception):
pass
-class BaseAgent(Agent):
+class BaseAgent(MesaAgent):
"""
A special type of Mesa Agent that:
@@ -47,9 +48,8 @@ class BaseAgent(Agent):
):
# Check for REQUIRED arguments
# Initialize agent parameters
- if isinstance(unique_id, Agent):
+ if isinstance(unique_id, MesaAgent):
raise Exception()
- self._saved = set()
super().__init__(unique_id=unique_id, model=model)
self.name = name or '{}[{}]'.format(type(self).__name__, self.unique_id)
@@ -57,7 +57,7 @@ class BaseAgent(Agent):
self.alive = True
self.interval = interval or self.get('interval', 1)
- self.logger = logging.getLogger(self.model.name).getChild(self.name)
+ self.logger = logging.getLogger(self.model.id).getChild(self.name)
if hasattr(self, 'level'):
self.logger.setLevel(self.level)
@@ -66,6 +66,7 @@ class BaseAgent(Agent):
setattr(self, k, deepcopy(v))
for (k, v) in kwargs.items():
+
setattr(self, k, v)
for (k, v) in getattr(self, 'defaults', {}).items():
@@ -107,23 +108,7 @@ class BaseAgent(Agent):
def environment_params(self, value):
self.model.environment_params = value
- def __setattr__(self, key, value):
- if not key.startswith('_') and key not in IGNORED_FIELDS:
- try:
- k = Key(t_step=self.now,
- dict_id=self.unique_id,
- key=key)
- self._saved.add(key)
- self.model[k] = value
- except AttributeError:
- pass
- super().__setattr__(key, value)
-
def __getitem__(self, key):
- if isinstance(key, tuple):
- key, t_step = key
- k = Key(key=key, t_step=t_step, dict_id=self.unique_id)
- return self.model[k]
return getattr(self, key)
def __delitem__(self, key):
@@ -135,8 +120,11 @@ class BaseAgent(Agent):
def __setitem__(self, key, value):
setattr(self, key, value)
+ def keys(self):
+ return (k for k in self.__dict__ if k[0] != '_')
+
def items(self):
- return ((k, getattr(self, k)) for k in self._saved)
+ return ((k, v) for (k, v) in self.__dict__.items() if k[0] != '_')
def get(self, key, default=None):
return self[key] if key in self else default
@@ -174,22 +162,32 @@ class BaseAgent(Agent):
extra['agent_name'] = self.name
return self.logger.log(level, message, extra=extra)
+
+
def debug(self, *args, **kwargs):
return self.log(*args, level=logging.DEBUG, **kwargs)
def info(self, *args, **kwargs):
return self.log(*args, level=logging.INFO, **kwargs)
+# Alias
+# Agent = BaseAgent
class NetworkAgent(BaseAgent):
-
- @property
- def topology(self):
- return self.model.G
+ def __init__(self,
+ *args,
+ graph_name: str,
+ node_id: int = None,
+ **kwargs,
+ ):
+ super().__init__(*args, **kwargs)
+ self.graph_name = graph_name
+ self.topology = self.env.topologies[self.graph_name]
+ self.node_id = node_id
@property
def G(self):
- return self.model.G
+ return self.model.topologies[self._topology]
def count_agents(self, **kwargs):
return len(list(self.get_agents(**kwargs)))
@@ -210,8 +208,7 @@ class NetworkAgent(BaseAgent):
if limit_neighbors:
agents = self.topology.neighbors(self.unique_id)
- agents = self.model.get_agents(agents)
- return select(agents, **kwargs)
+ return self.model.agents(ids=agents, **kwargs)
def subgraph(self, center=True, **kwargs):
include = [self] if center else []
@@ -229,7 +226,6 @@ class NetworkAgent(BaseAgent):
self.topology.add_edge(self.unique_id, other.unique_id, edge_attr_dict=edge_attr_dict, *edge_attrs)
-
def ego_search(self, steps=1, center=False, node=None, **kwargs):
'''Get a list of nodes in the ego network of *node* of radius *steps*'''
node = as_node(node if node is not None else self)
@@ -311,7 +307,7 @@ class MetaFSM(type):
cls.states = states
-class FSM(NetworkAgent, metaclass=MetaFSM):
+class FSM(BaseAgent, metaclass=MetaFSM):
def __init__(self, *args, **kwargs):
super(FSM, self).__init__(*args, **kwargs)
if not hasattr(self, 'state_id'):
@@ -537,32 +533,171 @@ def _definition_to_dict(definition, size=None, default_state=None):
return agents
-def select(agents, state_id=None, agent_type=None, ignore=None, iterator=False, **kwargs):
+class AgentView(Mapping, Set):
+ """A lazy-loaded list of agents.
+ """
- if state_id is not None and not isinstance(state_id, (tuple, list)):
- state_id = tuple([state_id])
- if agent_type is not None:
- try:
- agent_type = tuple(agent_type)
- except TypeError:
- agent_type = tuple([agent_type])
+ __slots__ = ("_agents",)
- f = agents
- if ignore:
- f = filter(lambda x: x not in ignore, f)
+ def __init__(self, agents):
+ self._agents = agents
- if state_id is not None:
- f = filter(lambda agent: agent.get('state_id', None) in state_id, f)
+ def __getstate__(self):
+ return {"_agents": self._agents}
- if agent_type is not None:
- f = filter(lambda agent: isinstance(agent, agent_type), f)
- for k, v in kwargs.items():
- f = filter(lambda agent: agent.state.get(k, None) == v, f)
+ def __setstate__(self, state):
+ self._agents = state["_agents"]
- if iterator:
- return f
- return f
+ # Mapping methods
+ def __len__(self):
+ return sum(len(x) for x in self._agents.values())
+
+ def __iter__(self):
+ return iter(chain.from_iterable(g.values() for g in self._agents.values()))
+
+ def __getitem__(self, agent_id):
+ if isinstance(agent_id, slice):
+ raise ValueError(f"Slicing is not supported")
+ for group in self._agents.values():
+ if agent_id in group:
+ return group[agent_id]
+ raise ValueError(f"Agent {agent_id} not found")
+
+ def filter(self, ids=None, groups=None, state_id=None, agent_type=None, ignore=None, iterator=False, **kwargs):
+
+ if state_id is not None and not isinstance(state_id, (tuple, list)):
+ state_id = tuple([state_id])
+
+ agents = self._agents
+
+ if groups:
+ agents = {(k,v) for (k, v) in agents.items() if k in groups}
+
+ if agent_type is not None:
+ try:
+ agent_type = tuple(agent_type)
+ except TypeError:
+ agent_type = tuple([agent_type])
+
+ if ids:
+ agents = (v[aid] for v in agents.values() for aid in ids if aid in v)
+ else:
+ agents = (a for v in agents.values() for a in v.values())
+
+ f = agents
+ if ignore:
+ f = filter(lambda x: x not in ignore, f)
+
+ if state_id is not None:
+ f = filter(lambda agent: agent.get('state_id', None) in state_id, f)
+
+ if agent_type is not None:
+ f = filter(lambda agent: isinstance(agent, agent_type), f)
+ for k, v in kwargs.items():
+ f = filter(lambda agent: agent.state.get(k, None) == v, f)
+
+ if iterator:
+ return f
+ return list(f)
+
+ def __call__(self, *args, **kwargs):
+ return self.filter(*args, **kwargs)
+
+ def __contains__(self, agent_id):
+ return any(agent_id in g for g in self._agents)
+
+ def __str__(self):
+ return str(list(a.id for a in self))
+
+ def __repr__(self):
+ return f"{self.__class__.__name__}({self})"
+
+
+def from_config(cfg: Dict[str, config.AgentConfig], env):
+ '''
+ Agents are specified in groups.
+ Each group can be specified in two ways, either through a fixed list in which each item has
+ has the agent type, number of agents to create, and the other parameters, or through what we call
+ an `agent distribution`, which is similar but instead of number of agents, it specifies the weight
+ of each agent type.
+ '''
+ default = cfg.get('default', None)
+ return {k: _group_from_config(c, default=default, env=env) for (k, c) in cfg.items() if k is not 'default'}
+
+
+def _group_from_config(cfg: config.AgentConfig, default: config.SingleAgentConfig, env):
+ agents = {}
+ if cfg.fixed is not None:
+ agents = _from_fixed(cfg.fixed, topology=cfg.topology, default=default, env=env)
+ if cfg.distribution:
+ n = cfg.n or len(env.topologies[cfg.topology])
+ agents.update(_from_distro(cfg.distribution, n - len(agents),
+ topology=cfg.topology or default.topology,
+ default=default,
+ env=env))
+ return agents
+
+
+def _from_fixed(lst: List[config.FixedAgentConfig], topology: str, default: config.SingleAgentConfig, env):
+ agents = {}
+
+ for fixed in lst:
+ agent_id = fixed.agent_id
+ if agent_id is None:
+ agent_id = env.next_id()
+
+ cls = serialization.deserialize(fixed.agent_class or default.agent_class)
+ state = fixed.state.copy()
+ state.update(default.state)
+ agents[agent_id] = cls(unique_id=agent_id,
+ model=env,
+ graph_name=fixed.topology or topology or default.topology,
+ **state)
+
+ return agents
+
+
+def _from_distro(distro: List[config.AgentDistro],
+ n: int,
+ topology: str,
+ default: config.SingleAgentConfig,
+ env):
+
+ agents = {}
+
+ if n is None:
+ if any(lambda dist: dist.n is None, distro):
+ raise ValueError('You must provide a total number of agents, or the number of each type')
+ n = sum(dist.n for dist in distro)
+
+
+ total = sum((dist.weight if dist.weight is not None else 1) for dist in distro)
+ thres = {}
+ last = 0
+ for i in sorted(distro, key=lambda x: x.weight):
+
+ cls = serialization.deserialize(i.agent_class or default.agent_class)
+ thres[(last, last + i.weight/total)] = (cls, i)
+
+ acc = 0
+
+ # using np.choice would be more efficient, but this allows us to use soil without
+ # numpy
+ for i in range(n):
+ r = random.random()
+ for (t, (cls, d)) in thres.items():
+ if r >= t[0] and r <= t[1]:
+ agent_id = d.agent_id
+ if agent_id is None:
+ agent_id = env.next_id()
+
+ state = d.state.copy()
+ state.update(default.state)
+ agents[agent_id] = cls(unique_id=agent_id, model=env, graph_name=d.topology or topology or default.topology, **state)
+ break
+
+ return agents
from .BassModel import *
diff --git a/soil/config.py b/soil/config.py
index 4f4ceed..a47e5a2 100644
--- a/soil/config.py
+++ b/soil/config.py
@@ -11,7 +11,7 @@ from pydantic import BaseModel, Extra
class General(BaseModel):
id: str = 'Unnamed Simulation'
group: str = None
- dir_path: str = None
+ dir_path: Optional[str] = None
num_trials: int = 1
max_time: float = 100
interval: float = 1
@@ -27,13 +27,13 @@ nodeId = int
class Node(BaseModel):
id: nodeId
- state: Dict[str, Any]
+ state: Optional[Dict[str, Any]] = {}
class Edge(BaseModel):
source: nodeId
target: nodeId
- value: float = 1
+ value: Optional[float] = 1
class Topology(BaseModel):
@@ -75,46 +75,62 @@ class EnvConfig(BaseModel):
class SingleAgentConfig(BaseModel):
- agent_class: Union[Type, str] = 'soil.Agent'
+ agent_class: Optional[Union[Type, str]] = None
agent_id: Optional[Union[str, int]] = None
- params: Dict[str, Any] = {}
- state: Dict[str, Any] = {}
+ topology: Optional[str] = None
+ state: Optional[Dict[str, Any]] = {}
-
-class AgentDistro(SingleAgentConfig):
- weight: Optional[float] = None
- n: Optional[int] = None
+class FixedAgentConfig(SingleAgentConfig):
+ n: Optional[int] = 1
@root_validator
def validate_all(cls, values):
- if 'weight' in values and 'count' in values:
- raise ValueError("You may either specify a weight in the distribution or an agent count")
+ if 'agent_id' in values and values.get('n', 1) > 1:
+ raise ValueError("An agent_id can only be provided when there is only one agent")
return values
+class AgentDistro(SingleAgentConfig):
+ weight: Optional[float] = 1
+
+
class AgentConfig(SingleAgentConfig):
n: Optional[int] = None
+ topology: Optional[str] = None
distribution: Optional[List[AgentDistro]] = None
- fixed: Optional[List[SingleAgentConfig]] = None
+ fixed: Optional[List[FixedAgentConfig]] = None
@staticmethod
def default():
return AgentConfig()
+ @root_validator
+ def validate_all(cls, values):
+ if 'distribution' in values and ('n' not in values and 'topology' not in values):
+ raise ValueError("You need to provide the number of agents or a topology to extract the value from.")
+ return values
+
class Config(BaseModel, extra=Extra.forbid):
+ version: Optional[str] = '1'
general: General = General.default()
- network: Optional[NetConfig] = None
+ topologies: Optional[Dict[str, NetConfig]] = {}
environment: EnvConfig = EnvConfig.default()
- agents: Dict[str, AgentConfig] = {}
+ agents: Optional[Dict[str, AgentConfig]] = {}
-def convert_old(old):
+def convert_old(old, strict=True):
'''
Try to convert old style configs into the new format.
This is still a work in progress and might not work in many cases.
'''
+
+ # TODO: translate states
+
+ if strict and old.get('states', {}):
+ raise ValueError('Custom (i.e., manual) agent states cannot be translated to v2 configuration files. Please, convert your configuration file to the new format.')
+
new = {}
@@ -129,7 +145,10 @@ def convert_old(old):
if k in old:
general[k] = old[k]
- network = {'group': 'network'}
+ if 'name' in old:
+ general['id'] = old['name']
+
+ network = {}
if 'network_params' in old and old['network_params']:
@@ -143,9 +162,6 @@ def convert_old(old):
network['topology'] = old['topology']
agents = {
- 'environment': {
- 'fixed': []
- },
'network': {},
'default': {},
}
@@ -164,10 +180,31 @@ def convert_old(old):
return newagent
for agent in old.get('environment_agents', []):
- agents['environment']['fixed'].append(updated_agent(agent))
+ agents['environment'] = {'distribution': [], 'fixed': []}
+ if 'agent_id' not in agent:
+ agents['environment']['distribution'].append(updated_agent(agent))
+ else:
+ agents['environment']['fixed'].append(updated_agent(agent))
- for agent in old.get('network_agents', []):
- agents['network'].setdefault('distribution', []).append(updated_agent(agent))
+ by_weight = []
+ fixed = []
+
+ if 'network_agents' in old:
+ agents['network']['topology'] = 'default'
+
+ for agent in old['network_agents']:
+ agent = updated_agent(agent)
+ if 'agent_id' in agent:
+ fixed.append(agent)
+ else:
+ by_weight.append(agent)
+
+ if 'agent_type' in old and (not fixed and not by_weight):
+ agents['network']['topology'] = 'default'
+ by_weight = [{'agent_type': old['agent_type']}]
+
+ agents['network']['fixed'] = fixed
+ agents['network']['distribution'] = by_weight
environment = {'params': {}}
if 'environment_class' in old:
@@ -176,8 +213,8 @@ def convert_old(old):
for (k, v) in old.get('environment_params', {}).items():
environment['params'][k] = v
-
- return Config(general=general,
- network=network,
+ return Config(version='2',
+ general=general,
+ topologies={'default': network},
environment=environment,
agents=agents)
diff --git a/soil/environment.py b/soil/environment.py
index 4e00cd9..f95b901 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -3,6 +3,10 @@ import os
import sqlite3
import math
import random
+import logging
+
+from typing import Dict
+from collections import namedtuple
from time import time as current_time
from copy import deepcopy
from networkx.readwrite import json_graph
@@ -12,9 +16,11 @@ import networkx as nx
from mesa import Model
-from tsih import Record
+from . import serialization, agents, analysis, utils, time, config, network
+
+
+Record = namedtuple('Record', 'dict_id t_step key value')
-from . import serialization, agents, analysis, utils, time, config
class Environment(Model):
"""
@@ -28,15 +34,17 @@ class Environment(Model):
"""
def __init__(self,
- env_id,
+ env_id='unnamed_env',
seed='default',
schedule=None,
- env_params=None,
dir_path=None,
- **kwargs):
+ interval=1,
+ agents: Dict[str, config.AgentConfig] = {},
+ topologies: Dict[str, config.NetConfig] = {},
+ **env_params):
super().__init__()
-
+ self.current_id = -1
self.seed = '{}_{}'.format(seed, env_id)
self.id = env_id
@@ -51,25 +59,28 @@ class Environment(Model):
random.seed(seed)
- if isinstance(states, list):
- states = dict(enumerate(states))
- self.states = deepcopy(states) if states else {}
- self.default_state = deepcopy(default_state) or {}
-
-
- self.set_topology(topology=topology,
- network_params=network_params)
+ self.topologies = {}
+ for (name, cfg) in topologies.items():
+ self.set_topology(cfg=cfg,
+ graph=name)
self.agents = agents or {}
self.env_params = env_params or {}
- self.env_params.update(kwargs)
self.interval = interval
self['SEED'] = seed
+ self.logger = utils.logger.getChild(self.id)
+
+ @property
+ def topology(self):
+ return self.topologies['default']
+
+ @property
+ def network_agents(self):
+ yield from self.agents(agent_type=agents.NetworkAgent, iterator=True)
- self.logger = utils.logger.getChild(self.name)
@staticmethod
def from_config(conf: config.Config, trial_id, **kwargs) -> Environment:
@@ -92,39 +103,30 @@ class Environment(Model):
raise Exception('The environment has not been scheduled, so it has no sense of time')
- def set_topology(self, topology, network_params=None, dir_path=None):
- if topology is None:
- network_params = network_params or {}
- topology = serialization.load_network(network_params,
- dir_path=dir_path or self.dir_path)
- if not topology:
- topology = nx.Graph()
- self.G = nx.Graph(topology)
+ def set_topology(self, cfg=None, dir_path=None, graph='default'):
+ self.topologies[graph] = network.from_config(cfg, dir_path=dir_path)
@property
def agents(self):
- for agents in self.agents.values():
- yield from agents
+ return agents.AgentView(self._agents)
@agents.setter
- def agents(self, agents):
- self.agents = {}
+ def agents(self, agents_def: Dict[str, config.AgentConfig]):
+ self._agents = agents.from_config(agents_def, env=self)
+ for d in self._agents.values():
+ for a in d.values():
+ self.schedule.add(a)
- for (k, v) in agents.items():
- self.agents[k] = agents.from_config(v)
- for agent in self.agents.get('network', []):
- node = self.G.nodes[agent.unique_id]
- node['agent'] = agent
- @property
- def network_agents(self):
- for i in self.G.nodes():
- node = self.G.nodes[i]
- if 'agent' in node:
- yield node['agent']
+ # @property
+ # def network_agents(self):
+ # for i in self.G.nodes():
+ # node = self.G.nodes[i]
+ # if 'agent' in node:
+ # yield node['agent']
- def init_agent(self, agent_id, agent_definitions):
- node = self.G.nodes[agent_id]
+ def init_agent(self, agent_id, agent_definitions, graph='default'):
+ node = self.topologies[graph].nodes[agent_id]
init = False
state = dict(node)
@@ -145,8 +147,8 @@ class Environment(Model):
return
return self.set_agent(agent_id, agent_type, state)
- def set_agent(self, agent_id, agent_type, state=None):
- node = self.G.nodes[agent_id]
+ def set_agent(self, agent_id, agent_type, state=None, graph='default'):
+ node = self.topologies[graph].nodes[agent_id]
defstate = deepcopy(self.default_state) or {}
defstate.update(self.states.get(agent_id, {}))
defstate.update(node.get('state', {}))
@@ -166,20 +168,20 @@ class Environment(Model):
self.schedule.add(a)
return a
- def add_node(self, agent_type, state=None):
- agent_id = int(len(self.G.nodes()))
- self.G.add_node(agent_id)
- a = self.set_agent(agent_id, agent_type, state)
+ def add_node(self, agent_type, state=None, graph='default'):
+ agent_id = int(len(self.topologies[graph].nodes()))
+ self.topologies[graph].add_node(agent_id)
+ a = self.set_agent(agent_id, agent_type, state, graph=graph)
a['visible'] = True
return a
- def add_edge(self, agent1, agent2, start=None, **attrs):
+ def add_edge(self, agent1, agent2, start=None, graph='default', **attrs):
if hasattr(agent1, 'id'):
agent1 = agent1.id
if hasattr(agent2, 'id'):
agent2 = agent2.id
start = start or self.now
- return self.G.add_edge(agent1, agent2, **attrs)
+ return self.topologies[graph].add_edge(agent1, agent2, **attrs)
def log(self, message, *args, level=logging.INFO, **kwargs):
if not self.logger.isEnabledFor(level):
@@ -190,7 +192,7 @@ class Environment(Model):
message += " {k}={v} ".format(k, v)
extra = {}
extra['now'] = self.now
- extra['unique_id'] = self.name
+ extra['unique_id'] = self.id
return self.logger.log(level, message, extra=extra)
def step(self):
@@ -207,30 +209,6 @@ class Environment(Model):
self.step()
utils.logger.debug(f'Simulation step {self.schedule.time}/{until}. Next: {self.schedule.next_time}')
self.schedule.time = until
- self._history.flush_cache()
-
- def _save_state(self, now=None):
- serialization.logger.debug('Saving state @{}'.format(self.now))
- self._history.save_records(self.state_to_tuples(now=now))
-
- def __getitem__(self, key):
- if isinstance(key, tuple):
- self._history.flush_cache()
- return self._history[key]
-
- return self.environment_params[key]
-
- def __setitem__(self, key, value):
- if isinstance(key, tuple):
- k = Key(*key)
- self._history.save_record(*k,
- value=value)
- return
- self.environment_params[key] = value
- self._history.save_record(dict_id='env',
- t_step=self.now,
- key=key,
- value=value)
def __contains__(self, key):
return key in self.env_params
@@ -248,14 +226,6 @@ class Environment(Model):
def __setitem__(self, key, value):
return self.env_params.__setitem__(key, value)
- def get_agent(self, agent_id):
- return self.G.nodes[agent_id]['agent']
-
- def get_agents(self, nodes=None):
- if nodes is None:
- return self.agents
- return (self.G.nodes[i]['agent'] for i in nodes)
-
def _agent_to_tuples(self, agent, now=None):
if now is None:
now = self.now
@@ -270,7 +240,7 @@ class Environment(Model):
now = self.now
if agent_id:
- agent = self.get_agent(agent_id)
+ agent = self.agents[agent_id]
yield from self._agent_to_tuples(agent, now)
return
@@ -283,4 +253,5 @@ class Environment(Model):
yield from self._agent_to_tuples(agent, now)
+
SoilEnvironment = Environment
diff --git a/soil/serialization.py b/soil/serialization.py
index 3a10de1..8c17f23 100644
--- a/soil/serialization.py
+++ b/soil/serialization.py
@@ -16,39 +16,39 @@ from jinja2 import Template
logger = logging.getLogger('soil')
-def load_network(network_params, dir_path=None):
- G = nx.Graph()
+# def load_network(network_params, dir_path=None):
+# G = nx.Graph()
- if not network_params:
- return G
+# if not network_params:
+# return G
- if 'path' in network_params:
- path = network_params['path']
- if dir_path and not os.path.isabs(path):
- path = os.path.join(dir_path, path)
- extension = os.path.splitext(path)[1][1:]
- kwargs = {}
- if extension == 'gexf':
- kwargs['version'] = '1.2draft'
- kwargs['node_type'] = int
- try:
- method = getattr(nx.readwrite, 'read_' + extension)
- except AttributeError:
- raise AttributeError('Unknown format')
- G = method(path, **kwargs)
+# if 'path' in network_params:
+# path = network_params['path']
+# if dir_path and not os.path.isabs(path):
+# path = os.path.join(dir_path, path)
+# extension = os.path.splitext(path)[1][1:]
+# kwargs = {}
+# if extension == 'gexf':
+# kwargs['version'] = '1.2draft'
+# kwargs['node_type'] = int
+# try:
+# method = getattr(nx.readwrite, 'read_' + extension)
+# except AttributeError:
+# raise AttributeError('Unknown format')
+# G = method(path, **kwargs)
- elif 'generator' in network_params:
- net_args = network_params.copy()
- net_gen = net_args.pop('generator')
+# elif 'generator' in network_params:
+# net_args = network_params.copy()
+# net_gen = net_args.pop('generator')
- if dir_path not in sys.path:
- sys.path.append(dir_path)
+# if dir_path not in sys.path:
+# sys.path.append(dir_path)
- method = deserializer(net_gen,
- known_modules=['networkx.generators',])
- G = method(**net_args)
+# method = deserializer(net_gen,
+# known_modules=['networkx.generators',])
+# G = method(**net_args)
- return G
+# return G
def load_file(infile):
@@ -122,8 +122,8 @@ def load_files(*patterns, **kwargs):
for i in glob(pattern, **kwargs):
for config in load_file(i):
path = os.path.abspath(i)
- if 'dir_path' not in config:
- config['dir_path'] = os.path.dirname(path)
+ if 'general' in config and 'dir_path' not in config['general']:
+ config['general']['dir_path'] = os.path.dirname(path)
yield config, path
diff --git a/soil/simulation.py b/soil/simulation.py
index 2f346ca..3826459 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -96,7 +96,7 @@ class Simulation:
stat.sim_start()
for exporter in exporters:
- exporter.start()
+ exporter.sim_start()
for env in self._run_sync_or_async(parallel=parallel,
log_level=log_level,
@@ -107,7 +107,7 @@ class Simulation:
collected = list(stat.trial_end(env) for stat in stats)
- saved = self._update_stats(collected, t_step=env.now, trial_id=env.name)
+ saved = self._update_stats(collected, t_step=env.now, trial_id=env.id)
for exporter in exporters:
exporter.trial_end(env, saved)
@@ -117,6 +117,9 @@ class Simulation:
collected = list(stat.end() for stat in stats)
saved = self._update_stats(collected)
+ for stat in stats:
+ stat.sim_end()
+
for exporter in exporters:
exporter.sim_end(saved)
@@ -131,24 +134,24 @@ class Simulation:
def get_env(self, trial_id=0, **kwargs):
'''Create an environment for a trial of the simulation'''
- opts = self.environment_params.copy()
- opts.update({
- 'name': '{}_trial_{}'.format(self.name, trial_id),
- 'topology': self.topology.copy(),
- 'network_params': self.network_params,
- 'seed': '{}_trial_{}'.format(self.seed, trial_id),
- 'initial_time': 0,
- 'interval': self.interval,
- 'network_agents': self.network_agents,
- 'initial_time': 0,
- 'states': self.states,
- 'dir_path': self.dir_path,
- 'default_state': self.default_state,
- 'history': bool(self._history),
- 'environment_agents': self.environment_agents,
- })
- opts.update(kwargs)
- env = self.environment_class(**opts)
+ # opts = self.environment_params.copy()
+ # opts.update({
+ # 'name': '{}_trial_{}'.format(self.name, trial_id),
+ # 'topology': self.topology.copy(),
+ # 'network_params': self.network_params,
+ # 'seed': '{}_trial_{}'.format(self.seed, trial_id),
+ # 'initial_time': 0,
+ # 'interval': self.interval,
+ # 'network_agents': self.network_agents,
+ # 'initial_time': 0,
+ # 'states': self.states,
+ # 'dir_path': self.dir_path,
+ # 'default_state': self.default_state,
+ # 'history': bool(self._history),
+ # 'environment_agents': self.environment_agents,
+ # })
+ # opts.update(kwargs)
+ env = Environment.from_config(self.config, trial_id=trial_id, **kwargs)
return env
def run_trial(self, trial_id=None, until=None, log_level=logging.INFO, **opts):
@@ -162,7 +165,7 @@ class Simulation:
# Set-up trial environment and graph
until = until or self.config.general.max_time
- env = Environment.from_config(self.config, trial_id=trial_id)
+ env = self.get_env(trial_id, **opts)
# Set up agents on nodes
with utils.timer('Simulation {} trial {}'.format(self.config.general.id, trial_id)):
env.run(until)
@@ -181,21 +184,31 @@ class Simulation:
ex.message = ''.join(traceback.format_exception(type(ex), ex, ex.__traceback__)[:])
return ex
+ def to_dict(self):
+ return self.config.dict()
+
+ def to_yaml(self):
+ return yaml.dump(self.config.dict())
+
def all_from_config(config):
configs = list(serialization.load_config(config))
- for config, _ in configs:
- sim = Simulation(**config)
+ for config, path in configs:
+ if config.get('version', '1') == '1':
+ config = convert_old(config)
+ if not isinstance(config, Config):
+ config = Config(**config)
+ if not config.general.dir_path:
+ config.general.dir_path = os.path.dirname(path)
+ sim = Simulation(config=config)
yield sim
def from_config(conf_or_path):
- config = list(serialization.load_config(conf_or_path))
- if len(config) > 1:
+ lst = list(all_from_config(conf_or_path))
+ if len(lst) > 1:
raise AttributeError('Provide only one configuration')
- config = config[0][0]
- sim = Simulation(**config)
- return sim
+ return lst[0]
def from_old_config(conf_or_path):
config = list(serialization.load_config(conf_or_path))
@@ -206,13 +219,7 @@ def from_old_config(conf_or_path):
def run_from_config(*configs, **kwargs):
- for config_def in configs:
- # logger.info("Found {} config(s)".format(len(ls)))
- for config, path in serialization.load_config(config_def):
- name = config.general.id
- logger.info("Using config(s): {name}".format(name=name))
-
- dir_path = config.general.dir_path or os.path.dirname(path)
- sim = Simulation(dir_path=dir_path,
- **config)
- sim.run_simulation(**kwargs)
+ for sim in all_from_config(configs):
+ name = config.general.id
+ logger.info("Using config(s): {name}".format(name=name))
+ sim.run_simulation(**kwargs)
diff --git a/soil/time.py b/soil/time.py
index 90ec513..b74ef82 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -3,7 +3,7 @@ from queue import Empty
from heapq import heappush, heappop
import math
from .utils import logger
-from mesa import Agent
+from mesa import Agent as MesaAgent
INFINITY = float('inf')
@@ -41,7 +41,7 @@ class TimedActivation(BaseScheduler):
self._queue = []
self.next_time = 0
- def add(self, agent: Agent):
+ def add(self, agent: MesaAgent):
if agent.unique_id not in self._agents:
heappush(self._queue, (self.time, agent.unique_id))
super().add(agent)
diff --git a/tests/test_config.py b/tests/test_config.py
index 359e8ad..f4ad32e 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -2,7 +2,7 @@ from unittest import TestCase
import os
from os.path import join
-from soil import serialization, config
+from soil import simulation, serialization, config, network
ROOT = os.path.abspath(os.path.dirname(__file__))
EXAMPLES = join(ROOT, '..', 'examples')
@@ -13,18 +13,58 @@ FORCE_TESTS = os.environ.get('FORCE_TESTS', '')
class TestConfig(TestCase):
def test_conversion(self):
- new = serialization.load_file(join(EXAMPLES, "complete.yml"))[0]
+ new = serialization.load_file(join(ROOT, "complete_converted.yml"))[0]
old = serialization.load_file(join(ROOT, "old_complete.yml"))[0]
- converted = config.convert_old(old).dict(skip_defaults=True)
- for (k, v) in new.items():
- assert v == converted[k]
+ converted_defaults = config.convert_old(old, strict=False)
+ converted = converted_defaults.dict(skip_defaults=True)
+ def isequal(old, new):
+ if isinstance(old, dict):
+ for (k, v) in old.items():
+ isequal(old[k], new[k])
+ return
+ assert old == new
+
+ isequal(new, converted)
+
+ def test_topology_config(self):
+ netconfig = config.NetConfig(**{
+ 'path': join(ROOT, 'test.gexf')
+ })
+ net = network.from_config(netconfig, dir_path=ROOT)
+ assert len(net.nodes) == 2
+ assert len(net.edges) == 1
+
+ def test_env_from_config(self):
+ """
+ Simple configuration that tests that the graph is loaded, and that
+ network agents are initialized properly.
+ """
+ config = {
+ 'name': 'CounterAgent',
+ 'network_params': {
+ 'path': join(ROOT, 'test.gexf')
+ },
+ 'agent_type': 'CounterModel',
+ # 'states': [{'times': 10}, {'times': 20}],
+ 'max_time': 2,
+ 'dry_run': True,
+ 'num_trials': 1,
+ 'environment_params': {
+ }
+ }
+ s = simulation.from_old_config(config)
+ env = s.get_env()
+ assert len(env.topologies['default'].nodes) == 2
+ assert len(env.topologies['default'].edges) == 1
+ assert len(env.agents) == 2
+ assert env.agents[0].topology == env.topologies['default']
def make_example_test(path, cfg):
def wrapped(self):
root = os.getcwd()
- s = config.Config(**cfg)
- import pdb;pdb.set_trace()
+ print(path)
+ s = simulation.from_config(cfg)
# for s in simulation.all_from_config(path):
# iterations = s.config.max_time * s.config.num_trials
# if iterations > 1000:
diff --git a/tests/test_exporters.py b/tests/test_exporters.py
index 790eaa8..79ffe25 100644
--- a/tests/test_exporters.py
+++ b/tests/test_exporters.py
@@ -18,17 +18,17 @@ class Dummy(exporters.Exporter):
called_trial = 0
called_end = 0
- def start(self):
+ def sim_start(self):
self.__class__.called_start += 1
self.__class__.started = True
- def trial(self, env, stats):
+ def trial_end(self, env, stats):
assert env
self.__class__.trials += 1
self.__class__.total_time += env.now
self.__class__.called_trial += 1
- def end(self, stats):
+ def sim_end(self, stats):
self.__class__.ended = True
self.__class__.called_end += 1
diff --git a/tests/test_main.py b/tests/test_main.py
index 2e89a2d..f63128e 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -9,7 +9,7 @@ import networkx as nx
from functools import partial
from os.path import join
-from soil import (simulation, Environment, agents, serialization,
+from soil import (simulation, Environment, agents, network, serialization,
utils)
from soil.time import Delta
@@ -17,7 +17,7 @@ ROOT = os.path.abspath(os.path.dirname(__file__))
EXAMPLES = join(ROOT, '..', 'examples')
-class CustomAgent(agents.FSM):
+class CustomAgent(agents.FSM, agents.NetworkAgent):
@agents.default_state
@agents.state
def normal(self):
@@ -39,7 +39,7 @@ class TestMain(TestCase):
'path': join(ROOT, 'test.gexf')
}
}
- G = serialization.load_network(config['network_params'])
+ G = network.from_config(config['network_params'])
assert G
assert len(G) == 2
with self.assertRaises(AttributeError):
@@ -48,7 +48,7 @@ class TestMain(TestCase):
'path': join(ROOT, 'unknown.extension')
}
}
- G = serialization.load_network(config['network_params'])
+ G = network.from_config(config['network_params'])
print(G)
def test_generate_barabasi(self):
@@ -56,16 +56,16 @@ class TestMain(TestCase):
If no path is given, a generator and network parameters
should be used to generate a network
"""
- config = {
- 'network_params': {
+ cfg = {
+ 'params': {
'generator': 'barabasi_albert_graph'
}
}
- with self.assertRaises(TypeError):
- G = serialization.load_network(config['network_params'])
- config['network_params']['n'] = 100
- config['network_params']['m'] = 10
- G = serialization.load_network(config['network_params'])
+ with self.assertRaises(Exception):
+ G = network.from_config(cfg)
+ cfg['params']['n'] = 100
+ cfg['params']['m'] = 10
+ G = network.from_config(cfg)
assert len(G) == 100
def test_empty_simulation(self):
@@ -103,28 +103,43 @@ class TestMain(TestCase):
}
}
s = simulation.from_old_config(config)
+
def test_counter_agent(self):
"""
The initial states should be applied to the agent and the
agent should be able to update its state."""
config = {
- 'name': 'CounterAgent',
- 'network_params': {
- 'path': join(ROOT, 'test.gexf')
+ 'version': '2',
+ 'general': {
+ 'name': 'CounterAgent',
+ 'max_time': 2,
+ 'dry_run': True,
+ 'num_trials': 1,
},
- 'agent_type': 'CounterModel',
- 'states': [{'times': 10}, {'times': 20}],
- 'max_time': 2,
- 'num_trials': 1,
- 'environment_params': {
+ 'topologies': {
+ 'default': {
+ 'path': join(ROOT, 'test.gexf')
+ }
+ },
+ 'agents': {
+ 'default': {
+ 'agent_class': 'CounterModel',
+ },
+ 'counters': {
+ 'topology': 'default',
+ 'fixed': [{'state': {'times': 10}}, {'state': {'times': 20}}],
+ }
}
}
- s = simulation.from_old_config(config)
- env = s.run_simulation(dry_run=True)[0]
- assert env.get_agent(0)['times', 0] == 11
- assert env.get_agent(0)['times', 1] == 12
- assert env.get_agent(1)['times', 0] == 21
- assert env.get_agent(1)['times', 1] == 22
+ s = simulation.from_config(config)
+ env = s.get_env()
+ assert isinstance(env.agents[0], agents.CounterModel)
+ assert env.agents[0].topology == env.topologies['default']
+ assert env.agents[0]['times'] == 10
+ assert env.agents[0]['times'] == 10
+ env.step()
+ assert env.agents[0]['times'] == 11
+ assert env.agents[1]['times'] == 21
def test_custom_agent(self):
"""Allow for search of neighbors with a certain state_id"""
@@ -143,9 +158,9 @@ class TestMain(TestCase):
}
s = simulation.from_old_config(config)
env = s.run_simulation(dry_run=True)[0]
- assert env.get_agent(1).count_agents(state_id='normal') == 2
- assert env.get_agent(1).count_agents(state_id='normal', limit_neighbors=True) == 1
- assert env.get_agent(0).neighbors == 1
+ assert env.agents[1].count_agents(state_id='normal') == 2
+ assert env.agents[1].count_agents(state_id='normal', limit_neighbors=True) == 1
+ assert env.agents[0].neighbors == 1
def test_torvalds_example(self):
"""A complete example from a documentation should work."""
@@ -180,11 +195,9 @@ class TestMain(TestCase):
config = serialization.load_file(join(EXAMPLES, 'complete.yml'))[0]
s = simulation.from_old_config(config)
with utils.timer('serializing'):
- serial = s.config.to_yaml()
+ serial = s.to_yaml()
with utils.timer('recovering'):
recovered = yaml.load(serial, Loader=yaml.SafeLoader)
- with utils.timer('deleting'):
- del recovered['topology']
for (k, v) in config.items():
assert recovered[k] == v
# assert config == recovered
From 3dc56892c105b1402a42c5cd919d106ecbdc45a2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Thu, 15 Sep 2022 19:27:17 +0200
Subject: [PATCH 05/39] WIP: working config
---
examples/complete.yml | 12 ++-
soil/agents/__init__.py | 189 ++++++++++++++++++++++-------------
soil/config.py | 43 +++++---
soil/environment.py | 2 +-
soil/network.py | 42 ++++++++
soil/simulation.py | 2 +-
tests/complete_converted.yml | 49 +++++++++
tests/old_complete.yml | 4 +-
tests/test_config.py | 35 +++++--
tests/test_examples.py | 6 +-
10 files changed, 284 insertions(+), 100 deletions(-)
create mode 100644 soil/network.py
create mode 100644 tests/complete_converted.yml
diff --git a/examples/complete.yml b/examples/complete.yml
index f017075..adf1e7e 100644
--- a/examples/complete.yml
+++ b/examples/complete.yml
@@ -22,7 +22,7 @@ environment:
params:
am_i_complete: true
agents:
-# Agents are split into groups, each with its own definition
+# Agents are split several groups, each with its own definition
default: # This is a special group. Its values will be used as default values for the rest of the groups
agent_class: CounterModel
topology: default
@@ -31,7 +31,7 @@ agents:
environment:
# In this group we are not specifying any topology
fixed:
- - agent_id: 'Environment Agent 1'
+ - name: 'Environment Agent 1'
agent_class: CounterModel
state:
times: 10
@@ -41,10 +41,16 @@ agents:
- agent_class: CounterModel
weight: 1
state:
- id: 0
times: 3
- agent_class: AggregatedCounter
weight: 0.2
+ override:
+ - filter:
+ agent_class: AggregatedCounter
+ n: 2
+ state:
+ times: 5
+
other_counters:
topology: another_graph
fixed:
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index 1b9b714..3b585f1 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -1,6 +1,7 @@
import logging
from collections import OrderedDict, defaultdict
-from collections.abc import Mapping, Set
+from collections.abc import MutableMapping, Mapping, Set
+from abc import ABCMeta
from copy import deepcopy
from functools import partial, wraps
from itertools import islice, chain
@@ -10,6 +11,8 @@ import networkx as nx
from mesa import Agent as MesaAgent
from typing import Dict, List
+from random import shuffle
+
from .. import serialization, utils, time, config
@@ -25,7 +28,7 @@ IGNORED_FIELDS = ('model', 'logger')
class DeadAgent(Exception):
pass
-class BaseAgent(MesaAgent):
+class BaseAgent(MesaAgent, MutableMapping):
"""
A special type of Mesa Agent that:
@@ -50,8 +53,10 @@ class BaseAgent(MesaAgent):
# Initialize agent parameters
if isinstance(unique_id, MesaAgent):
raise Exception()
+ assert isinstance(unique_id, int)
super().__init__(unique_id=unique_id, model=model)
- self.name = name or '{}[{}]'.format(type(self).__name__, self.unique_id)
+ self.name = str(name) if name else'{}[{}]'.format(type(self).__name__, self.unique_id)
+
self._neighbors = None
self.alive = True
@@ -120,6 +125,12 @@ class BaseAgent(MesaAgent):
def __setitem__(self, key, value):
setattr(self, key, value)
+ def __len__(self):
+ return sum(1 for n in self.keys())
+
+ def __iter__(self):
+ return self.items()
+
def keys(self):
return (k for k in self.__dict__ if k[0] != '_')
@@ -284,7 +295,7 @@ def default_state(func):
return func
-class MetaFSM(type):
+class MetaFSM(ABCMeta):
def __init__(cls, name, bases, nmspc):
super(MetaFSM, cls).__init__(name, bases, nmspc)
states = {}
@@ -486,14 +497,15 @@ def _definition_to_dict(definition, size=None, default_state=None):
distro = sorted([item for item in definition if 'weight' in item])
- ix = 0
+ id = 0
+
def init_agent(item, id=ix):
while id in agents:
id += 1
agent = remaining[id]
agent['state'].update(copy(item.get('state', {})))
- agents[id] = agent
+ agents[agent.unique_id] = agent
del remaining[id]
return agent
@@ -554,7 +566,7 @@ class AgentView(Mapping, Set):
return sum(len(x) for x in self._agents.values())
def __iter__(self):
- return iter(chain.from_iterable(g.values() for g in self._agents.values()))
+ yield from iter(chain.from_iterable(g.values() for g in self._agents.values()))
def __getitem__(self, agent_id):
if isinstance(agent_id, slice):
@@ -564,45 +576,11 @@ class AgentView(Mapping, Set):
return group[agent_id]
raise ValueError(f"Agent {agent_id} not found")
- def filter(self, ids=None, groups=None, state_id=None, agent_type=None, ignore=None, iterator=False, **kwargs):
-
- if state_id is not None and not isinstance(state_id, (tuple, list)):
- state_id = tuple([state_id])
-
- agents = self._agents
-
- if groups:
- agents = {(k,v) for (k, v) in agents.items() if k in groups}
-
- if agent_type is not None:
- try:
- agent_type = tuple(agent_type)
- except TypeError:
- agent_type = tuple([agent_type])
-
- if ids:
- agents = (v[aid] for v in agents.values() for aid in ids if aid in v)
- else:
- agents = (a for v in agents.values() for a in v.values())
-
- f = agents
- if ignore:
- f = filter(lambda x: x not in ignore, f)
-
- if state_id is not None:
- f = filter(lambda agent: agent.get('state_id', None) in state_id, f)
-
- if agent_type is not None:
- f = filter(lambda agent: isinstance(agent, agent_type), f)
- for k, v in kwargs.items():
- f = filter(lambda agent: agent.state.get(k, None) == v, f)
-
- if iterator:
- return f
- return list(f)
+ def filter(self, *group_ids, **kwargs):
+ yield from filter_groups(self._agents, group_ids=group_ids, **kwargs)
def __call__(self, *args, **kwargs):
- return self.filter(*args, **kwargs)
+ return list(self.filter(*args, **kwargs))
def __contains__(self, agent_id):
return any(agent_id in g for g in self._agents)
@@ -614,6 +592,57 @@ class AgentView(Mapping, Set):
return f"{self.__class__.__name__}({self})"
+def filter_groups(groups, group_ids=None, **kwargs):
+ assert isinstance(groups, dict)
+ if group_ids:
+ groups = list(groups[g] for g in group_ids if g in groups)
+ else:
+ groups = list(groups.values())
+
+ agents = chain.from_iterable(filter_group(g, **kwargs) for g in groups)
+
+ yield from agents
+
+
+def filter_group(group, ids=None, state_id=None, agent_type=None, ignore=None, state=None, **kwargs):
+ '''
+ Filter agents given as a dict, by the criteria given as arguments (e.g., certain type or state id).
+ '''
+ assert isinstance(group, dict)
+
+ if state_id is not None and not isinstance(state_id, (tuple, list)):
+ state_id = tuple([state_id])
+
+ if agent_type is not None:
+ try:
+ agent_type = tuple(agent_type)
+ except TypeError:
+ agent_type = tuple([agent_type])
+
+ if ids:
+ agents = (v[aid] for aid in ids if aid in group)
+ else:
+ agents = (a for a in group.values())
+
+ f = agents
+ if ignore:
+ f = filter(lambda x: x not in ignore, f)
+
+ if state_id is not None:
+ f = filter(lambda agent: agent.get('state_id', None) in state_id, f)
+
+ if agent_type is not None:
+ f = filter(lambda agent: isinstance(agent, agent_type), f)
+
+ state = state or dict()
+ state.update(kwargs)
+
+ for k, v in state.items():
+ f = filter(lambda agent: agent.state.get(k, None) == v, f)
+
+ yield from f
+
+
def from_config(cfg: Dict[str, config.AgentConfig], env):
'''
Agents are specified in groups.
@@ -632,10 +661,22 @@ def _group_from_config(cfg: config.AgentConfig, default: config.SingleAgentConfi
agents = _from_fixed(cfg.fixed, topology=cfg.topology, default=default, env=env)
if cfg.distribution:
n = cfg.n or len(env.topologies[cfg.topology])
- agents.update(_from_distro(cfg.distribution, n - len(agents),
+ target = n - len(agents)
+ agents.update(_from_distro(cfg.distribution, target,
topology=cfg.topology or default.topology,
default=default,
env=env))
+ assert len(agents) == n
+ if cfg.override:
+ for attrs in cfg.override:
+ if attrs.filter:
+ filtered = list(filter_group(agents, **attrs.filter))
+ else:
+ filtered = list(agents)
+
+ for agent in random.sample(filtered, attrs.n):
+ agent.state.update(attrs.state)
+
return agents
@@ -650,10 +691,11 @@ def _from_fixed(lst: List[config.FixedAgentConfig], topology: str, default: conf
cls = serialization.deserialize(fixed.agent_class or default.agent_class)
state = fixed.state.copy()
state.update(default.state)
- agents[agent_id] = cls(unique_id=agent_id,
- model=env,
- graph_name=fixed.topology or topology or default.topology,
- **state)
+ agent = cls(unique_id=agent_id,
+ model=env,
+ graph_name=fixed.topology or topology or default.topology,
+ **state)
+ agents[agent.unique_id] = agent
return agents
@@ -671,31 +713,40 @@ def _from_distro(distro: List[config.AgentDistro],
raise ValueError('You must provide a total number of agents, or the number of each type')
n = sum(dist.n for dist in distro)
+ weights = list(dist.weight if dist.weight is not None else 1 for dist in distro)
+ minw = min(weights)
+ norm = list(weight / minw for weight in weights)
+ total = sum(norm)
+ chunk = n // total
- total = sum((dist.weight if dist.weight is not None else 1) for dist in distro)
- thres = {}
- last = 0
- for i in sorted(distro, key=lambda x: x.weight):
+ # random.choices would be enough to get a weighted distribution. But it can vary a lot for smaller k
+ # So instead we calculate our own distribution to make sure the actual ratios are close to what we would expect
- cls = serialization.deserialize(i.agent_class or default.agent_class)
- thres[(last, last + i.weight/total)] = (cls, i)
+ # Calculate how many times each has to appear
+ indices = list(chain.from_iterable([idx] * int(n*chunk) for (idx, n) in enumerate(norm)))
- acc = 0
+ # Complete with random agents following the original weight distribution
+ if len(indices) < n:
+ indices += random.choices(list(range(len(distro))), weights=[d.weight for d in distro], k=n-len(indices))
- # using np.choice would be more efficient, but this allows us to use soil without
- # numpy
- for i in range(n):
- r = random.random()
- for (t, (cls, d)) in thres.items():
- if r >= t[0] and r <= t[1]:
- agent_id = d.agent_id
- if agent_id is None:
- agent_id = env.next_id()
+ # Deserialize classes for efficiency
+ classes = list(serialization.deserialize(i.agent_class or default.agent_class) for i in distro)
- state = d.state.copy()
- state.update(default.state)
- agents[agent_id] = cls(unique_id=agent_id, model=env, graph_name=d.topology or topology or default.topology, **state)
- break
+ # Add them in random order
+ random.shuffle(indices)
+
+
+ for idx in indices:
+ d = distro[idx]
+ cls = classes[idx]
+ agent_id = env.next_id()
+ state = d.state.copy()
+ state.update(default.state)
+ agent = cls(unique_id=agent_id, model=env, graph_name=d.topology or topology or default.topology, **state)
+ assert agent.name is not None
+ assert agent.name != 'None'
+ assert agent.name
+ agents[agent.unique_id] = agent
return agents
diff --git a/soil/config.py b/soil/config.py
index a47e5a2..eabb43f 100644
--- a/soil/config.py
+++ b/soil/config.py
@@ -76,8 +76,9 @@ class EnvConfig(BaseModel):
class SingleAgentConfig(BaseModel):
agent_class: Optional[Union[Type, str]] = None
- agent_id: Optional[Union[str, int]] = None
- topology: Optional[str] = None
+ agent_id: Optional[int] = None
+ topology: Optional[str] = 'default'
+ name: Optional[str] = None
state: Optional[Dict[str, Any]] = {}
class FixedAgentConfig(SingleAgentConfig):
@@ -85,11 +86,16 @@ class FixedAgentConfig(SingleAgentConfig):
@root_validator
def validate_all(cls, values):
- if 'agent_id' in values and values.get('n', 1) > 1:
- raise ValueError("An agent_id can only be provided when there is only one agent")
+ if values.get('agent_id', None) is not None and values.get('n', 1) > 1:
+ print(values)
+ raise ValueError(f"An agent_id can only be provided when there is only one agent ({values.get('n')} given)")
return values
+class OverrideAgentConfig(FixedAgentConfig):
+ filter: Optional[Dict[str, Any]] = None
+
+
class AgentDistro(SingleAgentConfig):
weight: Optional[float] = 1
@@ -99,6 +105,7 @@ class AgentConfig(SingleAgentConfig):
topology: Optional[str] = None
distribution: Optional[List[AgentDistro]] = None
fixed: Optional[List[FixedAgentConfig]] = None
+ override: Optional[List[OverrideAgentConfig]] = None
@staticmethod
def default():
@@ -118,7 +125,6 @@ class Config(BaseModel, extra=Extra.forbid):
environment: EnvConfig = EnvConfig.default()
agents: Optional[Dict[str, AgentConfig]] = {}
-
def convert_old(old, strict=True):
'''
Try to convert old style configs into the new format.
@@ -126,10 +132,6 @@ def convert_old(old, strict=True):
This is still a work in progress and might not work in many cases.
'''
- # TODO: translate states
-
- if strict and old.get('states', {}):
- raise ValueError('Custom (i.e., manual) agent states cannot be translated to v2 configuration files. Please, convert your configuration file to the new format.')
new = {}
@@ -181,13 +183,16 @@ def convert_old(old, strict=True):
for agent in old.get('environment_agents', []):
agents['environment'] = {'distribution': [], 'fixed': []}
- if 'agent_id' not in agent:
- agents['environment']['distribution'].append(updated_agent(agent))
- else:
+ if 'agent_id' in agent:
+ agent['name'] = agent['agent_id']
+ del agent['agent_id']
agents['environment']['fixed'].append(updated_agent(agent))
+ else:
+ agents['environment']['distribution'].append(updated_agent(agent))
by_weight = []
fixed = []
+ override = []
if 'network_agents' in old:
agents['network']['topology'] = 'default'
@@ -203,6 +208,20 @@ def convert_old(old, strict=True):
agents['network']['topology'] = 'default'
by_weight = [{'agent_type': old['agent_type']}]
+
+ # TODO: translate states
+ if 'states' in old:
+ states = old['states']
+ if isinstance(states, dict):
+ states = states.items()
+ else:
+ states = enumerate(states)
+ for (k, v) in states:
+ override.append({'filter': {'id': k},
+ 'state': v
+ })
+
+ agents['network']['override'] = override
agents['network']['fixed'] = fixed
agents['network']['distribution'] = by_weight
diff --git a/soil/environment.py b/soil/environment.py
index f95b901..ddb46cb 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -79,7 +79,7 @@ class Environment(Model):
@property
def network_agents(self):
- yield from self.agents(agent_type=agents.NetworkAgent, iterator=True)
+ yield from self.agents(agent_type=agents.NetworkAgent, iterator=False)
@staticmethod
diff --git a/soil/network.py b/soil/network.py
new file mode 100644
index 0000000..0eb3688
--- /dev/null
+++ b/soil/network.py
@@ -0,0 +1,42 @@
+from typing import Dict
+import os
+import sys
+
+import networkx as nx
+
+from . import config, serialization, basestring
+
+def from_config(cfg: config.NetConfig, dir_path: str = None):
+ if not isinstance(cfg, config.NetConfig):
+ cfg = config.NetConfig(**cfg)
+
+ if cfg.path:
+ path = cfg.path
+ if dir_path and not os.path.isabs(path):
+ path = os.path.join(dir_path, path)
+ extension = os.path.splitext(path)[1][1:]
+ kwargs = {}
+ if extension == 'gexf':
+ kwargs['version'] = '1.2draft'
+ kwargs['node_type'] = int
+ try:
+ method = getattr(nx.readwrite, 'read_' + extension)
+ except AttributeError:
+ raise AttributeError('Unknown format')
+ return method(path, **kwargs)
+
+ if cfg.params:
+ net_args = cfg.params.dict()
+ net_gen = net_args.pop('generator')
+
+ if dir_path not in sys.path:
+ sys.path.append(dir_path)
+
+ method = serialization.deserializer(net_gen,
+ known_modules=['networkx.generators',])
+ return method(**net_args)
+
+ if isinstance(cfg.topology, basestring) or isinstance(cfg.topology, dict):
+ return nx.json_graph.node_link_graph(cfg.topology)
+
+ return nx.Graph()
diff --git a/soil/simulation.py b/soil/simulation.py
index 3826459..0892731 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -42,7 +42,6 @@ class Simulation:
config = Config(**cfg)
if not config:
raise ValueError("You need to specify a simulation configuration")
-
self.config = config
@@ -151,6 +150,7 @@ class Simulation:
# 'environment_agents': self.environment_agents,
# })
# opts.update(kwargs)
+ print(self.config)
env = Environment.from_config(self.config, trial_id=trial_id, **kwargs)
return env
diff --git a/tests/complete_converted.yml b/tests/complete_converted.yml
new file mode 100644
index 0000000..ffb5a16
--- /dev/null
+++ b/tests/complete_converted.yml
@@ -0,0 +1,49 @@
+---
+version: '2'
+general:
+ id: simple
+ group: tests
+ dir_path: "/tmp/"
+ num_trials: 3
+ max_time: 100
+ interval: 1
+ seed: "CompleteSeed!"
+topologies:
+ default:
+ params:
+ generator: complete_graph
+ n: 10
+agents:
+ default:
+ agent_class: CounterModel
+ state:
+ times: 1
+ network:
+ topology: 'default'
+ distribution:
+ - agent_class: CounterModel
+ weight: 0.4
+ state:
+ state_id: 0
+ - agent_class: AggregatedCounter
+ weight: 0.6
+ override:
+ - filter:
+ id: 0
+ state:
+ name: 'The first node'
+ - filter:
+ id: 1
+ state:
+ name: 'The second node'
+
+ environment:
+ fixed:
+ - name: 'Environment Agent 1'
+ agent_class: CounterModel
+ state:
+ times: 10
+environment:
+ environment_class: Environment
+ params:
+ am_i_complete: true
diff --git a/tests/old_complete.yml b/tests/old_complete.yml
index 4382935..8609eb9 100644
--- a/tests/old_complete.yml
+++ b/tests/old_complete.yml
@@ -11,11 +11,11 @@ network_params:
n: 10
network_agents:
- agent_type: CounterModel
- weight: 1
+ weight: 0.4
state:
state_id: 0
- agent_type: AggregatedCounter
- weight: 0.2
+ weight: 0.6
environment_agents:
- agent_id: 'Environment Agent 1'
agent_type: CounterModel
diff --git a/tests/test_config.py b/tests/test_config.py
index f4ad32e..7cba6af 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -2,7 +2,7 @@ from unittest import TestCase
import os
from os.path import join
-from soil import simulation, serialization, config, network
+from soil import simulation, serialization, config, network, agents
ROOT = os.path.abspath(os.path.dirname(__file__))
EXAMPLES = join(ROOT, '..', 'examples')
@@ -13,18 +13,22 @@ FORCE_TESTS = os.environ.get('FORCE_TESTS', '')
class TestConfig(TestCase):
def test_conversion(self):
- new = serialization.load_file(join(ROOT, "complete_converted.yml"))[0]
+ expected = serialization.load_file(join(ROOT, "complete_converted.yml"))[0]
old = serialization.load_file(join(ROOT, "old_complete.yml"))[0]
converted_defaults = config.convert_old(old, strict=False)
converted = converted_defaults.dict(skip_defaults=True)
- def isequal(old, new):
- if isinstance(old, dict):
- for (k, v) in old.items():
- isequal(old[k], new[k])
- return
- assert old == new
- isequal(new, converted)
+ def isequal(a, b):
+ if isinstance(a, dict):
+ for (k, v) in a.items():
+ if v:
+ isequal(a[k], b[k])
+ else:
+ assert not b.get(k, None)
+ return
+ assert a == b
+
+ isequal(converted, expected)
def test_topology_config(self):
netconfig = config.NetConfig(**{
@@ -60,6 +64,19 @@ class TestConfig(TestCase):
assert env.agents[0].topology == env.topologies['default']
+ def test_agents_from_config(self):
+ '''We test that the known complete configuration produces
+ the right agents in the right groups'''
+ cfg = serialization.load_file(join(ROOT, "complete_converted.yml"))[0]
+ s = simulation.from_config(cfg)
+ env = s.get_env()
+ assert len(env.topologies['default'].nodes) == 10
+ assert len(env.agents('network')) == 10
+ assert len(env.agents('environment')) == 1
+
+ assert sum(1 for a in env.agents('network') if isinstance(a, agents.CounterModel)) == 4
+ assert sum(1 for a in env.agents('network') if isinstance(a, agents.AggregatedCounter)) == 6
+
def make_example_test(path, cfg):
def wrapped(self):
root = os.getcwd()
diff --git a/tests/test_examples.py b/tests/test_examples.py
index a516c27..1cc4cca 100644
--- a/tests/test_examples.py
+++ b/tests/test_examples.py
@@ -18,10 +18,10 @@ def make_example_test(path, config):
def wrapped(self):
root = os.getcwd()
for s in simulation.all_from_config(path):
- iterations = s.config.max_time * s.config.num_trials
+ iterations = s.config.general.max_time * s.config.general.num_trials
if iterations > 1000:
- s.config.max_time = 100
- s.config.num_trials = 1
+ s.config.general.max_time = 100
+ s.config.general.num_trials = 1
if config.get('skip_test', False) and not FORCE_TESTS:
self.skipTest('Example ignored.')
envs = s.run_simulation(dry_run=True)
From 0a9c6d8b190a1c4bb4a114265226c31b2f5abee4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Fri, 16 Sep 2022 18:13:39 +0200
Subject: [PATCH 06/39] WIP: removed stats
---
examples/mesa/mesa.yml | 1 -
examples/mesa/social_wealth.py | 5 +-
examples/newsspread/newsspread.py | 4 +-
examples/pubcrawl/pubcrawl.py | 6 +-
examples/rabbits/rabbit_agents.py | 8 +-
soil/agents/__init__.py | 155 +++++++++++-------
soil/config.py | 19 ++-
soil/config_old.py | 264 ------------------------------
soil/environment.py | 92 +++++++----
soil/exporters.py | 49 +++---
soil/simulation.py | 35 +---
soil/stats.py | 111 -------------
tests/complete_converted.yml | 4 +-
tests/test_config.py | 8 +-
tests/test_exporters.py | 7 +-
tests/test_main.py | 11 +-
tests/test_stats.py | 34 ----
17 files changed, 224 insertions(+), 589 deletions(-)
delete mode 100644 soil/config_old.py
delete mode 100644 soil/stats.py
delete mode 100644 tests/test_stats.py
diff --git a/examples/mesa/mesa.yml b/examples/mesa/mesa.yml
index 01096eb..19148a2 100644
--- a/examples/mesa/mesa.yml
+++ b/examples/mesa/mesa.yml
@@ -14,7 +14,6 @@ network_agents:
weight: 1
environment_class: social_wealth.MoneyEnv
environment_params:
- num_mesa_agents: 5
mesa_agent_type: social_wealth.MoneyAgent
N: 10
width: 50
diff --git a/examples/mesa/social_wealth.py b/examples/mesa/social_wealth.py
index 3398884..5f7590b 100644
--- a/examples/mesa/social_wealth.py
+++ b/examples/mesa/social_wealth.py
@@ -71,10 +71,9 @@ class SocialMoneyAgent(NetworkAgent, MoneyAgent):
class MoneyEnv(Environment):
"""A model with some number of agents."""
- def __init__(self, N, width, height, *args, network_params, **kwargs):
+ def __init__(self, width, height, *args, topologies, **kwargs):
- network_params['n'] = N
- super().__init__(*args, network_params=network_params, **kwargs)
+ super().__init__(*args, topologies=topologies, **kwargs)
self.grid = MultiGrid(width, height, False)
# Create agents
diff --git a/examples/newsspread/newsspread.py b/examples/newsspread/newsspread.py
index dc77f09..c3b5e6b 100644
--- a/examples/newsspread/newsspread.py
+++ b/examples/newsspread/newsspread.py
@@ -1,8 +1,8 @@
-from soil.agents import FSM, state, default_state, prob
+from soil.agents import FSM, NetworkAgent, state, default_state, prob
import logging
-class DumbViewer(FSM):
+class DumbViewer(FSM, NetworkAgent):
'''
A viewer that gets infected via TV (if it has one) and tries to infect
its neighbors once it's infected.
diff --git a/examples/pubcrawl/pubcrawl.py b/examples/pubcrawl/pubcrawl.py
index 6c8d632..e6c92bd 100644
--- a/examples/pubcrawl/pubcrawl.py
+++ b/examples/pubcrawl/pubcrawl.py
@@ -1,4 +1,4 @@
-from soil.agents import FSM, state, default_state
+from soil.agents import FSM, NetworkAgent, state, default_state
from soil import Environment
from random import random, shuffle
from itertools import islice
@@ -53,7 +53,7 @@ class CityPubs(Environment):
pub['occupancy'] -= 1
-class Patron(FSM):
+class Patron(FSM, NetworkAgent):
'''Agent that looks for friends to drink with. It will do three things:
1) Look for other patrons to drink with
2) Look for a bar where the agent and other agents in the same group can get in.
@@ -151,7 +151,7 @@ class Patron(FSM):
return befriended
-class Police(FSM):
+class Police(FSM, NetworkAgent):
'''Simple agent to take drunk people out of pubs.'''
level = logging.INFO
diff --git a/examples/rabbits/rabbit_agents.py b/examples/rabbits/rabbit_agents.py
index a8e6028..a70b21a 100644
--- a/examples/rabbits/rabbit_agents.py
+++ b/examples/rabbits/rabbit_agents.py
@@ -10,7 +10,7 @@ class Genders(Enum):
female = 'female'
-class RabbitModel(FSM):
+class RabbitModel(FSM, NetworkAgent):
defaults = {
'age': 0,
@@ -110,12 +110,12 @@ class Female(RabbitModel):
self.info('A mother has died carrying a baby!!')
-class RandomAccident(NetworkAgent):
+class RandomAccident(BaseAgent):
level = logging.DEBUG
def step(self):
- rabbits_total = self.topology.number_of_nodes()
+ rabbits_total = self.env.topology.number_of_nodes()
if 'rabbits_alive' not in self.env:
self.env['rabbits_alive'] = 0
rabbits_alive = self.env.get('rabbits_alive', rabbits_total)
@@ -131,5 +131,5 @@ class RandomAccident(NetworkAgent):
self.log('Rabbits alive: {}'.format(self.env['rabbits_alive']))
i.set_state(i.dead)
self.log('Rabbits alive: {}/{}'.format(rabbits_alive, rabbits_total))
- if self.count_agents(state_id=RabbitModel.dead.id) == self.topology.number_of_nodes():
+ if self.env.count_agents(state_id=RabbitModel.dead.id) == self.env.topology.number_of_nodes():
self.die()
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index 3b585f1..28cfbfe 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -55,6 +55,7 @@ class BaseAgent(MesaAgent, MutableMapping):
raise Exception()
assert isinstance(unique_id, int)
super().__init__(unique_id=unique_id, model=model)
+
self.name = str(name) if name else'{}[{}]'.format(type(self).__name__, self.unique_id)
@@ -78,6 +79,9 @@ class BaseAgent(MesaAgent, MutableMapping):
if not hasattr(self, k) or getattr(self, k) is None:
setattr(self, k, v)
+ def __hash__(self):
+ return hash(self.unique_id)
+
# TODO: refactor to clean up mesa compatibility
@property
def id(self):
@@ -185,16 +189,14 @@ class BaseAgent(MesaAgent, MutableMapping):
# Agent = BaseAgent
class NetworkAgent(BaseAgent):
- def __init__(self,
- *args,
- graph_name: str,
- node_id: int = None,
- **kwargs,
- ):
- super().__init__(*args, **kwargs)
- self.graph_name = graph_name
- self.topology = self.env.topologies[self.graph_name]
- self.node_id = node_id
+
+ @property
+ def topology(self):
+ return self.env.topology_for(self.unique_id)
+
+ @property
+ def node_id(self):
+ return self.env.node_id_for(self.unique_id)
@property
def G(self):
@@ -215,15 +217,19 @@ class NetworkAgent(BaseAgent):
it = islice(it, limit)
return list(it)
- def iter_agents(self, agents=None, limit_neighbors=False, **kwargs):
+ def iter_agents(self, unique_id=None, limit_neighbors=False, **kwargs):
if limit_neighbors:
- agents = self.topology.neighbors(self.unique_id)
+ unique_id = [self.topology.nodes[node]['agent_id'] for node in self.topology.neighbors(self.node_id)]
+ if not unique_id:
+ return
+
+ yield from self.model.agents(unique_id=unique_id, **kwargs)
- return self.model.agents(ids=agents, **kwargs)
def subgraph(self, center=True, **kwargs):
include = [self] if center else []
- return self.topology.subgraph(n.unique_id for n in list(self.get_agents(**kwargs))+include)
+ G = self.topology.subgraph(n.node_id for n in list(self.get_agents(**kwargs)+include))
+ return G
def remove_node(self, unique_id):
self.topology.remove_node(unique_id)
@@ -366,7 +372,7 @@ def prob(prob=1):
def calculate_distribution(network_agents=None,
- agent_type=None):
+ agent_class=None):
'''
Calculate the threshold values (thresholds for a uniform distribution)
of an agent distribution given the weights of each agent type.
@@ -374,13 +380,13 @@ def calculate_distribution(network_agents=None,
The input has this form: ::
[
- {'agent_type': 'agent_type_1',
+ {'agent_class': 'agent_class_1',
'weight': 0.2,
'state': {
'id': 0
}
},
- {'agent_type': 'agent_type_2',
+ {'agent_class': 'agent_class_2',
'weight': 0.8,
'state': {
'id': 1
@@ -389,12 +395,12 @@ def calculate_distribution(network_agents=None,
]
In this example, 20% of the nodes will be marked as type
- 'agent_type_1'.
+ 'agent_class_1'.
'''
if network_agents:
network_agents = [deepcopy(agent) for agent in network_agents if not hasattr(agent, 'id')]
- elif agent_type:
- network_agents = [{'agent_type': agent_type}]
+ elif agent_class:
+ network_agents = [{'agent_class': agent_class}]
else:
raise ValueError('Specify a distribution or a default agent type')
@@ -414,11 +420,11 @@ def calculate_distribution(network_agents=None,
return network_agents
-def serialize_type(agent_type, known_modules=[], **kwargs):
- if isinstance(agent_type, str):
- return agent_type
+def serialize_type(agent_class, known_modules=[], **kwargs):
+ if isinstance(agent_class, str):
+ return agent_class
known_modules += ['soil.agents']
- return serialization.serialize(agent_type, known_modules=known_modules, **kwargs)[1] # Get the name of the class
+ return serialization.serialize(agent_class, known_modules=known_modules, **kwargs)[1] # Get the name of the class
def serialize_definition(network_agents, known_modules=[]):
@@ -430,23 +436,23 @@ def serialize_definition(network_agents, known_modules=[]):
for v in d:
if 'threshold' in v:
del v['threshold']
- v['agent_type'] = serialize_type(v['agent_type'],
+ v['agent_class'] = serialize_type(v['agent_class'],
known_modules=known_modules)
return d
-def deserialize_type(agent_type, known_modules=[]):
- if not isinstance(agent_type, str):
- return agent_type
+def deserialize_type(agent_class, known_modules=[]):
+ if not isinstance(agent_class, str):
+ return agent_class
known = known_modules + ['soil.agents', 'soil.agents.custom' ]
- agent_type = serialization.deserializer(agent_type, known_modules=known)
- return agent_type
+ agent_class = serialization.deserializer(agent_class, known_modules=known)
+ return agent_class
def deserialize_definition(ind, **kwargs):
d = deepcopy(ind)
for v in d:
- v['agent_type'] = deserialize_type(v['agent_type'], **kwargs)
+ v['agent_class'] = deserialize_type(v['agent_class'], **kwargs)
return d
@@ -461,7 +467,7 @@ def _validate_states(states, topology):
return states
-def _convert_agent_types(ind, to_string=False, **kwargs):
+def _convert_agent_classs(ind, to_string=False, **kwargs):
'''Convenience method to allow specifying agents by class or class name.'''
if to_string:
return serialize_definition(ind, **kwargs)
@@ -480,7 +486,7 @@ def _agent_from_definition(definition, value=-1, unique_id=None):
state = {}
if 'state' in d:
state = deepcopy(d['state'])
- return d['agent_type'], state
+ return d['agent_class'], state
raise Exception('Definition for value {} not found in: {}'.format(value, definition))
@@ -576,8 +582,11 @@ class AgentView(Mapping, Set):
return group[agent_id]
raise ValueError(f"Agent {agent_id} not found")
- def filter(self, *group_ids, **kwargs):
- yield from filter_groups(self._agents, group_ids=group_ids, **kwargs)
+ def filter(self, *args, **kwargs):
+ yield from filter_groups(self._agents, *args, **kwargs)
+
+ def one(self, *args, **kwargs):
+ return next(filter_groups(self._agents, *args, **kwargs))
def __call__(self, *args, **kwargs):
return list(self.filter(*args, **kwargs))
@@ -586,41 +595,57 @@ class AgentView(Mapping, Set):
return any(agent_id in g for g in self._agents)
def __str__(self):
- return str(list(a.id for a in self))
+ return str(list(a.unique_id for a in self))
def __repr__(self):
return f"{self.__class__.__name__}({self})"
-def filter_groups(groups, group_ids=None, **kwargs):
+def filter_groups(groups, *, group=None, **kwargs):
assert isinstance(groups, dict)
- if group_ids:
- groups = list(groups[g] for g in group_ids if g in groups)
+
+ if group is not None and not isinstance(group, list):
+ group = [group]
+
+ if group:
+ groups = list(groups[g] for g in group if g in groups)
else:
groups = list(groups.values())
-
+
agents = chain.from_iterable(filter_group(g, **kwargs) for g in groups)
yield from agents
-def filter_group(group, ids=None, state_id=None, agent_type=None, ignore=None, state=None, **kwargs):
+def filter_group(group, *id_args, unique_id=None, state_id=None, agent_class=None, ignore=None, state=None, **kwargs):
'''
Filter agents given as a dict, by the criteria given as arguments (e.g., certain type or state id).
'''
assert isinstance(group, dict)
+ ids = []
+
+ if unique_id is not None:
+ if isinstance(unique_id, list):
+ ids += unique_id
+ else:
+ ids.append(unique_id)
+
+ if id_args:
+ ids += id_args
+
if state_id is not None and not isinstance(state_id, (tuple, list)):
state_id = tuple([state_id])
- if agent_type is not None:
+ if agent_class is not None:
+ agent_class = deserialize_type(agent_class)
try:
- agent_type = tuple(agent_type)
+ agent_class = tuple(agent_class)
except TypeError:
- agent_type = tuple([agent_type])
+ agent_class = tuple([agent_class])
if ids:
- agents = (v[aid] for aid in ids if aid in group)
+ agents = (group[aid] for aid in ids if aid in group)
else:
agents = (a for a in group.values())
@@ -631,8 +656,8 @@ def filter_group(group, ids=None, state_id=None, agent_type=None, ignore=None, s
if state_id is not None:
f = filter(lambda agent: agent.get('state_id', None) in state_id, f)
- if agent_type is not None:
- f = filter(lambda agent: isinstance(agent, agent_type), f)
+ if agent_class is not None:
+ f = filter(lambda agent: isinstance(agent, agent_class), f)
state = state or dict()
state.update(kwargs)
@@ -660,7 +685,7 @@ def _group_from_config(cfg: config.AgentConfig, default: config.SingleAgentConfi
if cfg.fixed is not None:
agents = _from_fixed(cfg.fixed, topology=cfg.topology, default=default, env=env)
if cfg.distribution:
- n = cfg.n or len(env.topologies[cfg.topology])
+ n = cfg.n or len(env.topologies[cfg.topology or default.topology])
target = n - len(agents)
agents.update(_from_distro(cfg.distribution, target,
topology=cfg.topology or default.topology,
@@ -674,6 +699,8 @@ def _group_from_config(cfg: config.AgentConfig, default: config.SingleAgentConfi
else:
filtered = list(agents)
+ if attrs.n > len(filtered):
+ raise ValueError(f'Not enough agents to sample. Got {len(filtered)}, expected >= {attrs.n}')
for agent in random.sample(filtered, attrs.n):
agent.state.update(attrs.state)
@@ -684,18 +711,20 @@ def _from_fixed(lst: List[config.FixedAgentConfig], topology: str, default: conf
agents = {}
for fixed in lst:
- agent_id = fixed.agent_id
- if agent_id is None:
- agent_id = env.next_id()
+ agent_id = fixed.agent_id
+ if agent_id is None:
+ agent_id = env.next_id()
- cls = serialization.deserialize(fixed.agent_class or default.agent_class)
- state = fixed.state.copy()
- state.update(default.state)
- agent = cls(unique_id=agent_id,
- model=env,
- graph_name=fixed.topology or topology or default.topology,
- **state)
- agents[agent.unique_id] = agent
+ cls = serialization.deserialize(fixed.agent_class or default.agent_class)
+ state = fixed.state.copy()
+ state.update(default.state)
+ agent = cls(unique_id=agent_id,
+ model=env,
+ **state)
+ topology = fixed.topology if (fixed.topology is not None) else (topology or default.topology)
+ if topology:
+ env.agent_to_node(agent_id, topology, fixed.node_id)
+ agents[agent.unique_id] = agent
return agents
@@ -741,8 +770,12 @@ def _from_distro(distro: List[config.AgentDistro],
cls = classes[idx]
agent_id = env.next_id()
state = d.state.copy()
- state.update(default.state)
- agent = cls(unique_id=agent_id, model=env, graph_name=d.topology or topology or default.topology, **state)
+ if default:
+ state.update(default.state)
+ agent = cls(unique_id=agent_id, model=env, **state)
+ topology = d.topology if (d.topology is not None) else topology or default.topology
+ if topology:
+ env.agent_to_node(agent.unique_id, topology)
assert agent.name is not None
assert agent.name != 'None'
assert agent.name
diff --git a/soil/config.py b/soil/config.py
index eabb43f..3cc4fd6 100644
--- a/soil/config.py
+++ b/soil/config.py
@@ -7,6 +7,7 @@ import sys
from typing import Any, Callable, Dict, List, Optional, Union, Type
from pydantic import BaseModel, Extra
+import networkx as nx
class General(BaseModel):
id: str = 'Unnamed Simulation'
@@ -50,9 +51,12 @@ class NetParams(BaseModel, extra=Extra.allow):
class NetConfig(BaseModel):
group: str = 'network'
params: Optional[NetParams]
- topology: Optional[Topology]
+ topology: Optional[Union[Topology, nx.Graph]]
path: Optional[str]
+ class Config:
+ arbitrary_types_allowed = True
+
@staticmethod
def default():
return NetConfig(topology=None, params=None)
@@ -77,7 +81,8 @@ class EnvConfig(BaseModel):
class SingleAgentConfig(BaseModel):
agent_class: Optional[Union[Type, str]] = None
agent_id: Optional[int] = None
- topology: Optional[str] = 'default'
+ topology: Optional[str] = None
+ node_id: Optional[Union[int, str]] = None
name: Optional[str] = None
state: Optional[Dict[str, Any]] = {}
@@ -186,9 +191,7 @@ def convert_old(old, strict=True):
if 'agent_id' in agent:
agent['name'] = agent['agent_id']
del agent['agent_id']
- agents['environment']['fixed'].append(updated_agent(agent))
- else:
- agents['environment']['distribution'].append(updated_agent(agent))
+ agents['environment']['fixed'].append(updated_agent(agent))
by_weight = []
fixed = []
@@ -206,10 +209,10 @@ def convert_old(old, strict=True):
if 'agent_type' in old and (not fixed and not by_weight):
agents['network']['topology'] = 'default'
- by_weight = [{'agent_type': old['agent_type']}]
+ by_weight = [{'agent_class': old['agent_type']}]
- # TODO: translate states
+ # TODO: translate states properly
if 'states' in old:
states = old['states']
if isinstance(states, dict):
@@ -217,7 +220,7 @@ def convert_old(old, strict=True):
else:
states = enumerate(states)
for (k, v) in states:
- override.append({'filter': {'id': k},
+ override.append({'filter': {'node_id': k},
'state': v
})
diff --git a/soil/config_old.py b/soil/config_old.py
deleted file mode 100644
index ca4eaa9..0000000
--- a/soil/config_old.py
+++ /dev/null
@@ -1,264 +0,0 @@
-from pydantic import BaseModel, ValidationError, validator
-
-import yaml
-import os
-import sys
-import networkx as nx
-import collections.abc
-
-from . import serialization, utils, basestring, agents
-
-class Config(collections.abc.Mapping):
- """
-
- 1) agent type can be specified by name or by class.
- 2) instead of just one type, a network agents distribution can be used.
- The distribution specifies the weight (or probability) of each
- agent type in the topology. This is an example distribution: ::
-
- [
- {'agent_type': 'agent_type_1',
- 'weight': 0.2,
- 'state': {
- 'id': 0
- }
- },
- {'agent_type': 'agent_type_2',
- 'weight': 0.8,
- 'state': {
- 'id': 1
- }
- }
- ]
-
- In this example, 20% of the nodes will be marked as type
- 'agent_type_1'.
- 3) if no initial state is given, each node's state will be set
- to `{'id': 0}`.
-
- Parameters
- ---------
- name : str, optional
- name of the Simulation
- group : str, optional
- a group name can be used to link simulations
- topology (optional): networkx.Graph instance or Node-Link topology as a dict or string (will be loaded with `json_graph.node_link_graph(topology`).
- network_params : dict
- parameters used to create a topology with networkx, if no topology is given
- network_agents : dict
- definition of agents to populate the topology with
- agent_type : NetworkAgent subclass, optional
- Default type of NetworkAgent to use for nodes not specified in network_agents
- states : list, optional
- List of initial states corresponding to the nodes in the topology. Basic form is a list of integers
- whose value indicates the state
- dir_path: str, optional
- Directory path to load simulation assets (files, modules...)
- seed : str, optional
- Seed to use for the random generator
- num_trials : int, optional
- Number of independent simulation runs
- max_time : int, optional
- Maximum step/time for each simulation
- environment_params : dict, optional
- Dictionary of globally-shared environmental parameters
- environment_agents: dict, optional
- Similar to network_agents. Distribution of Agents that control the environment
- environment_class: soil.environment.Environment subclass, optional
- Class for the environment. It defailts to soil.environment.Environment
- """
- __slots__ = 'name', 'agent_type', 'group', 'description', 'network_agents', 'environment_agents', 'states', 'default_state', 'interval', 'network_params', 'seed', 'num_trials', 'max_time', 'topology', 'schedule', 'initial_time', 'environment_params', 'environment_class', 'dir_path', '_added_to_path', 'visualization_params'
-
- def __init__(self, name=None,
- group=None,
- agent_type='BaseAgent',
- network_agents=None,
- environment_agents=None,
- states=None,
- description=None,
- default_state=None,
- interval=1,
- network_params=None,
- seed=None,
- num_trials=1,
- max_time=None,
- topology=None,
- schedule=None,
- initial_time=0,
- environment_params={},
- environment_class='soil.Environment',
- dir_path=None,
- visualization_params=None,
- ):
-
- self.network_params = network_params
- self.name = name or 'Unnamed'
- self.description = description or 'No simulation description available'
- self.seed = str(seed or name)
- self.group = group or ''
- self.num_trials = num_trials
- self.max_time = max_time
- self.default_state = default_state or {}
- self.dir_path = dir_path or os.getcwd()
- self.interval = interval
- self.visualization_params = visualization_params or {}
-
- self._added_to_path = list(x for x in [os.getcwd(), self.dir_path] if x not in sys.path)
- sys.path += self._added_to_path
-
- self.topology = topology
-
- self.schedule = schedule
- self.initial_time = initial_time
-
-
- self.environment_class = environment_class
- self.environment_params = dict(environment_params)
-
- #TODO: Check agent distro vs fixed agents
- self.environment_agents = environment_agents or []
-
- self.agent_type = agent_type
-
- self.network_agents = network_agents or {}
-
- self.states = states or {}
-
-
- def validate(self):
- agents._validate_states(self.states,
- self._topology)
-
- def calculate(self):
- return CalculatedConfig(self)
-
- def restore_path(self):
- for added in self._added_to_path:
- sys.path.remove(added)
-
- def to_yaml(self):
- return yaml.dump(self.to_dict())
-
- def dump_yaml(self, f=None, outdir=None):
- if not f and not outdir:
- raise ValueError('specify a file or an output directory')
-
- if not f:
- f = os.path.join(outdir, '{}.dumped.yml'.format(self.name))
-
- with utils.open_or_reuse(f, 'w') as f:
- f.write(self.to_yaml())
-
- def to_yaml(self):
- return yaml.dump(self.to_dict())
-
- # TODO: See note on getstate
- def to_dict(self):
- return dict(self)
-
- def __repr__(self):
- return self.to_yaml()
-
- def dump_yaml(self, f=None, outdir=None):
- if not f and not outdir:
- raise ValueError('specify a file or an output directory')
-
- if not f:
- f = os.path.join(outdir, '{}.dumped.yml'.format(self.name))
-
- with utils.open_or_reuse(f, 'w') as f:
- f.write(self.to_yaml())
-
- def __getitem__(self, key):
- return getattr(self, key)
-
- def __iter__(self):
- return (k for k in self.__slots__ if k[0] != '_')
-
- def __len__(self):
- return len(self.__slots__)
-
- def dump_pickle(self, f=None, outdir=None):
- if not outdir and not f:
- raise ValueError('specify a file or an output directory')
-
- if not f:
- f = os.path.join(outdir,
- '{}.simulation.pickle'.format(self.name))
- with utils.open_or_reuse(f, 'wb') as f:
- pickle.dump(self, f)
-
- # TODO: remove this. A config should be sendable regardless. Non-pickable objects could be computed via properties and the like
- # def __getstate__(self):
- # state={}
- # for k, v in self.__dict__.items():
- # if k[0] != '_':
- # state[k] = v
- # state['topology'] = json_graph.node_link_data(self.topology)
- # state['network_agents'] = agents.serialize_definition(self.network_agents,
- # known_modules = [])
- # state['environment_agents'] = agents.serialize_definition(self.environment_agents,
- # known_modules = [])
- # state['environment_class'] = serialization.serialize(self.environment_class,
- # known_modules=['soil.environment'])[1] # func, name
- # if state['load_module'] is None:
- # del state['load_module']
- # return state
-
- # # TODO: remove, same as __getstate__
- # def __setstate__(self, state):
- # self.__dict__ = state
- # self.load_module = getattr(self, 'load_module', None)
- # if self.dir_path not in sys.path:
- # sys.path += [self.dir_path, os.getcwd()]
- # self.topology = json_graph.node_link_graph(state['topology'])
- # self.network_agents = agents.calculate_distribution(agents._convert_agent_types(self.network_agents))
- # self.environment_agents = agents._convert_agent_types(self.environment_agents,
- # known_modules=[self.load_module])
- # self.environment_class = serialization.deserialize(self.environment_class,
- # known_modules=[self.load_module,
- # 'soil.environment', ]) # func, name
-
-class CalculatedConfig(Config):
- def __init__(self, config):
- """
- Returns a configuration object that replaces some "plain" attributes (e.g., `environment_class` string) into
- a Python object (`soil.environment.Environment` class).
- """
- self._config = config
- values = dict(config)
- values['environment_class'] = self._environment_class()
- values['environment_agents'] = self._environment_agents()
- values['topology'] = self._topology()
- values['network_agents'] = self._network_agents()
- values['agent_type'] = serialization.deserialize(self.agent_type, known_modules=['soil.agents'])
-
- return values
-
- def _topology(self):
- topology = self._config.topology
- if topology is None:
- topology = serialization.load_network(self._config.network_params,
- dir_path=self._config.dir_path)
-
- elif isinstance(topology, basestring) or isinstance(topology, dict):
- topology = json_graph.node_link_graph(topology)
-
- return nx.Graph(topology)
-
- def _environment_class(self):
- return serialization.deserialize(self._config.environment_class,
- known_modules=['soil.environment', ]) or Environment
-
- def _environment_agents(self):
- return agents._convert_agent_types(self._config.environment_agents)
-
- def _network_agents(self):
- distro = agents.calculate_distribution(self._config.network_agents,
- self._config.agent_type)
- return agents._convert_agent_types(distro)
-
- def _environment_class(self):
- return serialization.deserialize(self._config.environment_class,
- known_modules=['soil.environment', ]) # func, name
-
diff --git a/soil/environment.py b/soil/environment.py
index ddb46cb..9e00f36 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -15,6 +15,7 @@ from networkx.readwrite import json_graph
import networkx as nx
from mesa import Model
+from mesa.datacollection import DataCollector
from . import serialization, agents, analysis, utils, time, config, network
@@ -41,6 +42,9 @@ class Environment(Model):
interval=1,
agents: Dict[str, config.AgentConfig] = {},
topologies: Dict[str, config.NetConfig] = {},
+ agent_reporters: Optional[Any] = None,
+ model_reporters: Optional[Any] = None,
+ tables: Optional[Any] = None,
**env_params):
super().__init__()
@@ -61,6 +65,7 @@ class Environment(Model):
self.topologies = {}
+ self._node_ids = {}
for (name, cfg) in topologies.items():
self.set_topology(cfg=cfg,
graph=name)
@@ -72,6 +77,7 @@ class Environment(Model):
self['SEED'] = seed
self.logger = utils.logger.getChild(self.id)
+ self.datacollector = DataCollector(model_reporters, agent_reporters, tables)
@property
def topology(self):
@@ -79,8 +85,7 @@ class Environment(Model):
@property
def network_agents(self):
- yield from self.agents(agent_type=agents.NetworkAgent, iterator=False)
-
+ yield from self.agents(agent_class=agents.NetworkAgent)
@staticmethod
def from_config(conf: config.Config, trial_id, **kwargs) -> Environment:
@@ -91,9 +96,10 @@ class Environment(Model):
seed = '{}_{}'.format(conf.general.seed, trial_id)
id = '{}_trial_{}'.format(conf.general.id, trial_id).replace('.', '-')
opts = conf.environment.params.copy()
+ dir_path = conf.general.dir_path
opts.update(conf)
opts.update(kwargs)
- env = serialization.deserialize(conf.environment.environment_class)(env_id=id, seed=seed, **opts)
+ env = serialization.deserialize(conf.environment.environment_class)(env_id=id, seed=seed, dir_path=dir_path, **opts)
return env
@property
@@ -103,12 +109,31 @@ class Environment(Model):
raise Exception('The environment has not been scheduled, so it has no sense of time')
+ def topology_for(self, agent_id):
+ return self.topologies[self._node_ids[agent_id][0]]
+
+ def node_id_for(self, agent_id):
+ return self._node_ids[agent_id][1]
+
def set_topology(self, cfg=None, dir_path=None, graph='default'):
- self.topologies[graph] = network.from_config(cfg, dir_path=dir_path)
+ topology = cfg
+ if not isinstance(cfg, nx.Graph):
+ topology = network.from_config(cfg, dir_path=dir_path or self.dir_path)
+
+ self.topologies[graph] = topology
@property
def agents(self):
return agents.AgentView(self._agents)
+
+ def count_agents(self, *args, **kwargs):
+ return sum(1 for i in self.find_all(*args, **kwargs))
+
+ def find_all(self, *args, **kwargs):
+ return agents.AgentView(self._agents).filter(*args, **kwargs)
+
+ def find_one(self, *args, **kwargs):
+ return agents.AgentView(self._agents).one(*args, **kwargs)
@agents.setter
def agents(self, agents_def: Dict[str, config.AgentConfig]):
@@ -117,37 +142,47 @@ class Environment(Model):
for a in d.values():
self.schedule.add(a)
-
- # @property
- # def network_agents(self):
- # for i in self.G.nodes():
- # node = self.G.nodes[i]
- # if 'agent' in node:
- # yield node['agent']
-
def init_agent(self, agent_id, agent_definitions, graph='default'):
node = self.topologies[graph].nodes[agent_id]
init = False
state = dict(node)
- agent_type = None
- if 'agent_type' in self.states.get(agent_id, {}):
- agent_type = self.states[agent_id]['agent_type']
- elif 'agent_type' in node:
- agent_type = node['agent_type']
- elif 'agent_type' in self.default_state:
- agent_type = self.default_state['agent_type']
+ agent_class = None
+ if 'agent_class' in self.states.get(agent_id, {}):
+ agent_class = self.states[agent_id]['agent_class']
+ elif 'agent_class' in node:
+ agent_class = node['agent_class']
+ elif 'agent_class' in self.default_state:
+ agent_class = self.default_state['agent_class']
- if agent_type:
- agent_type = agents.deserialize_type(agent_type)
+ if agent_class:
+ agent_class = agents.deserialize_type(agent_class)
elif agent_definitions:
- agent_type, state = agents._agent_from_definition(agent_definitions, unique_id=agent_id)
+ agent_class, state = agents._agent_from_definition(agent_definitions, unique_id=agent_id)
else:
serialization.logger.debug('Skipping node {}'.format(agent_id))
return
- return self.set_agent(agent_id, agent_type, state)
+ return self.set_agent(agent_id, agent_class, state)
- def set_agent(self, agent_id, agent_type, state=None, graph='default'):
+ def agent_to_node(self, agent_id, graph_name='default', node_id=None, shuffle=False):
+ #TODO: test
+ if node_id is None:
+ G = self.topologies[graph_name]
+ candidates = list(G.nodes(data=True))
+ if shuffle:
+ random.shuffle(candidates)
+ for next_id, data in candidates:
+ if data.get('agent_id', None) is None:
+ node_id = next_id
+ data['agent_id'] = agent_id
+ break
+
+
+ self._node_ids[agent_id] = (graph_name, node_id)
+ print(self._node_ids)
+
+
+ def set_agent(self, agent_id, agent_class, state=None, graph='default'):
node = self.topologies[graph].nodes[agent_id]
defstate = deepcopy(self.default_state) or {}
defstate.update(self.states.get(agent_id, {}))
@@ -155,9 +190,9 @@ class Environment(Model):
if state:
defstate.update(state)
a = None
- if agent_type:
+ if agent_class:
state = defstate
- a = agent_type(model=self,
+ a = agent_class(model=self,
unique_id=agent_id
)
@@ -168,10 +203,10 @@ class Environment(Model):
self.schedule.add(a)
return a
- def add_node(self, agent_type, state=None, graph='default'):
+ def add_node(self, agent_class, state=None, graph='default'):
agent_id = int(len(self.topologies[graph].nodes()))
self.topologies[graph].add_node(agent_id)
- a = self.set_agent(agent_id, agent_type, state, graph=graph)
+ a = self.set_agent(agent_id, agent_class, state, graph=graph)
a['visible'] = True
return a
@@ -201,6 +236,7 @@ class Environment(Model):
'''
super().step()
self.schedule.step()
+ self.datacollector.collect(self)
def run(self, until, *args, **kwargs):
until = until or float('inf')
diff --git a/soil/exporters.py b/soil/exporters.py
index 0653517..1bd06de 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -1,5 +1,4 @@
import os
-import csv as csvlib
from time import time as current_time
from io import BytesIO
from sqlalchemy import create_engine
@@ -59,7 +58,7 @@ class Exporter:
'''Method to call when the simulation starts'''
pass
- def sim_end(self, stats):
+ def sim_end(self):
'''Method to call when the simulation ends'''
pass
@@ -67,7 +66,7 @@ class Exporter:
'''Method to call when a trial start'''
pass
- def trial_end(self, env, stats):
+ def trial_end(self, env):
'''Method to call when a trial ends'''
pass
@@ -115,31 +114,35 @@ class default(Exporter):
# self.simulation.dump_sqlite(f)
+def get_dc_dfs(dc):
+ dfs = {'env': dc.get_model_vars_dataframe(),
+ 'agents': dc.get_agent_vars_dataframe }
+ for table_name in dc.tables:
+ dfs[table_name] = dc.get_table_dataframe(table_name)
+ yield from dfs.items()
+
class csv(Exporter):
'''Export the state of each environment (and its agents) in a separate CSV file'''
- def trial_end(self, env, stats):
+ def trial_end(self, env):
with timer('[CSV] Dumping simulation {} trial {} @ dir {}'.format(self.simulation.name,
- env.name,
+ env.id,
self.outdir)):
-
- with self.output('{}.stats.{}.csv'.format(env.name, stats.name)) as f:
- statwriter = csvlib.writer(f, delimiter='\t', quotechar='"', quoting=csvlib.QUOTE_ALL)
-
- for stat in stats:
- statwriter.writerow(stat)
+ for (df_name, df) in get_dc_dfs(env.datacollector):
+ with self.output('{}.stats.{}.csv'.format(env.id, df_name)) as f:
+ df.to_csv(f)
class gexf(Exporter):
- def trial_end(self, env, stats):
+ def trial_end(self, env):
if self.dry_run:
logger.info('Not dumping GEXF in dry_run mode')
return
with timer('[GEXF] Dumping simulation {} trial {}'.format(self.simulation.name,
- env.name)):
- with self.output('{}.gexf'.format(env.name), mode='wb') as f:
+ env.id)):
+ with self.output('{}.gexf'.format(env.id), mode='wb') as f:
self.dump_gexf(env, f)
def dump_gexf(self, env, f):
@@ -159,25 +162,25 @@ class dummy(Exporter):
with self.output('dummy', 'w') as f:
f.write('simulation started @ {}\n'.format(current_time()))
- def trial_end(self, env, stats):
+ def trial_start(self, env):
with self.output('dummy', 'w') as f:
- for i in stats:
- f.write(','.join(map(str, i)))
- f.write('\n')
+ f.write('trial started@ {}\n'.format(current_time()))
- def sim_end(self, stats):
+ def trial_end(self, env):
+ with self.output('dummy', 'w') as f:
+ f.write('trial ended@ {}\n'.format(current_time()))
+
+ def sim_end(self):
with self.output('dummy', 'a') as f:
f.write('simulation ended @ {}\n'.format(current_time()))
-
-
class graphdrawing(Exporter):
- def trial_end(self, env, stats):
+ def trial_end(self, env):
# Outside effects
f = plt.figure()
nx.draw(env.G, node_size=10, width=0.2, pos=nx.spring_layout(env.G, scale=100), ax=f.add_subplot(111))
- with open('graph-{}.png'.format(env.name)) as f:
+ with open('graph-{}.png'.format(env.id)) as f:
f.savefig(f)
'''
diff --git a/soil/simulation.py b/soil/simulation.py
index 0892731..d28549d 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -16,7 +16,6 @@ from . import serialization, utils, basestring, agents
from .environment import Environment
from .utils import logger
from .exporters import default
-from .stats import defaultStats
from .config import Config, convert_old
@@ -71,8 +70,8 @@ class Simulation:
**kwargs)
def run_gen(self, parallel=False, dry_run=False,
- exporters=[default, ], stats=[], outdir=None, exporter_params={},
- stats_params={}, log_level=None,
+ exporters=[default, ], outdir=None, exporter_params={},
+ log_level=None,
**kwargs):
'''Run the simulation and yield the resulting environments.'''
if log_level:
@@ -85,15 +84,8 @@ class Simulation:
dry_run=dry_run,
outdir=outdir,
**exporter_params)
- stats = serialization.deserialize_all(simulation=self,
- names=stats,
- known_modules=['soil.stats',],
- **stats_params)
with utils.timer('simulation {}'.format(self.config.general.id)):
- for stat in stats:
- stat.sim_start()
-
for exporter in exporters:
exporter.sim_start()
@@ -104,32 +96,13 @@ class Simulation:
for exporter in exporters:
exporter.trial_start(env)
- collected = list(stat.trial_end(env) for stat in stats)
-
- saved = self._update_stats(collected, t_step=env.now, trial_id=env.id)
-
for exporter in exporters:
- exporter.trial_end(env, saved)
+ exporter.trial_end(env)
yield env
- collected = list(stat.end() for stat in stats)
- saved = self._update_stats(collected)
-
- for stat in stats:
- stat.sim_end()
-
for exporter in exporters:
- exporter.sim_end(saved)
-
- def _update_stats(self, collection, **kwargs):
- stats = dict(kwargs)
- for stat in collection:
- stats.update(stat)
- return stats
-
- def log_stats(self, stats):
- logger.info('Stats: \n{}'.format(yaml.dump(stats, default_flow_style=False)))
+ exporter.sim_end()
def get_env(self, trial_id=0, **kwargs):
'''Create an environment for a trial of the simulation'''
diff --git a/soil/stats.py b/soil/stats.py
deleted file mode 100644
index 5de9a40..0000000
--- a/soil/stats.py
+++ /dev/null
@@ -1,111 +0,0 @@
-import pandas as pd
-
-from collections import Counter
-
-class Stats:
- '''
- Interface for all stats. It is not necessary, but it is useful
- if you don't plan to implement all the methods.
- '''
-
- def __init__(self, simulation, name=None):
- self.name = name or type(self).__name__
- self.simulation = simulation
-
- def sim_start(self):
- '''Method to call when the simulation starts'''
- pass
-
- def sim_end(self):
- '''Method to call when the simulation ends'''
- return {}
-
- def trial_start(self, env):
- '''Method to call when a trial starts'''
- return {}
-
- def trial_end(self, env):
- '''Method to call when a trial ends'''
- return {}
-
-
-class distribution(Stats):
- '''
- Calculate the distribution of agent states at the end of each trial,
- the mean value, and its deviation.
- '''
-
- def sim_start(self):
- self.means = []
- self.counts = []
-
- def trial_end(self, env):
- df = pd.DataFrame(env.state_to_tuples())
- df = df.drop('SEED', axis=1)
- ix = df.index[-1]
- attrs = df.columns.get_level_values(0)
- vc = {}
- stats = {
- 'mean': {},
- 'count': {},
- }
- for a in attrs:
- t = df.loc[(ix, a)]
- try:
- stats['mean'][a] = t.mean()
- self.means.append(('mean', a, t.mean()))
- except TypeError:
- pass
-
- for name, count in t.value_counts().iteritems():
- if a not in stats['count']:
- stats['count'][a] = {}
- stats['count'][a][name] = count
- self.counts.append(('count', a, name, count))
-
- return stats
-
- def sim_end(self):
- dfm = pd.DataFrame(self.means, columns=['metric', 'key', 'value'])
- dfc = pd.DataFrame(self.counts, columns=['metric', 'key', 'value', 'count'])
-
- count = {}
- mean = {}
-
- if self.means:
- res = dfm.groupby(by=['key']).agg(['mean', 'std', 'count', 'median', 'max', 'min'])
- mean = res['value'].to_dict()
- if self.counts:
- res = dfc.groupby(by=['key', 'value']).agg(['mean', 'std', 'count', 'median', 'max', 'min'])
- for k,v in res['count'].to_dict().items():
- if k not in count:
- count[k] = {}
- for tup, times in v.items():
- subkey, subcount = tup
- if subkey not in count[k]:
- count[k][subkey] = {}
- count[k][subkey][subcount] = times
-
-
- return {'count': count, 'mean': mean}
-
-
-class defaultStats(Stats):
-
- def trial_end(self, env):
- c = Counter()
- c.update(a.__class__.__name__ for a in env.network_agents)
-
- c2 = Counter()
- c2.update(a['id'] for a in env.network_agents)
-
- return {
- 'network ': {
- 'n_nodes': env.G.number_of_nodes(),
- 'n_edges': env.G.number_of_edges(),
- },
- 'agents': {
- 'model_count': dict(c),
- 'state_count': dict(c2),
- }
- }
diff --git a/tests/complete_converted.yml b/tests/complete_converted.yml
index ffb5a16..36a0a96 100644
--- a/tests/complete_converted.yml
+++ b/tests/complete_converted.yml
@@ -29,11 +29,11 @@ agents:
weight: 0.6
override:
- filter:
- id: 0
+ node_id: 0
state:
name: 'The first node'
- filter:
- id: 1
+ node_id: 1
state:
name: 'The second node'
diff --git a/tests/test_config.py b/tests/test_config.py
index 7cba6af..6f69ee2 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -71,11 +71,11 @@ class TestConfig(TestCase):
s = simulation.from_config(cfg)
env = s.get_env()
assert len(env.topologies['default'].nodes) == 10
- assert len(env.agents('network')) == 10
- assert len(env.agents('environment')) == 1
+ assert len(env.agents(group='network')) == 10
+ assert len(env.agents(group='environment')) == 1
- assert sum(1 for a in env.agents('network') if isinstance(a, agents.CounterModel)) == 4
- assert sum(1 for a in env.agents('network') if isinstance(a, agents.AggregatedCounter)) == 6
+ assert sum(1 for a in env.agents(group='network', agent_type=agents.CounterModel)) == 4
+ assert sum(1 for a in env.agents(group='network', agent_type=agents.AggregatedCounter)) == 6
def make_example_test(path, cfg):
def wrapped(self):
diff --git a/tests/test_exporters.py b/tests/test_exporters.py
index 79ffe25..6ff544b 100644
--- a/tests/test_exporters.py
+++ b/tests/test_exporters.py
@@ -7,8 +7,6 @@ from unittest import TestCase
from soil import exporters
from soil import simulation
-from soil.stats import distribution
-
class Dummy(exporters.Exporter):
started = False
trials = 0
@@ -22,13 +20,13 @@ class Dummy(exporters.Exporter):
self.__class__.called_start += 1
self.__class__.started = True
- def trial_end(self, env, stats):
+ def trial_end(self, env):
assert env
self.__class__.trials += 1
self.__class__.total_time += env.now
self.__class__.called_trial += 1
- def sim_end(self, stats):
+ def sim_end(self):
self.__class__.ended = True
self.__class__.called_end += 1
@@ -78,7 +76,6 @@ class Exporters(TestCase):
exporters.csv,
exporters.gexf,
],
- stats=[distribution,],
dry_run=False,
outdir=tmpdir,
exporter_params={'copy_to': output})
diff --git a/tests/test_main.py b/tests/test_main.py
index f63128e..017e92e 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -10,7 +10,7 @@ from functools import partial
from os.path import join
from soil import (simulation, Environment, agents, network, serialization,
- utils)
+ utils, config)
from soil.time import Delta
ROOT = os.path.abspath(os.path.dirname(__file__))
@@ -200,7 +200,6 @@ class TestMain(TestCase):
recovered = yaml.load(serial, Loader=yaml.SafeLoader)
for (k, v) in config.items():
assert recovered[k] == v
- # assert config == recovered
def test_configuration_changes(self):
"""
@@ -294,11 +293,13 @@ class TestMain(TestCase):
G.add_node(3)
G.add_edge(1, 2)
distro = agents.calculate_distribution(agent_type=agents.NetworkAgent)
- env = Environment(name='Test', topology=G, network_agents=distro)
+ distro[0]['topology'] = 'default'
+ aconfig = config.AgentConfig(distribution=distro, topology='default')
+ env = Environment(name='Test', topologies={'default': G}, agents={'network': aconfig})
lst = list(env.network_agents)
- a2 = env.get_agent(2)
- a3 = env.get_agent(3)
+ a2 = env.find_one(node_id=2)
+ a3 = env.find_one(node_id=3)
assert len(a2.subgraph(limit_neighbors=True)) == 2
assert len(a3.subgraph(limit_neighbors=True)) == 1
assert len(a3.subgraph(limit_neighbors=True, center=False)) == 0
diff --git a/tests/test_stats.py b/tests/test_stats.py
deleted file mode 100644
index 406e1fd..0000000
--- a/tests/test_stats.py
+++ /dev/null
@@ -1,34 +0,0 @@
-from unittest import TestCase
-
-from soil import simulation, stats
-from soil.utils import unflatten_dict
-
-class Stats(TestCase):
-
- def test_distribution(self):
- '''The distribution exporter should write the number of agents in each state'''
- config = {
- 'name': 'exporter_sim',
- 'network_params': {
- 'generator': 'complete_graph',
- 'n': 4
- },
- 'agent_type': 'CounterModel',
- 'max_time': 2,
- 'num_trials': 5,
- 'environment_params': {}
- }
- s = simulation.from_config(config)
- for env in s.run_simulation(stats=[stats.distribution]):
- pass
- # stats_res = unflatten_dict(dict(env._history['stats', -1, None]))
- allstats = s.get_stats()
- for stat in allstats:
- assert 'count' in stat
- assert 'mean' in stat
- if 'trial_id' in stat:
- assert stat['mean']['neighbors'] == 3
- assert stat['count']['total']['4'] == 4
- else:
- assert stat['count']['count']['neighbors']['3'] == 20
- assert stat['mean']['min']['neighbors'] == stat['mean']['max']['neighbors']
From f811ee18c5e3b2d7e2c1c434516c2ce9f116c62f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Thu, 6 Oct 2022 15:49:10 +0200
Subject: [PATCH 07/39] WIP
---
CHANGELOG.md | 5 +-
README.md | 55 ++--
docs/configuration.rst | 28 +-
docs/example.yml | 6 +-
docs/quickstart.yml | 4 +-
docs/soil_tutorial.rst | 10 +-
examples/NewsSpread.ipynb | 24 +-
examples/Untitled.ipynb | 200 ++++++------
examples/complete.yml | 1 +
.../custom_generator/custom_generator.yml | 2 +-
examples/custom_generator/mymodule.py | 7 +-
examples/custom_timeouts/custom_timeouts.py | 4 +-
examples/mesa/mesa.yml | 4 +-
examples/mesa/server.py | 2 +-
examples/mesa/social_wealth.py | 2 +-
examples/newsspread/NewsSpread.ipynb | 24 +-
examples/newsspread/NewsSpread.yml | 24 +-
examples/programmatic/programmatic.py | 2 +-
examples/pubcrawl/pubcrawl.py | 5 +-
examples/pubcrawl/pubcrawl.yml | 6 +-
examples/rabbits/rabbit_agents.py | 12 +-
examples/rabbits/rabbits.yml | 8 +-
examples/random_delays/random_delays.py | 9 +-
examples/template.yml | 4 +-
examples/terrorism/TerroristNetworkModel.py | 27 +-
examples/terrorism/TerroristNetworkModel.yml | 8 +-
examples/torvalds.yml | 2 +-
examples/tutorial/soil_tutorial.html | 10 +-
examples/tutorial/soil_tutorial.ipynb | 10 +-
soil/agents/BassModel.py | 5 +-
soil/agents/BigMarketModel.py | 11 +-
soil/agents/IndependentCascadeModel.py | 5 +-
soil/agents/ModelM2.py | 66 ++--
soil/agents/SISaModel.py | 35 +--
soil/agents/SentimentCorrelationModel.py | 5 +-
soil/agents/__init__.py | 30 +-
soil/config.py | 47 ++-
soil/datacollection.py | 20 +-
soil/environment.py | 289 +++++++++---------
soil/exporters.py | 4 +-
soil/network.py | 23 ++
soil/serialization.py | 2 -
soil/simulation.py | 163 +++++-----
soil/time.py | 11 +-
soil/utils.py | 15 +
soil/web/config.yml | 4 +-
tests/old_complete.yml | 8 +-
tests/test_analysis.py | 2 +-
tests/test_config.py | 64 +++-
tests/test_exporters.py | 4 +-
tests/test_history.py | 2 +-
tests/test_main.py | 225 +++++---------
tests/test_network.py | 85 ++++++
53 files changed, 856 insertions(+), 774 deletions(-)
create mode 100644 tests/test_network.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6b7dc3e..92c457e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,13 +3,14 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## [UNRELEASED]
+## [0.3 UNRELEASED]
### Changed
-* Configuration schema is very different now. Check `soil.config` for more information. We are using Pydantic for (de)serialization.
+* Configuration schema is very different now. Check `soil.config` for more information. We are also using Pydantic for (de)serialization.
* There may be more than one topology/network in the simulation
* Agents are split into groups now. Each group may be assigned a given set of agents or an agent distribution, and a network topology to be assigned to.
### Removed
* Any `tsih` and `History` integration in the main classes. To record the state of environments/agents, just use a datacollector. In some cases this may be slower or consume more memory than the previous system. However, few cases actually used the full potential of the history, and it came at the cost of unnecessary complexity and worse performance for the majority of cases.
+
## [0.20.7]
### Changed
* Creating a `time.When` from another `time.When` does not nest them anymore (it returns the argument)
diff --git a/README.md b/README.md
index 7ea6f1d..8bcca61 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,42 @@ Learn how to run your own simulations with our [documentation](http://soilsim.re
Follow our [tutorial](examples/tutorial/soil_tutorial.ipynb) to develop your own agent models.
+
+# Changes in version 0.3
+
+Version 0.3 came packed with many changes to provide much better integration with MESA.
+For a long time, we tried to keep soil backwards-compatible, but it turned out to be a big endeavour and the resulting code was less readable.
+This translates to harder maintenance and a worse experience for newcomers.
+In the end, we decided to make some breaking changes.
+
+If you have an older Soil simulation, you have two options:
+
+* Update the necessary configuration files and code. You may use the examples in the `examples` folder for reference, as well as the documentation.
+* Keep using a previous `soil` version.
+
+## Mesa compatibility
+
+Soil is in the process of becoming fully compatible with MESA.
+The idea is to provide a set of modular classes and functions that extend the functionality of mesa, whilst staying compatible.
+In the end, it should be possible to add regular mesa agents to a soil simulation, or use a soil agent within a mesa simulation/model.
+
+This is a non-exhaustive list of tasks to achieve compatibility:
+
+- [ ] Integrate `soil.Simulation` with mesa's runners:
+ - [ ] `soil.Simulation` could mimic/become a `mesa.batchrunner`
+- [ ] Integrate `soil.Environment` with `mesa.Model`:
+ - [x] `Soil.Environment` inherits from `mesa.Model`
+ - [x] `Soil.Environment` includes a Mesa-like Scheduler (see the `soil.time` module.
+ - [ ] Allow for `mesa.Model` to be used in a simulation.
+- [ ] Integrate `soil.Agent` with `mesa.Agent`:
+ - [x] Rename agent.id to unique_id?
+ - [x] mesa agents can be used in soil simulations (see `examples/mesa`)
+- [ ] Provide examples
+ - [ ] Using mesa modules in a soil simulation
+ - [ ] Using soil modules in a mesa simulation
+- [ ] Document the new APIs and usage
+
+
## Citation
@@ -31,25 +67,6 @@ If you use Soil in your research, don't forget to cite this paper:
```
-## Mesa compatibility
-
-Soil is in the process of becoming fully compatible with MESA.
-As of this writing,
-
-This is a non-exhaustive list of tasks to achieve compatibility:
-
-* Environments.agents and mesa.Agent.agents are not the same. env is a property, and it only takes into account network and environment agents. Might rename environment_agents to other_agents or sth like that
-
-- [ ] Integrate `soil.Simulation` with mesa's runners:
- - [ ] `soil.Simulation` could mimic/become a `mesa.batchrunner`
-- [ ] Integrate `soil.Environment` with `mesa.Model`:
- - [x] `Soil.Environment` inherits from `mesa.Model`
- - [x] `Soil.Environment` includes a Mesa-like Scheduler (see the `soil.time` module.
-- [ ] Integrate `soil.Agent` with `mesa.Agent`:
- - [x] Rename agent.id to unique_id?
- - [x] mesa agents can be used in soil simulations (see `examples/mesa`)
-- [ ] Document the new APIs and usage
-
@Copyright GSI - Universidad Politécnica de Madrid 2017-2021
[![SOIL](logo_gsi.png)](https://www.gsi.upm.es)
diff --git a/docs/configuration.rst b/docs/configuration.rst
index 3d5a88d..223fbbc 100644
--- a/docs/configuration.rst
+++ b/docs/configuration.rst
@@ -13,7 +13,7 @@ Here's an example (``example.yml``).
This example configuration will run three trials (``num_trials``) of a simulation containing a randomly generated network (``network_params``).
-The 100 nodes in the network will be SISaModel agents (``network_agents.agent_type``), which is an agent behavior that is included in Soil.
+The 100 nodes in the network will be SISaModel agents (``network_agents.agent_class``), which is an agent behavior that is included in Soil.
10% of the agents (``weight=1``) will start in the content state, 10% in the discontent state, and the remaining 80% (``weight=8``) in the neutral state.
All agents will have access to the environment (``environment_params``), which only contains one variable, ``prob_infected``.
The state of the agents will be updated every 2 seconds (``interval``).
@@ -116,7 +116,7 @@ Agents
======
Agents are a way of modelling behavior.
-Agents can be characterized with two variables: agent type (``agent_type``) and state.
+Agents can be characterized with two variables: agent type (``agent_class``) and state.
The agent type is a ``soil.Agent`` class, which contains the code that encapsulates the behavior of the agent.
The state is a set of variables, which may change during the simulation, and that the code may use to control the behavior.
All agents provide a ``step`` method either explicitly or implicitly (by inheriting it from a superclass), which controls how the agent will behave in each step of the simulation.
@@ -142,7 +142,7 @@ Hence, every node in the network will be associated to an agent of that type.
.. code:: yaml
- agent_type: SISaModel
+ agent_class: SISaModel
It is also possible to add more than one type of agent to the simulation.
@@ -152,9 +152,9 @@ For instance, with following configuration, it is five times more likely for a n
.. code:: yaml
network_agents:
- - agent_type: SISaModel
+ - agent_class: SISaModel
weight: 1
- - agent_type: CounterModel
+ - agent_class: CounterModel
weight: 5
The third option is to specify the type of agent on the node itself, e.g.:
@@ -165,10 +165,10 @@ The third option is to specify the type of agent on the node itself, e.g.:
topology:
nodes:
- id: first
- agent_type: BaseAgent
+ agent_class: BaseAgent
states:
first:
- agent_type: SISaModel
+ agent_class: SISaModel
This would also work with a randomly generated network:
@@ -179,9 +179,9 @@ This would also work with a randomly generated network:
network:
generator: complete
n: 5
- agent_type: BaseAgent
+ agent_class: BaseAgent
states:
- - agent_type: SISaModel
+ - agent_class: SISaModel
@@ -192,11 +192,11 @@ e.g., to populate the network with SISaModel, roughly 10% of them with a discont
.. code:: yaml
network_agents:
- - agent_type: SISaModel
+ - agent_class: SISaModel
weight: 9
state:
id: neutral
- - agent_type: SISaModel
+ - agent_class: SISaModel
weight: 1
state:
id: discontent
@@ -206,7 +206,7 @@ For instance, to add a state for the two nodes in this configuration:
.. code:: yaml
- agent_type: SISaModel
+ agent_class: SISaModel
network:
generator: complete_graph
n: 2
@@ -231,10 +231,10 @@ These agents are programmed in much the same way as network agents, the only dif
.. code::
environment_agents:
- - agent_type: MyAgent
+ - agent_class: MyAgent
state:
mood: happy
- - agent_type: DummyAgent
+ - agent_class: DummyAgent
You may use environment agents to model events that a normal agent cannot control, such as natural disasters or chance.
diff --git a/docs/example.yml b/docs/example.yml
index 4ef6ef2..1554512 100644
--- a/docs/example.yml
+++ b/docs/example.yml
@@ -8,15 +8,15 @@ network_params:
n: 100
m: 2
network_agents:
- - agent_type: SISaModel
+ - agent_class: SISaModel
weight: 1
state:
id: content
- - agent_type: SISaModel
+ - agent_class: SISaModel
weight: 1
state:
id: discontent
- - agent_type: SISaModel
+ - agent_class: SISaModel
weight: 8
state:
id: neutral
diff --git a/docs/quickstart.yml b/docs/quickstart.yml
index 76ed3e2..3b1f36d 100644
--- a/docs/quickstart.yml
+++ b/docs/quickstart.yml
@@ -3,11 +3,11 @@ name: quickstart
num_trials: 1
max_time: 1000
network_agents:
- - agent_type: SISaModel
+ - agent_class: SISaModel
state:
id: neutral
weight: 1
- - agent_type: SISaModel
+ - agent_class: SISaModel
state:
id: content
weight: 2
diff --git a/docs/soil_tutorial.rst b/docs/soil_tutorial.rst
index 647ae0c..f7eefe9 100644
--- a/docs/soil_tutorial.rst
+++ b/docs/soil_tutorial.rst
@@ -211,11 +211,11 @@ nodes in that network. Notice how node 0 is the only one with a TV.
sim = soil.Simulation(topology=G,
num_trials=1,
max_time=MAX_TIME,
- environment_agents=[{'agent_type': NewsEnvironmentAgent,
+ environment_agents=[{'agent_class': NewsEnvironmentAgent,
'state': {
'event_time': EVENT_TIME
}}],
- network_agents=[{'agent_type': NewsSpread,
+ network_agents=[{'agent_class': NewsSpread,
'weight': 1}],
states={0: {'has_tv': True}},
default_state={'has_tv': False},
@@ -285,14 +285,14 @@ For this demo, we will use a python dictionary:
},
'network_agents': [
{
- 'agent_type': NewsSpread,
+ 'agent_class': NewsSpread,
'weight': 1,
'state': {
'has_tv': False
}
},
{
- 'agent_type': NewsSpread,
+ 'agent_class': NewsSpread,
'weight': 2,
'state': {
'has_tv': True
@@ -300,7 +300,7 @@ For this demo, we will use a python dictionary:
}
],
'environment_agents':[
- {'agent_type': NewsEnvironmentAgent,
+ {'agent_class': NewsEnvironmentAgent,
'state': {
'event_time': 10
}
diff --git a/examples/NewsSpread.ipynb b/examples/NewsSpread.ipynb
index 3f73ff6..87b53f2 100644
--- a/examples/NewsSpread.ipynb
+++ b/examples/NewsSpread.ipynb
@@ -98,11 +98,11 @@
"max_time: 30\r\n",
"name: Sim_all_dumb\r\n",
"network_agents:\r\n",
- "- agent_type: DumbViewer\r\n",
+ "- agent_class: DumbViewer\r\n",
" state:\r\n",
" has_tv: false\r\n",
" weight: 1\r\n",
- "- agent_type: DumbViewer\r\n",
+ "- agent_class: DumbViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" weight: 1\r\n",
@@ -122,19 +122,19 @@
"max_time: 30\r\n",
"name: Sim_half_herd\r\n",
"network_agents:\r\n",
- "- agent_type: DumbViewer\r\n",
+ "- agent_class: DumbViewer\r\n",
" state:\r\n",
" has_tv: false\r\n",
" weight: 1\r\n",
- "- agent_type: DumbViewer\r\n",
+ "- agent_class: DumbViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" weight: 1\r\n",
- "- agent_type: HerdViewer\r\n",
+ "- agent_class: HerdViewer\r\n",
" state:\r\n",
" has_tv: false\r\n",
" weight: 1\r\n",
- "- agent_type: HerdViewer\r\n",
+ "- agent_class: HerdViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" weight: 1\r\n",
@@ -154,12 +154,12 @@
"max_time: 30\r\n",
"name: Sim_all_herd\r\n",
"network_agents:\r\n",
- "- agent_type: HerdViewer\r\n",
+ "- agent_class: HerdViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" id: neutral\r\n",
" weight: 1\r\n",
- "- agent_type: HerdViewer\r\n",
+ "- agent_class: HerdViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" id: neutral\r\n",
@@ -181,12 +181,12 @@
"max_time: 30\r\n",
"name: Sim_wise_herd\r\n",
"network_agents:\r\n",
- "- agent_type: HerdViewer\r\n",
+ "- agent_class: HerdViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" id: neutral\r\n",
" weight: 1\r\n",
- "- agent_type: WiseViewer\r\n",
+ "- agent_class: WiseViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" weight: 1\r\n",
@@ -207,12 +207,12 @@
"max_time: 30\r\n",
"name: Sim_all_wise\r\n",
"network_agents:\r\n",
- "- agent_type: WiseViewer\r\n",
+ "- agent_class: WiseViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" id: neutral\r\n",
" weight: 1\r\n",
- "- agent_type: WiseViewer\r\n",
+ "- agent_class: WiseViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" weight: 1\r\n",
diff --git a/examples/Untitled.ipynb b/examples/Untitled.ipynb
index eb0387f..29e00b1 100644
--- a/examples/Untitled.ipynb
+++ b/examples/Untitled.ipynb
@@ -141,10 +141,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -1758,10 +1758,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -3363,10 +3363,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -4977,10 +4977,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -6591,10 +6591,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -8211,10 +8211,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -9828,10 +9828,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -11448,10 +11448,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -13062,10 +13062,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -14679,10 +14679,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -16296,10 +16296,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -17916,10 +17916,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -19521,10 +19521,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -21144,10 +21144,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -22767,10 +22767,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -24375,10 +24375,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -25992,10 +25992,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -27603,10 +27603,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -29220,10 +29220,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -30819,10 +30819,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -32439,10 +32439,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -34056,10 +34056,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -35676,10 +35676,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -37293,10 +37293,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -38913,10 +38913,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -40518,10 +40518,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -42129,10 +42129,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -43746,10 +43746,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -45357,10 +45357,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -46974,10 +46974,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -48588,10 +48588,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -50202,10 +50202,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -51819,10 +51819,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -53436,10 +53436,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -55041,10 +55041,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -56655,10 +56655,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -58257,10 +58257,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -59877,10 +59877,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -61494,10 +61494,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -63108,10 +63108,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -64713,10 +64713,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -66330,10 +66330,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -67947,10 +67947,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -69561,10 +69561,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -71178,10 +71178,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -72801,10 +72801,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -74418,10 +74418,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -76035,10 +76035,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -77643,10 +77643,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
@@ -79260,10 +79260,10 @@
" 'load_module': 'newsspread',\n",
" 'max_time': 30,\n",
" 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_type': 'DumbViewer',\n",
+ " 'network_agents': [{'agent_class': 'DumbViewer',\n",
" 'state': {'has_tv': False},\n",
" 'weight': 1},\n",
- " {'agent_type': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
+ " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
" 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
" 'num_trials': 50,\n",
" 'seed': 'None',\n",
diff --git a/examples/complete.yml b/examples/complete.yml
index adf1e7e..d33cbaf 100644
--- a/examples/complete.yml
+++ b/examples/complete.yml
@@ -30,6 +30,7 @@ agents:
times: 1
environment:
# In this group we are not specifying any topology
+ topology: False
fixed:
- name: 'Environment Agent 1'
agent_class: CounterModel
diff --git a/examples/custom_generator/custom_generator.yml b/examples/custom_generator/custom_generator.yml
index 8c128f3..12c130d 100644
--- a/examples/custom_generator/custom_generator.yml
+++ b/examples/custom_generator/custom_generator.yml
@@ -10,7 +10,7 @@ network_params:
n: 10
n_edges: 5
network_agents:
- - agent_type: CounterModel
+ - agent_class: CounterModel
weight: 1
state:
state_id: 0
diff --git a/examples/custom_generator/mymodule.py b/examples/custom_generator/mymodule.py
index 4f80510..ef3bacc 100644
--- a/examples/custom_generator/mymodule.py
+++ b/examples/custom_generator/mymodule.py
@@ -1,6 +1,5 @@
from networkx import Graph
import networkx as nx
-from random import choice
def mygenerator(n=5, n_edges=5):
'''
@@ -14,9 +13,9 @@ def mygenerator(n=5, n_edges=5):
for i in range(n_edges):
nodes = list(G.nodes)
- n_in = choice(nodes)
+ n_in = self.random.choice(nodes)
nodes.remove(n_in) # Avoid loops
- n_out = choice(nodes)
+ n_out = self.random.choice(nodes)
G.add_edge(n_in, n_out)
return G
@@ -24,4 +23,4 @@ def mygenerator(n=5, n_edges=5):
-
\ No newline at end of file
+
diff --git a/examples/custom_timeouts/custom_timeouts.py b/examples/custom_timeouts/custom_timeouts.py
index 75cfc91..16b8d66 100644
--- a/examples/custom_timeouts/custom_timeouts.py
+++ b/examples/custom_timeouts/custom_timeouts.py
@@ -27,8 +27,8 @@ if __name__ == '__main__':
import logging
logging.basicConfig(level=logging.INFO)
from soil import Simulation
- s = Simulation(network_agents=[{'ids': [0], 'agent_type': Fibonacci},
- {'ids': [1], 'agent_type': Odds}],
+ s = Simulation(network_agents=[{'ids': [0], 'agent_class': Fibonacci},
+ {'ids': [1], 'agent_class': Odds}],
network_params={"generator": "complete_graph", "n": 2},
max_time=100,
)
diff --git a/examples/mesa/mesa.yml b/examples/mesa/mesa.yml
index 19148a2..a1572f2 100644
--- a/examples/mesa/mesa.yml
+++ b/examples/mesa/mesa.yml
@@ -10,11 +10,11 @@ network_params:
generator: social_wealth.graph_generator
n: 5
network_agents:
- - agent_type: social_wealth.SocialMoneyAgent
+ - agent_class: social_wealth.SocialMoneyAgent
weight: 1
environment_class: social_wealth.MoneyEnv
environment_params:
- mesa_agent_type: social_wealth.MoneyAgent
+ mesa_agent_class: social_wealth.MoneyAgent
N: 10
width: 50
height: 50
diff --git a/examples/mesa/server.py b/examples/mesa/server.py
index e6afecd..fc9b0b1 100644
--- a/examples/mesa/server.py
+++ b/examples/mesa/server.py
@@ -70,7 +70,7 @@ model_params = {
1,
description="Choose how many agents to include in the model",
),
- "network_agents": [{"agent_type": SocialMoneyAgent}],
+ "network_agents": [{"agent_class": SocialMoneyAgent}],
"height": UserSettableParameter(
"slider",
"height",
diff --git a/examples/mesa/social_wealth.py b/examples/mesa/social_wealth.py
index 5f7590b..b20bc9a 100644
--- a/examples/mesa/social_wealth.py
+++ b/examples/mesa/social_wealth.py
@@ -99,7 +99,7 @@ if __name__ == '__main__':
G = graph_generator()
fixed_params = {"topology": G,
"width": 10,
- "network_agents": [{"agent_type": SocialMoneyAgent,
+ "network_agents": [{"agent_class": SocialMoneyAgent,
'weight': 1}],
"height": 10}
diff --git a/examples/newsspread/NewsSpread.ipynb b/examples/newsspread/NewsSpread.ipynb
index 198588a..0c44b6e 100644
--- a/examples/newsspread/NewsSpread.ipynb
+++ b/examples/newsspread/NewsSpread.ipynb
@@ -89,11 +89,11 @@
"max_time: 30\r\n",
"name: Sim_all_dumb\r\n",
"network_agents:\r\n",
- "- agent_type: DumbViewer\r\n",
+ "- agent_class: DumbViewer\r\n",
" state:\r\n",
" has_tv: false\r\n",
" weight: 1\r\n",
- "- agent_type: DumbViewer\r\n",
+ "- agent_class: DumbViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" weight: 1\r\n",
@@ -113,19 +113,19 @@
"max_time: 30\r\n",
"name: Sim_half_herd\r\n",
"network_agents:\r\n",
- "- agent_type: DumbViewer\r\n",
+ "- agent_class: DumbViewer\r\n",
" state:\r\n",
" has_tv: false\r\n",
" weight: 1\r\n",
- "- agent_type: DumbViewer\r\n",
+ "- agent_class: DumbViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" weight: 1\r\n",
- "- agent_type: HerdViewer\r\n",
+ "- agent_class: HerdViewer\r\n",
" state:\r\n",
" has_tv: false\r\n",
" weight: 1\r\n",
- "- agent_type: HerdViewer\r\n",
+ "- agent_class: HerdViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" weight: 1\r\n",
@@ -145,12 +145,12 @@
"max_time: 30\r\n",
"name: Sim_all_herd\r\n",
"network_agents:\r\n",
- "- agent_type: HerdViewer\r\n",
+ "- agent_class: HerdViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" id: neutral\r\n",
" weight: 1\r\n",
- "- agent_type: HerdViewer\r\n",
+ "- agent_class: HerdViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" id: neutral\r\n",
@@ -172,12 +172,12 @@
"max_time: 30\r\n",
"name: Sim_wise_herd\r\n",
"network_agents:\r\n",
- "- agent_type: HerdViewer\r\n",
+ "- agent_class: HerdViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" id: neutral\r\n",
" weight: 1\r\n",
- "- agent_type: WiseViewer\r\n",
+ "- agent_class: WiseViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" weight: 1\r\n",
@@ -198,12 +198,12 @@
"max_time: 30\r\n",
"name: Sim_all_wise\r\n",
"network_agents:\r\n",
- "- agent_type: WiseViewer\r\n",
+ "- agent_class: WiseViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" id: neutral\r\n",
" weight: 1\r\n",
- "- agent_type: WiseViewer\r\n",
+ "- agent_class: WiseViewer\r\n",
" state:\r\n",
" has_tv: true\r\n",
" weight: 1\r\n",
diff --git a/examples/newsspread/NewsSpread.yml b/examples/newsspread/NewsSpread.yml
index 27f8411..10ae525 100644
--- a/examples/newsspread/NewsSpread.yml
+++ b/examples/newsspread/NewsSpread.yml
@@ -8,11 +8,11 @@ interval: 1
max_time: 300
name: Sim_all_dumb
network_agents:
-- agent_type: newsspread.DumbViewer
+- agent_class: newsspread.DumbViewer
state:
has_tv: false
weight: 1
-- agent_type: newsspread.DumbViewer
+- agent_class: newsspread.DumbViewer
state:
has_tv: true
weight: 1
@@ -31,19 +31,19 @@ interval: 1
max_time: 300
name: Sim_half_herd
network_agents:
-- agent_type: newsspread.DumbViewer
+- agent_class: newsspread.DumbViewer
state:
has_tv: false
weight: 1
-- agent_type: newsspread.DumbViewer
+- agent_class: newsspread.DumbViewer
state:
has_tv: true
weight: 1
-- agent_type: newsspread.HerdViewer
+- agent_class: newsspread.HerdViewer
state:
has_tv: false
weight: 1
-- agent_type: newsspread.HerdViewer
+- agent_class: newsspread.HerdViewer
state:
has_tv: true
weight: 1
@@ -62,12 +62,12 @@ interval: 1
max_time: 300
name: Sim_all_herd
network_agents:
-- agent_type: newsspread.HerdViewer
+- agent_class: newsspread.HerdViewer
state:
has_tv: true
state_id: neutral
weight: 1
-- agent_type: newsspread.HerdViewer
+- agent_class: newsspread.HerdViewer
state:
has_tv: true
state_id: neutral
@@ -88,12 +88,12 @@ interval: 1
max_time: 300
name: Sim_wise_herd
network_agents:
-- agent_type: newsspread.HerdViewer
+- agent_class: newsspread.HerdViewer
state:
has_tv: true
state_id: neutral
weight: 1
-- agent_type: newsspread.WiseViewer
+- agent_class: newsspread.WiseViewer
state:
has_tv: true
weight: 1
@@ -113,12 +113,12 @@ interval: 1
max_time: 300
name: Sim_all_wise
network_agents:
-- agent_type: newsspread.WiseViewer
+- agent_class: newsspread.WiseViewer
state:
has_tv: true
state_id: neutral
weight: 1
-- agent_type: newsspread.WiseViewer
+- agent_class: newsspread.WiseViewer
state:
has_tv: true
weight: 1
diff --git a/examples/programmatic/programmatic.py b/examples/programmatic/programmatic.py
index 7c8d54a..3b9f86f 100644
--- a/examples/programmatic/programmatic.py
+++ b/examples/programmatic/programmatic.py
@@ -27,7 +27,7 @@ s = Simulation(name='Programmatic',
network_params={'generator': mygenerator},
num_trials=1,
max_time=100,
- agent_type=MyAgent,
+ agent_class=MyAgent,
dry_run=True)
diff --git a/examples/pubcrawl/pubcrawl.py b/examples/pubcrawl/pubcrawl.py
index e6c92bd..7fc5b5f 100644
--- a/examples/pubcrawl/pubcrawl.py
+++ b/examples/pubcrawl/pubcrawl.py
@@ -1,6 +1,5 @@
from soil.agents import FSM, NetworkAgent, state, default_state
from soil import Environment
-from random import random, shuffle
from itertools import islice
import logging
@@ -128,7 +127,7 @@ class Patron(FSM, NetworkAgent):
Try to become friends with another agent. The chances of
success depend on both agents' openness.
'''
- if force or self['openness'] > random():
+ if force or self['openness'] > self.random.random():
self.env.add_edge(self, other_agent)
self.info('Made some friend {}'.format(other_agent))
return True
@@ -138,7 +137,7 @@ class Patron(FSM, NetworkAgent):
''' Look for random agents around me and try to befriend them'''
befriended = False
k = int(10*self['openness'])
- shuffle(others)
+ self.random.shuffle(others)
for friend in islice(others, k): # random.choice >= 3.7
if friend == self:
continue
diff --git a/examples/pubcrawl/pubcrawl.yml b/examples/pubcrawl/pubcrawl.yml
index 7a464a6..1f83f95 100644
--- a/examples/pubcrawl/pubcrawl.yml
+++ b/examples/pubcrawl/pubcrawl.yml
@@ -8,18 +8,18 @@ network_params:
generator: empty_graph
n: 30
network_agents:
- - agent_type: pubcrawl.Patron
+ - agent_class: pubcrawl.Patron
description: Extroverted patron
state:
openness: 1.0
weight: 9
- - agent_type: pubcrawl.Patron
+ - agent_class: pubcrawl.Patron
description: Introverted patron
state:
openness: 0.1
weight: 1
environment_agents:
- - agent_type: pubcrawl.Police
+ - agent_class: pubcrawl.Police
environment_class: pubcrawl.CityPubs
environment_params:
altercations: 0
diff --git a/examples/rabbits/rabbit_agents.py b/examples/rabbits/rabbit_agents.py
index a70b21a..df371b2 100644
--- a/examples/rabbits/rabbit_agents.py
+++ b/examples/rabbits/rabbit_agents.py
@@ -1,6 +1,5 @@
from soil.agents import FSM, state, default_state, BaseAgent, NetworkAgent
from enum import Enum
-from random import random, choice
import logging
import math
@@ -57,10 +56,10 @@ class Male(RabbitModel):
# Males try to mate
for f in self.get_agents(state_id=Female.fertile.id,
- agent_type=Female,
+ agent_class=Female,
limit_neighbors=False,
limit=self.max_females):
- r = random()
+ r = self.random.random()
if r < self['mating_prob']:
self.impregnate(f)
break # Take a break
@@ -85,11 +84,11 @@ class Female(RabbitModel):
self['pregnancy'] += 1
self.debug('Pregnancy: {}'.format(self['pregnancy']))
if self['pregnancy'] >= self.gestation:
- number_of_babies = int(8+4*random())
+ number_of_babies = int(8+4*self.random.random())
self.info('Having {} babies'.format(number_of_babies))
for i in range(number_of_babies):
state = {}
- state['gender'] = choice(list(Genders)).value
+ state['gender'] = self.random.choice(list(Genders)).value
child = self.env.add_node(self.__class__, state)
self.env.add_edge(self.id, child.id)
self.env.add_edge(self['mate'], child.id)
@@ -124,8 +123,7 @@ class RandomAccident(BaseAgent):
for i in self.env.network_agents:
if i.state['id'] == i.dead.id:
continue
- r = random()
- if r < prob_death:
+ if self.prob(prob_death):
self.debug('I killed a rabbit: {}'.format(i.id))
rabbits_alive = self.env['rabbits_alive'] = rabbits_alive -1
self.log('Rabbits alive: {}'.format(self.env['rabbits_alive']))
diff --git a/examples/rabbits/rabbits.yml b/examples/rabbits/rabbits.yml
index a4ec8e8..1b1d148 100644
--- a/examples/rabbits/rabbits.yml
+++ b/examples/rabbits/rabbits.yml
@@ -3,9 +3,9 @@ name: rabbits_example
max_time: 100
interval: 1
seed: MySeed
-agent_type: rabbit_agents.RabbitModel
+agent_class: rabbit_agents.RabbitModel
environment_agents:
- - agent_type: rabbit_agents.RandomAccident
+ - agent_class: rabbit_agents.RandomAccident
environment_params:
prob_death: 0.001
default_state:
@@ -13,8 +13,8 @@ default_state:
topology:
nodes:
- id: 1
- agent_type: rabbit_agents.Male
+ agent_class: rabbit_agents.Male
- id: 0
- agent_type: rabbit_agents.Female
+ agent_class: rabbit_agents.Female
directed: true
links: []
diff --git a/examples/random_delays/random_delays.py b/examples/random_delays/random_delays.py
index c3a6961..52dd55e 100644
--- a/examples/random_delays/random_delays.py
+++ b/examples/random_delays/random_delays.py
@@ -4,7 +4,6 @@ Example of a fully programmatic simulation, without definition files.
'''
from soil import Simulation, agents
from soil.time import Delta
-from random import expovariate
import logging
@@ -20,7 +19,7 @@ class MyAgent(agents.FSM):
@agents.state
def ping(self):
self.info('Ping')
- return self.pong, Delta(expovariate(1/16))
+ return self.pong, Delta(self.random.expovariate(1/16))
@agents.state
def pong(self):
@@ -29,15 +28,15 @@ class MyAgent(agents.FSM):
self.info(str(self.pong_counts))
if self.pong_counts < 1:
return self.die()
- return None, Delta(expovariate(1/16))
+ return None, Delta(self.random.expovariate(1/16))
s = Simulation(name='Programmatic',
- network_agents=[{'agent_type': MyAgent, 'id': 0}],
+ network_agents=[{'agent_class': MyAgent, 'id': 0}],
topology={'nodes': [{'id': 0}], 'links': []},
num_trials=1,
max_time=100,
- agent_type=MyAgent,
+ agent_class=MyAgent,
dry_run=True)
diff --git a/examples/template.yml b/examples/template.yml
index f61757d..a307eff 100644
--- a/examples/template.yml
+++ b/examples/template.yml
@@ -13,11 +13,11 @@ template:
generator: complete_graph
n: 10
network_agents:
- - agent_type: CounterModel
+ - agent_class: CounterModel
weight: "{{ x1 }}"
state:
state_id: 0
- - agent_type: AggregatedCounter
+ - agent_class: AggregatedCounter
weight: "{{ 1 - x1 }}"
environment_params:
name: "{{ x3 }}"
diff --git a/examples/terrorism/TerroristNetworkModel.py b/examples/terrorism/TerroristNetworkModel.py
index 3cdc675..2fa6de4 100644
--- a/examples/terrorism/TerroristNetworkModel.py
+++ b/examples/terrorism/TerroristNetworkModel.py
@@ -1,4 +1,3 @@
-import random
import networkx as nx
from soil.agents import Geo, NetworkAgent, FSM, state, default_state
from soil import Environment
@@ -26,26 +25,26 @@ class TerroristSpreadModel(FSM, Geo):
self.prob_interaction = model.environment_params['prob_interaction']
if self['id'] == self.civilian.id: # Civilian
- self.mean_belief = random.uniform(0.00, 0.5)
+ self.mean_belief = self.random.uniform(0.00, 0.5)
elif self['id'] == self.terrorist.id: # Terrorist
- self.mean_belief = random.uniform(0.8, 1.00)
+ self.mean_belief = self.random.uniform(0.8, 1.00)
elif self['id'] == self.leader.id: # Leader
self.mean_belief = 1.00
else:
raise Exception('Invalid state id: {}'.format(self['id']))
if 'min_vulnerability' in model.environment_params:
- self.vulnerability = random.uniform( model.environment_params['min_vulnerability'], model.environment_params['max_vulnerability'] )
+ self.vulnerability = self.random.uniform( model.environment_params['min_vulnerability'], model.environment_params['max_vulnerability'] )
else :
- self.vulnerability = random.uniform( 0, model.environment_params['max_vulnerability'] )
+ self.vulnerability = self.random.uniform( 0, model.environment_params['max_vulnerability'] )
@state
def civilian(self):
- neighbours = list(self.get_neighboring_agents(agent_type=TerroristSpreadModel))
+ neighbours = list(self.get_neighboring_agents(agent_class=TerroristSpreadModel))
if len(neighbours) > 0:
# Only interact with some of the neighbors
- interactions = list(n for n in neighbours if random.random() <= self.prob_interaction)
+ interactions = list(n for n in neighbours if self.random.random() <= self.prob_interaction)
influence = sum( self.degree(i) for i in interactions )
mean_belief = sum( i.mean_belief * self.degree(i) / influence for i in interactions )
mean_belief = mean_belief * self.information_spread_intensity + self.mean_belief * ( 1 - self.information_spread_intensity )
@@ -64,7 +63,7 @@ class TerroristSpreadModel(FSM, Geo):
@state
def terrorist(self):
neighbours = self.get_agents(state_id=[self.terrorist.id, self.leader.id],
- agent_type=TerroristSpreadModel,
+ agent_class=TerroristSpreadModel,
limit_neighbors=True)
if len(neighbours) > 0:
influence = sum( self.degree(n) for n in neighbours )
@@ -103,7 +102,7 @@ class TrainingAreaModel(FSM, Geo):
@default_state
@state
def terrorist(self):
- for neighbour in self.get_neighboring_agents(agent_type=TerroristSpreadModel):
+ for neighbour in self.get_neighboring_agents(agent_class=TerroristSpreadModel):
if neighbour.vulnerability > self.min_vulnerability:
neighbour.vulnerability = neighbour.vulnerability ** ( 1 - self.training_influence )
@@ -129,7 +128,7 @@ class HavenModel(FSM, Geo):
self.max_vulnerability = model.environment_params['max_vulnerability']
def get_occupants(self, **kwargs):
- return self.get_neighboring_agents(agent_type=TerroristSpreadModel, **kwargs)
+ return self.get_neighboring_agents(agent_class=TerroristSpreadModel, **kwargs)
@state
def civilian(self):
@@ -182,15 +181,15 @@ class TerroristNetworkModel(TerroristSpreadModel):
def update_relationships(self):
if self.count_neighboring_agents(state_id=self.civilian.id) == 0:
- close_ups = set(self.geo_search(radius=self.vision_range, agent_type=TerroristNetworkModel))
- step_neighbours = set(self.ego_search(self.sphere_influence, agent_type=TerroristNetworkModel, center=False))
- neighbours = set(agent.id for agent in self.get_neighboring_agents(agent_type=TerroristNetworkModel))
+ close_ups = set(self.geo_search(radius=self.vision_range, agent_class=TerroristNetworkModel))
+ step_neighbours = set(self.ego_search(self.sphere_influence, agent_class=TerroristNetworkModel, center=False))
+ neighbours = set(agent.id for agent in self.get_neighboring_agents(agent_class=TerroristNetworkModel))
search = (close_ups | step_neighbours) - neighbours
for agent in self.get_agents(search):
social_distance = 1 / self.shortest_path_length(agent.id)
spatial_proximity = ( 1 - self.get_distance(agent.id) )
prob_new_interaction = self.weight_social_distance * social_distance + self.weight_link_distance * spatial_proximity
- if agent['id'] == agent.civilian.id and random.random() < prob_new_interaction:
+ if agent['id'] == agent.civilian.id and self.random.random() < prob_new_interaction:
self.add_edge(agent)
break
diff --git a/examples/terrorism/TerroristNetworkModel.yml b/examples/terrorism/TerroristNetworkModel.yml
index 45dd1aa..b5a3d09 100644
--- a/examples/terrorism/TerroristNetworkModel.yml
+++ b/examples/terrorism/TerroristNetworkModel.yml
@@ -8,19 +8,19 @@ network_params:
# theta: 20
n: 100
network_agents:
- - agent_type: TerroristNetworkModel.TerroristNetworkModel
+ - agent_class: TerroristNetworkModel.TerroristNetworkModel
weight: 0.8
state:
id: civilian # Civilians
- - agent_type: TerroristNetworkModel.TerroristNetworkModel
+ - agent_class: TerroristNetworkModel.TerroristNetworkModel
weight: 0.1
state:
id: leader # Leaders
- - agent_type: TerroristNetworkModel.TrainingAreaModel
+ - agent_class: TerroristNetworkModel.TrainingAreaModel
weight: 0.05
state:
id: terrorist # Terrorism
- - agent_type: TerroristNetworkModel.HavenModel
+ - agent_class: TerroristNetworkModel.HavenModel
weight: 0.05
state:
id: civilian # Civilian
diff --git a/examples/torvalds.yml b/examples/torvalds.yml
index e338163..421e2ac 100644
--- a/examples/torvalds.yml
+++ b/examples/torvalds.yml
@@ -2,7 +2,7 @@
name: torvalds_example
max_time: 10
interval: 2
-agent_type: CounterModel
+agent_class: CounterModel
default_state:
skill_level: 'beginner'
network_params:
diff --git a/examples/tutorial/soil_tutorial.html b/examples/tutorial/soil_tutorial.html
index f93ca03..3f98f61 100644
--- a/examples/tutorial/soil_tutorial.html
+++ b/examples/tutorial/soil_tutorial.html
@@ -12330,11 +12330,11 @@ Notice how node 0 is the only one with a TV.
sim = soil.Simulation(topology=G,
num_trials=1,
max_time=MAX_TIME,
- environment_agents=[{'agent_type': NewsEnvironmentAgent,
+ environment_agents=[{'agent_class': NewsEnvironmentAgent,
'state': {
'event_time': EVENT_TIME
}}],
- network_agents=[{'agent_type': NewsSpread,
+ network_agents=[{'agent_class': NewsSpread,
'weight': 1}],
states={0: {'has_tv': True}},
default_state={'has_tv': False},
@@ -12468,14 +12468,14 @@ For this demo, we will use a python dictionary:
},
'network_agents': [
{
- 'agent_type': NewsSpread,
+ 'agent_class': NewsSpread,
'weight': 1,
'state': {
'has_tv': False
}
},
{
- 'agent_type': NewsSpread,
+ 'agent_class': NewsSpread,
'weight': 2,
'state': {
'has_tv': True
@@ -12483,7 +12483,7 @@ For this demo, we will use a python dictionary:
}
],
'environment_agents':[
- {'agent_type': NewsEnvironmentAgent,
+ {'agent_class': NewsEnvironmentAgent,
'state': {
'event_time': 10
}
diff --git a/examples/tutorial/soil_tutorial.ipynb b/examples/tutorial/soil_tutorial.ipynb
index 3e0ff2d..7599ab2 100644
--- a/examples/tutorial/soil_tutorial.ipynb
+++ b/examples/tutorial/soil_tutorial.ipynb
@@ -459,11 +459,11 @@
"sim = soil.Simulation(topology=G,\n",
" num_trials=1,\n",
" max_time=MAX_TIME,\n",
- " environment_agents=[{'agent_type': NewsEnvironmentAgent,\n",
+ " environment_agents=[{'agent_class': NewsEnvironmentAgent,\n",
" 'state': {\n",
" 'event_time': EVENT_TIME\n",
" }}],\n",
- " network_agents=[{'agent_type': NewsSpread,\n",
+ " network_agents=[{'agent_class': NewsSpread,\n",
" 'weight': 1}],\n",
" states={0: {'has_tv': True}},\n",
" default_state={'has_tv': False},\n",
@@ -588,14 +588,14 @@
" },\n",
" 'network_agents': [\n",
" {\n",
- " 'agent_type': NewsSpread,\n",
+ " 'agent_class': NewsSpread,\n",
" 'weight': 1,\n",
" 'state': {\n",
" 'has_tv': False\n",
" }\n",
" },\n",
" {\n",
- " 'agent_type': NewsSpread,\n",
+ " 'agent_class': NewsSpread,\n",
" 'weight': 2,\n",
" 'state': {\n",
" 'has_tv': True\n",
@@ -603,7 +603,7 @@
" }\n",
" ],\n",
" 'environment_agents':[\n",
- " {'agent_type': NewsEnvironmentAgent,\n",
+ " {'agent_class': NewsEnvironmentAgent,\n",
" 'state': {\n",
" 'event_time': 10\n",
" }\n",
diff --git a/soil/agents/BassModel.py b/soil/agents/BassModel.py
index cba6790..e3f5015 100644
--- a/soil/agents/BassModel.py
+++ b/soil/agents/BassModel.py
@@ -1,4 +1,3 @@
-import random
from . import FSM, state, default_state
@@ -16,13 +15,13 @@ class BassModel(FSM):
@default_state
@state
def innovation(self):
- if random.random() < self.innovation_prob:
+ if self.prob(self.innovation_prob):
self.sentimentCorrelation = 1
return self.aware
else:
aware_neighbors = self.get_neighboring_agents(state_id=self.aware.id)
num_neighbors_aware = len(aware_neighbors)
- if random.random() < (self['imitation_prob']*num_neighbors_aware):
+ if self.prob((self['imitation_prob']*num_neighbors_aware)):
self.sentimentCorrelation = 1
return self.aware
diff --git a/soil/agents/BigMarketModel.py b/soil/agents/BigMarketModel.py
index fbc3ba5..7db663d 100644
--- a/soil/agents/BigMarketModel.py
+++ b/soil/agents/BigMarketModel.py
@@ -1,4 +1,3 @@
-import random
from . import FSM, state, default_state
@@ -39,10 +38,10 @@ class BigMarketModel(FSM):
@state
def enterprise(self):
- if random.random() < self.tweet_probability: # Tweets
+ if self.random.random() < self.tweet_probability: # Tweets
aware_neighbors = self.get_neighboring_agents(state_id=self.number_of_enterprises) # Nodes neighbour users
for x in aware_neighbors:
- if random.uniform(0,10) < 5:
+ if self.random.uniform(0,10) < 5:
x.sentiment_about[self.id] += 0.1 # Increments for enterprise
else:
x.sentiment_about[self.id] -= 0.1 # Decrements for enterprise
@@ -57,11 +56,11 @@ class BigMarketModel(FSM):
@state
def user(self):
- if random.random() < self.tweet_probability: # Tweets
- if random.random() < self.tweet_relevant_probability: # Tweets something relevant
+ if self.random.random() < self.tweet_probability: # Tweets
+ if self.random.random() < self.tweet_relevant_probability: # Tweets something relevant
# Tweet probability per enterprise
for i in range(len(self.enterprises)):
- random_num = random.random()
+ random_num = self.random.random()
if random_num < self.tweet_probability_about[i]:
# The condition is fulfilled, sentiments are evaluated towards that enterprise
if self.sentiment_about[i] < 0:
diff --git a/soil/agents/IndependentCascadeModel.py b/soil/agents/IndependentCascadeModel.py
index ab5a8a8..e927a6f 100644
--- a/soil/agents/IndependentCascadeModel.py
+++ b/soil/agents/IndependentCascadeModel.py
@@ -1,4 +1,3 @@
-import random
from . import BaseAgent
@@ -23,7 +22,7 @@ class IndependentCascadeModel(BaseAgent):
def behaviour(self):
aware_neighbors_1_time_step = []
# Outside effects
- if random.random() < self.innovation_prob:
+ if self.prob(self.innovation_prob):
if self.state['id'] == 0:
self.state['id'] = 1
self.state['sentimentCorrelation'] = 1
@@ -40,7 +39,7 @@ class IndependentCascadeModel(BaseAgent):
if x.state['time_awareness'] == (self.env.now-1):
aware_neighbors_1_time_step.append(x)
num_neighbors_aware = len(aware_neighbors_1_time_step)
- if random.random() < (self.imitation_prob*num_neighbors_aware):
+ if self.prob(self.imitation_prob*num_neighbors_aware):
self.state['id'] = 1
self.state['sentimentCorrelation'] = 1
else:
diff --git a/soil/agents/ModelM2.py b/soil/agents/ModelM2.py
index ec0f98d..dec6b97 100644
--- a/soil/agents/ModelM2.py
+++ b/soil/agents/ModelM2.py
@@ -1,4 +1,3 @@
-import random
import numpy as np
from . import BaseAgent
@@ -24,23 +23,26 @@ class SpreadModelM2(BaseAgent):
def __init__(self, model=None, unique_id=0, state=()):
super().__init__(model=environment, unique_id=unique_id, state=state)
- self.prob_neutral_making_denier = np.random.normal(environment.environment_params['prob_neutral_making_denier'],
- environment.environment_params['standard_variance'])
- self.prob_infect = np.random.normal(environment.environment_params['prob_infect'],
- environment.environment_params['standard_variance'])
+ # Use a single generator with the same seed as `self.random`
+ random = np.random.default_rng(seed=self._seed)
+ self.prob_neutral_making_denier = random.normal(environment.environment_params['prob_neutral_making_denier'],
+ environment.environment_params['standard_variance'])
- self.prob_cured_healing_infected = np.random.normal(environment.environment_params['prob_cured_healing_infected'],
- environment.environment_params['standard_variance'])
- self.prob_cured_vaccinate_neutral = np.random.normal(environment.environment_params['prob_cured_vaccinate_neutral'],
- environment.environment_params['standard_variance'])
+ self.prob_infect = random.normal(environment.environment_params['prob_infect'],
+ environment.environment_params['standard_variance'])
- self.prob_vaccinated_healing_infected = np.random.normal(environment.environment_params['prob_vaccinated_healing_infected'],
- environment.environment_params['standard_variance'])
- self.prob_vaccinated_vaccinate_neutral = np.random.normal(environment.environment_params['prob_vaccinated_vaccinate_neutral'],
- environment.environment_params['standard_variance'])
- self.prob_generate_anti_rumor = np.random.normal(environment.environment_params['prob_generate_anti_rumor'],
+ self.prob_cured_healing_infected = random.normal(environment.environment_params['prob_cured_healing_infected'],
environment.environment_params['standard_variance'])
+ self.prob_cured_vaccinate_neutral = random.normal(environment.environment_params['prob_cured_vaccinate_neutral'],
+ environment.environment_params['standard_variance'])
+
+ self.prob_vaccinated_healing_infected = random.normal(environment.environment_params['prob_vaccinated_healing_infected'],
+ environment.environment_params['standard_variance'])
+ self.prob_vaccinated_vaccinate_neutral = random.normal(environment.environment_params['prob_vaccinated_vaccinate_neutral'],
+ environment.environment_params['standard_variance'])
+ self.prob_generate_anti_rumor = random.normal(environment.environment_params['prob_generate_anti_rumor'],
+ environment.environment_params['standard_variance'])
def step(self):
@@ -58,7 +60,7 @@ class SpreadModelM2(BaseAgent):
# Infected
infected_neighbors = self.get_neighboring_agents(state_id=1)
if len(infected_neighbors) > 0:
- if random.random() < self.prob_neutral_making_denier:
+ if self.prob(self.prob_neutral_making_denier):
self.state['id'] = 3 # Vaccinated making denier
def infected_behaviour(self):
@@ -66,7 +68,7 @@ class SpreadModelM2(BaseAgent):
# Neutral
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
- if random.random() < self.prob_infect:
+ if self.prob(self.prob_infect):
neighbor.state['id'] = 1 # Infected
def cured_behaviour(self):
@@ -74,13 +76,13 @@ class SpreadModelM2(BaseAgent):
# Vaccinate
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
- if random.random() < self.prob_cured_vaccinate_neutral:
+ if self.prob(self.prob_cured_vaccinate_neutral):
neighbor.state['id'] = 3 # Vaccinated
# Cure
infected_neighbors = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors:
- if random.random() < self.prob_cured_healing_infected:
+ if self.prob(self.prob_cured_healing_infected):
neighbor.state['id'] = 2 # Cured
def vaccinated_behaviour(self):
@@ -88,19 +90,19 @@ class SpreadModelM2(BaseAgent):
# Cure
infected_neighbors = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors:
- if random.random() < self.prob_cured_healing_infected:
+ if self.prob(self.prob_cured_healing_infected):
neighbor.state['id'] = 2 # Cured
# Vaccinate
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
- if random.random() < self.prob_cured_vaccinate_neutral:
+ if self.prob(self.prob_cured_vaccinate_neutral):
neighbor.state['id'] = 3 # Vaccinated
# Generate anti-rumor
infected_neighbors_2 = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors_2:
- if random.random() < self.prob_generate_anti_rumor:
+ if self.prob(self.prob_generate_anti_rumor):
neighbor.state['id'] = 2 # Cured
@@ -165,7 +167,7 @@ class ControlModelM2(BaseAgent):
# Infected
infected_neighbors = self.get_neighboring_agents(state_id=1)
if len(infected_neighbors) > 0:
- if random.random() < self.prob_neutral_making_denier:
+ if self.random(self.prob_neutral_making_denier):
self.state['id'] = 3 # Vaccinated making denier
def infected_behaviour(self):
@@ -173,7 +175,7 @@ class ControlModelM2(BaseAgent):
# Neutral
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
- if random.random() < self.prob_infect:
+ if self.prob(self.prob_infect):
neighbor.state['id'] = 1 # Infected
self.state['visible'] = False
@@ -183,13 +185,13 @@ class ControlModelM2(BaseAgent):
# Vaccinate
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
- if random.random() < self.prob_cured_vaccinate_neutral:
+ if self.prob(self.prob_cured_vaccinate_neutral):
neighbor.state['id'] = 3 # Vaccinated
# Cure
infected_neighbors = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors:
- if random.random() < self.prob_cured_healing_infected:
+ if self.prob(self.prob_cured_healing_infected):
neighbor.state['id'] = 2 # Cured
def vaccinated_behaviour(self):
@@ -198,19 +200,19 @@ class ControlModelM2(BaseAgent):
# Cure
infected_neighbors = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors:
- if random.random() < self.prob_cured_healing_infected:
+ if self.prob(self.prob_cured_healing_infected):
neighbor.state['id'] = 2 # Cured
# Vaccinate
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
- if random.random() < self.prob_cured_vaccinate_neutral:
+ if self.prob(self.prob_cured_vaccinate_neutral):
neighbor.state['id'] = 3 # Vaccinated
# Generate anti-rumor
infected_neighbors_2 = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors_2:
- if random.random() < self.prob_generate_anti_rumor:
+ if self.prob(self.prob_generate_anti_rumor):
neighbor.state['id'] = 2 # Cured
def beacon_off_behaviour(self):
@@ -224,19 +226,19 @@ class ControlModelM2(BaseAgent):
# Cure (M2 feature added)
infected_neighbors = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors:
- if random.random() < self.prob_generate_anti_rumor:
+ if self.prob(self.prob_generate_anti_rumor):
neighbor.state['id'] = 2 # Cured
neutral_neighbors_infected = neighbor.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors_infected:
- if random.random() < self.prob_generate_anti_rumor:
+ if self.prob(self.prob_generate_anti_rumor):
neighbor.state['id'] = 3 # Vaccinated
infected_neighbors_infected = neighbor.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors_infected:
- if random.random() < self.prob_generate_anti_rumor:
+ if self.prob(self.prob_generate_anti_rumor):
neighbor.state['id'] = 2 # Cured
# Vaccinate
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
- if random.random() < self.prob_cured_vaccinate_neutral:
+ if self.prob(self.prob_cured_vaccinate_neutral):
neighbor.state['id'] = 3 # Vaccinated
diff --git a/soil/agents/SISaModel.py b/soil/agents/SISaModel.py
index 4b66087..fa0d224 100644
--- a/soil/agents/SISaModel.py
+++ b/soil/agents/SISaModel.py
@@ -1,4 +1,3 @@
-import random
import numpy as np
from . import FSM, state
@@ -32,62 +31,64 @@ class SISaModel(FSM):
def __init__(self, environment, unique_id=0, state=()):
super().__init__(model=environment, unique_id=unique_id, state=state)
- self.neutral_discontent_spon_prob = np.random.normal(self.env['neutral_discontent_spon_prob'],
+ random = np.random.default_rng(seed=self._seed)
+
+ self.neutral_discontent_spon_prob = random.normal(self.env['neutral_discontent_spon_prob'],
self.env['standard_variance'])
- self.neutral_discontent_infected_prob = np.random.normal(self.env['neutral_discontent_infected_prob'],
+ self.neutral_discontent_infected_prob = random.normal(self.env['neutral_discontent_infected_prob'],
self.env['standard_variance'])
- self.neutral_content_spon_prob = np.random.normal(self.env['neutral_content_spon_prob'],
+ self.neutral_content_spon_prob = random.normal(self.env['neutral_content_spon_prob'],
self.env['standard_variance'])
- self.neutral_content_infected_prob = np.random.normal(self.env['neutral_content_infected_prob'],
+ self.neutral_content_infected_prob = random.normal(self.env['neutral_content_infected_prob'],
self.env['standard_variance'])
- self.discontent_neutral = np.random.normal(self.env['discontent_neutral'],
+ self.discontent_neutral = random.normal(self.env['discontent_neutral'],
self.env['standard_variance'])
- self.discontent_content = np.random.normal(self.env['discontent_content'],
+ self.discontent_content = random.normal(self.env['discontent_content'],
self.env['variance_d_c'])
- self.content_discontent = np.random.normal(self.env['content_discontent'],
+ self.content_discontent = random.normal(self.env['content_discontent'],
self.env['variance_c_d'])
- self.content_neutral = np.random.normal(self.env['content_neutral'],
+ self.content_neutral = random.normal(self.env['content_neutral'],
self.env['standard_variance'])
@state
def neutral(self):
# Spontaneous effects
- if random.random() < self.neutral_discontent_spon_prob:
+ if self.prob(self.neutral_discontent_spon_prob):
return self.discontent
- if random.random() < self.neutral_content_spon_prob:
+ if self.prob(self.neutral_content_spon_prob):
return self.content
# Infected
discontent_neighbors = self.count_neighboring_agents(state_id=self.discontent)
- if random.random() < discontent_neighbors * self.neutral_discontent_infected_prob:
+ if self.prob(scontent_neighbors * self.neutral_discontent_infected_prob):
return self.discontent
content_neighbors = self.count_neighboring_agents(state_id=self.content.id)
- if random.random() < content_neighbors * self.neutral_content_infected_prob:
+ if self.prob(s * self.neutral_content_infected_prob):
return self.content
return self.neutral
@state
def discontent(self):
# Healing
- if random.random() < self.discontent_neutral:
+ if self.prob(self.discontent_neutral):
return self.neutral
# Superinfected
content_neighbors = self.count_neighboring_agents(state_id=self.content.id)
- if random.random() < content_neighbors * self.discontent_content:
+ if self.prob(s * self.discontent_content):
return self.content
return self.discontent
@state
def content(self):
# Healing
- if random.random() < self.content_neutral:
+ if self.prob(self.content_neutral):
return self.neutral
# Superinfected
discontent_neighbors = self.count_neighboring_agents(state_id=self.discontent.id)
- if random.random() < discontent_neighbors * self.content_discontent:
+ if self.prob(scontent_neighbors * self.content_discontent):
self.discontent
return self.content
diff --git a/soil/agents/SentimentCorrelationModel.py b/soil/agents/SentimentCorrelationModel.py
index 7c12d7b..96907aa 100644
--- a/soil/agents/SentimentCorrelationModel.py
+++ b/soil/agents/SentimentCorrelationModel.py
@@ -1,4 +1,3 @@
-import random
from . import BaseAgent
@@ -68,10 +67,10 @@ class SentimentCorrelationModel(BaseAgent):
disgust_prob = self.disgust_prob+(len(disgusted_neighbors_1_time_step)*self.disgust_prob)
outside_effects_prob = self.outside_effects_prob
- num = random.random()
+ num = self.random.random()
if num= 3.10
nodeId = int
@@ -125,10 +112,18 @@ class AgentConfig(SingleAgentConfig):
class Config(BaseModel, extra=Extra.forbid):
version: Optional[str] = '1'
- general: General = General.default()
- topologies: Optional[Dict[str, NetConfig]] = {}
- environment: EnvConfig = EnvConfig.default()
- agents: Optional[Dict[str, AgentConfig]] = {}
+
+ id: str = 'Unnamed Simulation'
+ group: str = None
+ dir_path: Optional[str] = None
+ num_trials: int = 1
+ max_time: float = 100
+ interval: float = 1
+ seed: str = ""
+
+ model_class: Union[Type, str]
+ model_parameters: Optiona[Dict[str, Any]] = {}
+
def convert_old(old, strict=True):
'''
@@ -137,10 +132,14 @@ def convert_old(old, strict=True):
This is still a work in progress and might not work in many cases.
'''
+ #TODO: implement actual conversion
+ print('The old configuration format is no longer supported. \
+ Update your config files or run Soil==0.20')
+ raise NotImplementedError()
+
new = {}
-
general = {}
for k in ['id',
'group',
@@ -173,8 +172,8 @@ def convert_old(old, strict=True):
'default': {},
}
- if 'agent_type' in old:
- agents['default']['agent_class'] = old['agent_type']
+ if 'agent_class' in old:
+ agents['default']['agent_class'] = old['agent_class']
if 'default_state' in old:
agents['default']['state'] = old['default_state']
@@ -182,8 +181,8 @@ def convert_old(old, strict=True):
def updated_agent(agent):
newagent = dict(agent)
- newagent['agent_class'] = newagent['agent_type']
- del newagent['agent_type']
+ newagent['agent_class'] = newagent['agent_class']
+ del newagent['agent_class']
return newagent
for agent in old.get('environment_agents', []):
@@ -207,9 +206,9 @@ def convert_old(old, strict=True):
else:
by_weight.append(agent)
- if 'agent_type' in old and (not fixed and not by_weight):
+ if 'agent_class' in old and (not fixed and not by_weight):
agents['network']['topology'] = 'default'
- by_weight = [{'agent_class': old['agent_type']}]
+ by_weight = [{'agent_class': old['agent_class']}]
# TODO: translate states properly
diff --git a/soil/datacollection.py b/soil/datacollection.py
index 979c7bd..a889a76 100644
--- a/soil/datacollection.py
+++ b/soil/datacollection.py
@@ -2,23 +2,5 @@ from mesa import DataCollector as MDC
class SoilDataCollector(MDC):
-
- def __init__(self, environment, *args, **kwargs):
+ def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
- # Populate model and env reporters so they have a key per
- # So they can be shown in the web interface
- self.environment = environment
- raise NotImplementedError()
-
- @property
- def model_vars(self):
- raise NotImplementedError()
-
- @model_vars.setter
- def model_vars(self, value):
- raise NotImplementedError()
-
- @property
- def agent_reporters(self):
- raise NotImplementedError()
-
diff --git a/soil/environment.py b/soil/environment.py
index 9e00f36..2f59553 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -5,7 +5,7 @@ import math
import random
import logging
-from typing import Dict
+from typing import Any, Dict, Optional, Union
from collections import namedtuple
from time import time as current_time
from copy import deepcopy
@@ -17,20 +17,24 @@ import networkx as nx
from mesa import Model
from mesa.datacollection import DataCollector
-from . import serialization, agents, analysis, utils, time, config, network
+from . import serialization, analysis, utils, time, network
+
+from .agents import AgentView, BaseAgent, NetworkAgent, from_config as agents_from_config
Record = namedtuple('Record', 'dict_id t_step key value')
-class Environment(Model):
+class BaseEnvironment(Model):
"""
- The environment is key in a simulation. It contains the network topology,
- a reference to network and environment agents, as well as the environment
- params, which are used as shared state between agents.
+ The environment is key in a simulation. It controls how agents interact,
+ and what information is available to them.
+
+ This is an opinionated version of `mesa.Model` class, which adds many
+ convenience methods and abstractions.
The environment parameters and the state of every agent can be accessed
- both by using the environment as a dictionary or with the environment's
+ both by using the environment as a dictionary and with the environment's
:meth:`soil.environment.Environment.get` method.
"""
@@ -40,67 +44,62 @@ class Environment(Model):
schedule=None,
dir_path=None,
interval=1,
- agents: Dict[str, config.AgentConfig] = {},
- topologies: Dict[str, config.NetConfig] = {},
+ agent_class=BaseAgent,
+ agents: [tuple[type, Dict[str, Any]]] = {},
agent_reporters: Optional[Any] = None,
model_reporters: Optional[Any] = None,
tables: Optional[Any] = None,
**env_params):
- super().__init__()
+ super().__init__(seed=seed)
self.current_id = -1
- self.seed = '{}_{}'.format(seed, env_id)
self.id = env_id
self.dir_path = dir_path or os.getcwd()
if schedule is None:
- schedule = time.TimedActivation()
+ schedule = time.TimedActivation(self)
self.schedule = schedule
- seed = seed or current_time()
+ self.agent_class = agent_class
- random.seed(seed)
-
-
- self.topologies = {}
- self._node_ids = {}
- for (name, cfg) in topologies.items():
- self.set_topology(cfg=cfg,
- graph=name)
- self.agents = agents or {}
+ self.init_agents(agents)
self.env_params = env_params or {}
self.interval = interval
- self['SEED'] = seed
self.logger = utils.logger.getChild(self.id)
- self.datacollector = DataCollector(model_reporters, agent_reporters, tables)
+
+ self.datacollector = DataCollector(
+ model_reporters=model_reporters,
+ agent_reporters=agent_reporters,
+ tables=tables,
+ )
+
+ def __read_agent_tuple(self, tup):
+ cls = self.agent_class
+ args = tup
+ if isinstance(tup, tuple):
+ cls = tup[0]
+ args = tup[1]
+ return serialization.deserialize(cls)(unique_id=self.next_id(),
+ model=self, **args)
+
+ def init_agents(self, agents: [tuple[type, Dict[str, Any]]] = {}):
+ agents = [self.__read_agent_tuple(tup) for tup in agents]
+ self._agents = {'default': {agent.id: agent for agent in agents}}
@property
- def topology(self):
- return self.topologies['default']
+ def agents(self):
+ return AgentView(self._agents)
- @property
- def network_agents(self):
- yield from self.agents(agent_class=agents.NetworkAgent)
-
- @staticmethod
- def from_config(conf: config.Config, trial_id, **kwargs) -> Environment:
- '''Create an environment for a trial of the simulation'''
- conf = conf
- if kwargs:
- conf = config.Config(**conf.dict(exclude_defaults=True), **kwargs)
- seed = '{}_{}'.format(conf.general.seed, trial_id)
- id = '{}_trial_{}'.format(conf.general.id, trial_id).replace('.', '-')
- opts = conf.environment.params.copy()
- dir_path = conf.general.dir_path
- opts.update(conf)
- opts.update(kwargs)
- env = serialization.deserialize(conf.environment.environment_class)(env_id=id, seed=seed, dir_path=dir_path, **opts)
- return env
+ def find_one(self, *args, **kwargs):
+ return AgentView(self._agents).one(*args, **kwargs)
+
+ def count_agents(self, *args, **kwargs):
+ return sum(1 for i in self.agents(*args, **kwargs))
@property
def now(self):
@@ -109,115 +108,42 @@ class Environment(Model):
raise Exception('The environment has not been scheduled, so it has no sense of time')
- def topology_for(self, agent_id):
- return self.topologies[self._node_ids[agent_id][0]]
+ # def init_agent(self, agent_id, agent_definitions, state=None):
+ # state = state or {}
- def node_id_for(self, agent_id):
- return self._node_ids[agent_id][1]
+ # agent_class = None
+ # if 'agent_class' in self.states.get(agent_id, {}):
+ # agent_class = self.states[agent_id]['agent_class']
+ # elif 'agent_class' in self.default_state:
+ # agent_class = self.default_state['agent_class']
- def set_topology(self, cfg=None, dir_path=None, graph='default'):
- topology = cfg
- if not isinstance(cfg, nx.Graph):
- topology = network.from_config(cfg, dir_path=dir_path or self.dir_path)
-
- self.topologies[graph] = topology
-
- @property
- def agents(self):
- return agents.AgentView(self._agents)
-
- def count_agents(self, *args, **kwargs):
- return sum(1 for i in self.find_all(*args, **kwargs))
-
- def find_all(self, *args, **kwargs):
- return agents.AgentView(self._agents).filter(*args, **kwargs)
-
- def find_one(self, *args, **kwargs):
- return agents.AgentView(self._agents).one(*args, **kwargs)
-
- @agents.setter
- def agents(self, agents_def: Dict[str, config.AgentConfig]):
- self._agents = agents.from_config(agents_def, env=self)
- for d in self._agents.values():
- for a in d.values():
- self.schedule.add(a)
-
- def init_agent(self, agent_id, agent_definitions, graph='default'):
- node = self.topologies[graph].nodes[agent_id]
- init = False
- state = dict(node)
-
- agent_class = None
- if 'agent_class' in self.states.get(agent_id, {}):
- agent_class = self.states[agent_id]['agent_class']
- elif 'agent_class' in node:
- agent_class = node['agent_class']
- elif 'agent_class' in self.default_state:
- agent_class = self.default_state['agent_class']
-
- if agent_class:
- agent_class = agents.deserialize_type(agent_class)
- elif agent_definitions:
- agent_class, state = agents._agent_from_definition(agent_definitions, unique_id=agent_id)
- else:
- serialization.logger.debug('Skipping node {}'.format(agent_id))
- return
- return self.set_agent(agent_id, agent_class, state)
-
- def agent_to_node(self, agent_id, graph_name='default', node_id=None, shuffle=False):
- #TODO: test
- if node_id is None:
- G = self.topologies[graph_name]
- candidates = list(G.nodes(data=True))
- if shuffle:
- random.shuffle(candidates)
- for next_id, data in candidates:
- if data.get('agent_id', None) is None:
- node_id = next_id
- data['agent_id'] = agent_id
- break
-
-
- self._node_ids[agent_id] = (graph_name, node_id)
- print(self._node_ids)
+ # if agent_class:
+ # agent_class = agents.deserialize_type(agent_class)
+ # elif agent_definitions:
+ # agent_class, state = agents._agent_from_definition(agent_definitions, unique_id=agent_id)
+ # else:
+ # serialization.logger.debug('Skipping agent {}'.format(agent_id))
+ # return
+ # return self.add_agent(agent_id, agent_class, state)
- def set_agent(self, agent_id, agent_class, state=None, graph='default'):
- node = self.topologies[graph].nodes[agent_id]
+ def add_agent(self, agent_id, agent_class, state=None, graph='default'):
defstate = deepcopy(self.default_state) or {}
defstate.update(self.states.get(agent_id, {}))
- defstate.update(node.get('state', {}))
if state:
defstate.update(state)
a = None
if agent_class:
state = defstate
a = agent_class(model=self,
- unique_id=agent_id
- )
+ unique_id=agent_id)
for (k, v) in state.items():
setattr(a, k, v)
- node['agent'] = a
self.schedule.add(a)
return a
- def add_node(self, agent_class, state=None, graph='default'):
- agent_id = int(len(self.topologies[graph].nodes()))
- self.topologies[graph].add_node(agent_id)
- a = self.set_agent(agent_id, agent_class, state, graph=graph)
- a['visible'] = True
- return a
-
- def add_edge(self, agent1, agent2, start=None, graph='default', **attrs):
- if hasattr(agent1, 'id'):
- agent1 = agent1.id
- if hasattr(agent2, 'id'):
- agent2 = agent2.id
- start = start or self.now
- return self.topologies[graph].add_edge(agent1, agent2, **attrs)
-
def log(self, message, *args, level=logging.INFO, **kwargs):
if not self.logger.isEnabledFor(level):
return
@@ -238,14 +164,6 @@ class Environment(Model):
self.schedule.step()
self.datacollector.collect(self)
- def run(self, until, *args, **kwargs):
- until = until or float('inf')
-
- while self.schedule.next_time < until:
- self.step()
- utils.logger.debug(f'Simulation step {self.schedule.time}/{until}. Next: {self.schedule.next_time}')
- self.schedule.time = until
-
def __contains__(self, key):
return key in self.env_params
@@ -289,5 +207,90 @@ class Environment(Model):
yield from self._agent_to_tuples(agent, now)
+class AgentConfigEnvironment(BaseEnvironment):
-SoilEnvironment = Environment
+ def __init__(self, *args,
+ agents: Dict[str, config.AgentConfig] = {},
+ **kwargs):
+ return super().__init__(*args, agents=agents, **kwargs)
+
+ def init_agents(self, agents: Union[Dict[str, config.AgentConfig], [tuple[type, Dict[str, Any]]]] = {}):
+ if not isinstance(agents, dict):
+ return BaseEnvironment.init_agents(self, agents)
+
+ self._agents = agents_from_config(agents,
+ env=self,
+ random=self.random)
+ for d in self._agents.values():
+ for a in d.values():
+ self.schedule.add(a)
+
+
+class NetworkConfigEnvironment(BaseEnvironment):
+
+ def __init__(self, *args, topologies: Dict[str, config.NetConfig] = {}, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.topologies = {}
+ self._node_ids = {}
+ for (name, cfg) in topologies.items():
+ self.set_topology(cfg=cfg, graph=name)
+
+ @property
+ def topology(self):
+ return self.topologies['default']
+
+ def set_topology(self, cfg=None, dir_path=None, graph='default'):
+ topology = cfg
+ if not isinstance(cfg, nx.Graph):
+ topology = network.from_config(cfg, dir_path=dir_path or self.dir_path)
+
+ self.topologies[graph] = topology
+
+ def topology_for(self, agent_id):
+ return self.topologies[self._node_ids[agent_id][0]]
+
+ @property
+ def network_agents(self):
+ yield from self.agents(agent_class=NetworkAgent)
+
+ def agent_to_node(self, agent_id, graph_name='default', node_id=None, shuffle=False):
+ node_id = network.agent_to_node(G=self.topologies[graph_name], agent_id=agent_id,
+ node_id=node_id, shuffle=shuffle,
+ random=self.random)
+
+ self._node_ids[agent_id] = (graph_name, node_id)
+
+
+ def add_node(self, agent_class, state=None, graph='default'):
+ agent_id = int(len(self.topologies[graph].nodes()))
+ self.topologies[graph].add_node(agent_id)
+ a = self.add_agent(agent_id, agent_class, state, graph=graph)
+ a['visible'] = True
+ return a
+
+ def add_edge(self, agent1, agent2, start=None, graph='default', **attrs):
+ if hasattr(agent1, 'id'):
+ agent1 = agent1.id
+ if hasattr(agent2, 'id'):
+ agent2 = agent2.id
+ start = start or self.now
+ return self.topologies[graph].add_edge(agent1, agent2, **attrs)
+
+ def add_agent(self, *args, state=None, graph='default', **kwargs):
+ node = self.topologies[graph].nodes[agent_id]
+ node_state = node.get('state', {})
+ if node_state:
+ node_state.update(state or {})
+ state = node_state
+ a = super().add_agent(*args, state=state, **kwargs)
+ node['agent'] = a
+ return a
+
+ def node_id_for(self, agent_id):
+ return self._node_ids[agent_id][1]
+
+class Environment(AgentConfigEnvironment, NetworkConfigEnvironment):
+ def __init__(self, *args, **kwargs):
+ agents = kwargs.pop('agents', {})
+ NetworkConfigEnvironment.__init__(self, *args, **kwargs)
+ AgentConfigEnvironment.__init__(self, *args, agents=agents, **kwargs)
diff --git a/soil/exporters.py b/soil/exporters.py
index 1bd06de..20a0f92 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -49,8 +49,8 @@ class Exporter:
self.simulation = simulation
outdir = outdir or os.path.join(os.getcwd(), 'soil_output')
self.outdir = os.path.join(outdir,
- simulation.config.general.group or '',
- simulation.config.general.id)
+ simulation.group or '',
+ simulation.name)
self.dry_run = dry_run
self.copy_to = copy_to
diff --git a/soil/network.py b/soil/network.py
index 0eb3688..25b55ab 100644
--- a/soil/network.py
+++ b/soil/network.py
@@ -1,6 +1,7 @@
from typing import Dict
import os
import sys
+import random
import networkx as nx
@@ -40,3 +41,25 @@ def from_config(cfg: config.NetConfig, dir_path: str = None):
return nx.json_graph.node_link_graph(cfg.topology)
return nx.Graph()
+
+
+def agent_to_node(G, agent_id, node_id=None, shuffle=False, random=random):
+ '''
+ Link an agent to a node in a topology.
+
+ If node_id is None, a node without an agent_id will be found.
+ '''
+ #TODO: test
+ if node_id is None:
+ candidates = list(G.nodes(data=True))
+ if shuffle:
+ random.shuffle(candidates)
+ for next_id, data in candidates:
+ if data.get('agent_id', None) is None:
+ node_id = next_id
+ data['agent_id'] = agent_id
+ break
+
+ if node_id is None:
+ raise ValueError(f"Not enough nodes in topology to assign one to agent {agent_id}")
+ return node_id
diff --git a/soil/serialization.py b/soil/serialization.py
index 8c17f23..328efdd 100644
--- a/soil/serialization.py
+++ b/soil/serialization.py
@@ -122,8 +122,6 @@ def load_files(*patterns, **kwargs):
for i in glob(pattern, **kwargs):
for config in load_file(i):
path = os.path.abspath(i)
- if 'general' in config and 'dir_path' not in config['general']:
- config['general']['dir_path'] = os.path.dirname(path)
yield config, path
diff --git a/soil/simulation.py b/soil/simulation.py
index d28549d..4d50c30 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -7,6 +7,10 @@ import traceback
import logging
import networkx as nx
+from dataclasses import dataclass, field, asdict
+from typing import Union
+
+
from networkx.readwrite import json_graph
from multiprocessing import Pool
from functools import partial
@@ -14,13 +18,15 @@ import pickle
from . import serialization, utils, basestring, agents
from .environment import Environment
-from .utils import logger
+from .utils import logger, run_and_return_exceptions
from .exporters import default
+from .time import INFINITY
from .config import Config, convert_old
#TODO: change documentation for simulation
+@dataclass
class Simulation:
"""
Parameters
@@ -30,23 +36,16 @@ class Simulation:
kwargs: parameters to use to initialize a new configuration, if one has not been provided.
"""
-
- def __init__(self, config=None,
- **kwargs):
- if kwargs:
- cfg = {}
- if config:
- cfg.update(config.dict(include_defaults=False))
- cfg.update(kwargs)
- config = Config(**cfg)
- if not config:
- raise ValueError("You need to specify a simulation configuration")
- self.config = config
-
-
- @property
- def name(self) -> str:
- return self.config.general.id
+ name: str = 'Unnamed simulation'
+ group: str = None
+ model_class: Union[str, type] = 'soil.Environment'
+ model_params: dict = field(default_factory=dict)
+ seed: str = field(default_factory=lambda: current_time())
+ dir_path: str = field(default_factory=lambda: os.getcwd())
+ max_time: float = float('inf')
+ max_steps: int = -1
+ num_trials: int = 3
+ dry_run: bool = False
def run_simulation(self, *args, **kwargs):
return self.run(*args, **kwargs)
@@ -58,14 +57,14 @@ class Simulation:
def _run_sync_or_async(self, parallel=False, **kwargs):
if parallel and not os.environ.get('SENPY_DEBUG', None):
p = Pool()
- func = partial(self.run_trial_exceptions, **kwargs)
- for i in p.imap_unordered(func, range(self.config.general.num_trials)):
+ func = partial(run_and_return_exceptions, self.run_trial, **kwargs)
+ for i in p.imap_unordered(func, self.num_trials):
if isinstance(i, Exception):
logger.error('Trial failed:\n\t%s', i.message)
continue
yield i
else:
- for i in range(self.config.general.num_trials):
+ for i in range(self.num_trials):
yield self.run_trial(trial_id=i,
**kwargs)
@@ -80,12 +79,12 @@ class Simulation:
logger.info('Output directory: %s', outdir)
exporters = serialization.deserialize_all(exporters,
simulation=self,
- known_modules=['soil.exporters',],
+ known_modules=['soil.exporters', ],
dry_run=dry_run,
outdir=outdir,
**exporter_params)
- with utils.timer('simulation {}'.format(self.config.general.id)):
+ with utils.timer('simulation {}'.format(self.name)):
for exporter in exporters:
exporter.sim_start()
@@ -104,95 +103,95 @@ class Simulation:
for exporter in exporters:
exporter.sim_end()
+ def run_model(self, until=None, *args, **kwargs):
+ until = until or float('inf')
+
+ while self.schedule.next_time < until:
+ self.step()
+ utils.logger.debug(f'Simulation step {self.schedule.time}/{until}. Next: {self.schedule.next_time}')
+ self.schedule.time = until
+
def get_env(self, trial_id=0, **kwargs):
'''Create an environment for a trial of the simulation'''
- # opts = self.environment_params.copy()
- # opts.update({
- # 'name': '{}_trial_{}'.format(self.name, trial_id),
- # 'topology': self.topology.copy(),
- # 'network_params': self.network_params,
- # 'seed': '{}_trial_{}'.format(self.seed, trial_id),
- # 'initial_time': 0,
- # 'interval': self.interval,
- # 'network_agents': self.network_agents,
- # 'initial_time': 0,
- # 'states': self.states,
- # 'dir_path': self.dir_path,
- # 'default_state': self.default_state,
- # 'history': bool(self._history),
- # 'environment_agents': self.environment_agents,
- # })
- # opts.update(kwargs)
- print(self.config)
- env = Environment.from_config(self.config, trial_id=trial_id, **kwargs)
- return env
+ def deserialize_reporters(reporters):
+ for (k, v) in reporters.items():
+ if isinstance(v, str) and v.startswith('py:'):
+ reporters[k] = serialization.deserialize(value.lsplit(':', 1)[1])
+
+ model_params = self.model_params.copy()
+ model_params.update(kwargs)
+
+ agent_reporters = deserialize_reporters(model_params.pop('agent_reporters', {}))
+ model_reporters = deserialize_reporters(model_params.pop('model_reporters', {}))
+
+ env = serialization.deserialize(self.model_class)
+ return env(id=f'{self.name}_trial_{trial_id}',
+ seed=f'{self.seed}_trial_{trial_id}',
+ dir_path=self.dir_path,
+ agent_reporters=agent_reporters,
+ model_reporters=model_reporters,
+ **model_params)
def run_trial(self, trial_id=None, until=None, log_level=logging.INFO, **opts):
"""
Run a single trial of the simulation
"""
+ model = self.get_env(trial_id, **opts)
+ return self.run_model(model, trial_id=trial_id, until=until, log_level=log_level)
+
+ def run_model(self, model, trial_id=None, until=None, log_level=logging.INFO, **opts):
trial_id = trial_id if trial_id is not None else current_time()
if log_level:
logger.setLevel(log_level)
# Set-up trial environment and graph
- until = until or self.config.general.max_time
+ until = until or self.max_time
- env = self.get_env(trial_id, **opts)
# Set up agents on nodes
- with utils.timer('Simulation {} trial {}'.format(self.config.general.id, trial_id)):
- env.run(until)
- return env
+ is_done = lambda: False
+ if self.max_time and hasattr(self.schedule, 'time'):
+ is_done = lambda x: is_done() or self.schedule.time >= self.max_time
+ if self.max_steps and hasattr(self.schedule, 'time'):
+ is_done = lambda: is_done() or self.schedule.steps >= self.max_steps
- def run_trial_exceptions(self, *args, **kwargs):
- '''
- A wrapper for run_trial that catches exceptions and returns them.
- It is meant for async simulations
- '''
- try:
- return self.run_trial(*args, **kwargs)
- except Exception as ex:
- if ex.__cause__ is not None:
- ex = ex.__cause__
- ex.message = ''.join(traceback.format_exception(type(ex), ex, ex.__traceback__)[:])
- return ex
+ with utils.timer('Simulation {} trial {}'.format(self.name, trial_id)):
+ while not is_done():
+ utils.logger.debug(f'Simulation time {model.schedule.time}/{until}. Next: {getattr(model.schedule, "next_time", model.schedule.time + self.interval)}')
+ model.step()
+ return model
def to_dict(self):
- return self.config.dict()
+ d = asdict(self)
+ d['model_class'] = serialization.serialize(d['model_class'])[0]
+ d['model_params'] = serialization.serialize(d['model_params'])[0]
+ d['dir_path'] = str(d['dir_path'])
+
+ return d
def to_yaml(self):
- return yaml.dump(self.config.dict())
+ return yaml.dump(self.asdict())
-def all_from_config(config):
+def iter_from_config(config):
configs = list(serialization.load_config(config))
for config, path in configs:
- if config.get('version', '1') == '1':
- config = convert_old(config)
- if not isinstance(config, Config):
- config = Config(**config)
- if not config.general.dir_path:
- config.general.dir_path = os.path.dirname(path)
- sim = Simulation(config=config)
- yield sim
+ d = dict(config)
+ if 'dir_path' not in d:
+ d['dir_path'] = os.path.dirname(path)
+ if d.get('version', '2') == '1' or 'agents' in d or 'network_agents' in d or 'environment_agents' in d:
+ d = convert_old(d)
+ d.pop('version', None)
+ yield Simulation(**d)
def from_config(conf_or_path):
- lst = list(all_from_config(conf_or_path))
+ lst = list(iter_from_config(conf_or_path))
if len(lst) > 1:
raise AttributeError('Provide only one configuration')
return lst[0]
-def from_old_config(conf_or_path):
- config = list(serialization.load_config(conf_or_path))
- if len(config) > 1:
- raise AttributeError('Provide only one configuration')
- config = convert_old(config[0][0])
- return Simulation(config)
-
def run_from_config(*configs, **kwargs):
- for sim in all_from_config(configs):
- name = config.general.id
- logger.info("Using config(s): {name}".format(name=name))
+ for sim in iter_from_config(configs):
+ logger.info(f"Using config(s): {sim.id}")
sim.run_simulation(**kwargs)
diff --git a/soil/time.py b/soil/time.py
index b74ef82..b2faf46 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -37,9 +37,10 @@ class TimedActivation(BaseScheduler):
"""
def __init__(self, *args, **kwargs):
- super().__init__(self)
+ super().__init__(*args, **kwargs)
self._queue = []
self.next_time = 0
+ self.logger = logger.getChild(f'time_{ self.model }')
def add(self, agent: MesaAgent):
if agent.unique_id not in self._agents:
@@ -52,7 +53,8 @@ class TimedActivation(BaseScheduler):
an agent will signal when it wants to be scheduled next.
"""
- if self.next_time == INFINITY:
+ self.logger.debug(f'Simulation step {self.next_time}')
+ if not self.model.running:
return
self.time = self.next_time
@@ -60,7 +62,7 @@ class TimedActivation(BaseScheduler):
while self._queue and self._queue[0][0] == self.time:
(when, agent_id) = heappop(self._queue)
- logger.debug(f'Stepping agent {agent_id}')
+ self.logger.debug(f'Stepping agent {agent_id}')
returned = self._agents[agent_id].step()
when = (returned or Delta(1)).abs(self.time)
@@ -74,7 +76,8 @@ class TimedActivation(BaseScheduler):
if not self._queue:
self.time = INFINITY
self.next_time = INFINITY
+ self.model.running = False
return
self.next_time = self._queue[0][0]
-
+ self.logger.debug(f'Next step: {self.next_time}')
diff --git a/soil/utils.py b/soil/utils.py
index 562def1..cd82588 100644
--- a/soil/utils.py
+++ b/soil/utils.py
@@ -1,6 +1,7 @@
import logging
from time import time as current_time, strftime, gmtime, localtime
import os
+import traceback
from shutil import copyfile
@@ -89,3 +90,17 @@ def unflatten_dict(d):
target = target[token]
target[tokens[-1]] = v
return out
+
+
+def run_and_return_exceptions(self, func, *args, **kwargs):
+ '''
+ A wrapper for run_trial that catches exceptions and returns them.
+ It is meant for async simulations.
+ '''
+ try:
+ return func(*args, **kwargs)
+ except Exception as ex:
+ if ex.__cause__ is not None:
+ ex = ex.__cause__
+ ex.message = ''.join(traceback.format_exception(type(ex), ex, ex.__traceback__)[:])
+ return ex
diff --git a/soil/web/config.yml b/soil/web/config.yml
index 1f741eb..27e2785 100644
--- a/soil/web/config.yml
+++ b/soil/web/config.yml
@@ -6,11 +6,11 @@ network_params:
n: 100
m: 2
network_agents:
- - agent_type: ControlModelM2
+ - agent_class: ControlModelM2
weight: 0.1
state:
id: 1
- - agent_type: ControlModelM2
+ - agent_class: ControlModelM2
weight: 0.9
state:
id: 0
diff --git a/tests/old_complete.yml b/tests/old_complete.yml
index 8609eb9..517abc4 100644
--- a/tests/old_complete.yml
+++ b/tests/old_complete.yml
@@ -10,21 +10,21 @@ network_params:
generator: complete_graph
n: 10
network_agents:
- - agent_type: CounterModel
+ - agent_class: CounterModel
weight: 0.4
state:
state_id: 0
- - agent_type: AggregatedCounter
+ - agent_class: AggregatedCounter
weight: 0.6
environment_agents:
- agent_id: 'Environment Agent 1'
- agent_type: CounterModel
+ agent_class: CounterModel
state:
times: 10
environment_class: Environment
environment_params:
am_i_complete: true
-agent_type: CounterModel
+agent_class: CounterModel
default_state:
times: 1
states:
diff --git a/tests/test_analysis.py b/tests/test_analysis.py
index 83d6e54..204b4dd 100644
--- a/tests/test_analysis.py
+++ b/tests/test_analysis.py
@@ -46,7 +46,7 @@ class TestAnalysis(TestCase):
'generator': 'complete_graph',
'n': 2
},
- 'agent_type': Ping,
+ 'agent_class': Ping,
'states': [{'interval': 1}, {'interval': 2}],
'max_time': 30,
'num_trials': 1,
diff --git a/tests/test_config.py b/tests/test_config.py
index 6f69ee2..fd9fc70 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -1,8 +1,10 @@
from unittest import TestCase
import os
+import yaml
+import copy
from os.path import join
-from soil import simulation, serialization, config, network, agents
+from soil import simulation, serialization, config, network, agents, utils
ROOT = os.path.abspath(os.path.dirname(__file__))
EXAMPLES = join(ROOT, '..', 'examples')
@@ -10,6 +12,17 @@ EXAMPLES = join(ROOT, '..', 'examples')
FORCE_TESTS = os.environ.get('FORCE_TESTS', '')
+def isequal(a, b):
+ if isinstance(a, dict):
+ for (k, v) in a.items():
+ if v:
+ isequal(a[k], b[k])
+ else:
+ assert not b.get(k, None)
+ return
+ assert a == b
+
+
class TestConfig(TestCase):
def test_conversion(self):
@@ -18,18 +31,23 @@ class TestConfig(TestCase):
converted_defaults = config.convert_old(old, strict=False)
converted = converted_defaults.dict(skip_defaults=True)
- def isequal(a, b):
- if isinstance(a, dict):
- for (k, v) in a.items():
- if v:
- isequal(a[k], b[k])
- else:
- assert not b.get(k, None)
- return
- assert a == b
-
isequal(converted, expected)
+ def test_configuration_changes(self):
+ """
+ The configuration should not change after running
+ the simulation.
+ """
+ config = serialization.load_file(join(EXAMPLES, 'complete.yml'))[0]
+ s = simulation.from_config(config)
+ init_config = copy.copy(s.config)
+
+ s.run_simulation(dry_run=True)
+ nconfig = s.config
+ # del nconfig['to
+ isequal(init_config, nconfig)
+
+
def test_topology_config(self):
netconfig = config.NetConfig(**{
'path': join(ROOT, 'test.gexf')
@@ -48,7 +66,7 @@ class TestConfig(TestCase):
'network_params': {
'path': join(ROOT, 'test.gexf')
},
- 'agent_type': 'CounterModel',
+ 'agent_class': 'CounterModel',
# 'states': [{'times': 10}, {'times': 20}],
'max_time': 2,
'dry_run': True,
@@ -63,7 +81,6 @@ class TestConfig(TestCase):
assert len(env.agents) == 2
assert env.agents[0].topology == env.topologies['default']
-
def test_agents_from_config(self):
'''We test that the known complete configuration produces
the right agents in the right groups'''
@@ -74,8 +91,25 @@ class TestConfig(TestCase):
assert len(env.agents(group='network')) == 10
assert len(env.agents(group='environment')) == 1
- assert sum(1 for a in env.agents(group='network', agent_type=agents.CounterModel)) == 4
- assert sum(1 for a in env.agents(group='network', agent_type=agents.AggregatedCounter)) == 6
+ assert sum(1 for a in env.agents(group='network', agent_class=agents.CounterModel)) == 4
+ assert sum(1 for a in env.agents(group='network', agent_class=agents.AggregatedCounter)) == 6
+
+ def test_yaml(self):
+ """
+ The YAML version of a newly created configuration should be equivalent
+ to the configuration file used.
+ Values not present in the original config file should have reasonable
+ defaults.
+ """
+ with utils.timer('loading'):
+ config = serialization.load_file(join(EXAMPLES, 'complete.yml'))[0]
+ s = simulation.from_config(config)
+ with utils.timer('serializing'):
+ serial = s.to_yaml()
+ with utils.timer('recovering'):
+ recovered = yaml.load(serial, Loader=yaml.SafeLoader)
+ for (k, v) in config.items():
+ assert recovered[k] == v
def make_example_test(path, cfg):
def wrapped(self):
diff --git a/tests/test_exporters.py b/tests/test_exporters.py
index 6ff544b..debc14a 100644
--- a/tests/test_exporters.py
+++ b/tests/test_exporters.py
@@ -36,7 +36,7 @@ class Exporters(TestCase):
config = {
'name': 'exporter_sim',
'network_params': {},
- 'agent_type': 'CounterModel',
+ 'agent_class': 'CounterModel',
'max_time': 2,
'num_trials': 5,
'environment_params': {}
@@ -62,7 +62,7 @@ class Exporters(TestCase):
'generator': 'complete_graph',
'n': 4
},
- 'agent_type': 'CounterModel',
+ 'agent_class': 'CounterModel',
'max_time': 2,
'num_trials': n_trials,
'dry_run': False,
diff --git a/tests/test_history.py b/tests/test_history.py
index 4a76d5c..773cfd6 100644
--- a/tests/test_history.py
+++ b/tests/test_history.py
@@ -41,7 +41,7 @@ class TestHistory(TestCase):
'path': join(ROOT, 'test.gexf')
},
'network_agents': [{
- 'agent_type': 'AggregatedCounter',
+ 'agent_class': 'AggregatedCounter',
'weight': 1,
'state': {'state_id': 0}
diff --git a/tests/test_main.py b/tests/test_main.py
index 017e92e..a114b6c 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -1,9 +1,6 @@
from unittest import TestCase
import os
-import io
-import yaml
-import copy
import pickle
import networkx as nx
from functools import partial
@@ -29,56 +26,17 @@ class CustomAgent(agents.FSM, agents.NetworkAgent):
class TestMain(TestCase):
- def test_load_graph(self):
- """
- Load a graph from file if the extension is known.
- Raise an exception otherwise.
- """
- config = {
- 'network_params': {
- 'path': join(ROOT, 'test.gexf')
- }
- }
- G = network.from_config(config['network_params'])
- assert G
- assert len(G) == 2
- with self.assertRaises(AttributeError):
- config = {
- 'network_params': {
- 'path': join(ROOT, 'unknown.extension')
- }
- }
- G = network.from_config(config['network_params'])
- print(G)
-
- def test_generate_barabasi(self):
- """
- If no path is given, a generator and network parameters
- should be used to generate a network
- """
- cfg = {
- 'params': {
- 'generator': 'barabasi_albert_graph'
- }
- }
- with self.assertRaises(Exception):
- G = network.from_config(cfg)
- cfg['params']['n'] = 100
- cfg['params']['m'] = 10
- G = network.from_config(cfg)
- assert len(G) == 100
-
def test_empty_simulation(self):
"""A simulation with a base behaviour should do nothing"""
config = {
- 'network_params': {
- 'path': join(ROOT, 'test.gexf')
- },
- 'agent_type': 'BaseAgent',
- 'environment_params': {
+ 'model_params': {
+ 'network_params': {
+ 'path': join(ROOT, 'test.gexf')
+ },
+ 'agent_class': 'BaseAgent',
}
}
- s = simulation.from_old_config(config)
+ s = simulation.from_config(config)
s.run_simulation(dry_run=True)
@@ -88,21 +46,21 @@ class TestMain(TestCase):
agent should be able to update its state."""
config = {
'name': 'CounterAgent',
- 'network_params': {
- 'generator': nx.complete_graph,
- 'n': 2,
- },
- 'agent_type': 'CounterModel',
- 'states': {
- 0: {'times': 10},
- 1: {'times': 20},
- },
- 'max_time': 2,
'num_trials': 1,
- 'environment_params': {
+ 'max_time': 2,
+ 'model_params': {
+ 'network_params': {
+ 'generator': nx.complete_graph,
+ 'n': 2,
+ },
+ 'agent_class': 'CounterModel',
+ 'states': {
+ 0: {'times': 10},
+ 1: {'times': 20},
+ },
}
}
- s = simulation.from_old_config(config)
+ s = simulation.from_config(config)
def test_counter_agent(self):
"""
@@ -110,24 +68,24 @@ class TestMain(TestCase):
agent should be able to update its state."""
config = {
'version': '2',
- 'general': {
- 'name': 'CounterAgent',
- 'max_time': 2,
- 'dry_run': True,
- 'num_trials': 1,
- },
- 'topologies': {
- 'default': {
- 'path': join(ROOT, 'test.gexf')
- }
- },
- 'agents': {
- 'default': {
- 'agent_class': 'CounterModel',
+ 'name': 'CounterAgent',
+ 'dry_run': True,
+ 'num_trials': 1,
+ 'max_time': 2,
+ 'model_params': {
+ 'topologies': {
+ 'default': {
+ 'path': join(ROOT, 'test.gexf')
+ }
},
- 'counters': {
- 'topology': 'default',
- 'fixed': [{'state': {'times': 10}}, {'state': {'times': 20}}],
+ 'agents': {
+ 'default': {
+ 'agent_class': 'CounterModel',
+ },
+ 'counters': {
+ 'topology': 'default',
+ 'fixed': [{'state': {'times': 10}}, {'state': {'times': 20}}],
+ }
}
}
}
@@ -141,33 +99,37 @@ class TestMain(TestCase):
assert env.agents[0]['times'] == 11
assert env.agents[1]['times'] == 21
- def test_custom_agent(self):
- """Allow for search of neighbors with a certain state_id"""
+ def test_init_and_count_agents(self):
+ """Agents should be properly initialized and counting should filter them properly"""
+ #TODO: separate this test into two or more test cases
config = {
- 'network_params': {
- 'path': join(ROOT, 'test.gexf')
- },
- 'network_agents': [{
- 'agent_type': CustomAgent,
- 'weight': 1
-
- }],
'max_time': 10,
- 'environment_params': {
- }
+ 'model_params': {
+ 'agents': [(CustomAgent, {'weight': 1}),
+ (CustomAgent, {'weight': 3}),
+ ],
+ 'topologies': {
+ 'default': {
+ 'path': join(ROOT, 'test.gexf')
+ }
+ },
+ },
}
- s = simulation.from_old_config(config)
+ s = simulation.from_config(config)
env = s.run_simulation(dry_run=True)[0]
- assert env.agents[1].count_agents(state_id='normal') == 2
- assert env.agents[1].count_agents(state_id='normal', limit_neighbors=True) == 1
- assert env.agents[0].neighbors == 1
+ assert env.agents[0].weight == 1
+ assert env.count_agents() == 2
+ assert env.count_agents(weight=1) == 1
+ assert env.count_agents(weight=3) == 1
+ assert env.count_agents(agent_class=CustomAgent) == 2
+
def test_torvalds_example(self):
"""A complete example from a documentation should work."""
config = serialization.load_file(join(EXAMPLES, 'torvalds.yml'))[0]
- config['network_params']['path'] = join(EXAMPLES,
+ config['model_params']['network_params']['path'] = join(EXAMPLES,
config['network_params']['path'])
- s = simulation.from_old_config(config)
+ s = simulation.from_config(config)
env = s.run_simulation(dry_run=True)[0]
for a in env.network_agents:
skill_level = a.state['skill_level']
@@ -184,47 +146,6 @@ class TestMain(TestCase):
assert a.state['total'] == 3
assert a.state['neighbors'] == 1
- def test_yaml(self):
- """
- The YAML version of a newly created configuration should be equivalent
- to the configuration file used.
- Values not present in the original config file should have reasonable
- defaults.
- """
- with utils.timer('loading'):
- config = serialization.load_file(join(EXAMPLES, 'complete.yml'))[0]
- s = simulation.from_old_config(config)
- with utils.timer('serializing'):
- serial = s.to_yaml()
- with utils.timer('recovering'):
- recovered = yaml.load(serial, Loader=yaml.SafeLoader)
- for (k, v) in config.items():
- assert recovered[k] == v
-
- def test_configuration_changes(self):
- """
- The configuration should not change after running
- the simulation.
- """
- config = serialization.load_file(join(EXAMPLES, 'complete.yml'))[0]
- s = simulation.from_old_config(config)
- init_config = copy.copy(s.config)
-
- s.run_simulation(dry_run=True)
- nconfig = s.config
- # del nconfig['to
- assert init_config == nconfig
-
- def test_save_geometric(self):
- """
- There is a bug in networkx that prevents it from creating a GEXF file
- from geometric models. We should work around it.
- """
- G = nx.random_geometric_graph(20, 0.1)
- env = Environment(topology=G)
- f = io.BytesIO()
- env.dump_gexf(f)
-
def test_serialize_class(self):
ser, name = serialization.serialize(agents.BaseAgent, known_modules=[])
assert name == 'soil.agents.BaseAgent'
@@ -247,7 +168,7 @@ class TestMain(TestCase):
des = serialization.deserialize(name, ser)
assert i == des
- def test_serialize_agent_type(self):
+ def test_serialize_agent_class(self):
'''A class from soil.agents should be serialized without the module part'''
ser = agents.serialize_type(CustomAgent)
assert ser == 'test_main.CustomAgent'
@@ -258,33 +179,33 @@ class TestMain(TestCase):
def test_deserialize_agent_distribution(self):
agent_distro = [
{
- 'agent_type': 'CounterModel',
+ 'agent_class': 'CounterModel',
'weight': 1
},
{
- 'agent_type': 'test_main.CustomAgent',
+ 'agent_class': 'test_main.CustomAgent',
'weight': 2
},
]
converted = agents.deserialize_definition(agent_distro)
- assert converted[0]['agent_type'] == agents.CounterModel
- assert converted[1]['agent_type'] == CustomAgent
+ assert converted[0]['agent_class'] == agents.CounterModel
+ assert converted[1]['agent_class'] == CustomAgent
pickle.dumps(converted)
def test_serialize_agent_distribution(self):
agent_distro = [
{
- 'agent_type': agents.CounterModel,
+ 'agent_class': agents.CounterModel,
'weight': 1
},
{
- 'agent_type': CustomAgent,
+ 'agent_class': CustomAgent,
'weight': 2
},
]
converted = agents.serialize_definition(agent_distro)
- assert converted[0]['agent_type'] == 'CounterModel'
- assert converted[1]['agent_type'] == 'test_main.CustomAgent'
+ assert converted[0]['agent_class'] == 'CounterModel'
+ assert converted[1]['agent_class'] == 'test_main.CustomAgent'
pickle.dumps(converted)
def test_subgraph(self):
@@ -292,7 +213,7 @@ class TestMain(TestCase):
G = nx.Graph()
G.add_node(3)
G.add_edge(1, 2)
- distro = agents.calculate_distribution(agent_type=agents.NetworkAgent)
+ distro = agents.calculate_distribution(agent_class=agents.NetworkAgent)
distro[0]['topology'] = 'default'
aconfig = config.AgentConfig(distribution=distro, topology='default')
env = Environment(name='Test', topologies={'default': G}, agents={'network': aconfig})
@@ -303,7 +224,7 @@ class TestMain(TestCase):
assert len(a2.subgraph(limit_neighbors=True)) == 2
assert len(a3.subgraph(limit_neighbors=True)) == 1
assert len(a3.subgraph(limit_neighbors=True, center=False)) == 0
- assert len(a3.subgraph(agent_type=agents.NetworkAgent)) == 3
+ assert len(a3.subgraph(agent_class=agents.NetworkAgent)) == 3
def test_templates(self):
'''Loading a template should result in several configs'''
@@ -313,19 +234,19 @@ class TestMain(TestCase):
def test_until(self):
config = {
'name': 'until_sim',
- 'network_params': {},
- 'agent_type': 'CounterModel',
+ 'model_params': {
+ 'network_params': {},
+ 'agent_class': 'CounterModel',
+ },
'max_time': 2,
'num_trials': 50,
- 'environment_params': {}
}
- s = simulation.from_old_config(config)
+ s = simulation.from_config(config)
runs = list(s.run_simulation(dry_run=True))
over = list(x.now for x in runs if x.now>2)
assert len(runs) == config['num_trials']
assert len(over) == 0
-
def test_fsm(self):
'''Basic state change'''
class ToggleAgent(agents.FSM):
diff --git a/tests/test_network.py b/tests/test_network.py
new file mode 100644
index 0000000..b111a94
--- /dev/null
+++ b/tests/test_network.py
@@ -0,0 +1,85 @@
+from unittest import TestCase
+
+import io
+import os
+import networkx as nx
+
+from os.path import join
+
+from soil import network, environment
+
+ROOT = os.path.abspath(os.path.dirname(__file__))
+EXAMPLES = join(ROOT, '..', 'examples')
+
+
+class TestNetwork(TestCase):
+ def test_load_graph(self):
+ """
+ Load a graph from file if the extension is known.
+ Raise an exception otherwise.
+ """
+ config = {
+ 'network_params': {
+ 'path': join(ROOT, 'test.gexf')
+ }
+ }
+ G = network.from_config(config['network_params'])
+ assert G
+ assert len(G) == 2
+ with self.assertRaises(AttributeError):
+ config = {
+ 'network_params': {
+ 'path': join(ROOT, 'unknown.extension')
+ }
+ }
+ G = network.from_config(config['network_params'])
+ print(G)
+
+ def test_generate_barabasi(self):
+ """
+ If no path is given, a generator and network parameters
+ should be used to generate a network
+ """
+ cfg = {
+ 'params': {
+ 'generator': 'barabasi_albert_graph'
+ }
+ }
+ with self.assertRaises(Exception):
+ G = network.from_config(cfg)
+ cfg['params']['n'] = 100
+ cfg['params']['m'] = 10
+ G = network.from_config(cfg)
+ assert len(G) == 100
+
+ def test_save_geometric(self):
+ """
+ There is a bug in networkx that prevents it from creating a GEXF file
+ from geometric models. We should work around it.
+ """
+ G = nx.random_geometric_graph(20, 0.1)
+ env = environment.NetworkEnvironment(topology=G)
+ f = io.BytesIO()
+ env.dump_gexf(f)
+
+ def test_custom_agent_neighbors(self):
+ """Allow for search of neighbors with a certain state_id"""
+ config = {
+ 'network_params': {
+ 'path': join(ROOT, 'test.gexf')
+ },
+ 'network_agents': [{
+ 'agent_class': CustomAgent,
+ 'weight': 1
+
+ }],
+ 'max_time': 10,
+ 'environment_params': {
+ }
+ }
+ s = simulation.from_config(config)
+ env = s.run_simulation(dry_run=True)[0]
+ assert env.agents[1].count_agents(state_id='normal') == 2
+ assert env.agents[1].count_agents(state_id='normal', limit_neighbors=True) == 1
+ assert env.agents[0].neighbors == 1
+
From cd62c23cb955e6695d30fead1556845bd2454ae9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Thu, 13 Oct 2022 22:43:16 +0200
Subject: [PATCH 08/39] WIP: all tests pass
---
CHANGELOG.md | 2 +
docs/soil-vs.rst | 12 +
examples/complete.yml | 81 ++-
examples/complete_opt2.yml | 63 ++
.../custom_generator/custom_generator.yml | 2 +-
examples/custom_generator/mymodule.py | 5 +-
examples/mesa/mesa.yml | 22 +-
examples/newsspread/NewsSpread.yml | 10 +-
examples/newsspread/newsspread.py | 16 +-
examples/pubcrawl/pubcrawl.py | 18 +-
examples/pubcrawl/pubcrawl.yml | 2 +-
examples/rabbits/README.md | 4 +
examples/rabbits/basic/rabbit_agents.py | 130 ++++
examples/rabbits/basic/rabbits.yml | 41 ++
examples/rabbits/improved/rabbit_agents.py | 130 ++++
examples/rabbits/improved/rabbits.yml | 41 ++
examples/rabbits/rabbit_agents.py | 133 ----
examples/rabbits/rabbits.yml | 20 -
examples/template.yml | 24 +-
examples/terrorism/TerroristNetworkModel.py | 26 +-
examples/terrorism/TerroristNetworkModel.yml | 50 +-
examples/torvalds.yml | 23 +-
requirements.txt | 5 +-
soil/__init__.py | 79 ++-
soil/agents/CounterModel.py | 20 +-
soil/agents/__init__.py | 641 ++++++++++--------
soil/analysis.py | 206 ------
soil/config.py | 167 +++--
soil/debugging.py | 151 +++++
soil/environment.py | 202 +++---
soil/exporters.py | 58 +-
soil/network.py | 19 +-
soil/serialization.py | 31 +-
soil/simulation.py | 144 ++--
soil/time.py | 30 +-
soil/utils.py | 39 +-
tests/complete_converted.yml | 65 +-
tests/old_complete.yml | 17 +-
tests/test_agents.py | 6 +-
tests/test_analysis.py | 91 ---
tests/test_config.py | 21 +-
tests/test_examples.py | 27 +-
tests/test_exporters.py | 37 +-
tests/test_history.py | 128 ----
tests/test_main.py | 45 +-
tests/test_network.py | 70 +-
46 files changed, 1720 insertions(+), 1434 deletions(-)
create mode 100644 docs/soil-vs.rst
create mode 100644 examples/complete_opt2.yml
create mode 100644 examples/rabbits/README.md
create mode 100644 examples/rabbits/basic/rabbit_agents.py
create mode 100644 examples/rabbits/basic/rabbits.yml
create mode 100644 examples/rabbits/improved/rabbit_agents.py
create mode 100644 examples/rabbits/improved/rabbits.yml
delete mode 100644 examples/rabbits/rabbit_agents.py
delete mode 100644 examples/rabbits/rabbits.yml
delete mode 100644 soil/analysis.py
create mode 100644 soil/debugging.py
delete mode 100644 tests/test_analysis.py
delete mode 100644 tests/test_history.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 92c457e..a0a8a2a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.3 UNRELEASED]
+### Added
+* Simple debugging capabilities, with a custom `pdb.Debugger` subclass that exposes commands to list agents and their status and set breakpoints on states (for FSM agents)
### Changed
* Configuration schema is very different now. Check `soil.config` for more information. We are also using Pydantic for (de)serialization.
* There may be more than one topology/network in the simulation
diff --git a/docs/soil-vs.rst b/docs/soil-vs.rst
new file mode 100644
index 0000000..53b6891
--- /dev/null
+++ b/docs/soil-vs.rst
@@ -0,0 +1,12 @@
+### MESA
+
+Starting with version 0.3, Soil has been redesigned to complement Mesa, while remaining compatible with it.
+That means that every component in Soil (i.e., Models, Environments, etc.) can be mixed with existing mesa components.
+In fact, there are examples that show how that integration may be used, in the `examples/mesa` folder in the repository.
+
+Here are some reasons to use Soil instead of plain mesa:
+
+- Less boilerplate for common scenarios (by some definitions of common)
+- Functions to automatically populate a topology with an agent distribution (i.e., different ratios of agent class and state)
+- The `soil.Simulation` class allows you to run multiple instances of the same experiment (i.e., multiple trials with the same parameters but a different randomness seed)
+- Reporting functions that aggregate multiple
diff --git a/examples/complete.yml b/examples/complete.yml
index d33cbaf..2677c22 100644
--- a/examples/complete.yml
+++ b/examples/complete.yml
@@ -1,46 +1,54 @@
---
version: '2'
-general:
- id: simple
- group: tests
- dir_path: "/tmp/"
- num_trials: 3
- max_time: 100
- interval: 1
- seed: "CompleteSeed!"
-topologies:
- default:
- params:
- generator: complete_graph
- n: 10
- another_graph:
- params:
- generator: complete_graph
- n: 2
-environment:
- environment_class: Environment
- params:
- am_i_complete: true
-agents:
-# Agents are split several groups, each with its own definition
- default: # This is a special group. Its values will be used as default values for the rest of the groups
+name: simple
+group: tests
+dir_path: "/tmp/"
+num_trials: 3
+max_steps: 100
+interval: 1
+seed: "CompleteSeed!"
+model_class: Environment
+model_params:
+ am_i_complete: true
+ topologies:
+ default:
+ params:
+ generator: complete_graph
+ n: 10
+ another_graph:
+ params:
+ generator: complete_graph
+ n: 2
+ environment:
+ agents:
agent_class: CounterModel
topology: default
state:
times: 1
- environment:
- # In this group we are not specifying any topology
- topology: False
+ # In this group we are not specifying any topology
fixed:
- name: 'Environment Agent 1'
- agent_class: CounterModel
+ agent_class: BaseAgent
+ group: environment
+ topology: null
+ hidden: true
state:
times: 10
- general_counters:
- topology: default
+ - agent_class: CounterModel
+ id: 0
+ group: other_counters
+ topology: another_graph
+ state:
+ times: 1
+ total: 0
+ - agent_class: CounterModel
+ topology: another_graph
+ group: other_counters
+ id: 1
distribution:
- agent_class: CounterModel
weight: 1
+ group: general_counters
state:
times: 3
- agent_class: AggregatedCounter
@@ -51,16 +59,3 @@ agents:
n: 2
state:
times: 5
-
- other_counters:
- topology: another_graph
- fixed:
- - agent_class: CounterModel
- id: 0
- state:
- times: 1
- total: 0
- - agent_class: CounterModel
- id: 1
- # If not specified, it will use the state set in the default
- # state:
diff --git a/examples/complete_opt2.yml b/examples/complete_opt2.yml
new file mode 100644
index 0000000..b4acc26
--- /dev/null
+++ b/examples/complete_opt2.yml
@@ -0,0 +1,63 @@
+---
+version: '2'
+id: simple
+group: tests
+dir_path: "/tmp/"
+num_trials: 3
+max_steps: 100
+interval: 1
+seed: "CompleteSeed!"
+model_class: "soil.Environment"
+model_params:
+ topologies:
+ default:
+ params:
+ generator: complete_graph
+ n: 10
+ another_graph:
+ params:
+ generator: complete_graph
+ n: 2
+ agents:
+ # The values here will be used as default values for any agent
+ agent_class: CounterModel
+ topology: default
+ state:
+ times: 1
+ # This specifies a distribution of agents, each with a `weight` or an explicit number of agents
+ distribution:
+ - agent_class: CounterModel
+ weight: 1
+ # This is inherited from the default settings
+ #topology: default
+ state:
+ times: 3
+ - agent_class: AggregatedCounter
+ topology: default
+ weight: 0.2
+ fixed:
+ - name: 'Environment Agent 1'
+ # All the other agents will assigned to the 'default' group
+ group: environment
+ # Do not count this agent towards total limits
+ hidden: true
+ agent_class: soil.BaseAgent
+ topology: null
+ state:
+ times: 10
+ - agent_class: CounterModel
+ topology: another_graph
+ id: 0
+ state:
+ times: 1
+ total: 0
+ - agent_class: CounterModel
+ topology: another_graph
+ id: 1
+ override:
+ # 2 agents that match this filter will be updated to match the state {times: 5}
+ - filter:
+ agent_class: AggregatedCounter
+ n: 2
+ state:
+ times: 5
diff --git a/examples/custom_generator/custom_generator.yml b/examples/custom_generator/custom_generator.yml
index 12c130d..81f0314 100644
--- a/examples/custom_generator/custom_generator.yml
+++ b/examples/custom_generator/custom_generator.yml
@@ -2,7 +2,7 @@
name: custom-generator
description: Using a custom generator for the network
num_trials: 3
-max_time: 100
+max_steps: 100
interval: 1
network_params:
generator: mymodule.mygenerator
diff --git a/examples/custom_generator/mymodule.py b/examples/custom_generator/mymodule.py
index ef3bacc..85226e0 100644
--- a/examples/custom_generator/mymodule.py
+++ b/examples/custom_generator/mymodule.py
@@ -1,4 +1,5 @@
from networkx import Graph
+import random
import networkx as nx
def mygenerator(n=5, n_edges=5):
@@ -13,9 +14,9 @@ def mygenerator(n=5, n_edges=5):
for i in range(n_edges):
nodes = list(G.nodes)
- n_in = self.random.choice(nodes)
+ n_in = random.choice(nodes)
nodes.remove(n_in) # Avoid loops
- n_out = self.random.choice(nodes)
+ n_out = random.choice(nodes)
G.add_edge(n_in, n_out)
return G
diff --git a/examples/mesa/mesa.yml b/examples/mesa/mesa.yml
index a1572f2..6bdae6f 100644
--- a/examples/mesa/mesa.yml
+++ b/examples/mesa/mesa.yml
@@ -3,17 +3,21 @@ name: mesa_sim
group: tests
dir_path: "/tmp"
num_trials: 3
-max_time: 100
+max_steps: 100
interval: 1
seed: '1'
-network_params:
- generator: social_wealth.graph_generator
- n: 5
-network_agents:
- - agent_class: social_wealth.SocialMoneyAgent
- weight: 1
-environment_class: social_wealth.MoneyEnv
-environment_params:
+model_class: social_wealth.MoneyEnv
+model_params:
+ topologies:
+ default:
+ params:
+ generator: social_wealth.graph_generator
+ n: 5
+ agents:
+ distribution:
+ - agent_class: social_wealth.SocialMoneyAgent
+ topology: default
+ weight: 1
mesa_agent_class: social_wealth.MoneyAgent
N: 10
width: 50
diff --git a/examples/newsspread/NewsSpread.yml b/examples/newsspread/NewsSpread.yml
index 10ae525..d80a5d5 100644
--- a/examples/newsspread/NewsSpread.yml
+++ b/examples/newsspread/NewsSpread.yml
@@ -5,7 +5,7 @@ environment_params:
prob_neighbor_spread: 0.0
prob_tv_spread: 0.01
interval: 1
-max_time: 300
+max_steps: 300
name: Sim_all_dumb
network_agents:
- agent_class: newsspread.DumbViewer
@@ -28,7 +28,7 @@ environment_params:
prob_neighbor_spread: 0.0
prob_tv_spread: 0.01
interval: 1
-max_time: 300
+max_steps: 300
name: Sim_half_herd
network_agents:
- agent_class: newsspread.DumbViewer
@@ -59,7 +59,7 @@ environment_params:
prob_neighbor_spread: 0.0
prob_tv_spread: 0.01
interval: 1
-max_time: 300
+max_steps: 300
name: Sim_all_herd
network_agents:
- agent_class: newsspread.HerdViewer
@@ -85,7 +85,7 @@ environment_params:
prob_tv_spread: 0.01
prob_neighbor_cure: 0.1
interval: 1
-max_time: 300
+max_steps: 300
name: Sim_wise_herd
network_agents:
- agent_class: newsspread.HerdViewer
@@ -110,7 +110,7 @@ environment_params:
prob_tv_spread: 0.01
prob_neighbor_cure: 0.1
interval: 1
-max_time: 300
+max_steps: 300
name: Sim_all_wise
network_agents:
- agent_class: newsspread.WiseViewer
diff --git a/examples/newsspread/newsspread.py b/examples/newsspread/newsspread.py
index c3b5e6b..14d666f 100644
--- a/examples/newsspread/newsspread.py
+++ b/examples/newsspread/newsspread.py
@@ -16,13 +16,13 @@ class DumbViewer(FSM, NetworkAgent):
@state
def neutral(self):
if self['has_tv']:
- if prob(self.env['prob_tv_spread']):
+ if self.prob(self.model['prob_tv_spread']):
return self.infected
@state
def infected(self):
for neighbor in self.get_neighboring_agents(state_id=self.neutral.id):
- if prob(self.env['prob_neighbor_spread']):
+ if self.prob(self.model['prob_neighbor_spread']):
neighbor.infect()
def infect(self):
@@ -44,9 +44,9 @@ class HerdViewer(DumbViewer):
'''Notice again that this is NOT a state. See DumbViewer.infect for reference'''
infected = self.count_neighboring_agents(state_id=self.infected.id)
total = self.count_neighboring_agents()
- prob_infect = self.env['prob_neighbor_spread'] * infected/total
+ prob_infect = self.model['prob_neighbor_spread'] * infected/total
self.debug('prob_infect', prob_infect)
- if prob(prob_infect):
+ if self.prob(prob_infect):
self.set_state(self.infected)
@@ -63,9 +63,9 @@ class WiseViewer(HerdViewer):
@state
def cured(self):
- prob_cure = self.env['prob_neighbor_cure']
+ prob_cure = self.model['prob_neighbor_cure']
for neighbor in self.get_neighboring_agents(state_id=self.infected.id):
- if prob(prob_cure):
+ if self.prob(prob_cure):
try:
neighbor.cure()
except AttributeError:
@@ -80,7 +80,7 @@ class WiseViewer(HerdViewer):
1.0)
infected = max(self.count_neighboring_agents(self.infected.id),
1.0)
- prob_cure = self.env['prob_neighbor_cure'] * (cured/infected)
- if prob(prob_cure):
+ prob_cure = self.model['prob_neighbor_cure'] * (cured/infected)
+ if self.prob(prob_cure):
return self.cured
return self.set_state(super().infected)
diff --git a/examples/pubcrawl/pubcrawl.py b/examples/pubcrawl/pubcrawl.py
index 7fc5b5f..e100893 100644
--- a/examples/pubcrawl/pubcrawl.py
+++ b/examples/pubcrawl/pubcrawl.py
@@ -60,12 +60,10 @@ class Patron(FSM, NetworkAgent):
'''
level = logging.DEBUG
- defaults = {
- 'pub': None,
- 'drunk': False,
- 'pints': 0,
- 'max_pints': 3,
- }
+ pub = None
+ drunk = False
+ pints = 0
+ max_pints = 3
@default_state
@state
@@ -89,9 +87,9 @@ class Patron(FSM, NetworkAgent):
return self.sober_in_pub
self.debug('I am looking for a pub')
group = list(self.get_neighboring_agents())
- for pub in self.env.available_pubs():
+ for pub in self.model.available_pubs():
self.debug('We\'re trying to get into {}: total: {}'.format(pub, len(group)))
- if self.env.enter(pub, self, *group):
+ if self.model.enter(pub, self, *group):
self.info('We\'re all {} getting in {}!'.format(len(group), pub))
return self.sober_in_pub
@@ -128,7 +126,7 @@ class Patron(FSM, NetworkAgent):
success depend on both agents' openness.
'''
if force or self['openness'] > self.random.random():
- self.env.add_edge(self, other_agent)
+ self.model.add_edge(self, other_agent)
self.info('Made some friend {}'.format(other_agent))
return True
return False
@@ -150,7 +148,7 @@ class Patron(FSM, NetworkAgent):
return befriended
-class Police(FSM, NetworkAgent):
+class Police(FSM):
'''Simple agent to take drunk people out of pubs.'''
level = logging.INFO
diff --git a/examples/pubcrawl/pubcrawl.yml b/examples/pubcrawl/pubcrawl.yml
index 1f83f95..220b705 100644
--- a/examples/pubcrawl/pubcrawl.yml
+++ b/examples/pubcrawl/pubcrawl.yml
@@ -1,7 +1,7 @@
---
name: pubcrawl
num_trials: 3
-max_time: 10
+max_steps: 10
dump: false
network_params:
# Generate 100 empty nodes. They will be assigned a network agent
diff --git a/examples/rabbits/README.md b/examples/rabbits/README.md
new file mode 100644
index 0000000..42b6011
--- /dev/null
+++ b/examples/rabbits/README.md
@@ -0,0 +1,4 @@
+There are two similar implementations of this simulation.
+
+- `basic`. Using simple primites
+- `improved`. Using more advanced features such as the `time` module to avoid unnecessary computations (i.e., skip steps), and generator functions.
diff --git a/examples/rabbits/basic/rabbit_agents.py b/examples/rabbits/basic/rabbit_agents.py
new file mode 100644
index 0000000..2d5cf40
--- /dev/null
+++ b/examples/rabbits/basic/rabbit_agents.py
@@ -0,0 +1,130 @@
+from soil.agents import FSM, state, default_state, BaseAgent, NetworkAgent
+from soil.time import Delta
+from enum import Enum
+from collections import Counter
+import logging
+import math
+
+
+class RabbitModel(FSM, NetworkAgent):
+
+ sexual_maturity = 30
+ life_expectancy = 300
+
+ @default_state
+ @state
+ def newborn(self):
+ self.info('I am a newborn.')
+ self.age = 0
+ self.offspring = 0
+ return self.youngling
+
+ @state
+ def youngling(self):
+ self.age += 1
+ if self.age >= self.sexual_maturity:
+ self.info(f'I am fertile! My age is {self.age}')
+ return self.fertile
+
+ @state
+ def fertile(self):
+ raise Exception("Each subclass should define its fertile state")
+
+ @state
+ def dead(self):
+ self.die()
+
+
+class Male(RabbitModel):
+ max_females = 5
+ mating_prob = 0.001
+
+ @state
+ def fertile(self):
+ self.age += 1
+
+ if self.age > self.life_expectancy:
+ return self.dead
+
+ # Males try to mate
+ for f in self.model.agents(agent_class=Female,
+ state_id=Female.fertile.id,
+ limit=self.max_females):
+ self.debug('FOUND A FEMALE: ', repr(f), self.mating_prob)
+ if self.prob(self['mating_prob']):
+ f.impregnate(self)
+ break # Take a break
+
+
+class Female(RabbitModel):
+ gestation = 100
+
+ @state
+ def fertile(self):
+ # Just wait for a Male
+ self.age += 1
+ if self.age > self.life_expectancy:
+ return self.dead
+
+ def impregnate(self, male):
+ self.info(f'{repr(male)} impregnating female {repr(self)}')
+ self.mate = male
+ self.pregnancy = -1
+ self.set_state(self.pregnant, when=self.now)
+ self.number_of_babies = int(8+4*self.random.random())
+ self.debug('I am pregnant')
+
+ @state
+ def pregnant(self):
+ self.age += 1
+ self.pregnancy += 1
+
+ if self.prob(self.age / self.life_expectancy):
+ return self.die()
+
+ if self.pregnancy >= self.gestation:
+ self.info('Having {} babies'.format(self.number_of_babies))
+ for i in range(self.number_of_babies):
+ state = {}
+ agent_class = self.random.choice([Male, Female])
+ child = self.model.add_node(agent_class=agent_class,
+ topology=self.topology,
+ **state)
+ child.add_edge(self)
+ try:
+ child.add_edge(self.mate)
+ self.model.agents[self.mate].offspring += 1
+ except ValueError:
+ self.debug('The father has passed away')
+
+ self.offspring += 1
+ self.mate = None
+ return self.fertile
+
+ @state
+ def dead(self):
+ super().dead()
+ if 'pregnancy' in self and self['pregnancy'] > -1:
+ self.info('A mother has died carrying a baby!!')
+
+
+class RandomAccident(BaseAgent):
+
+ level = logging.INFO
+
+ def step(self):
+ rabbits_alive = self.model.topology.number_of_nodes()
+
+ if not rabbits_alive:
+ return self.die()
+
+ prob_death = self.model.get('prob_death', 1e-100)*math.floor(math.log10(max(1, rabbits_alive)))
+ self.debug('Killing some rabbits with prob={}!'.format(prob_death))
+ for i in self.iter_agents(agent_class=RabbitModel):
+ if i.state.id == i.dead.id:
+ continue
+ if self.prob(prob_death):
+ self.info('I killed a rabbit: {}'.format(i.id))
+ rabbits_alive -= 1
+ i.set_state(i.dead)
+ self.debug('Rabbits alive: {}'.format(rabbits_alive))
diff --git a/examples/rabbits/basic/rabbits.yml b/examples/rabbits/basic/rabbits.yml
new file mode 100644
index 0000000..facaefe
--- /dev/null
+++ b/examples/rabbits/basic/rabbits.yml
@@ -0,0 +1,41 @@
+---
+version: '2'
+name: rabbits_basic
+num_trials: 1
+seed: MySeed
+description: null
+group: null
+interval: 1.0
+max_time: 100
+model_class: soil.environment.Environment
+model_params:
+ agents:
+ topology: default
+ agent_class: rabbit_agents.RabbitModel
+ distribution:
+ - agent_class: rabbit_agents.Male
+ topology: default
+ weight: 1
+ - agent_class: rabbit_agents.Female
+ topology: default
+ weight: 1
+ fixed:
+ - agent_class: rabbit_agents.RandomAccident
+ topology: null
+ hidden: true
+ state:
+ group: environment
+ state:
+ group: network
+ mating_prob: 0.1
+ prob_death: 0.001
+ topologies:
+ default:
+ topology:
+ directed: true
+ links: []
+ nodes:
+ - id: 1
+ - id: 0
+extra:
+ visualization_params: {}
diff --git a/examples/rabbits/improved/rabbit_agents.py b/examples/rabbits/improved/rabbit_agents.py
new file mode 100644
index 0000000..d97b7e7
--- /dev/null
+++ b/examples/rabbits/improved/rabbit_agents.py
@@ -0,0 +1,130 @@
+from soil.agents import FSM, state, default_state, BaseAgent, NetworkAgent
+from soil.time import Delta, When, NEVER
+from enum import Enum
+import logging
+import math
+
+
+class RabbitModel(FSM, NetworkAgent):
+
+ mating_prob = 0.005
+ offspring = 0
+ birth = None
+
+ sexual_maturity = 3
+ life_expectancy = 30
+
+ @default_state
+ @state
+ def newborn(self):
+ self.birth = self.now
+ self.info(f'I am a newborn.')
+ self.model['rabbits_alive'] = self.model.get('rabbits_alive', 0) + 1
+
+ # Here we can skip the `youngling` state by using a coroutine/generator.
+ while self.age < self.sexual_maturity:
+ interval = self.sexual_maturity - self.age
+ yield Delta(interval)
+
+ self.info(f'I am fertile! My age is {self.age}')
+ return self.fertile
+
+ @property
+ def age(self):
+ return self.now - self.birth
+
+ @state
+ def fertile(self):
+ raise Exception("Each subclass should define its fertile state")
+
+ def step(self):
+ super().step()
+ if self.prob(self.age / self.life_expectancy):
+ return self.die()
+
+
+class Male(RabbitModel):
+
+ max_females = 5
+
+ @state
+ def fertile(self):
+ # Males try to mate
+ for f in self.model.agents(agent_class=Female,
+ state_id=Female.fertile.id,
+ limit=self.max_females):
+ self.debug('Found a female:', repr(f))
+ if self.prob(self['mating_prob']):
+ f.impregnate(self)
+ break # Take a break, don't try to impregnate the rest
+
+
+class Female(RabbitModel):
+ due_date = None
+ age_of_pregnancy = None
+ gestation = 10
+ mate = None
+
+ @state
+ def fertile(self):
+ return self.fertile, NEVER
+
+ @state
+ def pregnant(self):
+ self.info('I am pregnant')
+ if self.age > self.life_expectancy:
+ return self.dead
+
+ self.due_date = self.now + self.gestation
+
+ number_of_babies = int(8+4*self.random.random())
+
+ while self.now < self.due_date:
+ yield When(self.due_date)
+
+ self.info('Having {} babies'.format(number_of_babies))
+ for i in range(number_of_babies):
+ agent_class = self.random.choice([Male, Female])
+ child = self.model.add_node(agent_class=agent_class,
+ topology=self.topology)
+ self.model.add_edge(self, child)
+ self.model.add_edge(self.mate, child)
+ self.offspring += 1
+ self.model.agents[self.mate].offspring += 1
+ self.mate = None
+ self.due_date = None
+ return self.fertile
+
+ @state
+ def dead(self):
+ super().dead()
+ if self.due_date is not None:
+ self.info('A mother has died carrying a baby!!')
+
+ def impregnate(self, male):
+ self.info(f'{repr(male)} impregnating female {repr(self)}')
+ self.mate = male
+ self.set_state(self.pregnant, when=self.now)
+
+
+class RandomAccident(BaseAgent):
+
+ level = logging.INFO
+
+ def step(self):
+ rabbits_total = self.model.topology.number_of_nodes()
+ if 'rabbits_alive' not in self.model:
+ self.model['rabbits_alive'] = 0
+ rabbits_alive = self.model.get('rabbits_alive', rabbits_total)
+ prob_death = self.model.get('prob_death', 1e-100)*math.floor(math.log10(max(1, rabbits_alive)))
+ self.debug('Killing some rabbits with prob={}!'.format(prob_death))
+ for i in self.model.network_agents:
+ if i.state.id == i.dead.id:
+ continue
+ if self.prob(prob_death):
+ self.info('I killed a rabbit: {}'.format(i.id))
+ rabbits_alive = self.model['rabbits_alive'] = rabbits_alive -1
+ i.set_state(i.dead)
+ self.debug('Rabbits alive: {}/{}'.format(rabbits_alive, rabbits_total))
+ if self.model.count_agents(state_id=RabbitModel.dead.id) == self.model.topology.number_of_nodes():
+ self.die()
diff --git a/examples/rabbits/improved/rabbits.yml b/examples/rabbits/improved/rabbits.yml
new file mode 100644
index 0000000..ce5dd68
--- /dev/null
+++ b/examples/rabbits/improved/rabbits.yml
@@ -0,0 +1,41 @@
+---
+version: '2'
+name: rabbits_improved
+num_trials: 1
+seed: MySeed
+description: null
+group: null
+interval: 1.0
+max_time: 100
+model_class: soil.environment.Environment
+model_params:
+ agents:
+ topology: default
+ agent_class: rabbit_agents.RabbitModel
+ distribution:
+ - agent_class: rabbit_agents.Male
+ topology: default
+ weight: 1
+ - agent_class: rabbit_agents.Female
+ topology: default
+ weight: 1
+ fixed:
+ - agent_class: rabbit_agents.RandomAccident
+ topology: null
+ hidden: true
+ state:
+ group: environment
+ state:
+ group: network
+ mating_prob: 0.1
+ prob_death: 0.001
+ topologies:
+ default:
+ topology:
+ directed: true
+ links: []
+ nodes:
+ - id: 1
+ - id: 0
+extra:
+ visualization_params: {}
diff --git a/examples/rabbits/rabbit_agents.py b/examples/rabbits/rabbit_agents.py
deleted file mode 100644
index df371b2..0000000
--- a/examples/rabbits/rabbit_agents.py
+++ /dev/null
@@ -1,133 +0,0 @@
-from soil.agents import FSM, state, default_state, BaseAgent, NetworkAgent
-from enum import Enum
-import logging
-import math
-
-
-class Genders(Enum):
- male = 'male'
- female = 'female'
-
-
-class RabbitModel(FSM, NetworkAgent):
-
- defaults = {
- 'age': 0,
- 'gender': Genders.male.value,
- 'mating_prob': 0.001,
- 'offspring': 0,
- }
-
- sexual_maturity = 3 #4*30
- life_expectancy = 365 * 3
- gestation = 33
- pregnancy = -1
- max_females = 5
-
- @default_state
- @state
- def newborn(self):
- self.debug(f'I am a newborn at age {self["age"]}')
- self['age'] += 1
-
- if self['age'] >= self.sexual_maturity:
- self.debug('I am fertile!')
- return self.fertile
- @state
- def fertile(self):
- raise Exception("Each subclass should define its fertile state")
-
- @state
- def dead(self):
- self.info('Agent {} is dying'.format(self.id))
- self.die()
-
-
-class Male(RabbitModel):
-
- @state
- def fertile(self):
- self['age'] += 1
- if self['age'] > self.life_expectancy:
- return self.dead
-
- if self['gender'] == Genders.female.value:
- return
-
- # Males try to mate
- for f in self.get_agents(state_id=Female.fertile.id,
- agent_class=Female,
- limit_neighbors=False,
- limit=self.max_females):
- r = self.random.random()
- if r < self['mating_prob']:
- self.impregnate(f)
- break # Take a break
- def impregnate(self, whom):
- whom['pregnancy'] = 0
- whom['mate'] = self.id
- whom.set_state(whom.pregnant)
- self.debug('{} impregnating: {}. {}'.format(self.id, whom.id, whom.state))
-
-class Female(RabbitModel):
- @state
- def fertile(self):
- # Just wait for a Male
- pass
-
- @state
- def pregnant(self):
- self['age'] += 1
- if self['age'] > self.life_expectancy:
- return self.dead
-
- self['pregnancy'] += 1
- self.debug('Pregnancy: {}'.format(self['pregnancy']))
- if self['pregnancy'] >= self.gestation:
- number_of_babies = int(8+4*self.random.random())
- self.info('Having {} babies'.format(number_of_babies))
- for i in range(number_of_babies):
- state = {}
- state['gender'] = self.random.choice(list(Genders)).value
- child = self.env.add_node(self.__class__, state)
- self.env.add_edge(self.id, child.id)
- self.env.add_edge(self['mate'], child.id)
- # self.add_edge()
- self.debug('A BABY IS COMING TO LIFE')
- self.env['rabbits_alive'] = self.env.get('rabbits_alive', self.topology.number_of_nodes())+1
- self.debug('Rabbits alive: {}'.format(self.env['rabbits_alive']))
- self['offspring'] += 1
- self.env.get_agent(self['mate'])['offspring'] += 1
- del self['mate']
- self['pregnancy'] = -1
- return self.fertile
-
- @state
- def dead(self):
- super().dead()
- if 'pregnancy' in self and self['pregnancy'] > -1:
- self.info('A mother has died carrying a baby!!')
-
-
-class RandomAccident(BaseAgent):
-
- level = logging.DEBUG
-
- def step(self):
- rabbits_total = self.env.topology.number_of_nodes()
- if 'rabbits_alive' not in self.env:
- self.env['rabbits_alive'] = 0
- rabbits_alive = self.env.get('rabbits_alive', rabbits_total)
- prob_death = self.env.get('prob_death', 1e-100)*math.floor(math.log10(max(1, rabbits_alive)))
- self.debug('Killing some rabbits with prob={}!'.format(prob_death))
- for i in self.env.network_agents:
- if i.state['id'] == i.dead.id:
- continue
- if self.prob(prob_death):
- self.debug('I killed a rabbit: {}'.format(i.id))
- rabbits_alive = self.env['rabbits_alive'] = rabbits_alive -1
- self.log('Rabbits alive: {}'.format(self.env['rabbits_alive']))
- i.set_state(i.dead)
- self.log('Rabbits alive: {}/{}'.format(rabbits_alive, rabbits_total))
- if self.env.count_agents(state_id=RabbitModel.dead.id) == self.env.topology.number_of_nodes():
- self.die()
diff --git a/examples/rabbits/rabbits.yml b/examples/rabbits/rabbits.yml
deleted file mode 100644
index 1b1d148..0000000
--- a/examples/rabbits/rabbits.yml
+++ /dev/null
@@ -1,20 +0,0 @@
----
-name: rabbits_example
-max_time: 100
-interval: 1
-seed: MySeed
-agent_class: rabbit_agents.RabbitModel
-environment_agents:
- - agent_class: rabbit_agents.RandomAccident
-environment_params:
- prob_death: 0.001
-default_state:
- mating_prob: 0.1
-topology:
- nodes:
- - id: 1
- agent_class: rabbit_agents.Male
- - id: 0
- agent_class: rabbit_agents.Female
- directed: true
- links: []
diff --git a/examples/template.yml b/examples/template.yml
index a307eff..2b1f2b7 100644
--- a/examples/template.yml
+++ b/examples/template.yml
@@ -6,20 +6,20 @@ template:
group: simple
num_trials: 1
interval: 1
- max_time: 2
+ max_steps: 2
seed: "CompleteSeed!"
dump: false
- network_params:
- generator: complete_graph
- n: 10
- network_agents:
- - agent_class: CounterModel
- weight: "{{ x1 }}"
- state:
- state_id: 0
- - agent_class: AggregatedCounter
- weight: "{{ 1 - x1 }}"
- environment_params:
+ model_params:
+ network_params:
+ generator: complete_graph
+ n: 10
+ network_agents:
+ - agent_class: CounterModel
+ weight: "{{ x1 }}"
+ state:
+ state_id: 0
+ - agent_class: AggregatedCounter
+ weight: "{{ 1 - x1 }}"
name: "{{ x3 }}"
skip_test: true
vars:
diff --git a/examples/terrorism/TerroristNetworkModel.py b/examples/terrorism/TerroristNetworkModel.py
index 2fa6de4..bf5045f 100644
--- a/examples/terrorism/TerroristNetworkModel.py
+++ b/examples/terrorism/TerroristNetworkModel.py
@@ -81,6 +81,26 @@ class TerroristSpreadModel(FSM, Geo):
return
return self.leader
+ def ego_search(self, steps=1, center=False, node=None, **kwargs):
+ '''Get a list of nodes in the ego network of *node* of radius *steps*'''
+ node = as_node(node if node is not None else self)
+ G = self.subgraph(**kwargs)
+ return nx.ego_graph(G, node, center=center, radius=steps).nodes()
+
+ def degree(self, node, force=False):
+ node = as_node(node)
+ if force or (not hasattr(self.model, '_degree')) or getattr(self.model, '_last_step', 0) < self.now:
+ self.model._degree = nx.degree_centrality(self.G)
+ self.model._last_step = self.now
+ return self.model._degree[node]
+
+ def betweenness(self, node, force=False):
+ node = as_node(node)
+ if force or (not hasattr(self.model, '_betweenness')) or getattr(self.model, '_last_step', 0) < self.now:
+ self.model._betweenness = nx.betweenness_centrality(self.G)
+ self.model._last_step = self.now
+ return self.model._betweenness[node]
+
class TrainingAreaModel(FSM, Geo):
"""
@@ -194,14 +214,14 @@ class TerroristNetworkModel(TerroristSpreadModel):
break
def get_distance(self, target):
- source_x, source_y = nx.get_node_attributes(self.topology, 'pos')[self.id]
- target_x, target_y = nx.get_node_attributes(self.topology, 'pos')[target]
+ source_x, source_y = nx.get_node_attributes(self.G, 'pos')[self.id]
+ target_x, target_y = nx.get_node_attributes(self.G, 'pos')[target]
dx = abs( source_x - target_x )
dy = abs( source_y - target_y )
return ( dx ** 2 + dy ** 2 ) ** ( 1 / 2 )
def shortest_path_length(self, target):
try:
- return nx.shortest_path_length(self.topology, self.id, target)
+ return nx.shortest_path_length(self.G, self.id, target)
except nx.NetworkXNoPath:
return float('inf')
diff --git a/examples/terrorism/TerroristNetworkModel.yml b/examples/terrorism/TerroristNetworkModel.yml
index b5a3d09..f709766 100644
--- a/examples/terrorism/TerroristNetworkModel.yml
+++ b/examples/terrorism/TerroristNetworkModel.yml
@@ -1,31 +1,31 @@
name: TerroristNetworkModel_sim
-max_time: 150
+max_steps: 150
num_trials: 1
-network_params:
- generator: random_geometric_graph
- radius: 0.2
- # generator: geographical_threshold_graph
- # theta: 20
- n: 100
-network_agents:
- - agent_class: TerroristNetworkModel.TerroristNetworkModel
- weight: 0.8
- state:
- id: civilian # Civilians
- - agent_class: TerroristNetworkModel.TerroristNetworkModel
- weight: 0.1
- state:
- id: leader # Leaders
- - agent_class: TerroristNetworkModel.TrainingAreaModel
- weight: 0.05
- state:
- id: terrorist # Terrorism
- - agent_class: TerroristNetworkModel.HavenModel
- weight: 0.05
- state:
- id: civilian # Civilian
+model_params:
+ network_params:
+ generator: random_geometric_graph
+ radius: 0.2
+ # generator: geographical_threshold_graph
+ # theta: 20
+ n: 100
+ network_agents:
+ - agent_class: TerroristNetworkModel.TerroristNetworkModel
+ weight: 0.8
+ state:
+ id: civilian # Civilians
+ - agent_class: TerroristNetworkModel.TerroristNetworkModel
+ weight: 0.1
+ state:
+ id: leader # Leaders
+ - agent_class: TerroristNetworkModel.TrainingAreaModel
+ weight: 0.05
+ state:
+ id: terrorist # Terrorism
+ - agent_class: TerroristNetworkModel.HavenModel
+ weight: 0.05
+ state:
+ id: civilian # Civilian
-environment_params:
# TerroristSpreadModel
information_spread_intensity: 0.7
terrorist_additional_influence: 0.035
diff --git a/examples/torvalds.yml b/examples/torvalds.yml
index 421e2ac..3073d8c 100644
--- a/examples/torvalds.yml
+++ b/examples/torvalds.yml
@@ -1,14 +1,15 @@
---
name: torvalds_example
-max_time: 10
+max_steps: 10
interval: 2
-agent_class: CounterModel
-default_state:
- skill_level: 'beginner'
-network_params:
- path: 'torvalds.edgelist'
-states:
- Torvalds:
- skill_level: 'God'
- balkian:
- skill_level: 'developer'
+model_params:
+ agent_class: CounterModel
+ default_state:
+ skill_level: 'beginner'
+ network_params:
+ path: 'torvalds.edgelist'
+ states:
+ Torvalds:
+ skill_level: 'God'
+ balkian:
+ skill_level: 'developer'
diff --git a/requirements.txt b/requirements.txt
index 31f12d5..8383887 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,8 +2,9 @@ networkx>=2.5
numpy
matplotlib
pyyaml>=5.1
-pandas>=0.23
+pandas>=1
SALib>=1.3
Jinja2
-Mesa>=0.8.9
+Mesa>=1
pydantic>=1.9
+sqlalchemy>=1.4
diff --git a/soil/__init__.py b/soil/__init__.py
index 44b548f..9219e04 100644
--- a/soil/__init__.py
+++ b/soil/__init__.py
@@ -1,8 +1,10 @@
+from __future__ import annotations
+
import importlib
import sys
import os
-import pdb
import logging
+import traceback
from .version import __version__
@@ -16,11 +18,10 @@ from . import agents
from .simulation import *
from .environment import Environment
from . import serialization
-from . import analysis
from .utils import logger
from .time import *
-def main():
+def main(cfg='simulation.yml', **kwargs):
import argparse
from . import simulation
@@ -29,7 +30,7 @@ def main():
parser = argparse.ArgumentParser(description='Run a SOIL simulation')
parser.add_argument('file', type=str,
nargs="?",
- default='simulation.yml',
+ default=cfg,
help='Configuration file for the simulation (e.g., YAML or JSON)')
parser.add_argument('--version', action='store_true',
help='Show version info and exit')
@@ -39,6 +40,8 @@ def main():
help='Do not store the results of the simulation to disk, show in terminal instead.')
parser.add_argument('--pdb', action='store_true',
help='Use a pdb console in case of exception.')
+ parser.add_argument('--debug', action='store_true',
+ help='Run a customized version of a pdb console to debug a simulation.')
parser.add_argument('--graph', '-g', action='store_true',
help='Dump each trial\'s network topology as a GEXF graph. Defaults to false.')
parser.add_argument('--csv', action='store_true',
@@ -51,9 +54,22 @@ def main():
help='Run trials serially and synchronously instead of in parallel. Defaults to false.')
parser.add_argument('-e', '--exporter', action='append',
help='Export environment and/or simulations using this exporter')
+ parser.add_argument('--only-convert', '--convert', action='store_true',
+ help='Do not run the simulation, only convert the configuration file(s) and output them.')
+
+
+ parser.add_argument("--set",
+ metavar="KEY=VALUE",
+ action='append',
+ help="Set a number of parameters that will be passed to the simulation."
+ "(do not put spaces before or after the = sign). "
+ "If a value contains spaces, you should define "
+ "it with double quotes: "
+ 'foo="this is a sentence". Note that '
+ "values are always treated as strings.")
args = parser.parse_args()
- logging.basicConfig(level=getattr(logging, (args.level or 'INFO').upper()))
+ logger.setLevel(getattr(logging, (args.level or 'INFO').upper()))
if args.version:
return
@@ -65,9 +81,10 @@ def main():
logger.info('Loading config file: {}'.format(args.file))
- if args.pdb:
+ if args.pdb or args.debug:
args.synchronous = True
-
+ if args.debug:
+ os.environ['SOIL_DEBUG'] = 'true'
try:
exporters = list(args.exporter or ['default', ])
@@ -82,18 +99,48 @@ def main():
if not os.path.exists(args.file):
logger.error('Please, input a valid file')
return
- simulation.run_from_config(args.file,
- dry_run=args.dry_run,
- exporters=exporters,
- parallel=(not args.synchronous),
- outdir=args.output,
- exporter_params=exp_params)
- except Exception:
+ for sim in simulation.iter_from_config(args.file):
+ if args.set:
+ for s in args.set:
+ k, v = s.split('=', 1)[:2]
+ v = eval(v)
+ tail, *head = k.rsplit('.', 1)[::-1]
+ target = sim
+ if head:
+ for part in head[0].split('.'):
+ try:
+ target = getattr(target, part)
+ except AttributeError:
+ target = target[part]
+ try:
+ setattr(target, tail, v)
+ except AttributeError:
+ target[tail] = v
+
+ if args.only_convert:
+ print(sim.to_yaml())
+ continue
+
+ sim.run_simulation(dry_run=args.dry_run,
+ exporters=exporters,
+ parallel=(not args.synchronous),
+ outdir=args.output,
+ exporter_params=exp_params,
+ **kwargs)
+
+ except Exception as ex:
if args.pdb:
- pdb.post_mortem()
+ from .debugging import post_mortem
+ print(traceback.format_exc())
+ post_mortem()
else:
raise
-
+def easy(cfg, debug=False):
+ sim = simulation.from_config(cfg)
+ if debug or os.environ.get('SOIL_DEBUG'):
+ from .debugging import setup
+ setup(sys._getframe().f_back)
+ return sim
if __name__ == '__main__':
main()
diff --git a/soil/agents/CounterModel.py b/soil/agents/CounterModel.py
index d2edc1b..97c7356 100644
--- a/soil/agents/CounterModel.py
+++ b/soil/agents/CounterModel.py
@@ -7,15 +7,13 @@ class CounterModel(NetworkAgent):
in each step and adds it to its state.
"""
- defaults = {
- 'times': 0,
- 'neighbors': 0,
- 'total': 0
- }
+ times = 0
+ neighbors = 0
+ total = 0
def step(self):
# Outside effects
- total = len(list(self.env.agents))
+ total = len(list(self.model.schedule._agents))
neighbors = len(list(self.get_neighboring_agents()))
self['times'] = self.get('times', 0) + 1
self['neighbors'] = neighbors
@@ -28,17 +26,15 @@ class AggregatedCounter(NetworkAgent):
in each step and adds it to its state.
"""
- defaults = {
- 'times': 0,
- 'neighbors': 0,
- 'total': 0
- }
+ times = 0
+ neighbors = 0
+ total = 0
def step(self):
# Outside effects
self['times'] += 1
neighbors = len(list(self.get_neighboring_agents()))
self['neighbors'] += neighbors
- total = len(list(self.env.agents))
+ total = len(list(self.model.schedule.agents))
self['total'] += total
self.debug('Running for step: {}. Total: {}'.format(self.now, total))
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index 213c345..c7763f2 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import logging
from collections import OrderedDict, defaultdict
from collections.abc import MutableMapping, Mapping, Set
@@ -5,9 +7,13 @@ from abc import ABCMeta
from copy import deepcopy, copy
from functools import partial, wraps
from itertools import islice, chain
-import json
+import inspect
+import types
+import textwrap
import networkx as nx
+from typing import Any
+
from mesa import Agent as MesaAgent
from typing import Dict, List
@@ -27,7 +33,31 @@ class DeadAgent(Exception):
pass
-class BaseAgent(MesaAgent, MutableMapping):
+class MetaAgent(ABCMeta):
+ def __new__(mcls, name, bases, namespace):
+ defaults = {}
+
+ # Re-use defaults from inherited classes
+ for i in bases:
+ if isinstance(i, MetaAgent):
+ defaults.update(i._defaults)
+
+ new_nmspc = {
+ '_defaults': defaults,
+ }
+
+ for attr, func in namespace.items():
+ if isinstance(func, types.FunctionType) or isinstance(func, property) or attr[0] == '_':
+ new_nmspc[attr] = func
+ elif attr == 'defaults':
+ defaults.update(func)
+ else:
+ defaults[attr] = copy(func)
+
+ return super().__new__(mcls=mcls, name=name, bases=bases, namespace=new_nmspc)
+
+
+class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
"""
A special type of Mesa Agent that:
@@ -39,15 +69,12 @@ class BaseAgent(MesaAgent, MutableMapping):
Any attribute that is not preceded by an underscore (`_`) will also be added to its state.
"""
- defaults = {}
-
def __init__(self,
unique_id,
model,
name=None,
interval=None,
- **kwargs
- ):
+ **kwargs):
# Check for REQUIRED arguments
# Initialize agent parameters
if isinstance(unique_id, MesaAgent):
@@ -58,15 +85,16 @@ class BaseAgent(MesaAgent, MutableMapping):
self.name = str(name) if name else'{}[{}]'.format(type(self).__name__, self.unique_id)
- self._neighbors = None
self.alive = True
self.interval = interval or self.get('interval', 1)
- self.logger = logging.getLogger(self.model.id).getChild(self.name)
+ logger = utils.logger.getChild(getattr(self.model, 'id', self.model)).getChild(self.name)
+ self.logger = logging.LoggerAdapter(logger, {'agent_name': self.name})
if hasattr(self, 'level'):
self.logger.setLevel(self.level)
- for (k, v) in self.defaults.items():
+
+ for (k, v) in self._defaults.items():
if not hasattr(self, k) or getattr(self, k) is None:
setattr(self, k, deepcopy(v))
@@ -74,10 +102,6 @@ class BaseAgent(MesaAgent, MutableMapping):
setattr(self, k, v)
- for (k, v) in getattr(self, 'defaults', {}).items():
- if not hasattr(self, k) or getattr(self, k) is None:
- setattr(self, k, v)
-
def __hash__(self):
return hash(self.unique_id)
@@ -89,14 +113,6 @@ class BaseAgent(MesaAgent, MutableMapping):
def id(self):
return self.unique_id
- @property
- def env(self):
- return self.model
-
- @env.setter
- def env(self, model):
- self.model = model
-
@property
def state(self):
'''
@@ -108,19 +124,16 @@ class BaseAgent(MesaAgent, MutableMapping):
@state.setter
def state(self, value):
+ if not value:
+ return
for k, v in value.items():
self[k] = v
- @property
- def environment_params(self):
- return self.model.environment_params
-
- @environment_params.setter
- def environment_params(self, value):
- self.model.environment_params = value
-
def __getitem__(self, key):
- return getattr(self, key)
+ try:
+ return getattr(self, key)
+ except AttributeError:
+ raise KeyError(f'key {key} not found in agent')
def __delitem__(self, key):
return delattr(self, key)
@@ -138,11 +151,15 @@ class BaseAgent(MesaAgent, MutableMapping):
return self.items()
def keys(self):
- return (k for k in self.__dict__ if k[0] != '_')
-
- def items(self):
- return ((k, v) for (k, v) in self.__dict__.items() if k[0] != '_')
+ return (k for k in self.__dict__ if k[0] != '_' and k not in IGNORED_FIELDS)
+ def items(self, keys=None, skip=None):
+ keys = keys if keys is not None else self.keys()
+ it = ((k, self.get(k, None)) for k in keys)
+ if skip:
+ return filter(lambda x: x[0] not in skip, it)
+ return it
+
def get(self, key, default=None):
return self[key] if key in self else default
@@ -154,11 +171,9 @@ class BaseAgent(MesaAgent, MutableMapping):
# No environment
return None
- def die(self, remove=False):
- self.info(f'agent {self.unique_id} is dying')
+ def die(self):
+ self.info(f'agent dying')
self.alive = False
- if remove:
- self.remove_node(self.id)
return time.NEVER
def step(self):
@@ -170,7 +185,7 @@ class BaseAgent(MesaAgent, MutableMapping):
if not self.logger.isEnabledFor(level):
return
message = message + " ".join(str(i) for i in args)
- message = " @{:>3}: {}".format(self.now, message)
+ message = "[@{:>4}]\t{:>10}: {}".format(self.now, repr(self), message)
for k, v in kwargs:
message += " {k}={v} ".format(k, v)
extra = {}
@@ -179,33 +194,48 @@ class BaseAgent(MesaAgent, MutableMapping):
extra['agent_name'] = self.name
return self.logger.log(level, message, extra=extra)
-
-
def debug(self, *args, **kwargs):
return self.log(*args, level=logging.DEBUG, **kwargs)
def info(self, *args, **kwargs):
return self.log(*args, level=logging.INFO, **kwargs)
-# Alias
-# Agent = BaseAgent
+ def count_agents(self, **kwargs):
+ return len(list(self.get_agents(**kwargs)))
+
+ def get_agents(self, *args, **kwargs):
+ it = self.iter_agents(*args, **kwargs)
+ return list(it)
+
+ def iter_agents(self, *args, **kwargs):
+ yield from filter_agents(self.model.schedule._agents, *args, **kwargs)
+
+ def __str__(self):
+ return self.to_str()
+
+ def to_str(self, keys=None, skip=None, pretty=False):
+ content = dict(self.items(keys=keys))
+ if pretty and content:
+ d = content
+ content = '\n'
+ for k, v in d.items():
+ content += f'- {k}: {v}\n'
+ content = textwrap.indent(content, ' ')
+ return f"{repr(self)}{content}"
+
+ def __repr__(self):
+ return f"{self.__class__.__name__}({self.unique_id})"
+
class NetworkAgent(BaseAgent):
- @property
- def topology(self):
- return self.env.topology_for(self.unique_id)
+ def __init__(self, *args, topology, node_id, **kwargs):
+ super().__init__(*args, **kwargs)
- @property
- def node_id(self):
- return self.env.node_id_for(self.unique_id)
-
- @property
- def G(self):
- return self.model.topologies[self._topology]
-
- def count_agents(self, **kwargs):
- return len(list(self.get_agents(**kwargs)))
+ self.topology = topology
+ self.node_id = node_id
+ self.G = self.model.topologies[topology]
+ assert self.G
def count_neighboring_agents(self, state_id=None, **kwargs):
return len(self.get_neighboring_agents(state_id=state_id, **kwargs))
@@ -213,57 +243,47 @@ class NetworkAgent(BaseAgent):
def get_neighboring_agents(self, state_id=None, **kwargs):
return self.get_agents(limit_neighbors=True, state_id=state_id, **kwargs)
- def get_agents(self, *args, limit=None, **kwargs):
- it = self.iter_agents(*args, **kwargs)
- if limit is not None:
- it = islice(it, limit)
- return list(it)
-
def iter_agents(self, unique_id=None, limit_neighbors=False, **kwargs):
+ unique_ids = None
+ if isinstance(unique_id, list):
+ unique_ids = set(unique_id)
+ elif unique_id is not None:
+ unique_ids = set([unique_id,])
+
if limit_neighbors:
- unique_id = [self.topology.nodes[node]['agent_id'] for node in self.topology.neighbors(self.node_id)]
- if not unique_id:
+ neighbor_ids = set()
+ for node_id in self.G.neighbors(self.node_id):
+ if self.G.nodes[node_id].get('agent_id') is not None:
+ neighbor_ids.add(node_id)
+ if unique_ids:
+ unique_ids = unique_ids & neighbor_ids
+ else:
+ unique_ids = neighbor_ids
+ if not unique_ids:
return
-
- yield from self.model.agents(unique_id=unique_id, **kwargs)
-
+ unique_ids = list(unique_ids)
+ yield from super().iter_agents(unique_id=unique_ids, **kwargs)
def subgraph(self, center=True, **kwargs):
include = [self] if center else []
- G = self.topology.subgraph(n.node_id for n in list(self.get_agents(**kwargs)+include))
+ G = self.G.subgraph(n.node_id for n in list(self.get_agents(**kwargs)+include))
return G
- def remove_node(self, unique_id):
- self.topology.remove_node(unique_id)
+ def remove_node(self):
+ self.G.remove_node(self.node_id)
def add_edge(self, other, edge_attr_dict=None, *edge_attrs):
- # return super(NetworkAgent, self).add_edge(node1=self.id, node2=other, **kwargs)
- if self.unique_id not in self.topology.nodes(data=False):
+ if self.node_id not in self.G.nodes(data=False):
raise ValueError('{} not in list of existing agents in the network'.format(self.unique_id))
- if other.unique_id not in self.topology.nodes(data=False):
+ if other.node_id not in self.G.nodes(data=False):
raise ValueError('{} not in list of existing agents in the network'.format(other))
- self.topology.add_edge(self.unique_id, other.unique_id, edge_attr_dict=edge_attr_dict, *edge_attrs)
+ self.G.add_edge(self.node_id, other.node_id, edge_attr_dict=edge_attr_dict, *edge_attrs)
- def ego_search(self, steps=1, center=False, node=None, **kwargs):
- '''Get a list of nodes in the ego network of *node* of radius *steps*'''
- node = as_node(node if node is not None else self)
- G = self.subgraph(**kwargs)
- return nx.ego_graph(G, node, center=center, radius=steps).nodes()
-
- def degree(self, node, force=False):
- node = as_node(node)
- if force or (not hasattr(self.model, '_degree')) or getattr(self.model, '_last_step', 0) < self.now:
- self.model._degree = nx.degree_centrality(self.topology)
- self.model._last_step = self.now
- return self.model._degree[node]
-
- def betweenness(self, node, force=False):
- node = as_node(node)
- if force or (not hasattr(self.model, '_betweenness')) or getattr(self.model, '_last_step', 0) < self.now:
- self.model._betweenness = nx.betweenness_centrality(self.topology)
- self.model._last_step = self.now
- return self.model._betweenness[node]
+ def die(self, remove=True):
+ if remove:
+ self.remove_node()
+ return super().die()
def state(name=None):
@@ -273,24 +293,29 @@ def state(name=None):
The default value for state_id is the current state id.
The default value for when is the interval defined in the environment.
'''
+ if inspect.isgeneratorfunction(func):
+ orig_func = func
- @wraps(func)
- def func_wrapper(self):
- next_state = func(self)
- when = None
- if next_state is None:
- return when
- try:
- next_state, when = next_state
- except (ValueError, TypeError):
- pass
- if next_state:
- self.set_state(next_state)
- return when
+ @wraps(func)
+ def func(self):
+ while True:
+ if not self._coroutine:
+ self._coroutine = orig_func(self)
+ try:
+ n = next(self._coroutine)
+ if n:
+ return None, n
+ return
+ except StopIteration as ex:
+ self._coroutine = None
+ next_state = ex.value
+ if next_state is not None:
+ self.set_state(next_state)
+ return next_state
- func_wrapper.id = name or func.__name__
- func_wrapper.is_default = False
- return func_wrapper
+ func.id = name or func.__name__
+ func.is_default = False
+ return func
if callable(name):
return decorator(name)
@@ -303,60 +328,84 @@ def default_state(func):
return func
-class MetaFSM(ABCMeta):
- def __init__(cls, name, bases, nmspc):
- super(MetaFSM, cls).__init__(name, bases, nmspc)
+class MetaFSM(MetaAgent):
+ def __new__(mcls, name, bases, namespace):
states = {}
# Re-use states from inherited classes
default_state = None
for i in bases:
if isinstance(i, MetaFSM):
- for state_id, state in i.states.items():
+ for state_id, state in i._states.items():
if state.is_default:
default_state = state
states[state_id] = state
# Add new states
- for name, func in nmspc.items():
+ for attr, func in namespace.items():
if hasattr(func, 'id'):
if func.is_default:
default_state = func
states[func.id] = func
- cls.default_state = default_state
- cls.states = states
+
+ namespace.update({
+ '_default_state': default_state,
+ '_states': states,
+ })
+
+ return super(MetaFSM, mcls).__new__(mcls=mcls, name=name, bases=bases, namespace=namespace)
class FSM(BaseAgent, metaclass=MetaFSM):
def __init__(self, *args, **kwargs):
super(FSM, self).__init__(*args, **kwargs)
if not hasattr(self, 'state_id'):
- if not self.default_state:
+ if not self._default_state:
raise ValueError('No default state specified for {}'.format(self.unique_id))
- self.state_id = self.default_state.id
+ self.state_id = self._default_state.id
+ self._coroutine = None
self.set_state(self.state_id)
def step(self):
self.debug(f'Agent {self.unique_id} @ state {self.state_id}')
- interval = super().step()
- if 'id' not in self.state:
- if self.default_state:
- self.set_state(self.default_state.id)
- else:
- raise Exception('{} has no valid state id or default state'.format(self))
- interval = self.states[self.state_id](self) or interval
- if not self.alive:
- return time.NEVER
- return interval
+ default_interval = super().step()
- def set_state(self, state):
+ next_state = self._states[self.state_id](self)
+
+ when = None
+ try:
+ next_state, *when = next_state
+ if not when:
+ when = None
+ elif len(when) == 1:
+ when = when[0]
+ else:
+ raise ValueError('Too many values returned. Only state (and time) allowed')
+ except TypeError:
+ pass
+
+ if next_state is not None:
+ self.set_state(next_state)
+
+ return when or default_interval
+
+ def set_state(self, state, when=None):
if hasattr(state, 'id'):
state = state.id
- if state not in self.states:
+ if state not in self._states:
raise ValueError('{} is not a valid state'.format(state))
self.state_id = state
+ if when is not None:
+ self.model.schedule.add(self, when=when)
return state
+ def die(self):
+ return self.dead, super().die()
+
+ @state
+ def dead(self):
+ return self.die()
+
def prob(prob, random):
'''
@@ -476,81 +525,81 @@ def _convert_agent_classs(ind, to_string=False, **kwargs):
return deserialize_definition(ind, **kwargs)
-def _agent_from_definition(definition, random, value=-1, unique_id=None):
- """Used in the initialization of agents given an agent distribution."""
- if value < 0:
- value = random.random()
- for d in sorted(definition, key=lambda x: x.get('threshold')):
- threshold = d.get('threshold', (-1, -1))
- # Check if the definition matches by id (first) or by threshold
- if (unique_id is not None and unique_id in d.get('ids', [])) or \
- (value >= threshold[0] and value < threshold[1]):
- state = {}
- if 'state' in d:
- state = deepcopy(d['state'])
- return d['agent_class'], state
+# def _agent_from_definition(definition, random, value=-1, unique_id=None):
+# """Used in the initialization of agents given an agent distribution."""
+# if value < 0:
+# value = random.random()
+# for d in sorted(definition, key=lambda x: x.get('threshold')):
+# threshold = d.get('threshold', (-1, -1))
+# # Check if the definition matches by id (first) or by threshold
+# if (unique_id is not None and unique_id in d.get('ids', [])) or \
+# (value >= threshold[0] and value < threshold[1]):
+# state = {}
+# if 'state' in d:
+# state = deepcopy(d['state'])
+# return d['agent_class'], state
- raise Exception('Definition for value {} not found in: {}'.format(value, definition))
+# raise Exception('Definition for value {} not found in: {}'.format(value, definition))
-def _definition_to_dict(definition, random, size=None, default_state=None):
- state = default_state or {}
- agents = {}
- remaining = {}
- if size:
- for ix in range(size):
- remaining[ix] = copy(state)
- else:
- remaining = defaultdict(lambda x: copy(state))
+# def _definition_to_dict(definition, random, size=None, default_state=None):
+# state = default_state or {}
+# agents = {}
+# remaining = {}
+# if size:
+# for ix in range(size):
+# remaining[ix] = copy(state)
+# else:
+# remaining = defaultdict(lambda x: copy(state))
- distro = sorted([item for item in definition if 'weight' in item])
+# distro = sorted([item for item in definition if 'weight' in item])
- id = 0
+# id = 0
- def init_agent(item, id=ix):
- while id in agents:
- id += 1
+# def init_agent(item, id=ix):
+# while id in agents:
+# id += 1
- agent = remaining[id]
- agent['state'].update(copy(item.get('state', {})))
- agents[agent.unique_id] = agent
- del remaining[id]
- return agent
+# agent = remaining[id]
+# agent['state'].update(copy(item.get('state', {})))
+# agents[agent.unique_id] = agent
+# del remaining[id]
+# return agent
- for item in definition:
- if 'ids' in item:
- ids = item['ids']
- del item['ids']
- for id in ids:
- agent = init_agent(item, id)
+# for item in definition:
+# if 'ids' in item:
+# ids = item['ids']
+# del item['ids']
+# for id in ids:
+# agent = init_agent(item, id)
- for item in definition:
- if 'number' in item:
- times = item['number']
- del item['number']
- for times in range(times):
- if size:
- ix = random.choice(remaining.keys())
- agent = init_agent(item, id)
- else:
- agent = init_agent(item)
- if not size:
- return agents
+# for item in definition:
+# if 'number' in item:
+# times = item['number']
+# del item['number']
+# for times in range(times):
+# if size:
+# ix = random.choice(remaining.keys())
+# agent = init_agent(item, id)
+# else:
+# agent = init_agent(item)
+# if not size:
+# return agents
- if len(remaining) < 0:
- raise Exception('Invalid definition. Too many agents to add')
+# if len(remaining) < 0:
+# raise Exception('Invalid definition. Too many agents to add')
- total_weight = float(sum(s['weight'] for s in distro))
- unit = size / total_weight
+# total_weight = float(sum(s['weight'] for s in distro))
+# unit = size / total_weight
- for item in distro:
- times = unit * item['weight']
- del item['weight']
- for times in range(times):
- ix = random.choice(remaining.keys())
- agent = init_agent(item, id)
- return agents
+# for item in distro:
+# times = unit * item['weight']
+# del item['weight']
+# for times in range(times):
+# ix = random.choice(remaining.keys())
+# agent = init_agent(item, id)
+# return agents
class AgentView(Mapping, Set):
@@ -571,59 +620,43 @@ class AgentView(Mapping, Set):
# Mapping methods
def __len__(self):
- return sum(len(x) for x in self._agents.values())
+ return len(self._agents)
def __iter__(self):
- yield from iter(chain.from_iterable(g.values() for g in self._agents.values()))
+ yield from self._agents.values()
def __getitem__(self, agent_id):
if isinstance(agent_id, slice):
raise ValueError(f"Slicing is not supported")
- for group in self._agents.values():
- if agent_id in group:
- return group[agent_id]
+ if agent_id in self._agents:
+ return self._agents[agent_id]
raise ValueError(f"Agent {agent_id} not found")
def filter(self, *args, **kwargs):
- yield from filter_groups(self._agents, *args, **kwargs)
+ yield from filter_agents(self._agents, *args, **kwargs)
def one(self, *args, **kwargs):
- return next(filter_groups(self._agents, *args, **kwargs))
+ return next(filter_agents(self._agents, *args, **kwargs))
def __call__(self, *args, **kwargs):
return list(self.filter(*args, **kwargs))
def __contains__(self, agent_id):
- return any(agent_id in g for g in self._agents)
+ return agent_id in self._agents
def __str__(self):
- return str(list(a.unique_id for a in self))
+ return str(list(unique_id for unique_id in self.keys()))
def __repr__(self):
return f"{self.__class__.__name__}({self})"
-def filter_groups(groups, *, group=None, **kwargs):
- assert isinstance(groups, dict)
-
- if group is not None and not isinstance(group, list):
- group = [group]
-
- if group:
- groups = list(groups[g] for g in group if g in groups)
- else:
- groups = list(groups.values())
-
- agents = chain.from_iterable(filter_group(g, **kwargs) for g in groups)
-
- yield from agents
-
-
-def filter_group(group, *id_args, unique_id=None, state_id=None, agent_class=None, ignore=None, state=None, **kwargs):
+def filter_agents(agents, *id_args, unique_id=None, state_id=None, agent_class=None, ignore=None, state=None,
+ limit=None, **kwargs):
'''
Filter agents given as a dict, by the criteria given as arguments (e.g., certain type or state id).
'''
- assert isinstance(group, dict)
+ assert isinstance(agents, dict)
ids = []
@@ -636,6 +669,11 @@ def filter_group(group, *id_args, unique_id=None, state_id=None, agent_class=Non
if id_args:
ids += id_args
+ if ids:
+ f = (agents[aid] for aid in ids if aid in agents)
+ else:
+ f = (a for a in agents.values())
+
if state_id is not None and not isinstance(state_id, (tuple, list)):
state_id = tuple([state_id])
@@ -646,12 +684,6 @@ def filter_group(group, *id_args, unique_id=None, state_id=None, agent_class=Non
except TypeError:
agent_class = tuple([agent_class])
- if ids:
- agents = (group[aid] for aid in ids if aid in group)
- else:
- agents = (a for a in group.values())
-
- f = agents
if ignore:
f = filter(lambda x: x not in ignore, f)
@@ -667,83 +699,125 @@ def filter_group(group, *id_args, unique_id=None, state_id=None, agent_class=Non
for k, v in state.items():
f = filter(lambda agent: agent.state.get(k, None) == v, f)
+ if limit is not None:
+ f = islice(f, limit)
+
yield from f
-def from_config(cfg: Dict[str, config.AgentConfig], env, random):
+def from_config(cfg: config.AgentConfig, random, topologies: Dict[str, nx.Graph] = None) -> List[Dict[str, Any]]:
'''
- Agents are specified in groups.
- Each group can be specified in two ways, either through a fixed list in which each item has
- has the agent type, number of agents to create, and the other parameters, or through what we call
- an `agent distribution`, which is similar but instead of number of agents, it specifies the weight
- of each agent type.
+ This function turns an agentconfig into a list of individual "agent specifications", which are just a dictionary
+ with the parameters that the environment will use to construct each agent.
+
+ This function does NOT return a list of agents, mostly because some attributes to the agent are not known at the
+ time of calling this function, such as `unique_id`.
'''
- default = cfg.get('default', None)
- return {k: _group_from_config(c, default=default, env=env, random=random) for (k, c) in cfg.items() if k is not 'default'}
+ default = cfg or config.AgentConfig()
+ if not isinstance(cfg, config.AgentConfig):
+ cfg = config.AgentConfig(**cfg)
+ return _agents_from_config(cfg, topologies=topologies, random=random)
-def _group_from_config(cfg: config.AgentConfig, default: config.SingleAgentConfig, env, random):
+def _agents_from_config(cfg: config.AgentConfig,
+ topologies: Dict[str, nx.Graph],
+ random) -> List[Dict[str, Any]]:
if cfg and not isinstance(cfg, config.AgentConfig):
cfg = config.AgentConfig(**cfg)
- if default and not isinstance(default, config.SingleAgentConfig):
- default = config.SingleAgentConfig(**default)
- agents = {}
+ agents = []
+
+ assigned = defaultdict(int)
+
if cfg.fixed is not None:
- agents = _from_fixed(cfg.fixed, topology=cfg.topology, default=default, env=env)
- if cfg.distribution:
- n = cfg.n or len(env.topologies[cfg.topology or default.topology])
- target = n - len(agents)
- agents.update(_from_distro(cfg.distribution, target,
- topology=cfg.topology or default.topology,
- default=default,
- env=env, random=random))
- assert len(agents) == n
- if cfg.override:
- for attrs in cfg.override:
- if attrs.filter:
- filtered = list(filter_group(agents, **attrs.filter))
- else:
- filtered = list(agents)
+ agents, counts = _from_fixed(cfg.fixed, topology=cfg.topology, default=cfg)
+ assigned.update(counts)
- if attrs.n > len(filtered):
- raise ValueError(f'Not enough agents to sample. Got {len(filtered)}, expected >= {attrs.n}')
- for agent in random.sample(filtered, attrs.n):
- agent.state.update(attrs.state)
+ n = cfg.n
+
+ if cfg.distribution:
+ topo_size = {top: len(topologies[top]) for top in topologies}
+
+ grouped = defaultdict(list)
+ total = []
+
+ for d in cfg.distribution:
+ if d.strategy == config.Strategy.topology:
+ topology = d.topology if ('topology' in d.__fields_set__) else cfg.topology
+ if not topology:
+ raise ValueError('The "topology" strategy only works if the topology parameter is specified')
+ if topology not in topo_size:
+ raise ValueError(f'Unknown topology selected: { topology }. Make sure the topology has been defined')
+
+ grouped[topology].append(d)
+
+ if d.strategy == config.Strategy.total:
+ if not cfg.n:
+ raise ValueError('Cannot use the "total" strategy without providing the total number of agents')
+ total.append(d)
+
+
+ for (topo, distro) in grouped.items():
+ if not topologies or topo not in topo_size:
+ raise ValueError(
+ 'You need to specify a target number of agents for the distribution \
+ or a configuration with a topology, along with a dictionary with \
+ all the available topologies')
+ n = len(topologies[topo])
+ target = topo_size[topo] - assigned[topo]
+ new_agents = _from_distro(cfg.distribution, target,
+ topology=topo,
+ default=cfg,
+ random=random)
+ assigned[topo] += len(new_agents)
+ agents += new_agents
+
+ if total:
+ remaining = n - sum(assigned.values())
+ agents += _from_distro(total, remaining,
+ topology='', # DO NOT assign to any topology
+ default=cfg,
+ random=random)
+
+
+ if sum(assigned.values()) != sum(topo_size.values()):
+ utils.logger.warn(f'The total number of agents does not match the total number of nodes in '
+ 'every topology. This may be due to a definition error: assigned: '
+ f'{ assigned } total sizes: { topo_size }')
return agents
-def _from_fixed(lst: List[config.FixedAgentConfig], topology: str, default: config.SingleAgentConfig, env):
- agents = {}
+def _from_fixed(lst: List[config.FixedAgentConfig], topology: str, default: config.SingleAgentConfig) -> List[Dict[str, Any]]:
+ agents = []
+
+ counts = {}
for fixed in lst:
- agent_id = fixed.agent_id
- if agent_id is None:
- agent_id = env.next_id()
+ agent = {}
+ if default:
+ agent = default.state.copy()
+ agent.update(fixed.state)
+ cls = serialization.deserialize(fixed.agent_class or (default and default.agent_class))
+ agent['agent_class'] = cls
+ topo = fixed.topology if ('topology' in fixed.__fields_set__) else topology or default.topology
- cls = serialization.deserialize(fixed.agent_class or default.agent_class)
- state = fixed.state.copy()
- state.update(default.state)
- agent = cls(unique_id=agent_id,
- model=env,
- **state)
- topology = fixed.topology if (fixed.topology is not None) else (topology or default.topology)
- if topology:
- env.agent_to_node(agent_id, topology, fixed.node_id)
- agents[agent.unique_id] = agent
+ if topo:
+ agent['topology'] = topo
+ if not fixed.hidden:
+ counts[topo] = counts.get(topo, 0) + 1
+ agents.append(agent)
- return agents
+ return agents, counts
def _from_distro(distro: List[config.AgentDistro],
n: int,
topology: str,
default: config.SingleAgentConfig,
- env,
- random):
+ random) -> List[Dict[str, Any]]:
- agents = {}
+ agents = []
if n is None:
if any(lambda dist: dist.n is None, distro):
@@ -775,19 +849,16 @@ def _from_distro(distro: List[config.AgentDistro],
for idx in indices:
d = distro[idx]
+ agent = d.state.copy()
cls = classes[idx]
- agent_id = env.next_id()
- state = d.state.copy()
+ agent['agent_class'] = cls
if default:
- state.update(default.state)
- agent = cls(unique_id=agent_id, model=env, **state)
- topology = d.topology if (d.topology is not None) else topology or default.topology
+ agent.update(default.state)
+ # agent = cls(unique_id=agent_id, model=env, **state)
+ topology = d.topology if ('topology' in d.__fields_set__) else topology or default.topology
if topology:
- env.agent_to_node(agent.unique_id, topology)
- assert agent.name is not None
- assert agent.name != 'None'
- assert agent.name
- agents[agent.unique_id] = agent
+ agent['topology'] = topology
+ agents.append(agent)
return agents
diff --git a/soil/analysis.py b/soil/analysis.py
deleted file mode 100644
index 65d8468..0000000
--- a/soil/analysis.py
+++ /dev/null
@@ -1,206 +0,0 @@
-import pandas as pd
-
-import glob
-import yaml
-from os.path import join
-
-from . import serialization
-from tsih import History
-
-
-def read_data(*args, group=False, **kwargs):
- iterable = _read_data(*args, **kwargs)
- if group:
- return group_trials(iterable)
- else:
- return list(iterable)
-
-
-def _read_data(pattern, *args, from_csv=False, process_args=None, **kwargs):
- if not process_args:
- process_args = {}
- for folder in glob.glob(pattern):
- config_file = glob.glob(join(folder, '*.yml'))[0]
- config = yaml.load(open(config_file), Loader=yaml.SafeLoader)
- df = None
- if from_csv:
- for trial_data in sorted(glob.glob(join(folder,
- '*.environment.csv'))):
- df = read_csv(trial_data, **kwargs)
- yield config_file, df, config
- else:
- for trial_data in sorted(glob.glob(join(folder, '*.sqlite'))):
- df = read_sql(trial_data, **kwargs)
- yield config_file, df, config
-
-
-def read_sql(db, *args, **kwargs):
- h = History(db_path=db, backup=False, readonly=True)
- df = h.read_sql(*args, **kwargs)
- return df
-
-
-def read_csv(filename, keys=None, convert_types=False, **kwargs):
- '''
- Read a CSV in canonical form: ::
-
-
-
- '''
- df = pd.read_csv(filename)
- if convert_types:
- df = convert_types_slow(df)
- if keys:
- df = df[df['key'].isin(keys)]
- df = process_one(df)
- return df
-
-
-def convert_row(row):
- row['value'] = serialization.deserialize(row['value_type'], row['value'])
- return row
-
-
-def convert_types_slow(df):
- '''
- Go over every column in a dataframe and convert it to the type determined by the `get_types`
- function.
-
- This is a slow operation.
- '''
- dtypes = get_types(df)
- for k, v in dtypes.items():
- t = df[df['key']==k]
- t['value'] = t['value'].astype(v)
- df = df.apply(convert_row, axis=1)
- return df
-
-
-def split_processed(df):
- env = df.loc[:, df.columns.get_level_values(1).isin(['env', 'stats'])]
- agents = df.loc[:, ~df.columns.get_level_values(1).isin(['env', 'stats'])]
- return env, agents
-
-
-def split_df(df):
- '''
- Split a dataframe in two dataframes: one with the history of agents,
- and one with the environment history
- '''
- envmask = (df['agent_id'] == 'env')
- n_env = envmask.sum()
- if n_env == len(df):
- return df, None
- elif n_env == 0:
- return None, df
- agents, env = [x for _, x in df.groupby(envmask)]
- return env, agents
-
-
-def process(df, **kwargs):
- '''
- Process a dataframe in canonical form ``(t_step, agent_id, key, value, value_type)`` into
- two dataframes with a column per key: one with the history of the agents, and one for the
- history of the environment.
- '''
- env, agents = split_df(df)
- return process_one(env, **kwargs), process_one(agents, **kwargs)
-
-
-def get_types(df):
- '''
- Get the value type for every key stored in a raw history dataframe.
- '''
- dtypes = df.groupby(by=['key'])['value_type'].unique()
- return {k:v[0] for k,v in dtypes.iteritems()}
-
-
-def process_one(df, *keys, columns=['key', 'agent_id'], values='value',
- fill=True, index=['t_step',],
- aggfunc='first', **kwargs):
- '''
- Process a dataframe in canonical form ``(t_step, agent_id, key, value, value_type)`` into
- a dataframe with a column per key
- '''
- if df is None:
- return df
- if keys:
- df = df[df['key'].isin(keys)]
-
- df = df.pivot_table(values=values, index=index, columns=columns,
- aggfunc=aggfunc, **kwargs)
- if fill:
- df = fillna(df)
- return df
-
-
-def get_count(df, *keys):
- '''
- For every t_step and key, get the value count.
-
- The result is a dataframe with `t_step` as index, an a multiindex column based on `key` and the values found for each `key`.
- '''
- if keys:
- df = df[list(keys)]
- df.columns = df.columns.remove_unused_levels()
- counts = pd.DataFrame()
- for key in df.columns.levels[0]:
- g = df[[key]].apply(pd.Series.value_counts, axis=1).fillna(0)
- for value, series in g.iteritems():
- counts[key, value] = series
- counts.columns = pd.MultiIndex.from_tuples(counts.columns)
- return counts
-
-
-def get_majority(df, *keys):
- '''
- For every t_step and key, get the value of the majority of agents
-
- The result is a dataframe with `t_step` as index, and columns based on `key`.
- '''
- df = get_count(df, *keys)
- return df.stack(level=0).idxmax(axis=1).unstack()
-
-
-def get_value(df, *keys, aggfunc='sum'):
- '''
- For every t_step and key, get the value of *numeric columns*, aggregated using a specific function.
- '''
- if keys:
- df = df[list(keys)]
- df.columns = df.columns.remove_unused_levels()
- df = df.select_dtypes('number')
- return df.groupby(level='key', axis=1).agg(aggfunc)
-
-
-def plot_all(*args, plot_args={}, **kwargs):
- '''
- Read all the trial data and plot the result of applying a function on them.
- '''
- dfs = do_all(*args, **kwargs)
- ps = []
- for line in dfs:
- f, df, config = line
- if len(df) < 1:
- continue
- df.plot(title=config['name'], **plot_args)
- ps.append(df)
- return ps
-
-def do_all(pattern, func, *keys, include_env=False, **kwargs):
- for config_file, df, config in read_data(pattern, keys=keys):
- if len(df) < 1:
- continue
- p = func(df, *keys, **kwargs)
- yield config_file, p, config
-
-
-def group_trials(trials, aggfunc=['mean', 'min', 'max', 'std']):
- trials = list(trials)
- trials = list(map(lambda x: x[1] if isinstance(x, tuple) else x, trials))
- return pd.concat(trials).groupby(level=0).agg(aggfunc).reorder_levels([2, 0,1] ,axis=1)
-
-
-def fillna(df):
- new_df = df.ffill(axis=0)
- return new_df
diff --git a/soil/config.py b/soil/config.py
index cf4cee2..20934db 100644
--- a/soil/config.py
+++ b/soil/config.py
@@ -1,12 +1,18 @@
from __future__ import annotations
+
+from enum import Enum
from pydantic import BaseModel, ValidationError, validator, root_validator
import yaml
import os
import sys
+
from typing import Any, Callable, Dict, List, Optional, Union, Type
from pydantic import BaseModel, Extra
+
+from . import environment, utils
+
import networkx as nx
@@ -36,7 +42,6 @@ class NetParams(BaseModel, extra=Extra.allow):
class NetConfig(BaseModel):
- group: str = 'network'
params: Optional[NetParams]
topology: Optional[Union[Topology, nx.Graph]]
path: Optional[str]
@@ -56,9 +61,6 @@ class NetConfig(BaseModel):
class EnvConfig(BaseModel):
- environment_class: Union[Type, str] = 'soil.Environment'
- params: Dict[str, Any] = {}
- schedule: Union[Type, str] = 'soil.time.TimedActivation'
@staticmethod
def default():
@@ -67,19 +69,19 @@ class EnvConfig(BaseModel):
class SingleAgentConfig(BaseModel):
agent_class: Optional[Union[Type, str]] = None
- agent_id: Optional[int] = None
+ unique_id: Optional[int] = None
topology: Optional[str] = None
node_id: Optional[Union[int, str]] = None
- name: Optional[str] = None
state: Optional[Dict[str, Any]] = {}
+
class FixedAgentConfig(SingleAgentConfig):
n: Optional[int] = 1
+ hidden: Optional[bool] = False # Do not count this agent towards total agent count
@root_validator
def validate_all(cls, values):
if values.get('agent_id', None) is not None and values.get('n', 1) > 1:
- print(values)
raise ValueError(f"An agent_id can only be provided when there is only one agent ({values.get('n')} given)")
return values
@@ -88,13 +90,19 @@ class OverrideAgentConfig(FixedAgentConfig):
filter: Optional[Dict[str, Any]] = None
+class Strategy(Enum):
+ topology = 'topology'
+ total = 'total'
+
+
class AgentDistro(SingleAgentConfig):
weight: Optional[float] = 1
+ strategy: Strategy = Strategy.topology
class AgentConfig(SingleAgentConfig):
n: Optional[int] = None
- topology: Optional[str] = None
+ topology: Optional[str]
distribution: Optional[List[AgentDistro]] = None
fixed: Optional[List[FixedAgentConfig]] = None
override: Optional[List[OverrideAgentConfig]] = None
@@ -110,19 +118,32 @@ class AgentConfig(SingleAgentConfig):
return values
-class Config(BaseModel, extra=Extra.forbid):
+class Config(BaseModel, extra=Extra.allow):
version: Optional[str] = '1'
- id: str = 'Unnamed Simulation'
+ name: str = 'Unnamed Simulation'
+ description: Optional[str] = None
group: str = None
dir_path: Optional[str] = None
num_trials: int = 1
max_time: float = 100
+ max_steps: int = -1
interval: float = 1
seed: str = ""
+ dry_run: bool = False
- model_class: Union[Type, str]
- model_parameters: Optiona[Dict[str, Any]] = {}
+ model_class: Union[Type, str] = environment.Environment
+ model_params: Optional[Dict[str, Any]] = {}
+
+ visualization_params: Optional[Dict[str, Any]] = {}
+
+ @classmethod
+ def from_raw(cls, cfg):
+ if isinstance(cfg, Config):
+ return cfg
+ if cfg.get('version', '1') == '1' and any(k in cfg for k in ['agents', 'agent_class', 'topology', 'environment_class']):
+ return convert_old(cfg)
+ return Config(**cfg)
def convert_old(old, strict=True):
@@ -132,87 +153,84 @@ def convert_old(old, strict=True):
This is still a work in progress and might not work in many cases.
'''
- #TODO: implement actual conversion
- print('The old configuration format is no longer supported. \
- Update your config files or run Soil==0.20')
- raise NotImplementedError()
+ utils.logger.warning('The old configuration format is deprecated. The converted file MAY NOT yield the right results')
-
- new = {}
-
- general = {}
- for k in ['id',
- 'group',
- 'dir_path',
- 'num_trials',
- 'max_time',
- 'interval',
- 'seed']:
- if k in old:
- general[k] = old[k]
-
- if 'name' in old:
- general['id'] = old['name']
+ new = old.copy()
network = {}
+ if 'topology' in old:
+ del new['topology']
+ network['topology'] = old['topology']
if 'network_params' in old and old['network_params']:
+ del new['network_params']
for (k, v) in old['network_params'].items():
if k == 'path':
network['path'] = v
else:
network.setdefault('params', {})[k] = v
- if 'topology' in old:
- network['topology'] = old['topology']
+ topologies = {}
+ if network:
+ topologies['default'] = network
- agents = {
- 'network': {},
- 'default': {},
- }
-
- if 'agent_class' in old:
- agents['default']['agent_class'] = old['agent_class']
-
- if 'default_state' in old:
- agents['default']['state'] = old['default_state']
+ agents = {'fixed': [], 'distribution': []}
def updated_agent(agent):
+ '''Convert an agent definition'''
newagent = dict(agent)
- newagent['agent_class'] = newagent['agent_class']
- del newagent['agent_class']
return newagent
- for agent in old.get('environment_agents', []):
- agents['environment'] = {'distribution': [], 'fixed': []}
- if 'agent_id' in agent:
- agent['name'] = agent['agent_id']
- del agent['agent_id']
- agents['environment']['fixed'].append(updated_agent(agent))
-
by_weight = []
fixed = []
override = []
- if 'network_agents' in old:
- agents['network']['topology'] = 'default'
+ if 'environment_agents' in new:
- for agent in old['network_agents']:
+ for agent in new['environment_agents']:
+ agent.setdefault('state', {})['group'] = 'environment'
+ if 'agent_id' in agent:
+ agent['state']['name'] = agent['agent_id']
+ del agent['agent_id']
+ agent['hidden'] = True
+ agent['topology'] = None
+ fixed.append(updated_agent(agent))
+ del new['environment_agents']
+
+
+ if 'agent_class' in old:
+ del new['agent_class']
+ agents['agent_class'] = old['agent_class']
+
+ if 'default_state' in old:
+ del new['default_state']
+ agents['state'] = old['default_state']
+
+ if 'network_agents' in old:
+ agents['topology'] = 'default'
+
+ agents.setdefault('state', {})['group'] = 'network'
+
+ for agent in new['network_agents']:
agent = updated_agent(agent)
if 'agent_id' in agent:
+ agent['state']['name'] = agent['agent_id']
+ del agent['agent_id']
fixed.append(agent)
else:
by_weight.append(agent)
+ del new['network_agents']
if 'agent_class' in old and (not fixed and not by_weight):
- agents['network']['topology'] = 'default'
- by_weight = [{'agent_class': old['agent_class']}]
+ agents['topology'] = 'default'
+ by_weight = [{'agent_class': old['agent_class'], 'weight': 1}]
# TODO: translate states properly
if 'states' in old:
+ del new['states']
states = old['states']
if isinstance(states, dict):
states = states.items()
@@ -220,22 +238,29 @@ def convert_old(old, strict=True):
states = enumerate(states)
for (k, v) in states:
override.append({'filter': {'node_id': k},
- 'state': v
- })
+ 'state': v})
- agents['network']['override'] = override
- agents['network']['fixed'] = fixed
- agents['network']['distribution'] = by_weight
+ agents['override'] = override
+ agents['fixed'] = fixed
+ agents['distribution'] = by_weight
+
+
+ model_params = {}
+ if 'environment_params' in new:
+ del new['environment_params']
+ model_params = dict(old['environment_params'])
- environment = {'params': {}}
if 'environment_class' in old:
- environment['environment_class'] = old['environment_class']
+ del new['environment_class']
+ new['model_class'] = old['environment_class']
- for (k, v) in old.get('environment_params', {}).items():
- environment['params'][k] = v
+ if 'dump' in old:
+ del new['dump']
+ new['dry_run'] = not old['dump']
+
+ model_params['topologies'] = topologies
+ model_params['agents'] = agents
return Config(version='2',
- general=general,
- topologies={'default': network},
- environment=environment,
- agents=agents)
+ model_params=model_params,
+ **new)
diff --git a/soil/debugging.py b/soil/debugging.py
new file mode 100644
index 0000000..98c25e1
--- /dev/null
+++ b/soil/debugging.py
@@ -0,0 +1,151 @@
+from __future__ import annotations
+
+import pdb
+import sys
+import os
+
+from textwrap import indent
+from functools import wraps
+
+from .agents import FSM, MetaFSM
+
+
+def wrapcmd(func):
+ @wraps(func)
+ def wrapper(self, arg: str, temporary=False):
+ sys.settrace(self.trace_dispatch)
+
+ known = globals()
+ known.update(self.curframe.f_globals)
+ known.update(self.curframe.f_locals)
+ known['agent'] = known.get('self', None)
+ known['model'] = known.get('self', {}).get('model')
+ known['attrs'] = arg.strip().split()
+
+ exec(func.__code__, known, known)
+
+ return wrapper
+
+
+class Debug(pdb.Pdb):
+ def __init__(self, *args, skip_soil=False, **kwargs):
+ skip = kwargs.get('skip', [])
+ if skip_soil:
+ skip.append('soil.*')
+ skip.append('mesa.*')
+ super(Debug, self).__init__(*args, skip=skip, **kwargs)
+ self.prompt = "[soil-pdb] "
+
+ @staticmethod
+ def _soil_agents(model, attrs=None, pretty=True, **kwargs):
+ for agent in model.agents(**kwargs):
+ d = agent
+ print(' - ' + indent(agent.to_str(keys=attrs, pretty=pretty), ' '))
+
+ @wrapcmd
+ def do_soil_agents():
+ return Debug._soil_agents(model, attrs=attrs or None)
+
+ do_sa = do_soil_agents
+
+ @wrapcmd
+ def do_soil_list():
+ return Debug._soil_agents(model, attrs=['state_id'], pretty=False)
+
+ do_sl = do_soil_list
+
+ @wrapcmd
+ def do_soil_self():
+ if not agent:
+ print('No agent available')
+ return
+
+ keys = None
+ if attrs:
+ keys = []
+ for k in attrs:
+ for key in agent.keys():
+ if key.startswith(k):
+ keys.append(key)
+
+ print(agent.to_str(pretty=True, keys=keys))
+
+ do_ss = do_soil_self
+
+ def do_break_state(self, arg: str, temporary=False):
+ '''
+ Break before a specified state is stepped into.
+ '''
+
+ klass = None
+ state = arg.strip()
+ if not state:
+ self.error("Specify at least a state name")
+ return
+
+ comma = arg.find(':')
+ if comma > 0:
+ state = arg[comma+1:].lstrip()
+ klass = arg[:comma].rstrip()
+ klass = eval(klass,
+ self.curframe.f_globals,
+ self.curframe_locals)
+
+ if klass:
+ klasses = [klass]
+ else:
+ klasses = [k for k in self.curframe.f_globals.values() if isinstance(k, type) and issubclass(k, FSM)]
+ print(klasses)
+ if not klasses:
+ self.error('No agent classes found')
+
+ for klass in klasses:
+ try:
+ func = getattr(klass, state)
+ except AttributeError:
+ continue
+ if hasattr(func, '__func__'):
+ func = func.__func__
+
+ code = func.__code__
+ #use co_name to identify the bkpt (function names
+ #could be aliased, but co_name is invariant)
+ funcname = code.co_name
+ lineno = code.co_firstlineno
+ filename = code.co_filename
+
+ # Check for reasonable breakpoint
+ line = self.checkline(filename, lineno)
+ if not line:
+ raise ValueError('no line found')
+ # now set the break point
+ cond = None
+ existing = self.get_breaks(filename, line)
+ if existing:
+ self.message("Breakpoint already exists at %s:%d" %
+ (filename, line))
+ continue
+ err = self.set_break(filename, line, temporary, cond, funcname)
+ if err:
+ self.error(err)
+ else:
+ bp = self.get_breaks(filename, line)[-1]
+ self.message("Breakpoint %d at %s:%d" %
+ (bp.number, bp.file, bp.line))
+ do_bs = do_break_state
+
+
+def setup(frame=None):
+ debugger = Debug()
+ frame = frame or sys._getframe().f_back
+ debugger.set_trace(frame)
+
+def debug_env():
+ if os.environ.get('SOIL_DEBUG'):
+ return setup(frame=sys._getframe().f_back)
+
+def post_mortem(traceback=None):
+ p = Debug()
+ t = sys.exc_info()[2]
+ p.reset()
+ p.interaction(None, t)
diff --git a/soil/environment.py b/soil/environment.py
index 2f59553..303a00f 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -1,4 +1,5 @@
from __future__ import annotations
+
import os
import sqlite3
import math
@@ -17,9 +18,7 @@ import networkx as nx
from mesa import Model
from mesa.datacollection import DataCollector
-from . import serialization, analysis, utils, time, network
-
-from .agents import AgentView, BaseAgent, NetworkAgent, from_config as agents_from_config
+from . import agents as agentmod, config, serialization, utils, time, network
Record = namedtuple('Record', 'dict_id t_step key value')
@@ -39,12 +38,12 @@ class BaseEnvironment(Model):
"""
def __init__(self,
- env_id='unnamed_env',
+ id='unnamed_env',
seed='default',
schedule=None,
dir_path=None,
interval=1,
- agent_class=BaseAgent,
+ agent_class=None,
agents: [tuple[type, Dict[str, Any]]] = {},
agent_reporters: Optional[Any] = None,
model_reporters: Optional[Any] = None,
@@ -54,7 +53,7 @@ class BaseEnvironment(Model):
super().__init__(seed=seed)
self.current_id = -1
- self.id = env_id
+ self.id = id
self.dir_path = dir_path or os.getcwd()
@@ -62,7 +61,7 @@ class BaseEnvironment(Model):
schedule = time.TimedActivation(self)
self.schedule = schedule
- self.agent_class = agent_class
+ self.agent_class = agent_class or agentmod.BaseAgent
self.init_agents(agents)
@@ -78,25 +77,51 @@ class BaseEnvironment(Model):
tables=tables,
)
- def __read_agent_tuple(self, tup):
- cls = self.agent_class
- args = tup
- if isinstance(tup, tuple):
- cls = tup[0]
- args = tup[1]
- return serialization.deserialize(cls)(unique_id=self.next_id(),
- model=self, **args)
+ def _read_single_agent(self, agent):
+ agent = dict(**agent)
+ cls = agent.pop('agent_class', None) or self.agent_class
+ unique_id = agent.pop('unique_id', None)
+ if unique_id is None:
+ unique_id = self.next_id()
+
+ return serialization.deserialize(cls)(unique_id=unique_id,
+ model=self, **agent)
+
+ def init_agents(self, agents: Union[config.AgentConfig, [Dict[str, Any]]] = {}):
+ if not agents:
+ return
+
+ lst = agents
+ override = []
+ if not isinstance(lst, list):
+ if not isinstance(agents, config.AgentConfig):
+ lst = config.AgentConfig(**agents)
+ if lst.override:
+ override = lst.override
+ lst = agentmod.from_config(lst,
+ topologies=getattr(self, 'topologies', None),
+ random=self.random)
+
+ #TODO: check override is working again. It cannot (easily) be part of agents.from_config anymore,
+ # because it needs attribute such as unique_id, which are only present after init
+ new_agents = [self._read_single_agent(agent) for agent in lst]
+
+
+ for a in new_agents:
+ self.schedule.add(a)
+
+ for rule in override:
+ for agent in agentmod.filter_agents(self.schedule._agents, **rule.filter):
+ for attr, value in rule.state.items():
+ setattr(agent, attr, value)
- def init_agents(self, agents: [tuple[type, Dict[str, Any]]] = {}):
- agents = [self.__read_agent_tuple(tup) for tup in agents]
- self._agents = {'default': {agent.id: agent for agent in agents}}
@property
def agents(self):
- return AgentView(self._agents)
+ return agentmod.AgentView(self.schedule._agents)
def find_one(self, *args, **kwargs):
- return AgentView(self._agents).one(*args, **kwargs)
+ return agentmod.AgentView(self.schedule._agents).one(*args, **kwargs)
def count_agents(self, *args, **kwargs):
return sum(1 for i in self.agents(*args, **kwargs))
@@ -108,38 +133,12 @@ class BaseEnvironment(Model):
raise Exception('The environment has not been scheduled, so it has no sense of time')
- # def init_agent(self, agent_id, agent_definitions, state=None):
- # state = state or {}
-
- # agent_class = None
- # if 'agent_class' in self.states.get(agent_id, {}):
- # agent_class = self.states[agent_id]['agent_class']
- # elif 'agent_class' in self.default_state:
- # agent_class = self.default_state['agent_class']
-
- # if agent_class:
- # agent_class = agents.deserialize_type(agent_class)
- # elif agent_definitions:
- # agent_class, state = agents._agent_from_definition(agent_definitions, unique_id=agent_id)
- # else:
- # serialization.logger.debug('Skipping agent {}'.format(agent_id))
- # return
- # return self.add_agent(agent_id, agent_class, state)
-
-
- def add_agent(self, agent_id, agent_class, state=None, graph='default'):
- defstate = deepcopy(self.default_state) or {}
- defstate.update(self.states.get(agent_id, {}))
- if state:
- defstate.update(state)
+ def add_agent(self, agent_id, agent_class, **kwargs):
a = None
if agent_class:
- state = defstate
a = agent_class(model=self,
- unique_id=agent_id)
-
- for (k, v) in state.items():
- setattr(a, k, v)
+ unique_id=agent_id,
+ **kwargs)
self.schedule.add(a)
return a
@@ -153,7 +152,7 @@ class BaseEnvironment(Model):
message += " {k}={v} ".format(k, v)
extra = {}
extra['now'] = self.now
- extra['unique_id'] = self.id
+ extra['id'] = self.id
return self.logger.log(level, message, extra=extra)
def step(self):
@@ -161,6 +160,7 @@ class BaseEnvironment(Model):
Advance one step in the simulation, and update the data collection and scheduler appropriately
'''
super().step()
+ self.logger.info(f'--- Step {self.now:^5} ---')
self.schedule.step()
self.datacollector.collect(self)
@@ -207,34 +207,41 @@ class BaseEnvironment(Model):
yield from self._agent_to_tuples(agent, now)
-class AgentConfigEnvironment(BaseEnvironment):
+class NetworkEnvironment(BaseEnvironment):
- def __init__(self, *args,
- agents: Dict[str, config.AgentConfig] = {},
- **kwargs):
- return super().__init__(*args, agents=agents, **kwargs)
-
- def init_agents(self, agents: Union[Dict[str, config.AgentConfig], [tuple[type, Dict[str, Any]]]] = {}):
- if not isinstance(agents, dict):
- return BaseEnvironment.init_agents(self, agents)
-
- self._agents = agents_from_config(agents,
- env=self,
- random=self.random)
- for d in self._agents.values():
- for a in d.values():
- self.schedule.add(a)
-
-
-class NetworkConfigEnvironment(BaseEnvironment):
-
- def __init__(self, *args, topologies: Dict[str, config.NetConfig] = {}, **kwargs):
- super().__init__(*args, **kwargs)
- self.topologies = {}
+ def __init__(self, *args, topology: nx.Graph = None, topologies: Dict[str, config.NetConfig] = {}, **kwargs):
+ agents = kwargs.pop('agents', None)
+ super().__init__(*args, agents=None, **kwargs)
self._node_ids = {}
+ assert not hasattr(self, 'topologies')
+ if topology is not None:
+ if topologies:
+ raise ValueError('Please, provide either a single topology or a dictionary of them')
+ topologies = {'default': topology}
+
+ self.topologies = {}
for (name, cfg) in topologies.items():
self.set_topology(cfg=cfg, graph=name)
+ self.init_agents(agents)
+
+
+ def _read_single_agent(self, agent, unique_id=None):
+ agent = dict(agent)
+
+ if agent.get('topology', None) is not None:
+ topology = agent.get('topology')
+ if unique_id is None:
+ unique_id = self.next_id()
+ if topology:
+ node_id = self.agent_to_node(unique_id, graph_name=topology, node_id=agent.get('node_id'))
+ agent['node_id'] = node_id
+ agent['topology'] = topology
+ agent['unique_id'] = unique_id
+
+ return super()._read_single_agent(agent)
+
+
@property
def topology(self):
return self.topologies['default']
@@ -246,51 +253,50 @@ class NetworkConfigEnvironment(BaseEnvironment):
self.topologies[graph] = topology
- def topology_for(self, agent_id):
- return self.topologies[self._node_ids[agent_id][0]]
+ def topology_for(self, unique_id):
+ return self.topologies[self._node_ids[unique_id][0]]
@property
def network_agents(self):
- yield from self.agents(agent_class=NetworkAgent)
+ yield from self.agents(agent_class=agentmod.NetworkAgent)
- def agent_to_node(self, agent_id, graph_name='default', node_id=None, shuffle=False):
- node_id = network.agent_to_node(G=self.topologies[graph_name], agent_id=agent_id,
- node_id=node_id, shuffle=shuffle,
+ def agent_to_node(self, unique_id, graph_name='default',
+ node_id=None, shuffle=False):
+ node_id = network.agent_to_node(G=self.topologies[graph_name],
+ agent_id=unique_id,
+ node_id=node_id,
+ shuffle=shuffle,
random=self.random)
- self._node_ids[agent_id] = (graph_name, node_id)
+ self._node_ids[unique_id] = (graph_name, node_id)
+ return node_id
+ def add_node(self, agent_class, topology, **kwargs):
+ unique_id = self.next_id()
+ self.topologies[topology].add_node(unique_id)
+ node_id = self.agent_to_node(unique_id=unique_id, node_id=unique_id, graph_name=topology)
- def add_node(self, agent_class, state=None, graph='default'):
- agent_id = int(len(self.topologies[graph].nodes()))
- self.topologies[graph].add_node(agent_id)
- a = self.add_agent(agent_id, agent_class, state, graph=graph)
+ a = self.add_agent(unique_id=unique_id, agent_class=agent_class, node_id=node_id, topology=topology, **kwargs)
a['visible'] = True
return a
def add_edge(self, agent1, agent2, start=None, graph='default', **attrs):
- if hasattr(agent1, 'id'):
- agent1 = agent1.id
- if hasattr(agent2, 'id'):
- agent2 = agent2.id
- start = start or self.now
- return self.topologies[graph].add_edge(agent1, agent2, **attrs)
+ agent1 = agent1.node_id
+ agent2 = agent2.node_id
+ return self.topologies[graph].add_edge(agent1, agent2, start=start)
- def add_agent(self, *args, state=None, graph='default', **kwargs):
- node = self.topologies[graph].nodes[agent_id]
+ def add_agent(self, unique_id, state=None, graph='default', **kwargs):
+ node = self.topologies[graph].nodes[unique_id]
node_state = node.get('state', {})
if node_state:
node_state.update(state or {})
state = node_state
- a = super().add_agent(*args, state=state, **kwargs)
+ a = super().add_agent(unique_id, state=state, **kwargs)
node['agent'] = a
return a
def node_id_for(self, agent_id):
return self._node_ids[agent_id][1]
-class Environment(AgentConfigEnvironment, NetworkConfigEnvironment):
- def __init__(self, *args, **kwargs):
- agents = kwargs.pop('agents', {})
- NetworkConfigEnvironment.__init__(self, *args, **kwargs)
- AgentConfigEnvironment.__init__(self, *args, agents=agents, **kwargs)
+
+Environment = NetworkEnvironment
diff --git a/soil/exporters.py b/soil/exporters.py
index 20a0f92..055afd4 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -12,7 +12,7 @@ from .serialization import deserialize
from .utils import open_or_reuse, logger, timer
-from . import utils
+from . import utils, network
class DryRunner(BytesIO):
@@ -85,38 +85,28 @@ class Exporter:
class default(Exporter):
'''Default exporter. Writes sqlite results, as well as the simulation YAML'''
- # def sim_start(self):
- # if not self.dry_run:
- # logger.info('Dumping results to %s', self.outdir)
- # self.simulation.dump_yaml(outdir=self.outdir)
- # else:
- # logger.info('NOT dumping results')
+ def sim_start(self):
+ if not self.dry_run:
+ logger.info('Dumping results to %s', self.outdir)
+ with self.output(self.simulation.name + '.dumped.yml') as f:
+ f.write(self.simulation.to_yaml())
+ else:
+ logger.info('NOT dumping results')
- # def trial_start(self, env, stats):
- # if not self.dry_run:
- # with timer('Dumping simulation {} trial {}'.format(self.simulation.name,
- # env.name)):
- # engine = create_engine('sqlite:///{}.sqlite'.format(env.name), echo=False)
+ def trial_end(self, env):
+ if not self.dry_run:
+ with timer('Dumping simulation {} trial {}'.format(self.simulation.name,
+ env.id)):
+ engine = create_engine('sqlite:///{}.sqlite'.format(env.id), echo=False)
- # dc = env.datacollector
- # tables = {'env': dc.get_model_vars_dataframe(),
- # 'agents': dc.get_agent_vars_dataframe(),
- # 'agents': dc.get_agent_vars_dataframe()}
- # for table in dc.tables:
- # tables[table] = dc.get_table_dataframe(table)
- # for (t, df) in tables.items():
- # df.to_sql(t, con=engine)
-
- # def sim_end(self, stats):
- # with timer('Dumping simulation {}\'s stats'.format(self.simulation.name)):
- # engine = create_engine('sqlite:///{}.sqlite'.format(self.simulation.name), echo=False)
- # with self.output('{}.sqlite'.format(self.simulation.name), mode='wb') as f:
- # self.simulation.dump_sqlite(f)
+ dc = env.datacollector
+ for (t, df) in get_dc_dfs(dc):
+ df.to_sql(t, con=engine, if_exists='append')
def get_dc_dfs(dc):
dfs = {'env': dc.get_model_vars_dataframe(),
- 'agents': dc.get_agent_vars_dataframe }
+ 'agents': dc.get_agent_vars_dataframe() }
for table_name in dc.tables:
dfs[table_name] = dc.get_table_dataframe(table_name)
yield from dfs.items()
@@ -130,10 +120,11 @@ class csv(Exporter):
env.id,
self.outdir)):
for (df_name, df) in get_dc_dfs(env.datacollector):
- with self.output('{}.stats.{}.csv'.format(env.id, df_name)) as f:
+ with self.output('{}.{}.csv'.format(env.id, df_name)) as f:
df.to_csv(f)
+#TODO: reimplement GEXF exporting without history
class gexf(Exporter):
def trial_end(self, env):
if self.dry_run:
@@ -143,18 +134,9 @@ class gexf(Exporter):
with timer('[GEXF] Dumping simulation {} trial {}'.format(self.simulation.name,
env.id)):
with self.output('{}.gexf'.format(env.id), mode='wb') as f:
+ network.dump_gexf(env.history_to_graph(), f)
self.dump_gexf(env, f)
- def dump_gexf(self, env, f):
- G = env.history_to_graph()
- # Workaround for geometric models
- # See soil/soil#4
- for node in G.nodes():
- if 'pos' in G.nodes[node]:
- G.nodes[node]['viz'] = {"position": {"x": G.nodes[node]['pos'][0], "y": G.nodes[node]['pos'][1], "z": 0.0}}
- del (G.nodes[node]['pos'])
-
- nx.write_gexf(G, f, version="1.2draft")
class dummy(Exporter):
diff --git a/soil/network.py b/soil/network.py
index 25b55ab..0836f35 100644
--- a/soil/network.py
+++ b/soil/network.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
from typing import Dict
import os
import sys
@@ -37,8 +39,10 @@ def from_config(cfg: config.NetConfig, dir_path: str = None):
known_modules=['networkx.generators',])
return method(**net_args)
- if isinstance(cfg.topology, basestring) or isinstance(cfg.topology, dict):
- return nx.json_graph.node_link_graph(cfg.topology)
+ if isinstance(cfg.topology, config.Topology):
+ cfg = cfg.topology.dict()
+ if isinstance(cfg, str) or isinstance(cfg, dict):
+ return nx.json_graph.node_link_graph(cfg)
return nx.Graph()
@@ -57,9 +61,18 @@ def agent_to_node(G, agent_id, node_id=None, shuffle=False, random=random):
for next_id, data in candidates:
if data.get('agent_id', None) is None:
node_id = next_id
- data['agent_id'] = agent_id
break
if node_id is None:
raise ValueError(f"Not enough nodes in topology to assign one to agent {agent_id}")
+ G.nodes[node_id]['agent_id'] = agent_id
return node_id
+
+
+def dump_gexf(G, f):
+ for node in G.nodes():
+ if 'pos' in G.nodes[node]:
+ G.nodes[node]['viz'] = {"position": {"x": G.nodes[node]['pos'][0], "y": G.nodes[node]['pos'][1], "z": 0.0}}
+ del (G.nodes[node]['pos'])
+
+ nx.write_gexf(G, f, version="1.2draft")
diff --git a/soil/serialization.py b/soil/serialization.py
index 328efdd..9c2af63 100644
--- a/soil/serialization.py
+++ b/soil/serialization.py
@@ -7,6 +7,8 @@ import importlib
from glob import glob
from itertools import product, chain
+from .config import Config
+
import yaml
import networkx as nx
@@ -120,22 +122,25 @@ def params_for_template(config):
def load_files(*patterns, **kwargs):
for pattern in patterns:
for i in glob(pattern, **kwargs):
- for config in load_file(i):
+ for cfg in load_file(i):
path = os.path.abspath(i)
- yield config, path
+ yield Config.from_raw(cfg), path
-def load_config(config):
- if isinstance(config, dict):
- yield config, os.getcwd()
+def load_config(cfg):
+ if isinstance(cfg, Config):
+ yield cfg, os.getcwd()
+ elif isinstance(cfg, dict):
+ yield Config.from_raw(cfg), os.getcwd()
else:
- yield from load_files(config)
+ yield from load_files(cfg)
builtins = importlib.import_module('builtins')
KNOWN_MODULES = ['soil', ]
+
def name(value, known_modules=KNOWN_MODULES):
'''Return a name that can be imported, to serialize/deserialize an object'''
if value is None:
@@ -172,8 +177,22 @@ def serialize(v, known_modules=KNOWN_MODULES):
return func(v), tname
+def serialize_dict(d, known_modules=KNOWN_MODULES):
+ d = dict(d)
+ for (k, v) in d.items():
+ if isinstance(v, dict):
+ d[k] = serialize_dict(v, known_modules=known_modules)
+ elif isinstance(v, list):
+ for ix in range(len(v)):
+ v[ix] = serialize_dict(v[ix], known_modules=known_modules)
+ elif isinstance(v, type):
+ d[k] = serialize(v, known_modules=known_modules)[1]
+ return d
+
+
IS_CLASS = re.compile(r"")
+
def deserializer(type_, known_modules=KNOWN_MODULES):
if type(type_) != str: # Already deserialized
return type_
diff --git a/soil/simulation.py b/soil/simulation.py
index 4d50c30..1ed5dbc 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -4,15 +4,17 @@ import importlib
import sys
import yaml
import traceback
+import inspect
import logging
import networkx as nx
+from textwrap import dedent
+
from dataclasses import dataclass, field, asdict
-from typing import Union
+from typing import Any, Dict, Union, Optional
from networkx.readwrite import json_graph
-from multiprocessing import Pool
from functools import partial
import pickle
@@ -21,7 +23,6 @@ from .environment import Environment
from .utils import logger, run_and_return_exceptions
from .exporters import default
from .time import INFINITY
-
from .config import Config, convert_old
@@ -36,7 +37,9 @@ class Simulation:
kwargs: parameters to use to initialize a new configuration, if one has not been provided.
"""
+ version: str = '2'
name: str = 'Unnamed simulation'
+ description: Optional[str] = ''
group: str = None
model_class: Union[str, type] = 'soil.Environment'
model_params: dict = field(default_factory=dict)
@@ -44,30 +47,37 @@ class Simulation:
dir_path: str = field(default_factory=lambda: os.getcwd())
max_time: float = float('inf')
max_steps: int = -1
+ interval: int = 1
num_trials: int = 3
dry_run: bool = False
+ extra: Dict[str, Any] = field(default_factory=dict)
+
+ @classmethod
+ def from_dict(cls, env):
+
+ ignored = {k: v for k, v in env.items()
+ if k not in inspect.signature(cls).parameters}
+
+ kwargs = {k:v for k, v in env.items() if k not in ignored}
+ if ignored:
+ kwargs.setdefault('extra', {}).update(ignored)
+ if ignored:
+ print(f'Warning: Ignoring these parameters (added to "extra"): { ignored }')
+
+ return cls(**kwargs)
def run_simulation(self, *args, **kwargs):
return self.run(*args, **kwargs)
def run(self, *args, **kwargs):
'''Run the simulation and return the list of resulting environments'''
+ logger.info(dedent('''
+ Simulation:
+ ---
+ ''') +
+ self.to_yaml())
return list(self.run_gen(*args, **kwargs))
- def _run_sync_or_async(self, parallel=False, **kwargs):
- if parallel and not os.environ.get('SENPY_DEBUG', None):
- p = Pool()
- func = partial(run_and_return_exceptions, self.run_trial, **kwargs)
- for i in p.imap_unordered(func, self.num_trials):
- if isinstance(i, Exception):
- logger.error('Trial failed:\n\t%s', i.message)
- continue
- yield i
- else:
- for i in range(self.num_trials):
- yield self.run_trial(trial_id=i,
- **kwargs)
-
def run_gen(self, parallel=False, dry_run=False,
exporters=[default, ], outdir=None, exporter_params={},
log_level=None,
@@ -88,9 +98,11 @@ class Simulation:
for exporter in exporters:
exporter.sim_start()
- for env in self._run_sync_or_async(parallel=parallel,
- log_level=log_level,
- **kwargs):
+ for env in utils.run_parallel(func=self.run_trial,
+ iterable=range(int(self.num_trials)),
+ parallel=parallel,
+ log_level=log_level,
+ **kwargs):
for exporter in exporters:
exporter.trial_start(env)
@@ -103,14 +115,6 @@ class Simulation:
for exporter in exporters:
exporter.sim_end()
- def run_model(self, until=None, *args, **kwargs):
- until = until or float('inf')
-
- while self.schedule.next_time < until:
- self.step()
- utils.logger.debug(f'Simulation step {self.schedule.time}/{until}. Next: {self.schedule.next_time}')
- self.schedule.time = until
-
def get_env(self, trial_id=0, **kwargs):
'''Create an environment for a trial of the simulation'''
def deserialize_reporters(reporters):
@@ -132,56 +136,76 @@ class Simulation:
model_reporters=model_reporters,
**model_params)
- def run_trial(self, trial_id=None, until=None, log_level=logging.INFO, **opts):
+ def run_trial(self, trial_id=None, until=None, log_file=False, log_level=logging.INFO, **opts):
"""
Run a single trial of the simulation
"""
- model = self.get_env(trial_id, **opts)
- return self.run_model(model, trial_id=trial_id, until=until, log_level=log_level)
-
- def run_model(self, model, trial_id=None, until=None, log_level=logging.INFO, **opts):
- trial_id = trial_id if trial_id is not None else current_time()
if log_level:
logger.setLevel(log_level)
+ model = self.get_env(trial_id, **opts)
+ trial_id = trial_id if trial_id is not None else current_time()
+ with utils.timer('Simulation {} trial {}'.format(self.name, trial_id)):
+ return self.run_model(model=model, trial_id=trial_id, until=until, log_level=log_level)
+
+ def run_model(self, model, until=None, **opts):
# Set-up trial environment and graph
- until = until or self.max_time
+ until = float(until or self.max_time or 'inf')
# Set up agents on nodes
- is_done = lambda: False
- if self.max_time and hasattr(self.schedule, 'time'):
- is_done = lambda x: is_done() or self.schedule.time >= self.max_time
- if self.max_steps and hasattr(self.schedule, 'time'):
- is_done = lambda: is_done() or self.schedule.steps >= self.max_steps
+ def is_done():
+ return False
- with utils.timer('Simulation {} trial {}'.format(self.name, trial_id)):
- while not is_done():
- utils.logger.debug(f'Simulation time {model.schedule.time}/{until}. Next: {getattr(model.schedule, "next_time", model.schedule.time + self.interval)}')
- model.step()
+ if until and hasattr(model.schedule, 'time'):
+ prev = is_done
+
+ def is_done():
+ return prev() or model.schedule.time >= until
+
+ if self.max_steps and self.max_steps > 0 and hasattr(model.schedule, 'steps'):
+ prev_steps = is_done
+
+ def is_done():
+ return prev_steps() or model.schedule.steps >= self.max_steps
+
+ newline = '\n'
+ logger.info(dedent(f'''
+Model stats:
+ Agents (total: { model.schedule.get_agent_count() }):
+ - { (newline + ' - ').join(str(a) for a in model.schedule.agents) }'''
+f'''
+
+ Topologies (size):
+ - { dict( (k, len(v)) for (k, v) in model.topologies.items()) }
+''' if getattr(model, "topologies", None) else ''
+))
+
+ while not is_done():
+ utils.logger.debug(f'Simulation time {model.schedule.time}/{until}. Next: {getattr(model.schedule, "next_time", model.schedule.time + self.interval)}')
+ model.step()
return model
def to_dict(self):
d = asdict(self)
- d['model_class'] = serialization.serialize(d['model_class'])[0]
- d['model_params'] = serialization.serialize(d['model_params'])[0]
+ if not isinstance(d['model_class'], str):
+ d['model_class'] = serialization.name(d['model_class'])
+ d['model_params'] = serialization.serialize_dict(d['model_params'])
d['dir_path'] = str(d['dir_path'])
-
+ d['version'] = '2'
return d
def to_yaml(self):
- return yaml.dump(self.asdict())
+ return yaml.dump(self.to_dict())
-def iter_from_config(config):
- configs = list(serialization.load_config(config))
- for config, path in configs:
- d = dict(config)
- if 'dir_path' not in d:
- d['dir_path'] = os.path.dirname(path)
- if d.get('version', '2') == '1' or 'agents' in d or 'network_agents' in d or 'environment_agents' in d:
- d = convert_old(d)
- d.pop('version', None)
- yield Simulation(**d)
+def iter_from_config(*cfgs):
+ for config in cfgs:
+ configs = list(serialization.load_config(config))
+ for config, path in configs:
+ d = dict(config)
+ if 'dir_path' not in d:
+ d['dir_path'] = os.path.dirname(path)
+ yield Simulation.from_dict(d)
def from_config(conf_or_path):
@@ -192,6 +216,6 @@ def from_config(conf_or_path):
def run_from_config(*configs, **kwargs):
- for sim in iter_from_config(configs):
- logger.info(f"Using config(s): {sim.id}")
+ for sim in iter_from_config(*configs):
+ logger.info(f"Using config(s): {sim.name}")
sim.run_simulation(**kwargs)
diff --git a/soil/time.py b/soil/time.py
index b2faf46..b95c51e 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -1,6 +1,6 @@
from mesa.time import BaseScheduler
from queue import Empty
-from heapq import heappush, heappop
+from heapq import heappush, heappop, heapify
import math
from .utils import logger
from mesa import Agent as MesaAgent
@@ -17,6 +17,7 @@ class When:
def abs(self, time):
return self._time
+
NEVER = When(INFINITY)
@@ -38,14 +39,22 @@ class TimedActivation(BaseScheduler):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
+ self._next = {}
self._queue = []
self.next_time = 0
self.logger = logger.getChild(f'time_{ self.model }')
- def add(self, agent: MesaAgent):
- if agent.unique_id not in self._agents:
- heappush(self._queue, (self.time, agent.unique_id))
- super().add(agent)
+ def add(self, agent: MesaAgent, when=None):
+ if when is None:
+ when = self.time
+ if agent.unique_id in self._agents:
+ self._queue.remove((self._next[agent.unique_id], agent.unique_id))
+ del self._agents[agent.unique_id]
+ heapify(self._queue)
+
+ heappush(self._queue, (when, agent.unique_id))
+ self._next[agent.unique_id] = when
+ super().add(agent)
def step(self) -> None:
"""
@@ -64,11 +73,18 @@ class TimedActivation(BaseScheduler):
(when, agent_id) = heappop(self._queue)
self.logger.debug(f'Stepping agent {agent_id}')
- returned = self._agents[agent_id].step()
+ agent = self._agents[agent_id]
+ returned = agent.step()
+
+ if not agent.alive:
+ self.remove(agent)
+ continue
+
when = (returned or Delta(1)).abs(self.time)
if when < self.time:
raise Exception("Cannot schedule an agent for a time in the past ({} < {})".format(when, self.time))
+ self._next[agent_id] = when
heappush(self._queue, (when, agent_id))
self.steps += 1
@@ -77,7 +93,7 @@ class TimedActivation(BaseScheduler):
self.time = INFINITY
self.next_time = INFINITY
self.model.running = False
- return
+ return self.time
self.next_time = self._queue[0][0]
self.logger.debug(f'Next step: {self.next_time}')
diff --git a/soil/utils.py b/soil/utils.py
index cd82588..faa34d1 100644
--- a/soil/utils.py
+++ b/soil/utils.py
@@ -3,13 +3,27 @@ from time import time as current_time, strftime, gmtime, localtime
import os
import traceback
+from functools import partial
from shutil import copyfile
+from multiprocessing import Pool
from contextlib import contextmanager
logger = logging.getLogger('soil')
-# logging.basicConfig()
-# logger.setLevel(logging.INFO)
+logger.setLevel(logging.INFO)
+
+timeformat = "%H:%M:%S"
+
+if os.environ.get('SOIL_VERBOSE', ''):
+ logformat = "[%(levelname)-5.5s][%(asctime)s][%(name)s]: %(message)s"
+else:
+ logformat = "[%(levelname)-5.5s][%(asctime)s] %(message)s"
+
+logFormatter = logging.Formatter(logformat, timeformat)
+
+consoleHandler = logging.StreamHandler()
+consoleHandler.setFormatter(logFormatter)
+logger.addHandler(consoleHandler)
@contextmanager
@@ -27,8 +41,6 @@ def timer(name='task', pre="", function=logger.info, to_object=None):
to_object.end = end
-
-
def safe_open(path, mode='r', backup=True, **kwargs):
outdir = os.path.dirname(path)
if outdir and not os.path.exists(outdir):
@@ -41,7 +53,7 @@ def safe_open(path, mode='r', backup=True, **kwargs):
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
newpath = os.path.join(backup_dir, '{}@{}'.format(os.path.basename(path),
- stamp))
+ stamp))
copyfile(path, newpath)
return open(path, mode=mode, **kwargs)
@@ -92,7 +104,7 @@ def unflatten_dict(d):
return out
-def run_and_return_exceptions(self, func, *args, **kwargs):
+def run_and_return_exceptions(func, *args, **kwargs):
'''
A wrapper for run_trial that catches exceptions and returns them.
It is meant for async simulations.
@@ -104,3 +116,18 @@ def run_and_return_exceptions(self, func, *args, **kwargs):
ex = ex.__cause__
ex.message = ''.join(traceback.format_exception(type(ex), ex, ex.__traceback__)[:])
return ex
+
+
+def run_parallel(func, iterable, parallel=False, **kwargs):
+ if parallel and not os.environ.get('SOIL_DEBUG', None):
+ p = Pool()
+ wrapped_func = partial(run_and_return_exceptions,
+ func, **kwargs)
+ for i in p.imap_unordered(wrapped_func, iterable):
+ if isinstance(i, Exception):
+ logger.error('Trial failed:\n\t%s', i.message)
+ continue
+ yield i
+ else:
+ for i in iterable:
+ yield func(i, **kwargs)
diff --git a/tests/complete_converted.yml b/tests/complete_converted.yml
index 36a0a96..d1c3358 100644
--- a/tests/complete_converted.yml
+++ b/tests/complete_converted.yml
@@ -1,49 +1,50 @@
---
version: '2'
-general:
- id: simple
- group: tests
- dir_path: "/tmp/"
- num_trials: 3
- max_time: 100
- interval: 1
- seed: "CompleteSeed!"
-topologies:
- default:
- params:
- generator: complete_graph
- n: 10
-agents:
- default:
+name: simple
+group: tests
+dir_path: "/tmp/"
+num_trials: 3
+max_time: 100
+interval: 1
+seed: "CompleteSeed!"
+model_class: Environment
+model_params:
+ topologies:
+ default:
+ params:
+ generator: complete_graph
+ n: 4
+ agents:
agent_class: CounterModel
state:
+ group: network
times: 1
- network:
topology: 'default'
distribution:
- agent_class: CounterModel
- weight: 0.4
+ weight: 0.25
state:
state_id: 0
+ times: 1
- agent_class: AggregatedCounter
- weight: 0.6
- override:
- - filter:
- node_id: 0
+ weight: 0.5
state:
- name: 'The first node'
+ times: 2
+ override:
- filter:
node_id: 1
state:
- name: 'The second node'
-
- environment:
- fixed:
- - name: 'Environment Agent 1'
- agent_class: CounterModel
+ name: 'Node 1'
+ - filter:
+ node_id: 2
state:
+ name: 'Node 2'
+ fixed:
+ - agent_class: BaseAgent
+ hidden: true
+ topology: null
+ state:
+ name: 'Environment Agent 1'
times: 10
-environment:
- environment_class: Environment
- params:
- am_i_complete: true
+ group: environment
+ am_i_complete: true
diff --git a/tests/old_complete.yml b/tests/old_complete.yml
index 517abc4..9e4315b 100644
--- a/tests/old_complete.yml
+++ b/tests/old_complete.yml
@@ -8,17 +8,20 @@ interval: 1
seed: "CompleteSeed!"
network_params:
generator: complete_graph
- n: 10
+ n: 4
network_agents:
- agent_class: CounterModel
- weight: 0.4
+ weight: 0.25
state:
state_id: 0
+ times: 1
- agent_class: AggregatedCounter
- weight: 0.6
+ weight: 0.5
+ state:
+ times: 2
environment_agents:
- agent_id: 'Environment Agent 1'
- agent_class: CounterModel
+ agent_class: BaseAgent
state:
times: 10
environment_class: Environment
@@ -28,5 +31,7 @@ agent_class: CounterModel
default_state:
times: 1
states:
- - name: 'The first node'
- - name: 'The second node'
+ 1:
+ name: 'Node 1'
+ 2:
+ name: 'Node 2'
diff --git a/tests/test_agents.py b/tests/test_agents.py
index e95c11c..cb33f1f 100644
--- a/tests/test_agents.py
+++ b/tests/test_agents.py
@@ -8,7 +8,7 @@ class Dead(agents.FSM):
@agents.default_state
@agents.state
def only(self):
- self.die()
+ return self.die()
class TestMain(TestCase):
def test_die_raises_exception(self):
@@ -19,4 +19,6 @@ class TestMain(TestCase):
def test_die_returns_infinity(self):
d = Dead(unique_id=0, model=environment.Environment())
- assert d.step().abs(0) == stime.INFINITY
+ ret = d.step().abs(0)
+ print(ret, 'next')
+ assert ret == stime.INFINITY
diff --git a/tests/test_analysis.py b/tests/test_analysis.py
deleted file mode 100644
index 204b4dd..0000000
--- a/tests/test_analysis.py
+++ /dev/null
@@ -1,91 +0,0 @@
-from unittest import TestCase
-
-import os
-import pandas as pd
-import yaml
-from functools import partial
-
-from os.path import join
-from soil import simulation, analysis, agents
-
-
-ROOT = os.path.abspath(os.path.dirname(__file__))
-
-
-class Ping(agents.FSM):
-
- defaults = {
- 'count': 0,
- }
-
- @agents.default_state
- @agents.state
- def even(self):
- self.debug(f'Even {self["count"]}')
- self['count'] += 1
- return self.odd
-
- @agents.state
- def odd(self):
- self.debug(f'Odd {self["count"]}')
- self['count'] += 1
- return self.even
-
-
-class TestAnalysis(TestCase):
-
- # Code to generate a simple sqlite history
- def setUp(self):
- """
- The initial states should be applied to the agent and the
- agent should be able to update its state."""
- config = {
- 'name': 'analysis',
- 'seed': 'seed',
- 'network_params': {
- 'generator': 'complete_graph',
- 'n': 2
- },
- 'agent_class': Ping,
- 'states': [{'interval': 1}, {'interval': 2}],
- 'max_time': 30,
- 'num_trials': 1,
- 'history': True,
- 'environment_params': {
- }
- }
- s = simulation.from_config(config)
- self.env = s.run_simulation(dry_run=True)[0]
-
- def test_saved(self):
- env = self.env
- assert env.get_agent(0)['count', 0] == 1
- assert env.get_agent(0)['count', 29] == 30
- assert env.get_agent(1)['count', 0] == 1
- assert env.get_agent(1)['count', 29] == 15
- assert env['env', 29, None]['SEED'] == env['env', 29, 'SEED']
-
- def test_count(self):
- env = self.env
- df = analysis.read_sql(env._history.db_path)
- res = analysis.get_count(df, 'SEED', 'state_id')
- assert res['SEED'][self.env['SEED']].iloc[0] == 1
- assert res['SEED'][self.env['SEED']].iloc[-1] == 1
- assert res['state_id']['odd'].iloc[0] == 2
- assert res['state_id']['even'].iloc[0] == 0
- assert res['state_id']['odd'].iloc[-1] == 1
- assert res['state_id']['even'].iloc[-1] == 1
-
- def test_value(self):
- env = self.env
- df = analysis.read_sql(env._history.db_path)
- res_sum = analysis.get_value(df, 'count')
-
- assert res_sum['count'].iloc[0] == 2
-
- import numpy as np
- res_mean = analysis.get_value(df, 'count', aggfunc=np.mean)
- assert res_mean['count'].iloc[15] == (16+8)/2
-
- res_total = analysis.get_majority(df)
- res_total['SEED'].iloc[0] == self.env['SEED']
diff --git a/tests/test_config.py b/tests/test_config.py
index fd9fc70..3597844 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -29,7 +29,7 @@ class TestConfig(TestCase):
expected = serialization.load_file(join(ROOT, "complete_converted.yml"))[0]
old = serialization.load_file(join(ROOT, "old_complete.yml"))[0]
converted_defaults = config.convert_old(old, strict=False)
- converted = converted_defaults.dict(skip_defaults=True)
+ converted = converted_defaults.dict(exclude_unset=True)
isequal(converted, expected)
@@ -40,10 +40,10 @@ class TestConfig(TestCase):
"""
config = serialization.load_file(join(EXAMPLES, 'complete.yml'))[0]
s = simulation.from_config(config)
- init_config = copy.copy(s.config)
+ init_config = copy.copy(s.to_dict())
s.run_simulation(dry_run=True)
- nconfig = s.config
+ nconfig = s.to_dict()
# del nconfig['to
isequal(init_config, nconfig)
@@ -61,7 +61,7 @@ class TestConfig(TestCase):
Simple configuration that tests that the graph is loaded, and that
network agents are initialized properly.
"""
- config = {
+ cfg = {
'name': 'CounterAgent',
'network_params': {
'path': join(ROOT, 'test.gexf')
@@ -74,12 +74,14 @@ class TestConfig(TestCase):
'environment_params': {
}
}
- s = simulation.from_old_config(config)
+ conf = config.convert_old(cfg)
+ s = simulation.from_config(conf)
+
env = s.get_env()
assert len(env.topologies['default'].nodes) == 2
assert len(env.topologies['default'].edges) == 1
assert len(env.agents) == 2
- assert env.agents[0].topology == env.topologies['default']
+ assert env.agents[0].G == env.topologies['default']
def test_agents_from_config(self):
'''We test that the known complete configuration produces
@@ -87,12 +89,9 @@ class TestConfig(TestCase):
cfg = serialization.load_file(join(ROOT, "complete_converted.yml"))[0]
s = simulation.from_config(cfg)
env = s.get_env()
- assert len(env.topologies['default'].nodes) == 10
- assert len(env.agents(group='network')) == 10
+ assert len(env.topologies['default'].nodes) == 4
+ assert len(env.agents(group='network')) == 4
assert len(env.agents(group='environment')) == 1
-
- assert sum(1 for a in env.agents(group='network', agent_class=agents.CounterModel)) == 4
- assert sum(1 for a in env.agents(group='network', agent_class=agents.AggregatedCounter)) == 6
def test_yaml(self):
"""
diff --git a/tests/test_examples.py b/tests/test_examples.py
index 1cc4cca..af77c33 100644
--- a/tests/test_examples.py
+++ b/tests/test_examples.py
@@ -2,7 +2,7 @@ from unittest import TestCase
import os
from os.path import join
-from soil import serialization, simulation
+from soil import serialization, simulation, config
ROOT = os.path.abspath(os.path.dirname(__file__))
EXAMPLES = join(ROOT, '..', 'examples')
@@ -14,36 +14,37 @@ class TestExamples(TestCase):
pass
-def make_example_test(path, config):
+def make_example_test(path, cfg):
def wrapped(self):
root = os.getcwd()
- for s in simulation.all_from_config(path):
- iterations = s.config.general.max_time * s.config.general.num_trials
- if iterations > 1000:
- s.config.general.max_time = 100
- s.config.general.num_trials = 1
- if config.get('skip_test', False) and not FORCE_TESTS:
+ for s in simulation.iter_from_config(cfg):
+ iterations = s.max_steps * s.num_trials
+ if iterations < 0 or iterations > 1000:
+ s.max_steps = 100
+ s.num_trials = 1
+ assert isinstance(cfg, config.Config)
+ if getattr(cfg, 'skip_test', False) and not FORCE_TESTS:
self.skipTest('Example ignored.')
envs = s.run_simulation(dry_run=True)
assert envs
for env in envs:
assert env
try:
- n = config['network_params']['n']
+ n = cfg.model_params['network_params']['n']
assert len(list(env.network_agents)) == n
- assert env.now > 0 # It has run
- assert env.now <= config['max_time'] # But not further than allowed
except KeyError:
pass
+ assert env.schedule.steps > 0 # It has run
+ assert env.schedule.steps <= s.max_steps # But not further than allowed
return wrapped
def add_example_tests():
- for config, path in serialization.load_files(
+ for cfg, path in serialization.load_files(
join(EXAMPLES, '*', '*.yml'),
join(EXAMPLES, '*.yml'),
):
- p = make_example_test(path=path, config=config)
+ p = make_example_test(path=path, cfg=config.Config.from_raw(cfg))
fname = os.path.basename(path)
p.__name__ = 'test_example_file_%s' % fname
p.__doc__ = '%s should be a valid configuration' % fname
diff --git a/tests/test_exporters.py b/tests/test_exporters.py
index debc14a..cbd88bd 100644
--- a/tests/test_exporters.py
+++ b/tests/test_exporters.py
@@ -6,6 +6,8 @@ import shutil
from unittest import TestCase
from soil import exporters
from soil import simulation
+from soil import agents
+
class Dummy(exporters.Exporter):
started = False
@@ -33,28 +35,36 @@ class Dummy(exporters.Exporter):
class Exporters(TestCase):
def test_basic(self):
+ # We need to add at least one agent to make sure the scheduler
+ # ticks every step
+ num_trials = 5
+ max_time = 2
config = {
'name': 'exporter_sim',
- 'network_params': {},
- 'agent_class': 'CounterModel',
- 'max_time': 2,
- 'num_trials': 5,
- 'environment_params': {}
+ 'model_params': {
+ 'agents': [{
+ 'agent_class': agents.BaseAgent
+ }]
+ },
+ 'max_time': max_time,
+ 'num_trials': num_trials,
}
s = simulation.from_config(config)
+
for env in s.run_simulation(exporters=[Dummy], dry_run=True):
- assert env.now <= 2
+ assert len(env.agents) == 1
+ assert env.now == max_time
assert Dummy.started
assert Dummy.ended
assert Dummy.called_start == 1
assert Dummy.called_end == 1
- assert Dummy.called_trial == 5
- assert Dummy.trials == 5
- assert Dummy.total_time == 2*5
+ assert Dummy.called_trial == num_trials
+ assert Dummy.trials == num_trials
+ assert Dummy.total_time == max_time * num_trials
def test_writing(self):
- '''Try to write CSV, GEXF, sqlite and YAML (without dry_run)'''
+ '''Try to write CSV, sqlite and YAML (without dry_run)'''
n_trials = 5
config = {
'name': 'exporter_sim',
@@ -74,7 +84,6 @@ class Exporters(TestCase):
envs = s.run_simulation(exporters=[
exporters.default,
exporters.csv,
- exporters.gexf,
],
dry_run=False,
outdir=tmpdir,
@@ -88,11 +97,7 @@ class Exporters(TestCase):
try:
for e in envs:
- with open(os.path.join(simdir, '{}.gexf'.format(e.name))) as f:
- result = f.read()
- assert result
-
- with open(os.path.join(simdir, '{}.csv'.format(e.name))) as f:
+ with open(os.path.join(simdir, '{}.env.csv'.format(e.id))) as f:
result = f.read()
assert result
finally:
diff --git a/tests/test_history.py b/tests/test_history.py
deleted file mode 100644
index 773cfd6..0000000
--- a/tests/test_history.py
+++ /dev/null
@@ -1,128 +0,0 @@
-from unittest import TestCase
-
-import os
-import io
-import yaml
-import copy
-import pickle
-import networkx as nx
-from functools import partial
-
-from os.path import join
-from soil import (simulation, Environment, agents, serialization,
- utils)
-from soil.time import Delta
-from tsih import NoHistory, History
-
-
-ROOT = os.path.abspath(os.path.dirname(__file__))
-EXAMPLES = join(ROOT, '..', 'examples')
-
-
-class CustomAgent(agents.FSM):
- @agents.default_state
- @agents.state
- def normal(self):
- self.neighbors = self.count_agents(state_id='normal',
- limit_neighbors=True)
- @agents.state
- def unreachable(self):
- return
-
-class TestHistory(TestCase):
-
- def test_counter_agent_history(self):
- """
- The evolution of the state should be recorded in the logging agent
- """
- config = {
- 'name': 'CounterAgent',
- 'network_params': {
- 'path': join(ROOT, 'test.gexf')
- },
- 'network_agents': [{
- 'agent_class': 'AggregatedCounter',
- 'weight': 1,
- 'state': {'state_id': 0}
-
- }],
- 'max_time': 10,
- 'environment_params': {
- }
- }
- s = simulation.from_config(config)
- env = s.run_simulation(dry_run=True)[0]
- for agent in env.network_agents:
- last = 0
- assert len(agent[None, None]) == 11
- for step, total in sorted(agent['total', None]):
- assert total == last + 2
- last = total
-
- def test_row_conversion(self):
- env = Environment(history=True)
- env['test'] = 'test_value'
-
- res = list(env.history_to_tuples())
- assert len(res) == len(env.environment_params)
-
- env.schedule.time = 1
- env['test'] = 'second_value'
- res = list(env.history_to_tuples())
-
- assert env['env', 0, 'test' ] == 'test_value'
- assert env['env', 1, 'test' ] == 'second_value'
-
- def test_nohistory(self):
- '''
- Make sure that no history(/sqlite) is used by default
- '''
- env = Environment(topology=nx.Graph(), network_agents=[])
- assert isinstance(env._history, NoHistory)
-
- def test_save_graph_history(self):
- '''
- The history_to_graph method should return a valid networkx graph.
-
- The state of the agent should be encoded as intervals in the nx graph.
- '''
- G = nx.cycle_graph(5)
- distribution = agents.calculate_distribution(None, agents.BaseAgent)
- env = Environment(topology=G, network_agents=distribution, history=True)
- env[0, 0, 'testvalue'] = 'start'
- env[0, 10, 'testvalue'] = 'finish'
- nG = env.history_to_graph()
- values = nG.nodes[0]['attr_testvalue']
- assert ('start', 0, 10) in values
- assert ('finish', 10, None) in values
-
- def test_save_graph_nohistory(self):
- '''
- The history_to_graph method should return a valid networkx graph.
-
- When NoHistory is used, only the last known value is known
- '''
- G = nx.cycle_graph(5)
- distribution = agents.calculate_distribution(None, agents.BaseAgent)
- env = Environment(topology=G, network_agents=distribution, history=False)
- env.get_agent(0)['testvalue'] = 'start'
- env.schedule.time = 10
- env.get_agent(0)['testvalue'] = 'finish'
- nG = env.history_to_graph()
- values = nG.nodes[0]['attr_testvalue']
- assert ('start', 0, None) not in values
- assert ('finish', 10, None) in values
-
- def test_pickle_agent_environment(self):
- env = Environment(name='Test', history=True)
- a = agents.BaseAgent(model=env, unique_id=25)
-
- a['key'] = 'test'
-
- pickled = pickle.dumps(a)
- recovered = pickle.loads(pickled)
-
- assert recovered.env.name == 'Test'
- assert list(recovered.env._history.to_tuples())
- assert recovered['key', 0] == 'test'
- assert recovered['key'] == 'test'
diff --git a/tests/test_main.py b/tests/test_main.py
index a114b6c..6ac26e4 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -24,6 +24,7 @@ class CustomAgent(agents.FSM, agents.NetworkAgent):
def unreachable(self):
return
+
class TestMain(TestCase):
def test_empty_simulation(self):
@@ -79,20 +80,16 @@ class TestMain(TestCase):
}
},
'agents': {
- 'default': {
- 'agent_class': 'CounterModel',
- },
- 'counters': {
- 'topology': 'default',
- 'fixed': [{'state': {'times': 10}}, {'state': {'times': 20}}],
- }
+ 'agent_class': 'CounterModel',
+ 'topology': 'default',
+ 'fixed': [{'state': {'times': 10}}, {'state': {'times': 20}}],
}
}
}
s = simulation.from_config(config)
env = s.get_env()
assert isinstance(env.agents[0], agents.CounterModel)
- assert env.agents[0].topology == env.topologies['default']
+ assert env.agents[0].G == env.topologies['default']
assert env.agents[0]['times'] == 10
assert env.agents[0]['times'] == 10
env.step()
@@ -105,8 +102,8 @@ class TestMain(TestCase):
config = {
'max_time': 10,
'model_params': {
- 'agents': [(CustomAgent, {'weight': 1}),
- (CustomAgent, {'weight': 3}),
+ 'agents': [{'agent_class': CustomAgent, 'weight': 1, 'topology': 'default'},
+ {'agent_class': CustomAgent, 'weight': 3, 'topology': 'default'},
],
'topologies': {
'default': {
@@ -128,7 +125,7 @@ class TestMain(TestCase):
"""A complete example from a documentation should work."""
config = serialization.load_file(join(EXAMPLES, 'torvalds.yml'))[0]
config['model_params']['network_params']['path'] = join(EXAMPLES,
- config['network_params']['path'])
+ config['model_params']['network_params']['path'])
s = simulation.from_config(config)
env = s.run_simulation(dry_run=True)[0]
for a in env.network_agents:
@@ -208,24 +205,6 @@ class TestMain(TestCase):
assert converted[1]['agent_class'] == 'test_main.CustomAgent'
pickle.dumps(converted)
- def test_subgraph(self):
- '''An agent should be able to subgraph the global topology'''
- G = nx.Graph()
- G.add_node(3)
- G.add_edge(1, 2)
- distro = agents.calculate_distribution(agent_class=agents.NetworkAgent)
- distro[0]['topology'] = 'default'
- aconfig = config.AgentConfig(distribution=distro, topology='default')
- env = Environment(name='Test', topologies={'default': G}, agents={'network': aconfig})
- lst = list(env.network_agents)
-
- a2 = env.find_one(node_id=2)
- a3 = env.find_one(node_id=3)
- assert len(a2.subgraph(limit_neighbors=True)) == 2
- assert len(a3.subgraph(limit_neighbors=True)) == 1
- assert len(a3.subgraph(limit_neighbors=True, center=False)) == 0
- assert len(a3.subgraph(agent_class=agents.NetworkAgent)) == 3
-
def test_templates(self):
'''Loading a template should result in several configs'''
configs = serialization.load_file(join(EXAMPLES, 'template.yml'))
@@ -236,14 +215,18 @@ class TestMain(TestCase):
'name': 'until_sim',
'model_params': {
'network_params': {},
- 'agent_class': 'CounterModel',
+ 'agents': {
+ 'fixed': [{
+ 'agent_class': agents.BaseAgent,
+ }]
+ },
},
'max_time': 2,
'num_trials': 50,
}
s = simulation.from_config(config)
runs = list(s.run_simulation(dry_run=True))
- over = list(x.now for x in runs if x.now>2)
+ over = list(x.now for x in runs if x.now > 2)
assert len(runs) == config['num_trials']
assert len(over) == 0
diff --git a/tests/test_network.py b/tests/test_network.py
index b111a94..d984320 100644
--- a/tests/test_network.py
+++ b/tests/test_network.py
@@ -6,7 +6,8 @@ import networkx as nx
from os.path import join
-from soil import network, environment
+from soil import config, network, environment, agents, simulation
+from test_main import CustomAgent
ROOT = os.path.abspath(os.path.dirname(__file__))
EXAMPLES = join(ROOT, '..', 'examples')
@@ -60,22 +61,53 @@ class TestNetwork(TestCase):
G = nx.random_geometric_graph(20, 0.1)
env = environment.NetworkEnvironment(topology=G)
f = io.BytesIO()
- env.dump_gexf(f)
+ assert env.topologies['default']
+ network.dump_gexf(env.topologies['default'], f)
+
+ def test_networkenvironment_creation(self):
+ """Networkenvironment should accept netconfig as parameters"""
+ model_params = {
+ 'topologies': {
+ 'default': {
+ 'path': join(ROOT, 'test.gexf')
+ }
+ },
+ 'agents': {
+ 'topology': 'default',
+ 'distribution': [{
+ 'agent_class': CustomAgent,
+ }]
+ }
+ }
+ env = environment.Environment(**model_params)
+ assert env.topologies
+ env.step()
+ assert len(env.topologies['default']) == 2
+ assert len(env.agents) == 2
+ assert env.agents[1].count_agents(state_id='normal') == 2
+ assert env.agents[1].count_agents(state_id='normal', limit_neighbors=True) == 1
+ assert env.agents[0].neighbors == 1
def test_custom_agent_neighbors(self):
"""Allow for search of neighbors with a certain state_id"""
config = {
- 'network_params': {
- 'path': join(ROOT, 'test.gexf')
+ 'model_params': {
+ 'topologies': {
+ 'default': {
+ 'path': join(ROOT, 'test.gexf')
+ }
+ },
+ 'agents': {
+ 'topology': 'default',
+ 'distribution': [
+ {
+ 'weight': 1,
+ 'agent_class': CustomAgent
+ }
+ ]
+ }
},
- 'network_agents': [{
- 'agent_class': CustomAgent,
- 'weight': 1
-
- }],
'max_time': 10,
- 'environment_params': {
- }
}
s = simulation.from_config(config)
env = s.run_simulation(dry_run=True)[0]
@@ -83,3 +115,19 @@ class TestNetwork(TestCase):
assert env.agents[1].count_agents(state_id='normal', limit_neighbors=True) == 1
assert env.agents[0].neighbors == 1
+ def test_subgraph(self):
+ '''An agent should be able to subgraph the global topology'''
+ G = nx.Graph()
+ G.add_node(3)
+ G.add_edge(1, 2)
+ distro = agents.calculate_distribution(agent_class=agents.NetworkAgent)
+ aconfig = config.AgentConfig(distribution=distro, topology='default')
+ env = environment.Environment(name='Test', topologies={'default': G}, agents=aconfig)
+ lst = list(env.network_agents)
+
+ a2 = env.find_one(node_id=2)
+ a3 = env.find_one(node_id=3)
+ assert len(a2.subgraph(limit_neighbors=True)) == 2
+ assert len(a3.subgraph(limit_neighbors=True)) == 1
+ assert len(a3.subgraph(limit_neighbors=True, center=False)) == 0
+ assert len(a3.subgraph(agent_class=agents.NetworkAgent)) == 3
From d9947c2c525a213f7dc4fac3e21335970f21c78b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Sun, 16 Oct 2022 17:54:03 +0200
Subject: [PATCH 09/39] WIP: all tests pass
Documentation needs some improvement
The API has been simplified to only allow for ONE topology per
NetworkEnvironment.
This covers the main use case, and simplifies the code.
---
CHANGELOG.md | 10 +-
examples/complete.yml | 25 +--
examples/complete_opt2.yml | 63 ------
examples/custom_timeouts/custom_timeouts.py | 4 +-
examples/mesa/mesa.yml | 9 +-
examples/mesa/server.py | 31 +--
examples/mesa/social_wealth.py | 43 ++--
examples/pubcrawl/pubcrawl.py | 2 +-
examples/rabbits/basic/rabbit_agents.py | 14 +-
examples/rabbits/basic/rabbits.yml | 21 +-
examples/rabbits/improved/rabbits.yml | 21 +-
examples/random_delays/random_delays.py | 2 -
requirements.txt | 2 +-
setup.py | 2 +-
soil/__init__.py | 91 +++++----
soil/__main__.py | 7 +-
soil/agents/__init__.py | 123 ++++++------
soil/config.py | 21 +-
soil/debugging.py | 78 +++++--
soil/environment.py | 212 ++++++++++----------
soil/exporters.py | 22 +-
soil/network.py | 25 +--
soil/serialization.py | 49 +----
soil/simulation.py | 60 +++---
soil/time.py | 2 +-
soil/utils.py | 5 +-
tests/complete_converted.yml | 13 +-
tests/test_agents.py | 4 +-
tests/test_config.py | 63 +++---
tests/test_examples.py | 18 +-
tests/test_exporters.py | 67 ++++---
tests/test_main.py | 211 +++++++++----------
tests/test_mesa.py | 16 +-
tests/test_network.py | 93 ++++-----
34 files changed, 693 insertions(+), 736 deletions(-)
delete mode 100644 examples/complete_opt2.yml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a0a8a2a..0ca9fc3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,14 +5,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
## [0.3 UNRELEASED]
### Added
-* Simple debugging capabilities, with a custom `pdb.Debugger` subclass that exposes commands to list agents and their status and set breakpoints on states (for FSM agents)
+* Simple debugging capabilities in `soil.debugging`, with a custom `pdb.Debugger` subclass that exposes commands to list agents and their status and set breakpoints on states (for FSM agents). Try it with `soil --debug `
+* Ability to run
+* Ability to
+* The `soil.exporters` module to export the results of datacollectors (model.datacollector) into files at the end of trials/simulations
+* A modular set of classes for environments/models. Now the ability to configure the agents through an agent definition and a topology through a network configuration is split into two classes (`soil.agents.BaseEnvironment` for agents, `soil.agents.NetworkEnvironment` to add topology).
+* FSM agents can now have generators as states. They work similar to normal states, with one caveat. Only `time` values can be yielded, not a state. This is because the state will not change, it will be resumed after the yield, at the appropriate time. The return value *can* be a state, or a `(state, time)` tuple, just like in normal states.
### Changed
* Configuration schema is very different now. Check `soil.config` for more information. We are also using Pydantic for (de)serialization.
* There may be more than one topology/network in the simulation
-* Agents are split into groups now. Each group may be assigned a given set of agents or an agent distribution, and a network topology to be assigned to.
+* Ability
### Removed
* Any `tsih` and `History` integration in the main classes. To record the state of environments/agents, just use a datacollector. In some cases this may be slower or consume more memory than the previous system. However, few cases actually used the full potential of the history, and it came at the cost of unnecessary complexity and worse performance for the majority of cases.
+
## [0.20.7]
### Changed
* Creating a `time.When` from another `time.When` does not nest them anymore (it returns the argument)
diff --git a/examples/complete.yml b/examples/complete.yml
index 2677c22..130b1e7 100644
--- a/examples/complete.yml
+++ b/examples/complete.yml
@@ -10,19 +10,14 @@ seed: "CompleteSeed!"
model_class: Environment
model_params:
am_i_complete: true
- topologies:
- default:
- params:
- generator: complete_graph
- n: 10
- another_graph:
- params:
- generator: complete_graph
- n: 2
+ topology:
+ params:
+ generator: complete_graph
+ n: 12
environment:
agents:
agent_class: CounterModel
- topology: default
+ topology: true
state:
times: 1
# In this group we are not specifying any topology
@@ -30,25 +25,23 @@ model_params:
- name: 'Environment Agent 1'
agent_class: BaseAgent
group: environment
- topology: null
+ topology: false
hidden: true
state:
times: 10
- agent_class: CounterModel
id: 0
- group: other_counters
- topology: another_graph
+ group: fixed_counters
state:
times: 1
total: 0
- agent_class: CounterModel
- topology: another_graph
- group: other_counters
+ group: fixed_counters
id: 1
distribution:
- agent_class: CounterModel
weight: 1
- group: general_counters
+ group: distro_counters
state:
times: 3
- agent_class: AggregatedCounter
diff --git a/examples/complete_opt2.yml b/examples/complete_opt2.yml
deleted file mode 100644
index b4acc26..0000000
--- a/examples/complete_opt2.yml
+++ /dev/null
@@ -1,63 +0,0 @@
----
-version: '2'
-id: simple
-group: tests
-dir_path: "/tmp/"
-num_trials: 3
-max_steps: 100
-interval: 1
-seed: "CompleteSeed!"
-model_class: "soil.Environment"
-model_params:
- topologies:
- default:
- params:
- generator: complete_graph
- n: 10
- another_graph:
- params:
- generator: complete_graph
- n: 2
- agents:
- # The values here will be used as default values for any agent
- agent_class: CounterModel
- topology: default
- state:
- times: 1
- # This specifies a distribution of agents, each with a `weight` or an explicit number of agents
- distribution:
- - agent_class: CounterModel
- weight: 1
- # This is inherited from the default settings
- #topology: default
- state:
- times: 3
- - agent_class: AggregatedCounter
- topology: default
- weight: 0.2
- fixed:
- - name: 'Environment Agent 1'
- # All the other agents will assigned to the 'default' group
- group: environment
- # Do not count this agent towards total limits
- hidden: true
- agent_class: soil.BaseAgent
- topology: null
- state:
- times: 10
- - agent_class: CounterModel
- topology: another_graph
- id: 0
- state:
- times: 1
- total: 0
- - agent_class: CounterModel
- topology: another_graph
- id: 1
- override:
- # 2 agents that match this filter will be updated to match the state {times: 5}
- - filter:
- agent_class: AggregatedCounter
- n: 2
- state:
- times: 5
diff --git a/examples/custom_timeouts/custom_timeouts.py b/examples/custom_timeouts/custom_timeouts.py
index 16b8d66..b269c0a 100644
--- a/examples/custom_timeouts/custom_timeouts.py
+++ b/examples/custom_timeouts/custom_timeouts.py
@@ -15,6 +15,7 @@ class Fibonacci(FSM):
prev, self['prev'] = self['prev'], max([self.now, self['prev']])
return None, self.env.timeout(prev)
+
class Odds(FSM):
'''Agent that only executes in odd t_steps'''
@default_state
@@ -23,9 +24,8 @@ class Odds(FSM):
self.log('Stopping at {}'.format(self.now))
return None, self.env.timeout(1+self.now%2)
+
if __name__ == '__main__':
- import logging
- logging.basicConfig(level=logging.INFO)
from soil import Simulation
s = Simulation(network_agents=[{'ids': [0], 'agent_class': Fibonacci},
{'ids': [1], 'agent_class': Odds}],
diff --git a/examples/mesa/mesa.yml b/examples/mesa/mesa.yml
index 6bdae6f..eb10b8d 100644
--- a/examples/mesa/mesa.yml
+++ b/examples/mesa/mesa.yml
@@ -8,17 +8,12 @@ interval: 1
seed: '1'
model_class: social_wealth.MoneyEnv
model_params:
- topologies:
- default:
- params:
- generator: social_wealth.graph_generator
- n: 5
+ generator: social_wealth.graph_generator
agents:
+ topology: true
distribution:
- agent_class: social_wealth.SocialMoneyAgent
- topology: default
weight: 1
- mesa_agent_class: social_wealth.MoneyAgent
N: 10
width: 50
height: 50
diff --git a/examples/mesa/server.py b/examples/mesa/server.py
index fc9b0b1..7fe820f 100644
--- a/examples/mesa/server.py
+++ b/examples/mesa/server.py
@@ -2,6 +2,7 @@ from mesa.visualization.ModularVisualization import ModularServer
from soil.visualization import UserSettableParameter
from mesa.visualization.modules import ChartModule, NetworkModule, CanvasGrid
from social_wealth import MoneyEnv, graph_generator, SocialMoneyAgent
+import networkx as nx
class MyNetwork(NetworkModule):
@@ -13,15 +14,16 @@ def network_portrayal(env):
# The model ensures there is 0 or 1 agent per node
portrayal = dict()
+ wealths = {node_id: data['agent'].wealth for (node_id, data) in env.G.nodes(data=True)}
portrayal["nodes"] = [
{
- "id": agent_id,
- "size": env.get_agent(agent_id).wealth,
- # "color": "#CC0000" if not agents or agents[0].wealth == 0 else "#007959",
- "color": "#CC0000",
- "label": f"{agent_id}: {env.get_agent(agent_id).wealth}",
- }
- for (agent_id) in env.G.nodes
+ "id": node_id,
+ "size": 2*(wealth+1),
+ "color": "#CC0000" if wealth == 0 else "#007959",
+ # "color": "#CC0000",
+ "label": f"{node_id}: {wealth}",
+ } for (node_id, wealth) in wealths.items()
+
]
portrayal["edges"] = [
@@ -29,7 +31,6 @@ def network_portrayal(env):
for edge_id, (source, target) in enumerate(env.G.edges)
]
-
return portrayal
@@ -55,7 +56,7 @@ def gridPortrayal(agent):
}
-grid = MyNetwork(network_portrayal, 500, 500, library="sigma")
+grid = MyNetwork(network_portrayal, 500, 500)
chart = ChartModule(
[{"Label": "Gini", "Color": "Black"}], data_collector_name="datacollector"
)
@@ -70,7 +71,6 @@ model_params = {
1,
description="Choose how many agents to include in the model",
),
- "network_agents": [{"agent_class": SocialMoneyAgent}],
"height": UserSettableParameter(
"slider",
"height",
@@ -89,12 +89,15 @@ model_params = {
1,
description="Grid width",
),
- "network_params": {
- 'generator': graph_generator
- },
+ "agent_class": UserSettableParameter('choice', 'Agent class', value='MoneyAgent',
+ choices=['MoneyAgent', 'SocialMoneyAgent']),
+ "generator": graph_generator,
}
-canvas_element = CanvasGrid(gridPortrayal, model_params["width"].value, model_params["height"].value, 500, 500)
+
+canvas_element = CanvasGrid(gridPortrayal,
+ model_params["width"].value,
+ model_params["height"].value, 500, 500)
server = ModularServer(
diff --git a/examples/mesa/social_wealth.py b/examples/mesa/social_wealth.py
index b20bc9a..c8b1701 100644
--- a/examples/mesa/social_wealth.py
+++ b/examples/mesa/social_wealth.py
@@ -10,7 +10,7 @@ from mesa.batchrunner import BatchRunner
import networkx as nx
-from soil import NetworkAgent, Environment
+from soil import NetworkAgent, Environment, serialization
def compute_gini(model):
agent_wealths = [agent.wealth for agent in model.agents]
@@ -19,15 +19,16 @@ def compute_gini(model):
B = sum( xi * (N-i) for i,xi in enumerate(x) ) / (N*sum(x))
return (1 + (1/N) - 2*B)
+
class MoneyAgent(MesaAgent):
"""
A MESA agent with fixed initial wealth.
It will only share wealth with neighbors based on grid proximity
"""
- def __init__(self, unique_id, model):
+ def __init__(self, unique_id, model, wealth=1):
super().__init__(unique_id=unique_id, model=model)
- self.wealth = 1
+ self.wealth = wealth
def move(self):
possible_steps = self.model.grid.get_neighborhood(
@@ -45,7 +46,7 @@ class MoneyAgent(MesaAgent):
self.wealth -= 1
def step(self):
- self.info("Crying wolf", self.pos)
+ print("Crying wolf", self.pos)
self.move()
if self.wealth > 0:
self.give_money()
@@ -58,8 +59,8 @@ class SocialMoneyAgent(NetworkAgent, MoneyAgent):
cellmates = set(self.model.grid.get_cell_list_contents([self.pos]))
friends = set(self.get_neighboring_agents())
self.info("Trying to give money")
- self.debug("Cellmates: ", cellmates)
- self.debug("Friends: ", friends)
+ self.info("Cellmates: ", cellmates)
+ self.info("Friends: ", friends)
nearby_friends = list(cellmates & friends)
@@ -68,14 +69,29 @@ class SocialMoneyAgent(NetworkAgent, MoneyAgent):
other.wealth += 1
self.wealth -= 1
+def graph_generator(n=5):
+ G = nx.Graph()
+ for ix in range(n):
+ G.add_edge(0, ix)
+ return G
+
class MoneyEnv(Environment):
"""A model with some number of agents."""
- def __init__(self, width, height, *args, topologies, **kwargs):
+ def __init__(self, width, height, N, generator=graph_generator,
+ agent_class=SocialMoneyAgent,
+ topology=None, **kwargs):
- super().__init__(*args, topologies=topologies, **kwargs)
+ generator = serialization.deserialize(generator)
+ agent_class = serialization.deserialize(agent_class, globs=globals())
+ topology = generator(n=N)
+ super().__init__(topology=topology,
+ N=N,
+ **kwargs)
self.grid = MultiGrid(width, height, False)
+ self.populate_network(agent_class=agent_class)
+
# Create agents
for agent in self.agents:
x = self.random.randrange(self.grid.width)
@@ -87,17 +103,9 @@ class MoneyEnv(Environment):
agent_reporters={"Wealth": "wealth"})
-def graph_generator(n=5):
- G = nx.Graph()
- for ix in range(n):
- G.add_edge(0, ix)
- return G
-
if __name__ == '__main__':
-
- G = graph_generator()
- fixed_params = {"topology": G,
+ fixed_params = {"generator": nx.complete_graph,
"width": 10,
"network_agents": [{"agent_class": SocialMoneyAgent,
'weight': 1}],
@@ -116,4 +124,3 @@ if __name__ == '__main__':
run_data = batch_run.get_model_vars_dataframe()
run_data.head()
print(run_data.Gini)
-
diff --git a/examples/pubcrawl/pubcrawl.py b/examples/pubcrawl/pubcrawl.py
index e100893..b220856 100644
--- a/examples/pubcrawl/pubcrawl.py
+++ b/examples/pubcrawl/pubcrawl.py
@@ -126,7 +126,7 @@ class Patron(FSM, NetworkAgent):
success depend on both agents' openness.
'''
if force or self['openness'] > self.random.random():
- self.model.add_edge(self, other_agent)
+ self.add_edge(self, other_agent)
self.info('Made some friend {}'.format(other_agent))
return True
return False
diff --git a/examples/rabbits/basic/rabbit_agents.py b/examples/rabbits/basic/rabbit_agents.py
index 2d5cf40..fc7b73b 100644
--- a/examples/rabbits/basic/rabbit_agents.py
+++ b/examples/rabbits/basic/rabbit_agents.py
@@ -57,7 +57,7 @@ class Male(RabbitModel):
class Female(RabbitModel):
- gestation = 100
+ gestation = 30
@state
def fertile(self):
@@ -72,10 +72,10 @@ class Female(RabbitModel):
self.pregnancy = -1
self.set_state(self.pregnant, when=self.now)
self.number_of_babies = int(8+4*self.random.random())
- self.debug('I am pregnant')
@state
def pregnant(self):
+ self.debug('I am pregnant')
self.age += 1
self.pregnancy += 1
@@ -88,7 +88,6 @@ class Female(RabbitModel):
state = {}
agent_class = self.random.choice([Male, Female])
child = self.model.add_node(agent_class=agent_class,
- topology=self.topology,
**state)
child.add_edge(self)
try:
@@ -113,7 +112,7 @@ class RandomAccident(BaseAgent):
level = logging.INFO
def step(self):
- rabbits_alive = self.model.topology.number_of_nodes()
+ rabbits_alive = self.model.G.number_of_nodes()
if not rabbits_alive:
return self.die()
@@ -121,10 +120,15 @@ class RandomAccident(BaseAgent):
prob_death = self.model.get('prob_death', 1e-100)*math.floor(math.log10(max(1, rabbits_alive)))
self.debug('Killing some rabbits with prob={}!'.format(prob_death))
for i in self.iter_agents(agent_class=RabbitModel):
- if i.state.id == i.dead.id:
+ if i.state_id == i.dead.id:
continue
if self.prob(prob_death):
self.info('I killed a rabbit: {}'.format(i.id))
rabbits_alive -= 1
i.set_state(i.dead)
self.debug('Rabbits alive: {}'.format(rabbits_alive))
+
+if __name__ == '__main__':
+ from soil import easy
+ sim = easy('rabbits.yml')
+ sim.run()
diff --git a/examples/rabbits/basic/rabbits.yml b/examples/rabbits/basic/rabbits.yml
index facaefe..6945f67 100644
--- a/examples/rabbits/basic/rabbits.yml
+++ b/examples/rabbits/basic/rabbits.yml
@@ -10,18 +10,16 @@ max_time: 100
model_class: soil.environment.Environment
model_params:
agents:
- topology: default
+ topology: true
agent_class: rabbit_agents.RabbitModel
distribution:
- agent_class: rabbit_agents.Male
- topology: default
weight: 1
- agent_class: rabbit_agents.Female
- topology: default
weight: 1
fixed:
- agent_class: rabbit_agents.RandomAccident
- topology: null
+ topology: false
hidden: true
state:
group: environment
@@ -29,13 +27,12 @@ model_params:
group: network
mating_prob: 0.1
prob_death: 0.001
- topologies:
- default:
- topology:
- directed: true
- links: []
- nodes:
- - id: 1
- - id: 0
+ topology:
+ fixed:
+ directed: true
+ links: []
+ nodes:
+ - id: 1
+ - id: 0
extra:
visualization_params: {}
diff --git a/examples/rabbits/improved/rabbits.yml b/examples/rabbits/improved/rabbits.yml
index ce5dd68..dd13c4e 100644
--- a/examples/rabbits/improved/rabbits.yml
+++ b/examples/rabbits/improved/rabbits.yml
@@ -10,18 +10,16 @@ max_time: 100
model_class: soil.environment.Environment
model_params:
agents:
- topology: default
+ topology: true
agent_class: rabbit_agents.RabbitModel
distribution:
- agent_class: rabbit_agents.Male
- topology: default
weight: 1
- agent_class: rabbit_agents.Female
- topology: default
weight: 1
fixed:
- agent_class: rabbit_agents.RandomAccident
- topology: null
+ topology: false
hidden: true
state:
group: environment
@@ -29,13 +27,12 @@ model_params:
group: network
mating_prob: 0.1
prob_death: 0.001
- topologies:
- default:
- topology:
- directed: true
- links: []
- nodes:
- - id: 1
- - id: 0
+ topology:
+ fixed:
+ directed: true
+ links: []
+ nodes:
+ - id: 1
+ - id: 0
extra:
visualization_params: {}
diff --git a/examples/random_delays/random_delays.py b/examples/random_delays/random_delays.py
index 52dd55e..8455e5e 100644
--- a/examples/random_delays/random_delays.py
+++ b/examples/random_delays/random_delays.py
@@ -4,7 +4,6 @@ Example of a fully programmatic simulation, without definition files.
'''
from soil import Simulation, agents
from soil.time import Delta
-import logging
@@ -40,5 +39,4 @@ s = Simulation(name='Programmatic',
dry_run=True)
-logging.basicConfig(level=logging.INFO)
envs = s.run()
diff --git a/requirements.txt b/requirements.txt
index 8383887..834b156 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,6 +5,6 @@ pyyaml>=5.1
pandas>=1
SALib>=1.3
Jinja2
-Mesa>=1
+Mesa>=1.1
pydantic>=1.9
sqlalchemy>=1.4
diff --git a/setup.py b/setup.py
index 151ae7e..e9b3df6 100644
--- a/setup.py
+++ b/setup.py
@@ -53,6 +53,6 @@ setup(
include_package_data=True,
entry_points={
'console_scripts':
- ['soil = soil.__init__:main',
+ ['soil = soil.__main__:main',
'soil-web = soil.web.__init__:main']
})
diff --git a/soil/__init__.py b/soil/__init__.py
index 9219e04..be53c47 100644
--- a/soil/__init__.py
+++ b/soil/__init__.py
@@ -21,7 +21,8 @@ from . import serialization
from .utils import logger
from .time import *
-def main(cfg='simulation.yml', **kwargs):
+
+def main(cfg='simulation.yml', exporters=None, parallel=None, output="soil_output", *, do_run=False, debug=False, **kwargs):
import argparse
from . import simulation
@@ -48,16 +49,19 @@ def main(cfg='simulation.yml', **kwargs):
help='Dump all data collected in CSV format. Defaults to false.')
parser.add_argument('--level', type=str,
help='Logging level')
- parser.add_argument('--output', '-o', type=str, default="soil_output",
+ parser.add_argument('--output', '-o', type=str, default=output or "soil_output",
help='folder to write results to. It defaults to the current directory.')
- parser.add_argument('--synchronous', action='store_true',
- help='Run trials serially and synchronously instead of in parallel. Defaults to false.')
+ if parallel is None:
+ parser.add_argument('--synchronous', action='store_true',
+ help='Run trials serially and synchronously instead of in parallel. Defaults to false.')
+
parser.add_argument('-e', '--exporter', action='append',
+ default=[],
help='Export environment and/or simulations using this exporter')
+
parser.add_argument('--only-convert', '--convert', action='store_true',
help='Do not run the simulation, only convert the configuration file(s) and output them.')
-
parser.add_argument("--set",
metavar="KEY=VALUE",
action='append',
@@ -74,32 +78,49 @@ def main(cfg='simulation.yml', **kwargs):
if args.version:
return
+ if parallel is None:
+ parallel = not args.synchronous
+
+ exporters = exporters or ['default', ]
+ for exp in args.exporter:
+ if exp not in exporters:
+ exporters.append(exp)
+ if args.csv:
+ exporters.append('csv')
+ if args.graph:
+ exporters.append('gexf')
+
if os.getcwd() not in sys.path:
sys.path.append(os.getcwd())
if args.module:
importlib.import_module(args.module)
+ if output is None:
+ output = args.output
+
logger.info('Loading config file: {}'.format(args.file))
- if args.pdb or args.debug:
- args.synchronous = True
- if args.debug:
- os.environ['SOIL_DEBUG'] = 'true'
+ debug = debug or args.debug
+ if args.pdb or debug:
+ args.synchronous = True
+
+
+ res = []
try:
- exporters = list(args.exporter or ['default', ])
- if args.csv:
- exporters.append('csv')
- if args.graph:
- exporters.append('gexf')
exp_params = {}
- if args.dry_run:
- exp_params['copy_to'] = sys.stdout
if not os.path.exists(args.file):
logger.error('Please, input a valid file')
return
- for sim in simulation.iter_from_config(args.file):
+
+ for sim in simulation.iter_from_config(args.file,
+ dry_run=args.dry_run,
+ exporters=exporters,
+ parallel=parallel,
+ outdir=output,
+ exporter_params=exp_params,
+ **kwargs):
if args.set:
for s in args.set:
k, v = s.split('=', 1)[:2]
@@ -117,16 +138,14 @@ def main(cfg='simulation.yml', **kwargs):
except AttributeError:
target[tail] = v
- if args.only_convert:
- print(sim.to_yaml())
- continue
-
- sim.run_simulation(dry_run=args.dry_run,
- exporters=exporters,
- parallel=(not args.synchronous),
- outdir=args.output,
- exporter_params=exp_params,
- **kwargs)
+ if args.only_convert:
+ print(sim.to_yaml())
+ continue
+ if do_run:
+ res.append(sim.run())
+ else:
+ print('not running')
+ res.append(sim)
except Exception as ex:
if args.pdb:
@@ -135,12 +154,16 @@ def main(cfg='simulation.yml', **kwargs):
post_mortem()
else:
raise
+ if debug:
+ from .debugging import set_trace
+ os.environ['SOIL_DEBUG'] = 'true'
+ set_trace()
+ return res
+
+
+def easy(cfg, debug=False, **kwargs):
+ return main(cfg, **kwargs)[0]
+
-def easy(cfg, debug=False):
- sim = simulation.from_config(cfg)
- if debug or os.environ.get('SOIL_DEBUG'):
- from .debugging import setup
- setup(sys._getframe().f_back)
- return sim
if __name__ == '__main__':
- main()
+ main(do_run=True)
diff --git a/soil/__main__.py b/soil/__main__.py
index c7c70d0..9ad5c4f 100644
--- a/soil/__main__.py
+++ b/soil/__main__.py
@@ -1,4 +1,7 @@
-from . import main
+from . import main as init_main
+
+def main():
+ init_main(do_run=True)
if __name__ == '__main__':
- main()
+ init_main(do_run=True)
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index c7763f2..ad3e4a7 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -47,7 +47,7 @@ class MetaAgent(ABCMeta):
}
for attr, func in namespace.items():
- if isinstance(func, types.FunctionType) or isinstance(func, property) or attr[0] == '_':
+ if isinstance(func, types.FunctionType) or isinstance(func, property) or isinstance(func, classmethod) or attr[0] == '_':
new_nmspc[attr] = func
elif attr == 'defaults':
defaults.update(func)
@@ -113,21 +113,18 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
def id(self):
return self.unique_id
- @property
- def state(self):
- '''
- Return the agent itself, which behaves as a dictionary.
-
- This method shouldn't be used, but is kept here for backwards compatibility.
- '''
- return self
-
- @state.setter
- def state(self, value):
- if not value:
- return
- for k, v in value.items():
- self[k] = v
+ @classmethod
+ def from_dict(cls, model, attrs, warn_extra=True):
+ ignored = {}
+ args = {}
+ for k, v in attrs.items():
+ if k in inspect.signature(cls).parameters:
+ args[k] = v
+ else:
+ ignored[k] = v
+ if ignored and warn_extra:
+ utils.logger.info(f'Ignoring the following arguments for agent class { agent_class.__name__ }: { ignored }')
+ return cls(model=model, **args)
def __getitem__(self, key):
try:
@@ -232,18 +229,27 @@ class NetworkAgent(BaseAgent):
def __init__(self, *args, topology, node_id, **kwargs):
super().__init__(*args, **kwargs)
- self.topology = topology
- self.node_id = node_id
- self.G = self.model.topologies[topology]
+ assert topology is not None
+ assert node_id is not None
+ self.G = topology
assert self.G
+ self.node_id = node_id
def count_neighboring_agents(self, state_id=None, **kwargs):
return len(self.get_neighboring_agents(state_id=state_id, **kwargs))
- def get_neighboring_agents(self, state_id=None, **kwargs):
- return self.get_agents(limit_neighbors=True, state_id=state_id, **kwargs)
+ def get_neighboring_agents(self, **kwargs):
+ return list(self.iter_agents(limit_neighbors=True, **kwargs))
- def iter_agents(self, unique_id=None, limit_neighbors=False, **kwargs):
+ def add_edge(self, other):
+ self.topology.add_edge(self.node_id, other.node_id)
+
+ @property
+ def node(self):
+ return self.topology.nodes[self.node_id]
+
+
+ def iter_agents(self, unique_id=None, *, limit_neighbors=False, **kwargs):
unique_ids = None
if isinstance(unique_id, list):
unique_ids = set(unique_id)
@@ -253,7 +259,7 @@ class NetworkAgent(BaseAgent):
if limit_neighbors:
neighbor_ids = set()
for node_id in self.G.neighbors(self.node_id):
- if self.G.nodes[node_id].get('agent_id') is not None:
+ if self.G.nodes[node_id].get('agent') is not None:
neighbor_ids.add(node_id)
if unique_ids:
unique_ids = unique_ids & neighbor_ids
@@ -697,7 +703,7 @@ def filter_agents(agents, *id_args, unique_id=None, state_id=None, agent_class=N
state.update(kwargs)
for k, v in state.items():
- f = filter(lambda agent: agent.state.get(k, None) == v, f)
+ f = filter(lambda agent: getattr(agent, k, None) == v, f)
if limit is not None:
f = islice(f, limit)
@@ -705,7 +711,7 @@ def filter_agents(agents, *id_args, unique_id=None, state_id=None, agent_class=N
yield from f
-def from_config(cfg: config.AgentConfig, random, topologies: Dict[str, nx.Graph] = None) -> List[Dict[str, Any]]:
+def from_config(cfg: config.AgentConfig, random, topology: nx.Graph = None) -> List[Dict[str, Any]]:
'''
This function turns an agentconfig into a list of individual "agent specifications", which are just a dictionary
with the parameters that the environment will use to construct each agent.
@@ -716,40 +722,40 @@ def from_config(cfg: config.AgentConfig, random, topologies: Dict[str, nx.Graph]
default = cfg or config.AgentConfig()
if not isinstance(cfg, config.AgentConfig):
cfg = config.AgentConfig(**cfg)
- return _agents_from_config(cfg, topologies=topologies, random=random)
+ return _agents_from_config(cfg, topology=topology, random=random)
def _agents_from_config(cfg: config.AgentConfig,
- topologies: Dict[str, nx.Graph],
+ topology: nx.Graph,
random) -> List[Dict[str, Any]]:
if cfg and not isinstance(cfg, config.AgentConfig):
cfg = config.AgentConfig(**cfg)
agents = []
- assigned = defaultdict(int)
+ assigned_total = 0
+ assigned_network = 0
if cfg.fixed is not None:
- agents, counts = _from_fixed(cfg.fixed, topology=cfg.topology, default=cfg)
- assigned.update(counts)
+ agents, assigned_total, assigned_network = _from_fixed(cfg.fixed, topology=cfg.topology, default=cfg)
n = cfg.n
if cfg.distribution:
- topo_size = {top: len(topologies[top]) for top in topologies}
+ topo_size = len(topology) if topology else 0
- grouped = defaultdict(list)
+ networked = []
total = []
for d in cfg.distribution:
if d.strategy == config.Strategy.topology:
- topology = d.topology if ('topology' in d.__fields_set__) else cfg.topology
- if not topology:
- raise ValueError('The "topology" strategy only works if the topology parameter is specified')
- if topology not in topo_size:
- raise ValueError(f'Unknown topology selected: { topology }. Make sure the topology has been defined')
+ topo = d.topology if ('topology' in d.__fields_set__) else cfg.topology
+ if not topo:
+ raise ValueError('The "topology" strategy only works if the topology parameter is set to True')
+ if not topo_size:
+ raise ValueError(f'Topology does not have enough free nodes to assign one to the agent')
- grouped[topology].append(d)
+ networked.append(d)
if d.strategy == config.Strategy.total:
if not cfg.n:
@@ -757,41 +763,36 @@ def _agents_from_config(cfg: config.AgentConfig,
total.append(d)
- for (topo, distro) in grouped.items():
- if not topologies or topo not in topo_size:
- raise ValueError(
- 'You need to specify a target number of agents for the distribution \
- or a configuration with a topology, along with a dictionary with \
- all the available topologies')
- n = len(topologies[topo])
- target = topo_size[topo] - assigned[topo]
- new_agents = _from_distro(cfg.distribution, target,
+ if networked:
+ new_agents = _from_distro(networked,
+ n= topo_size - assigned_network,
topology=topo,
default=cfg,
random=random)
- assigned[topo] += len(new_agents)
+ assigned_total += len(new_agents)
+ assigned_network += len(new_agents)
agents += new_agents
if total:
- remaining = n - sum(assigned.values())
- agents += _from_distro(total, remaining,
- topology='', # DO NOT assign to any topology
- default=cfg,
- random=random)
+ remaining = n - assigned_total
+ agents += _from_distro(total, n=remaining,
+ default=cfg,
+ random=random)
- if sum(assigned.values()) != sum(topo_size.values()):
+ if assigned_network < topo_size:
utils.logger.warn(f'The total number of agents does not match the total number of nodes in '
'every topology. This may be due to a definition error: assigned: '
- f'{ assigned } total sizes: { topo_size }')
+ f'{ assigned } total size: { topo_size }')
return agents
-def _from_fixed(lst: List[config.FixedAgentConfig], topology: str, default: config.SingleAgentConfig) -> List[Dict[str, Any]]:
+def _from_fixed(lst: List[config.FixedAgentConfig], topology: bool, default: config.SingleAgentConfig) -> List[Dict[str, Any]]:
agents = []
- counts = {}
+ counts_total = 0
+ counts_network = 0
for fixed in lst:
agent = {}
@@ -803,12 +804,13 @@ def _from_fixed(lst: List[config.FixedAgentConfig], topology: str, default: conf
topo = fixed.topology if ('topology' in fixed.__fields_set__) else topology or default.topology
if topo:
- agent['topology'] = topo
+ agent['topology'] = True
+ counts_network += 1
if not fixed.hidden:
- counts[topo] = counts.get(topo, 0) + 1
+ counts_total += 1
agents.append(agent)
- return agents, counts
+ return agents, counts_total, counts_network
def _from_distro(distro: List[config.AgentDistro],
@@ -854,7 +856,6 @@ def _from_distro(distro: List[config.AgentDistro],
agent['agent_class'] = cls
if default:
agent.update(default.state)
- # agent = cls(unique_id=agent_id, model=env, **state)
topology = d.topology if ('topology' in d.__fields_set__) else topology or default.topology
if topology:
agent['topology'] = topology
diff --git a/soil/config.py b/soil/config.py
index 20934db..7b39154 100644
--- a/soil/config.py
+++ b/soil/config.py
@@ -43,7 +43,7 @@ class NetParams(BaseModel, extra=Extra.allow):
class NetConfig(BaseModel):
params: Optional[NetParams]
- topology: Optional[Union[Topology, nx.Graph]]
+ fixed: Optional[Union[Topology, nx.Graph]]
path: Optional[str]
class Config:
@@ -70,7 +70,7 @@ class EnvConfig(BaseModel):
class SingleAgentConfig(BaseModel):
agent_class: Optional[Union[Type, str]] = None
unique_id: Optional[int] = None
- topology: Optional[str] = None
+ topology: Optional[bool] = False
node_id: Optional[Union[int, str]] = None
state: Optional[Dict[str, Any]] = {}
@@ -81,8 +81,8 @@ class FixedAgentConfig(SingleAgentConfig):
@root_validator
def validate_all(cls, values):
- if values.get('agent_id', None) is not None and values.get('n', 1) > 1:
- raise ValueError(f"An agent_id can only be provided when there is only one agent ({values.get('n')} given)")
+ if values.get('unique_id', None) is not None and values.get('n', 1) > 1:
+ raise ValueError(f"An unique_id can only be provided when there is only one agent ({values.get('n')} given)")
return values
@@ -102,7 +102,6 @@ class AgentDistro(SingleAgentConfig):
class AgentConfig(SingleAgentConfig):
n: Optional[int] = None
- topology: Optional[str]
distribution: Optional[List[AgentDistro]] = None
fixed: Optional[List[FixedAgentConfig]] = None
override: Optional[List[OverrideAgentConfig]] = None
@@ -171,9 +170,9 @@ def convert_old(old, strict=True):
else:
network.setdefault('params', {})[k] = v
- topologies = {}
+ topology = None
if network:
- topologies['default'] = network
+ topology = network
agents = {'fixed': [], 'distribution': []}
@@ -195,7 +194,7 @@ def convert_old(old, strict=True):
agent['state']['name'] = agent['agent_id']
del agent['agent_id']
agent['hidden'] = True
- agent['topology'] = None
+ agent['topology'] = False
fixed.append(updated_agent(agent))
del new['environment_agents']
@@ -209,7 +208,7 @@ def convert_old(old, strict=True):
agents['state'] = old['default_state']
if 'network_agents' in old:
- agents['topology'] = 'default'
+ agents['topology'] = True
agents.setdefault('state', {})['group'] = 'network'
@@ -224,7 +223,7 @@ def convert_old(old, strict=True):
del new['network_agents']
if 'agent_class' in old and (not fixed and not by_weight):
- agents['topology'] = 'default'
+ agents['topology'] = True
by_weight = [{'agent_class': old['agent_class'], 'weight': 1}]
@@ -258,7 +257,7 @@ def convert_old(old, strict=True):
del new['dump']
new['dry_run'] = not old['dump']
- model_params['topologies'] = topologies
+ model_params['topology'] = topology
model_params['agents'] = agents
return Config(version='2',
diff --git a/soil/debugging.py b/soil/debugging.py
index 98c25e1..863c50a 100644
--- a/soil/debugging.py
+++ b/soil/debugging.py
@@ -30,7 +30,9 @@ def wrapcmd(func):
class Debug(pdb.Pdb):
def __init__(self, *args, skip_soil=False, **kwargs):
skip = kwargs.get('skip', [])
+ skip.append('soil')
if skip_soil:
+ skip.append('soil')
skip.append('soil.*')
skip.append('mesa.*')
super(Debug, self).__init__(*args, skip=skip, **kwargs)
@@ -54,8 +56,14 @@ class Debug(pdb.Pdb):
do_sl = do_soil_list
+ def do_continue_state(self, arg):
+ self.do_break_state(arg, temporary=True)
+ return self.do_continue('')
+
+ do_cs = do_continue_state
+
@wrapcmd
- def do_soil_self():
+ def do_soil_agent():
if not agent:
print('No agent available')
return
@@ -70,23 +78,31 @@ class Debug(pdb.Pdb):
print(agent.to_str(pretty=True, keys=keys))
- do_ss = do_soil_self
+ do_aa = do_soil_agent
- def do_break_state(self, arg: str, temporary=False):
+ def do_break_state(self, arg: str, instances=None, temporary=False):
'''
Break before a specified state is stepped into.
'''
klass = None
- state = arg.strip()
+ state = arg
if not state:
self.error("Specify at least a state name")
return
- comma = arg.find(':')
- if comma > 0:
- state = arg[comma+1:].lstrip()
- klass = arg[:comma].rstrip()
+ state, *tokens = state.lstrip().split()
+ if tokens:
+ instances = list(eval(token) for token in tokens)
+
+ colon = state.find(':')
+
+ if colon > 0:
+ klass = state[:colon].rstrip()
+ state = state[colon+1:].strip()
+
+
+ print(klass, state, tokens)
klass = eval(klass,
self.curframe.f_globals,
self.curframe_locals)
@@ -95,14 +111,16 @@ class Debug(pdb.Pdb):
klasses = [klass]
else:
klasses = [k for k in self.curframe.f_globals.values() if isinstance(k, type) and issubclass(k, FSM)]
- print(klasses)
- if not klasses:
- self.error('No agent classes found')
+
+ if not klasses:
+ self.error('No agent classes found')
+
for klass in klasses:
try:
func = getattr(klass, state)
except AttributeError:
+ self.error(f'State {state} not found in class {klass}')
continue
if hasattr(func, '__func__'):
func = func.__func__
@@ -120,6 +138,9 @@ class Debug(pdb.Pdb):
raise ValueError('no line found')
# now set the break point
cond = None
+ if instances:
+ cond = f'self.unique_id in { repr(instances) }'
+
existing = self.get_breaks(filename, line)
if existing:
self.message("Breakpoint already exists at %s:%d" %
@@ -132,20 +153,39 @@ class Debug(pdb.Pdb):
bp = self.get_breaks(filename, line)[-1]
self.message("Breakpoint %d at %s:%d" %
(bp.number, bp.file, bp.line))
+
do_bs = do_break_state
+ def do_break_state_self(self, arg: str, temporary=False):
+ '''
+ Break before a specified state is stepped into, for the current agent
+ '''
+ agent = self.curframe.f_locals.get('self')
+ if not agent:
+ self.error('No current agent.')
+ self.error('Try this again when the debugger is stopped inside an agent')
+ return
-def setup(frame=None):
- debugger = Debug()
+ arg = f'{agent.__class__.__name__}:{ arg } {agent.unique_id}'
+ return self.do_break_state(arg)
+
+ do_bss = do_break_state_self
+
+
+debugger = None
+
+def set_trace(frame=None, **kwargs):
+ global debugger
+ if debugger is None:
+ debugger = Debug(**kwargs)
frame = frame or sys._getframe().f_back
debugger.set_trace(frame)
-def debug_env():
- if os.environ.get('SOIL_DEBUG'):
- return setup(frame=sys._getframe().f_back)
def post_mortem(traceback=None):
- p = Debug()
+ global debugger
+ if debugger is None:
+ debugger = Debug(**kwargs)
t = sys.exc_info()[2]
- p.reset()
- p.interaction(None, t)
+ debugger.reset()
+ debugger.interaction(None, t)
diff --git a/soil/environment.py b/soil/environment.py
index 303a00f..8588eaf 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -5,6 +5,7 @@ import sqlite3
import math
import random
import logging
+import inspect
from typing import Any, Dict, Optional, Union
from collections import namedtuple
@@ -21,9 +22,6 @@ from mesa.datacollection import DataCollector
from . import agents as agentmod, config, serialization, utils, time, network
-Record = namedtuple('Record', 'dict_id t_step key value')
-
-
class BaseEnvironment(Model):
"""
The environment is key in a simulation. It controls how agents interact,
@@ -51,6 +49,8 @@ class BaseEnvironment(Model):
**env_params):
super().__init__(seed=seed)
+ self.env_params = env_params or {}
+
self.current_id = -1
self.id = id
@@ -63,11 +63,8 @@ class BaseEnvironment(Model):
self.agent_class = agent_class or agentmod.BaseAgent
- self.init_agents(agents)
-
- self.env_params = env_params or {}
-
self.interval = interval
+ self.init_agents(agents)
self.logger = utils.logger.getChild(self.id)
@@ -77,7 +74,10 @@ class BaseEnvironment(Model):
tables=tables,
)
- def _read_single_agent(self, agent):
+ def _agent_from_dict(self, agent):
+ '''
+ Translate an agent dictionary into an agent
+ '''
agent = dict(**agent)
cls = agent.pop('agent_class', None) or self.agent_class
unique_id = agent.pop('unique_id', None)
@@ -88,6 +88,14 @@ class BaseEnvironment(Model):
model=self, **agent)
def init_agents(self, agents: Union[config.AgentConfig, [Dict[str, Any]]] = {}):
+ '''
+ Initialize the agents in the model from either a `soil.config.AgentConfig` or a list of
+ dictionaries that each describes an agent.
+
+ If given a list of dictionaries, an agent will be created for each dictionary. The agent
+ class can be specified through the `agent_class` key. The rest of the items will be used
+ as parameters to the agent.
+ '''
if not agents:
return
@@ -98,13 +106,11 @@ class BaseEnvironment(Model):
lst = config.AgentConfig(**agents)
if lst.override:
override = lst.override
- lst = agentmod.from_config(lst,
- topologies=getattr(self, 'topologies', None),
- random=self.random)
+ lst = self._agent_dict_from_config(lst)
#TODO: check override is working again. It cannot (easily) be part of agents.from_config anymore,
# because it needs attribute such as unique_id, which are only present after init
- new_agents = [self._read_single_agent(agent) for agent in lst]
+ new_agents = [self._agent_from_dict(agent) for agent in lst]
for a in new_agents:
@@ -115,6 +121,9 @@ class BaseEnvironment(Model):
for attr, value in rule.state.items():
setattr(agent, attr, value)
+ def _agent_dict_from_config(self, cfg):
+ return agentmod.from_config(cfg,
+ random=self.random)
@property
def agents(self):
@@ -133,12 +142,15 @@ class BaseEnvironment(Model):
raise Exception('The environment has not been scheduled, so it has no sense of time')
- def add_agent(self, agent_id, agent_class, **kwargs):
+ def add_agent(self, agent_class, unique_id=None, **kwargs):
a = None
- if agent_class:
- a = agent_class(model=self,
- unique_id=agent_id,
- **kwargs)
+ if unique_id is None:
+ unique_id = self.next_id()
+
+
+ a = agent_class(model=self,
+ unique_id=unique_id,
+ **args)
self.schedule.add(a)
return a
@@ -180,123 +192,109 @@ class BaseEnvironment(Model):
def __setitem__(self, key, value):
return self.env_params.__setitem__(key, value)
- def _agent_to_tuples(self, agent, now=None):
- if now is None:
- now = self.now
- for k, v in agent.state.items():
- yield Record(dict_id=agent.id,
- t_step=now,
- key=k,
- value=v)
-
- def state_to_tuples(self, agent_id=None, now=None):
- if now is None:
- now = self.now
-
- if agent_id:
- agent = self.agents[agent_id]
- yield from self._agent_to_tuples(agent, now)
- return
-
- for k, v in self.env_params.items():
- yield Record(dict_id='env',
- t_step=now,
- key=k,
- value=v)
- for agent in self.agents:
- yield from self._agent_to_tuples(agent, now)
+ def __str__(self):
+ return str(self.env_params)
class NetworkEnvironment(BaseEnvironment):
+ '''
+ The NetworkEnvironment is an environment that includes one or more networkx.Graph intances
+ and methods to associate agents to nodes and vice versa.
+ '''
- def __init__(self, *args, topology: nx.Graph = None, topologies: Dict[str, config.NetConfig] = {}, **kwargs):
+ def __init__(self, *args, topology: Union[config.NetConfig, nx.Graph] = None, **kwargs):
agents = kwargs.pop('agents', None)
super().__init__(*args, agents=None, **kwargs)
- self._node_ids = {}
- assert not hasattr(self, 'topologies')
- if topology is not None:
- if topologies:
- raise ValueError('Please, provide either a single topology or a dictionary of them')
- topologies = {'default': topology}
- self.topologies = {}
- for (name, cfg) in topologies.items():
- self.set_topology(cfg=cfg, graph=name)
+ self._set_topology(topology)
self.init_agents(agents)
+ def init_agents(self, *args, **kwargs):
+ '''Initialize the agents from a '''
+ super().init_agents(*args, **kwargs)
+ for agent in self.schedule._agents.values():
+ if hasattr(agent, 'node_id'):
+ self._init_node(agent)
- def _read_single_agent(self, agent, unique_id=None):
+ def _init_node(self, agent):
+ '''
+ Make sure the node for a given agent has the proper attributes.
+ '''
+ self.G.nodes[agent.node_id]['agent'] = agent
+
+ def _agent_dict_from_config(self, cfg):
+ return agentmod.from_config(cfg,
+ topology=self.G,
+ random=self.random)
+
+ def _agent_from_dict(self, agent, unique_id=None):
agent = dict(agent)
- if agent.get('topology', None) is not None:
- topology = agent.get('topology')
- if unique_id is None:
- unique_id = self.next_id()
- if topology:
- node_id = self.agent_to_node(unique_id, graph_name=topology, node_id=agent.get('node_id'))
- agent['node_id'] = node_id
- agent['topology'] = topology
- agent['unique_id'] = unique_id
+ if not agent.get('topology', False):
+ return super()._agent_from_dict(agent)
- return super()._read_single_agent(agent)
-
+ if unique_id is None:
+ unique_id = self.next_id()
+ node_id = agent.get('node_id', None)
+ if node_id is None:
+ node_id = network.find_unassigned(self.G, random=self.random)
+ agent['node_id'] = node_id
+ agent['unique_id'] = unique_id
+ agent['topology'] = self.G
+ node_attrs = self.G.nodes[node_id]
+ node_attrs.update(agent)
+ agent = node_attrs
- @property
- def topology(self):
- return self.topologies['default']
+ a = super()._agent_from_dict(agent)
+ self._init_node(a)
- def set_topology(self, cfg=None, dir_path=None, graph='default'):
- topology = cfg
- if not isinstance(cfg, nx.Graph):
- topology = network.from_config(cfg, dir_path=dir_path or self.dir_path)
+ return a
- self.topologies[graph] = topology
+ def _set_topology(self, cfg=None, dir_path=None):
+ if cfg is None:
+ cfg = nx.Graph()
+ elif not isinstance(cfg, nx.Graph):
+ cfg = network.from_config(cfg, dir_path=dir_path or self.dir_path)
- def topology_for(self, unique_id):
- return self.topologies[self._node_ids[unique_id][0]]
+ self.G = cfg
@property
def network_agents(self):
- yield from self.agents(agent_class=agentmod.NetworkAgent)
+ for a in self.schedule._agents:
+ if isinstance(a, agentmod.NetworkAgent):
+ yield a
- def agent_to_node(self, unique_id, graph_name='default',
- node_id=None, shuffle=False):
- node_id = network.agent_to_node(G=self.topologies[graph_name],
- agent_id=unique_id,
- node_id=node_id,
- shuffle=shuffle,
- random=self.random)
+ def add_node(self, agent_class, unique_id=None, node_id=None, **kwargs):
+ if unique_id is None:
+ unique_id = self.next_id()
+ if node_id is None:
+ node_id = network.find_unassigned(G=self.G,
+ shuffle=True,
+ random=self.random)
+
+ if node_id in G.nodes:
+ self.G.nodes[node_id]['agent'] = None # Reserve
+ else:
+ self.G.add_node(node_id)
- self._node_ids[unique_id] = (graph_name, node_id)
- return node_id
-
- def add_node(self, agent_class, topology, **kwargs):
- unique_id = self.next_id()
- self.topologies[topology].add_node(unique_id)
- node_id = self.agent_to_node(unique_id=unique_id, node_id=unique_id, graph_name=topology)
-
- a = self.add_agent(unique_id=unique_id, agent_class=agent_class, node_id=node_id, topology=topology, **kwargs)
+ a = self.add_agent(unique_id=unique_id, agent_class=agent_class, node_id=node_id, **kwargs)
a['visible'] = True
return a
- def add_edge(self, agent1, agent2, start=None, graph='default', **attrs):
- agent1 = agent1.node_id
- agent2 = agent2.node_id
- return self.topologies[graph].add_edge(agent1, agent2, start=start)
+ def agent_for_node_id(self, node_id):
+ return self.G.nodes[node_id].get('agent')
- def add_agent(self, unique_id, state=None, graph='default', **kwargs):
- node = self.topologies[graph].nodes[unique_id]
- node_state = node.get('state', {})
- if node_state:
- node_state.update(state or {})
- state = node_state
- a = super().add_agent(unique_id, state=state, **kwargs)
- node['agent'] = a
- return a
-
- def node_id_for(self, agent_id):
- return self._node_ids[agent_id][1]
+ def populate_network(self, agent_class, weights=None, **agent_params):
+ if not hasattr(agent_class, 'len'):
+ agent_class = [agent_class]
+ weights = None
+ for (node_id, node) in self.G.nodes(data=True):
+ if 'agent' in node:
+ continue
+ a_class = self.random.choices(agent_class, weights)[0]
+ self.add_agent(node_id=node_id,
+ agent_class=a_class, **agent_params)
Environment = NetworkEnvironment
diff --git a/soil/exporters.py b/soil/exporters.py
index 055afd4..648ba77 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -1,4 +1,5 @@
import os
+import sys
from time import time as current_time
from io import BytesIO
from sqlalchemy import create_engine
@@ -52,6 +53,8 @@ class Exporter:
simulation.group or '',
simulation.name)
self.dry_run = dry_run
+ if copy_to is None and dry_run:
+ copy_to = sys.stdout
self.copy_to = copy_to
def sim_start(self):
@@ -94,14 +97,19 @@ class default(Exporter):
logger.info('NOT dumping results')
def trial_end(self, env):
- if not self.dry_run:
- with timer('Dumping simulation {} trial {}'.format(self.simulation.name,
- env.id)):
- engine = create_engine('sqlite:///{}.sqlite'.format(env.id), echo=False)
+ if self.dry_run:
+ logger.info('Running in DRY_RUN mode, the database will NOT be created')
+ return
- dc = env.datacollector
- for (t, df) in get_dc_dfs(dc):
- df.to_sql(t, con=engine, if_exists='append')
+ with timer('Dumping simulation {} trial {}'.format(self.simulation.name,
+ env.id)):
+
+ fpath = os.path.join(self.outdir, f'{env.id}.sqlite')
+ engine = create_engine(f'sqlite:///{fpath}', echo=False)
+
+ dc = env.datacollector
+ for (t, df) in get_dc_dfs(dc):
+ df.to_sql(t, con=engine, if_exists='append')
def get_dc_dfs(dc):
diff --git a/soil/network.py b/soil/network.py
index 0836f35..bc69716 100644
--- a/soil/network.py
+++ b/soil/network.py
@@ -39,33 +39,30 @@ def from_config(cfg: config.NetConfig, dir_path: str = None):
known_modules=['networkx.generators',])
return method(**net_args)
- if isinstance(cfg.topology, config.Topology):
- cfg = cfg.topology.dict()
+ if isinstance(cfg.fixed, config.Topology):
+ cfg = cfg.fixed.dict()
+
if isinstance(cfg, str) or isinstance(cfg, dict):
return nx.json_graph.node_link_graph(cfg)
return nx.Graph()
-def agent_to_node(G, agent_id, node_id=None, shuffle=False, random=random):
+def find_unassigned(G, shuffle=False, random=random):
'''
Link an agent to a node in a topology.
If node_id is None, a node without an agent_id will be found.
'''
#TODO: test
- if node_id is None:
- candidates = list(G.nodes(data=True))
- if shuffle:
- random.shuffle(candidates)
- for next_id, data in candidates:
- if data.get('agent_id', None) is None:
- node_id = next_id
- break
+ candidates = list(G.nodes(data=True))
+ if shuffle:
+ random.shuffle(candidates)
+ for next_id, data in candidates:
+ if 'agent' not in data:
+ node_id = next_id
+ break
- if node_id is None:
- raise ValueError(f"Not enough nodes in topology to assign one to agent {agent_id}")
- G.nodes[node_id]['agent_id'] = agent_id
return node_id
diff --git a/soil/serialization.py b/soil/serialization.py
index 9c2af63..972ca69 100644
--- a/soil/serialization.py
+++ b/soil/serialization.py
@@ -17,42 +17,6 @@ from jinja2 import Template
logger = logging.getLogger('soil')
-
-# def load_network(network_params, dir_path=None):
-# G = nx.Graph()
-
-# if not network_params:
-# return G
-
-# if 'path' in network_params:
-# path = network_params['path']
-# if dir_path and not os.path.isabs(path):
-# path = os.path.join(dir_path, path)
-# extension = os.path.splitext(path)[1][1:]
-# kwargs = {}
-# if extension == 'gexf':
-# kwargs['version'] = '1.2draft'
-# kwargs['node_type'] = int
-# try:
-# method = getattr(nx.readwrite, 'read_' + extension)
-# except AttributeError:
-# raise AttributeError('Unknown format')
-# G = method(path, **kwargs)
-
-# elif 'generator' in network_params:
-# net_args = network_params.copy()
-# net_gen = net_args.pop('generator')
-
-# if dir_path not in sys.path:
-# sys.path.append(dir_path)
-
-# method = deserializer(net_gen,
-# known_modules=['networkx.generators',])
-# G = method(**net_args)
-
-# return G
-
-
def load_file(infile):
folder = os.path.dirname(infile)
if folder not in sys.path:
@@ -121,7 +85,7 @@ def params_for_template(config):
def load_files(*patterns, **kwargs):
for pattern in patterns:
- for i in glob(pattern, **kwargs):
+ for i in glob(pattern, **kwargs, recursive=True):
for cfg in load_file(i):
path = os.path.abspath(i)
yield Config.from_raw(cfg), path
@@ -229,14 +193,17 @@ def deserializer(type_, known_modules=KNOWN_MODULES):
return getattr(cls, 'deserialize', cls)
except (ImportError, AttributeError) as ex:
errors.append((modname, tname, ex))
- raise Exception('Could not find type {}. Tried: {}'.format(type_, errors))
+ raise Exception('Could not find type "{}". Tried: {}'.format(type_, errors))
-def deserialize(type_, value=None, **kwargs):
+def deserialize(type_, value=None, globs=None, **kwargs):
'''Get an object from a text representation'''
if not isinstance(type_, str):
return type_
- des = deserializer(type_, **kwargs)
+ if globs and type_ in globs:
+ des = globs[type_]
+ else:
+ des = deserializer(type_, **kwargs)
if value is None:
return des
return des(value)
@@ -244,6 +211,8 @@ def deserialize(type_, value=None, **kwargs):
def deserialize_all(names, *args, known_modules=KNOWN_MODULES, **kwargs):
'''Return the list of deserialized objects'''
+ #TODO: remove
+ print('SERIALIZATION', kwargs)
objects = []
for name in names:
mod = deserialize(name, known_modules=known_modules)
diff --git a/soil/simulation.py b/soil/simulation.py
index 1ed5dbc..baee50f 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -11,17 +11,16 @@ import networkx as nx
from textwrap import dedent
from dataclasses import dataclass, field, asdict
-from typing import Any, Dict, Union, Optional
+from typing import Any, Dict, Union, Optional, List
from networkx.readwrite import json_graph
from functools import partial
import pickle
-from . import serialization, utils, basestring, agents
+from . import serialization, exporters, utils, basestring, agents
from .environment import Environment
from .utils import logger, run_and_return_exceptions
-from .exporters import default
from .time import INFINITY
from .config import Config, convert_old
@@ -35,7 +34,7 @@ class Simulation:
config (optional): :class:`config.Config`
name of the Simulation
- kwargs: parameters to use to initialize a new configuration, if one has not been provided.
+ kwargs: parameters to use to initialize a new configuration, if one not been provided.
"""
version: str = '2'
name: str = 'Unnamed simulation'
@@ -49,22 +48,27 @@ class Simulation:
max_steps: int = -1
interval: int = 1
num_trials: int = 3
+ parallel: Optional[bool] = None
+ exporters: Optional[List[str]] = field(default_factory=list)
+ outdir: Optional[str] = None
+ exporter_params: Optional[Dict[str, Any]] = field(default_factory=dict)
dry_run: bool = False
extra: Dict[str, Any] = field(default_factory=dict)
@classmethod
- def from_dict(cls, env):
+ def from_dict(cls, env, **kwargs):
ignored = {k: v for k, v in env.items()
if k not in inspect.signature(cls).parameters}
- kwargs = {k:v for k, v in env.items() if k not in ignored}
+ d = {k:v for k, v in env.items() if k not in ignored}
if ignored:
- kwargs.setdefault('extra', {}).update(ignored)
+ d.setdefault('extra', {}).update(ignored)
if ignored:
print(f'Warning: Ignoring these parameters (added to "extra"): { ignored }')
+ d.update(kwargs)
- return cls(**kwargs)
+ return cls(**d)
def run_simulation(self, *args, **kwargs):
return self.run(*args, **kwargs)
@@ -78,15 +82,23 @@ class Simulation:
self.to_yaml())
return list(self.run_gen(*args, **kwargs))
- def run_gen(self, parallel=False, dry_run=False,
- exporters=[default, ], outdir=None, exporter_params={},
+ def run_gen(self, parallel=False, dry_run=None,
+ exporters=None, outdir=None, exporter_params={},
log_level=None,
**kwargs):
'''Run the simulation and yield the resulting environments.'''
if log_level:
logger.setLevel(log_level)
+ outdir = outdir or self.outdir
logger.info('Using exporters: %s', exporters or [])
logger.info('Output directory: %s', outdir)
+ if dry_run is None:
+ dry_run = self.dry_run
+ if exporters is None:
+ exporters = self.exporters
+ if not exporter_params:
+ exporter_params = self.exporter_params
+
exporters = serialization.deserialize_all(exporters,
simulation=self,
known_modules=['soil.exporters', ],
@@ -115,18 +127,21 @@ class Simulation:
for exporter in exporters:
exporter.sim_end()
- def get_env(self, trial_id=0, **kwargs):
+ def get_env(self, trial_id=0, model_params=None, **kwargs):
'''Create an environment for a trial of the simulation'''
def deserialize_reporters(reporters):
for (k, v) in reporters.items():
if isinstance(v, str) and v.startswith('py:'):
reporters[k] = serialization.deserialize(value.lsplit(':', 1)[1])
+ return reporters
- model_params = self.model_params.copy()
- model_params.update(kwargs)
+ params = self.model_params.copy()
+ if model_params:
+ params.update(model_params)
+ params.update(kwargs)
- agent_reporters = deserialize_reporters(model_params.pop('agent_reporters', {}))
- model_reporters = deserialize_reporters(model_params.pop('model_reporters', {}))
+ agent_reporters = deserialize_reporters(params.pop('agent_reporters', {}))
+ model_reporters = deserialize_reporters(params.pop('model_reporters', {}))
env = serialization.deserialize(self.model_class)
return env(id=f'{self.name}_trial_{trial_id}',
@@ -134,7 +149,7 @@ class Simulation:
dir_path=self.dir_path,
agent_reporters=agent_reporters,
model_reporters=model_reporters,
- **model_params)
+ **params)
def run_trial(self, trial_id=None, until=None, log_file=False, log_level=logging.INFO, **opts):
"""
@@ -172,13 +187,10 @@ class Simulation:
logger.info(dedent(f'''
Model stats:
Agents (total: { model.schedule.get_agent_count() }):
- - { (newline + ' - ').join(str(a) for a in model.schedule.agents) }'''
-f'''
+ - { (newline + ' - ').join(str(a) for a in model.schedule.agents) }
- Topologies (size):
- - { dict( (k, len(v)) for (k, v) in model.topologies.items()) }
-''' if getattr(model, "topologies", None) else ''
-))
+ Topology size: { len(model.G) if hasattr(model, "G") else 0 }
+ '''))
while not is_done():
utils.logger.debug(f'Simulation time {model.schedule.time}/{until}. Next: {getattr(model.schedule, "next_time", model.schedule.time + self.interval)}')
@@ -198,14 +210,14 @@ f'''
return yaml.dump(self.to_dict())
-def iter_from_config(*cfgs):
+def iter_from_config(*cfgs, **kwargs):
for config in cfgs:
configs = list(serialization.load_config(config))
for config, path in configs:
d = dict(config)
if 'dir_path' not in d:
d['dir_path'] = os.path.dirname(path)
- yield Simulation.from_dict(d)
+ yield Simulation.from_dict(d, **kwargs)
def from_config(conf_or_path):
diff --git a/soil/time.py b/soil/time.py
index b95c51e..602aa8c 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -76,7 +76,7 @@ class TimedActivation(BaseScheduler):
agent = self._agents[agent_id]
returned = agent.step()
- if not agent.alive:
+ if not getattr(agent, 'alive', True):
self.remove(agent)
continue
diff --git a/soil/utils.py b/soil/utils.py
index faa34d1..6c25dbc 100644
--- a/soil/utils.py
+++ b/soil/utils.py
@@ -20,10 +20,11 @@ else:
logformat = "[%(levelname)-5.5s][%(asctime)s] %(message)s"
logFormatter = logging.Formatter(logformat, timeformat)
-
consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
-logger.addHandler(consoleHandler)
+
+logging.basicConfig(level=logging.INFO,
+ handlers=[consoleHandler,])
@contextmanager
diff --git a/tests/complete_converted.yml b/tests/complete_converted.yml
index d1c3358..63f31a5 100644
--- a/tests/complete_converted.yml
+++ b/tests/complete_converted.yml
@@ -9,17 +9,16 @@ interval: 1
seed: "CompleteSeed!"
model_class: Environment
model_params:
- topologies:
- default:
- params:
- generator: complete_graph
- n: 4
+ topology:
+ params:
+ generator: complete_graph
+ n: 4
agents:
agent_class: CounterModel
state:
group: network
times: 1
- topology: 'default'
+ topology: true
distribution:
- agent_class: CounterModel
weight: 0.25
@@ -42,7 +41,7 @@ model_params:
fixed:
- agent_class: BaseAgent
hidden: true
- topology: null
+ topology: false
state:
name: 'Environment Agent 1'
times: 10
diff --git a/tests/test_agents.py b/tests/test_agents.py
index cb33f1f..bee9a9a 100644
--- a/tests/test_agents.py
+++ b/tests/test_agents.py
@@ -4,12 +4,14 @@ import pytest
from soil import agents, environment
from soil import time as stime
+
class Dead(agents.FSM):
@agents.default_state
@agents.state
def only(self):
return self.die()
+
class TestMain(TestCase):
def test_die_raises_exception(self):
d = Dead(unique_id=0, model=environment.Environment())
@@ -20,5 +22,5 @@ class TestMain(TestCase):
def test_die_returns_infinity(self):
d = Dead(unique_id=0, model=environment.Environment())
ret = d.step().abs(0)
- print(ret, 'next')
+ print(ret, "next")
assert ret == stime.INFINITY
diff --git a/tests/test_config.py b/tests/test_config.py
index 3597844..8d1d471 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -7,9 +7,9 @@ from os.path import join
from soil import simulation, serialization, config, network, agents, utils
ROOT = os.path.abspath(os.path.dirname(__file__))
-EXAMPLES = join(ROOT, '..', 'examples')
+EXAMPLES = join(ROOT, "..", "examples")
-FORCE_TESTS = os.environ.get('FORCE_TESTS', '')
+FORCE_TESTS = os.environ.get("FORCE_TESTS", "")
def isequal(a, b):
@@ -24,7 +24,6 @@ def isequal(a, b):
class TestConfig(TestCase):
-
def test_conversion(self):
expected = serialization.load_file(join(ROOT, "complete_converted.yml"))[0]
old = serialization.load_file(join(ROOT, "old_complete.yml"))[0]
@@ -38,7 +37,7 @@ class TestConfig(TestCase):
The configuration should not change after running
the simulation.
"""
- config = serialization.load_file(join(EXAMPLES, 'complete.yml'))[0]
+ config = serialization.load_file(join(EXAMPLES, "complete.yml"))[0]
s = simulation.from_config(config)
init_config = copy.copy(s.to_dict())
@@ -47,11 +46,8 @@ class TestConfig(TestCase):
# del nconfig['to
isequal(init_config, nconfig)
-
def test_topology_config(self):
- netconfig = config.NetConfig(**{
- 'path': join(ROOT, 'test.gexf')
- })
+ netconfig = config.NetConfig(**{"path": join(ROOT, "test.gexf")})
net = network.from_config(netconfig, dir_path=ROOT)
assert len(net.nodes) == 2
assert len(net.edges) == 1
@@ -62,36 +58,33 @@ class TestConfig(TestCase):
network agents are initialized properly.
"""
cfg = {
- 'name': 'CounterAgent',
- 'network_params': {
- 'path': join(ROOT, 'test.gexf')
- },
- 'agent_class': 'CounterModel',
+ "name": "CounterAgent",
+ "network_params": {"path": join(ROOT, "test.gexf")},
+ "agent_class": "CounterModel",
# 'states': [{'times': 10}, {'times': 20}],
- 'max_time': 2,
- 'dry_run': True,
- 'num_trials': 1,
- 'environment_params': {
- }
+ "max_time": 2,
+ "dry_run": True,
+ "num_trials": 1,
+ "environment_params": {},
}
conf = config.convert_old(cfg)
s = simulation.from_config(conf)
env = s.get_env()
- assert len(env.topologies['default'].nodes) == 2
- assert len(env.topologies['default'].edges) == 1
+ assert len(env.G.nodes) == 2
+ assert len(env.G.edges) == 1
assert len(env.agents) == 2
- assert env.agents[0].G == env.topologies['default']
+ assert env.agents[0].G == env.G
def test_agents_from_config(self):
- '''We test that the known complete configuration produces
- the right agents in the right groups'''
+ """We test that the known complete configuration produces
+ the right agents in the right groups"""
cfg = serialization.load_file(join(ROOT, "complete_converted.yml"))[0]
s = simulation.from_config(cfg)
env = s.get_env()
- assert len(env.topologies['default'].nodes) == 4
- assert len(env.agents(group='network')) == 4
- assert len(env.agents(group='environment')) == 1
+ assert len(env.G.nodes) == 4
+ assert len(env.agents(group="network")) == 4
+ assert len(env.agents(group="environment")) == 1
def test_yaml(self):
"""
@@ -100,16 +93,17 @@ class TestConfig(TestCase):
Values not present in the original config file should have reasonable
defaults.
"""
- with utils.timer('loading'):
- config = serialization.load_file(join(EXAMPLES, 'complete.yml'))[0]
+ with utils.timer("loading"):
+ config = serialization.load_file(join(EXAMPLES, "complete.yml"))[0]
s = simulation.from_config(config)
- with utils.timer('serializing'):
+ with utils.timer("serializing"):
serial = s.to_yaml()
- with utils.timer('recovering'):
+ with utils.timer("recovering"):
recovered = yaml.load(serial, Loader=yaml.SafeLoader)
for (k, v) in config.items():
assert recovered[k] == v
+
def make_example_test(path, cfg):
def wrapped(self):
root = os.getcwd()
@@ -133,18 +127,19 @@ def make_example_test(path, cfg):
# assert env.now <= config['max_time'] # But not further than allowed
# except KeyError:
# pass
+
return wrapped
def add_example_tests():
for config, path in serialization.load_files(
- join(EXAMPLES, '*', '*.yml'),
- join(EXAMPLES, '*.yml'),
+ join(EXAMPLES, "*", "*.yml"),
+ join(EXAMPLES, "*.yml"),
):
p = make_example_test(path=path, cfg=config)
fname = os.path.basename(path)
- p.__name__ = 'test_example_file_%s' % fname
- p.__doc__ = '%s should be a valid configuration' % fname
+ p.__name__ = "test_example_file_%s" % fname
+ p.__doc__ = "%s should be a valid configuration" % fname
setattr(TestConfig, p.__name__, p)
del p
diff --git a/tests/test_examples.py b/tests/test_examples.py
index af77c33..a0a2bd5 100644
--- a/tests/test_examples.py
+++ b/tests/test_examples.py
@@ -5,9 +5,9 @@ from os.path import join
from soil import serialization, simulation, config
ROOT = os.path.abspath(os.path.dirname(__file__))
-EXAMPLES = join(ROOT, '..', 'examples')
+EXAMPLES = join(ROOT, "..", "examples")
-FORCE_TESTS = os.environ.get('FORCE_TESTS', '')
+FORCE_TESTS = os.environ.get("FORCE_TESTS", "")
class TestExamples(TestCase):
@@ -23,31 +23,31 @@ def make_example_test(path, cfg):
s.max_steps = 100
s.num_trials = 1
assert isinstance(cfg, config.Config)
- if getattr(cfg, 'skip_test', False) and not FORCE_TESTS:
- self.skipTest('Example ignored.')
+ if getattr(cfg, "skip_test", False) and not FORCE_TESTS:
+ self.skipTest("Example ignored.")
envs = s.run_simulation(dry_run=True)
assert envs
for env in envs:
assert env
try:
- n = cfg.model_params['network_params']['n']
+ n = cfg.model_params["network_params"]["n"]
assert len(list(env.network_agents)) == n
except KeyError:
pass
assert env.schedule.steps > 0 # It has run
assert env.schedule.steps <= s.max_steps # But not further than allowed
+
return wrapped
def add_example_tests():
for cfg, path in serialization.load_files(
- join(EXAMPLES, '*', '*.yml'),
- join(EXAMPLES, '*.yml'),
+ join(EXAMPLES, "**", "*.yml"),
):
p = make_example_test(path=path, cfg=config.Config.from_raw(cfg))
fname = os.path.basename(path)
- p.__name__ = 'test_example_file_%s' % fname
- p.__doc__ = '%s should be a valid configuration' % fname
+ p.__name__ = "test_example_file_%s" % fname
+ p.__doc__ = "%s should be a valid configuration" % fname
setattr(TestExamples, p.__name__, p)
del p
diff --git a/tests/test_exporters.py b/tests/test_exporters.py
index cbd88bd..973bd06 100644
--- a/tests/test_exporters.py
+++ b/tests/test_exporters.py
@@ -2,6 +2,7 @@ import os
import io
import tempfile
import shutil
+import sqlite3
from unittest import TestCase
from soil import exporters
@@ -40,14 +41,10 @@ class Exporters(TestCase):
num_trials = 5
max_time = 2
config = {
- 'name': 'exporter_sim',
- 'model_params': {
- 'agents': [{
- 'agent_class': agents.BaseAgent
- }]
- },
- 'max_time': max_time,
- 'num_trials': num_trials,
+ "name": "exporter_sim",
+ "model_params": {"agents": [{"agent_class": agents.BaseAgent}]},
+ "max_time": max_time,
+ "num_trials": num_trials,
}
s = simulation.from_config(config)
@@ -64,40 +61,52 @@ class Exporters(TestCase):
assert Dummy.total_time == max_time * num_trials
def test_writing(self):
- '''Try to write CSV, sqlite and YAML (without dry_run)'''
+ """Try to write CSV, sqlite and YAML (without dry_run)"""
n_trials = 5
config = {
- 'name': 'exporter_sim',
- 'network_params': {
- 'generator': 'complete_graph',
- 'n': 4
- },
- 'agent_class': 'CounterModel',
- 'max_time': 2,
- 'num_trials': n_trials,
- 'dry_run': False,
- 'environment_params': {}
+ "name": "exporter_sim",
+ "network_params": {"generator": "complete_graph", "n": 4},
+ "agent_class": "CounterModel",
+ "max_time": 2,
+ "num_trials": n_trials,
+ "dry_run": False,
+ "environment_params": {},
}
output = io.StringIO()
s = simulation.from_config(config)
tmpdir = tempfile.mkdtemp()
- envs = s.run_simulation(exporters=[
- exporters.default,
- exporters.csv,
- ],
- dry_run=False,
- outdir=tmpdir,
- exporter_params={'copy_to': output})
+ envs = s.run_simulation(
+ exporters=[
+ exporters.default,
+ exporters.csv,
+ ],
+ model_params={
+ "agent_reporters": {"times": "times"},
+ "model_reporters": {
+ "constant": lambda x: 1,
+ },
+ },
+ dry_run=False,
+ outdir=tmpdir,
+ exporter_params={"copy_to": output},
+ )
result = output.getvalue()
- simdir = os.path.join(tmpdir, s.group or '', s.name)
- with open(os.path.join(simdir, '{}.dumped.yml'.format(s.name))) as f:
+ simdir = os.path.join(tmpdir, s.group or "", s.name)
+ with open(os.path.join(simdir, "{}.dumped.yml".format(s.name))) as f:
result = f.read()
assert result
try:
for e in envs:
- with open(os.path.join(simdir, '{}.env.csv'.format(e.id))) as f:
+ db = sqlite3.connect(os.path.join(simdir, f"{e.id}.sqlite"))
+ cur = db.cursor()
+ agent_entries = cur.execute("SELECT * from agents").fetchall()
+ env_entries = cur.execute("SELECT * from env").fetchall()
+ assert len(agent_entries) > 0
+ assert len(env_entries) > 0
+
+ with open(os.path.join(simdir, "{}.env.csv".format(e.id))) as f:
result = f.read()
assert result
finally:
diff --git a/tests/test_main.py b/tests/test_main.py
index 6ac26e4..f2004ad 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -6,60 +6,55 @@ import networkx as nx
from functools import partial
from os.path import join
-from soil import (simulation, Environment, agents, network, serialization,
- utils, config)
+from soil import simulation, Environment, agents, network, serialization, utils, config
from soil.time import Delta
ROOT = os.path.abspath(os.path.dirname(__file__))
-EXAMPLES = join(ROOT, '..', 'examples')
+EXAMPLES = join(ROOT, "..", "examples")
class CustomAgent(agents.FSM, agents.NetworkAgent):
@agents.default_state
@agents.state
def normal(self):
- self.neighbors = self.count_agents(state_id='normal',
- limit_neighbors=True)
+ self.neighbors = self.count_agents(state_id="normal", limit_neighbors=True)
+
@agents.state
def unreachable(self):
return
class TestMain(TestCase):
-
def test_empty_simulation(self):
"""A simulation with a base behaviour should do nothing"""
config = {
- 'model_params': {
- 'network_params': {
- 'path': join(ROOT, 'test.gexf')
- },
- 'agent_class': 'BaseAgent',
+ "model_params": {
+ "network_params": {"path": join(ROOT, "test.gexf")},
+ "agent_class": "BaseAgent",
}
}
s = simulation.from_config(config)
s.run_simulation(dry_run=True)
-
def test_network_agent(self):
"""
The initial states should be applied to the agent and the
agent should be able to update its state."""
config = {
- 'name': 'CounterAgent',
- 'num_trials': 1,
- 'max_time': 2,
- 'model_params': {
- 'network_params': {
- 'generator': nx.complete_graph,
- 'n': 2,
+ "name": "CounterAgent",
+ "num_trials": 1,
+ "max_time": 2,
+ "model_params": {
+ "network_params": {
+ "generator": nx.complete_graph,
+ "n": 2,
},
- 'agent_class': 'CounterModel',
- 'states': {
- 0: {'times': 10},
- 1: {'times': 20},
+ "agent_class": "CounterModel",
+ "states": {
+ 0: {"times": 10},
+ 1: {"times": 20},
},
- }
+ },
}
s = simulation.from_config(config)
@@ -68,48 +63,41 @@ class TestMain(TestCase):
The initial states should be applied to the agent and the
agent should be able to update its state."""
config = {
- 'version': '2',
- 'name': 'CounterAgent',
- 'dry_run': True,
- 'num_trials': 1,
- 'max_time': 2,
- 'model_params': {
- 'topologies': {
- 'default': {
- 'path': join(ROOT, 'test.gexf')
- }
+ "version": "2",
+ "name": "CounterAgent",
+ "dry_run": True,
+ "num_trials": 1,
+ "max_time": 2,
+ "model_params": {
+ "topology": {"path": join(ROOT, "test.gexf")},
+ "agents": {
+ "agent_class": "CounterModel",
+ "topology": True,
+ "fixed": [{"state": {"times": 10}}, {"state": {"times": 20}}],
},
- 'agents': {
- 'agent_class': 'CounterModel',
- 'topology': 'default',
- 'fixed': [{'state': {'times': 10}}, {'state': {'times': 20}}],
- }
- }
+ },
}
s = simulation.from_config(config)
env = s.get_env()
assert isinstance(env.agents[0], agents.CounterModel)
- assert env.agents[0].G == env.topologies['default']
- assert env.agents[0]['times'] == 10
- assert env.agents[0]['times'] == 10
+ assert env.agents[0].G == env.G
+ assert env.agents[0]["times"] == 10
+ assert env.agents[0]["times"] == 10
env.step()
- assert env.agents[0]['times'] == 11
- assert env.agents[1]['times'] == 21
+ assert env.agents[0]["times"] == 11
+ assert env.agents[1]["times"] == 21
def test_init_and_count_agents(self):
"""Agents should be properly initialized and counting should filter them properly"""
- #TODO: separate this test into two or more test cases
+ # TODO: separate this test into two or more test cases
config = {
- 'max_time': 10,
- 'model_params': {
- 'agents': [{'agent_class': CustomAgent, 'weight': 1, 'topology': 'default'},
- {'agent_class': CustomAgent, 'weight': 3, 'topology': 'default'},
+ "max_time": 10,
+ "model_params": {
+ "agents": [
+ {"agent_class": CustomAgent, "weight": 1, "topology": True},
+ {"agent_class": CustomAgent, "weight": 3, "topology": True},
],
- 'topologies': {
- 'default': {
- 'path': join(ROOT, 'test.gexf')
- }
- },
+ "topology": {"path": join(ROOT, "test.gexf")},
},
}
s = simulation.from_config(config)
@@ -120,40 +108,45 @@ class TestMain(TestCase):
assert env.count_agents(weight=3) == 1
assert env.count_agents(agent_class=CustomAgent) == 2
-
def test_torvalds_example(self):
"""A complete example from a documentation should work."""
- config = serialization.load_file(join(EXAMPLES, 'torvalds.yml'))[0]
- config['model_params']['network_params']['path'] = join(EXAMPLES,
- config['model_params']['network_params']['path'])
+ config = serialization.load_file(join(EXAMPLES, "torvalds.yml"))[0]
+ config["model_params"]["network_params"]["path"] = join(
+ EXAMPLES, config["model_params"]["network_params"]["path"]
+ )
s = simulation.from_config(config)
env = s.run_simulation(dry_run=True)[0]
for a in env.network_agents:
- skill_level = a.state['skill_level']
- if a.id == 'Torvalds':
- assert skill_level == 'God'
- assert a.state['total'] == 3
- assert a.state['neighbors'] == 2
- elif a.id == 'balkian':
- assert skill_level == 'developer'
- assert a.state['total'] == 3
- assert a.state['neighbors'] == 1
+ skill_level = a.state["skill_level"]
+ if a.id == "Torvalds":
+ assert skill_level == "God"
+ assert a.state["total"] == 3
+ assert a.state["neighbors"] == 2
+ elif a.id == "balkian":
+ assert skill_level == "developer"
+ assert a.state["total"] == 3
+ assert a.state["neighbors"] == 1
else:
- assert skill_level == 'beginner'
- assert a.state['total'] == 3
- assert a.state['neighbors'] == 1
+ assert skill_level == "beginner"
+ assert a.state["total"] == 3
+ assert a.state["neighbors"] == 1
def test_serialize_class(self):
ser, name = serialization.serialize(agents.BaseAgent, known_modules=[])
- assert name == 'soil.agents.BaseAgent'
+ assert name == "soil.agents.BaseAgent"
assert ser == agents.BaseAgent
- ser, name = serialization.serialize(agents.BaseAgent, known_modules=['soil', ])
- assert name == 'BaseAgent'
+ ser, name = serialization.serialize(
+ agents.BaseAgent,
+ known_modules=[
+ "soil",
+ ],
+ )
+ assert name == "BaseAgent"
assert ser == agents.BaseAgent
ser, name = serialization.serialize(CustomAgent)
- assert name == 'test_main.CustomAgent'
+ assert name == "test_main.CustomAgent"
assert ser == CustomAgent
pickle.dumps(ser)
@@ -166,72 +159,63 @@ class TestMain(TestCase):
assert i == des
def test_serialize_agent_class(self):
- '''A class from soil.agents should be serialized without the module part'''
+ """A class from soil.agents should be serialized without the module part"""
ser = agents.serialize_type(CustomAgent)
- assert ser == 'test_main.CustomAgent'
+ assert ser == "test_main.CustomAgent"
ser = agents.serialize_type(agents.BaseAgent)
- assert ser == 'BaseAgent'
+ assert ser == "BaseAgent"
pickle.dumps(ser)
-
+
def test_deserialize_agent_distribution(self):
agent_distro = [
- {
- 'agent_class': 'CounterModel',
- 'weight': 1
- },
- {
- 'agent_class': 'test_main.CustomAgent',
- 'weight': 2
- },
+ {"agent_class": "CounterModel", "weight": 1},
+ {"agent_class": "test_main.CustomAgent", "weight": 2},
]
converted = agents.deserialize_definition(agent_distro)
- assert converted[0]['agent_class'] == agents.CounterModel
- assert converted[1]['agent_class'] == CustomAgent
+ assert converted[0]["agent_class"] == agents.CounterModel
+ assert converted[1]["agent_class"] == CustomAgent
pickle.dumps(converted)
def test_serialize_agent_distribution(self):
agent_distro = [
- {
- 'agent_class': agents.CounterModel,
- 'weight': 1
- },
- {
- 'agent_class': CustomAgent,
- 'weight': 2
- },
+ {"agent_class": agents.CounterModel, "weight": 1},
+ {"agent_class": CustomAgent, "weight": 2},
]
converted = agents.serialize_definition(agent_distro)
- assert converted[0]['agent_class'] == 'CounterModel'
- assert converted[1]['agent_class'] == 'test_main.CustomAgent'
+ assert converted[0]["agent_class"] == "CounterModel"
+ assert converted[1]["agent_class"] == "test_main.CustomAgent"
pickle.dumps(converted)
def test_templates(self):
- '''Loading a template should result in several configs'''
- configs = serialization.load_file(join(EXAMPLES, 'template.yml'))
+ """Loading a template should result in several configs"""
+ configs = serialization.load_file(join(EXAMPLES, "template.yml"))
assert len(configs) > 0
def test_until(self):
config = {
- 'name': 'until_sim',
- 'model_params': {
- 'network_params': {},
- 'agents': {
- 'fixed': [{
- 'agent_class': agents.BaseAgent,
- }]
+ "name": "until_sim",
+ "model_params": {
+ "network_params": {},
+ "agents": {
+ "fixed": [
+ {
+ "agent_class": agents.BaseAgent,
+ }
+ ]
},
},
- 'max_time': 2,
- 'num_trials': 50,
+ "max_time": 2,
+ "num_trials": 50,
}
s = simulation.from_config(config)
runs = list(s.run_simulation(dry_run=True))
over = list(x.now for x in runs if x.now > 2)
- assert len(runs) == config['num_trials']
+ assert len(runs) == config["num_trials"]
assert len(over) == 0
def test_fsm(self):
- '''Basic state change'''
+ """Basic state change"""
+
class ToggleAgent(agents.FSM):
@agents.default_state
@agents.state
@@ -250,7 +234,8 @@ class TestMain(TestCase):
assert a.state_id == a.ping.id
def test_fsm_when(self):
- '''Basic state change'''
+ """Basic state change"""
+
class ToggleAgent(agents.FSM):
@agents.default_state
@agents.state
diff --git a/tests/test_mesa.py b/tests/test_mesa.py
index b219de9..a0aa5a1 100644
--- a/tests/test_mesa.py
+++ b/tests/test_mesa.py
@@ -1,4 +1,4 @@
-'''
+"""
Mesa-SOIL integration tests
We have to test that:
@@ -8,13 +8,15 @@ We have to test that:
- Mesa visualizations work with SOIL simulations
-'''
+"""
from mesa import Agent, Model
from mesa.time import RandomActivation
from mesa.space import MultiGrid
+
class MoneyAgent(Agent):
- """ An agent with fixed initial wealth."""
+ """An agent with fixed initial wealth."""
+
def __init__(self, unique_id, model):
super().__init__(unique_id, model)
self.wealth = 1
@@ -33,15 +35,15 @@ class MoneyAgent(Agent):
def move(self):
possible_steps = self.model.grid.get_neighborhood(
- self.pos,
- moore=True,
- include_center=False)
+ self.pos, moore=True, include_center=False
+ )
new_position = self.random.choice(possible_steps)
self.model.grid.move_agent(self, new_position)
class MoneyModel(Model):
"""A model with some number of agents."""
+
def __init__(self, N, width, height):
self.num_agents = N
self.grid = MultiGrid(width, height, True)
@@ -58,7 +60,7 @@ class MoneyModel(Model):
self.grid.place_agent(a, (x, y))
def step(self):
- '''Advance the model by one step.'''
+ """Advance the model by one step."""
self.schedule.step()
diff --git a/tests/test_network.py b/tests/test_network.py
index d984320..a860b14 100644
--- a/tests/test_network.py
+++ b/tests/test_network.py
@@ -10,7 +10,7 @@ from soil import config, network, environment, agents, simulation
from test_main import CustomAgent
ROOT = os.path.abspath(os.path.dirname(__file__))
-EXAMPLES = join(ROOT, '..', 'examples')
+EXAMPLES = join(ROOT, "..", "examples")
class TestNetwork(TestCase):
@@ -19,21 +19,13 @@ class TestNetwork(TestCase):
Load a graph from file if the extension is known.
Raise an exception otherwise.
"""
- config = {
- 'network_params': {
- 'path': join(ROOT, 'test.gexf')
- }
- }
- G = network.from_config(config['network_params'])
+ config = {"network_params": {"path": join(ROOT, "test.gexf")}}
+ G = network.from_config(config["network_params"])
assert G
assert len(G) == 2
with self.assertRaises(AttributeError):
- config = {
- 'network_params': {
- 'path': join(ROOT, 'unknown.extension')
- }
- }
- G = network.from_config(config['network_params'])
+ config = {"network_params": {"path": join(ROOT, "unknown.extension")}}
+ G = network.from_config(config["network_params"])
print(G)
def test_generate_barabasi(self):
@@ -41,88 +33,73 @@ class TestNetwork(TestCase):
If no path is given, a generator and network parameters
should be used to generate a network
"""
- cfg = {
- 'params': {
- 'generator': 'barabasi_albert_graph'
- }
- }
+ cfg = {"params": {"generator": "barabasi_albert_graph"}}
with self.assertRaises(Exception):
G = network.from_config(cfg)
- cfg['params']['n'] = 100
- cfg['params']['m'] = 10
+ cfg["params"]["n"] = 100
+ cfg["params"]["m"] = 10
G = network.from_config(cfg)
assert len(G) == 100
def test_save_geometric(self):
"""
- There is a bug in networkx that prevents it from creating a GEXF file
+ There is a bug in networkx that prevents it from creating a GEXF file
from geometric models. We should work around it.
"""
G = nx.random_geometric_graph(20, 0.1)
env = environment.NetworkEnvironment(topology=G)
f = io.BytesIO()
- assert env.topologies['default']
- network.dump_gexf(env.topologies['default'], f)
+ assert env.G
+ network.dump_gexf(env.G, f)
def test_networkenvironment_creation(self):
"""Networkenvironment should accept netconfig as parameters"""
model_params = {
- 'topologies': {
- 'default': {
- 'path': join(ROOT, 'test.gexf')
- }
+ "topology": {"path": join(ROOT, "test.gexf")},
+ "agents": {
+ "topology": True,
+ "distribution": [
+ {
+ "agent_class": CustomAgent,
+ }
+ ],
},
- 'agents': {
- 'topology': 'default',
- 'distribution': [{
- 'agent_class': CustomAgent,
- }]
- }
}
env = environment.Environment(**model_params)
- assert env.topologies
+ assert env.G
env.step()
- assert len(env.topologies['default']) == 2
+ assert len(env.G) == 2
assert len(env.agents) == 2
- assert env.agents[1].count_agents(state_id='normal') == 2
- assert env.agents[1].count_agents(state_id='normal', limit_neighbors=True) == 1
+ assert env.agents[1].count_agents(state_id="normal") == 2
+ assert env.agents[1].count_agents(state_id="normal", limit_neighbors=True) == 1
assert env.agents[0].neighbors == 1
def test_custom_agent_neighbors(self):
"""Allow for search of neighbors with a certain state_id"""
config = {
- 'model_params': {
- 'topologies': {
- 'default': {
- 'path': join(ROOT, 'test.gexf')
- }
- },
- 'agents': {
- 'topology': 'default',
- 'distribution': [
- {
- 'weight': 1,
- 'agent_class': CustomAgent
- }
- ]
- }
+ "model_params": {
+ "topology": {"path": join(ROOT, "test.gexf")},
+ "agents": {
+ "topology": True,
+ "distribution": [{"weight": 1, "agent_class": CustomAgent}],
+ },
},
- 'max_time': 10,
+ "max_time": 10,
}
s = simulation.from_config(config)
env = s.run_simulation(dry_run=True)[0]
- assert env.agents[1].count_agents(state_id='normal') == 2
- assert env.agents[1].count_agents(state_id='normal', limit_neighbors=True) == 1
+ assert env.agents[1].count_agents(state_id="normal") == 2
+ assert env.agents[1].count_agents(state_id="normal", limit_neighbors=True) == 1
assert env.agents[0].neighbors == 1
def test_subgraph(self):
- '''An agent should be able to subgraph the global topology'''
+ """An agent should be able to subgraph the global topology"""
G = nx.Graph()
G.add_node(3)
G.add_edge(1, 2)
distro = agents.calculate_distribution(agent_class=agents.NetworkAgent)
- aconfig = config.AgentConfig(distribution=distro, topology='default')
- env = environment.Environment(name='Test', topologies={'default': G}, agents=aconfig)
+ aconfig = config.AgentConfig(distribution=distro, topology=True)
+ env = environment.Environment(name="Test", topology=G, agents=aconfig)
lst = list(env.network_agents)
a2 = env.find_one(node_id=2)
From 78833a9e08814eb6ce1c8a2d006b8029a5fa1add Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Sun, 16 Oct 2022 17:58:19 +0200
Subject: [PATCH 10/39] Formatted with black
---
soil/__init__.py | 177 +++++++-----
soil/__main__.py | 4 +-
soil/agents/BassModel.py | 3 +-
soil/agents/BigMarketModel.py | 72 +++--
soil/agents/CounterModel.py | 14 +-
soil/agents/Geo.py | 8 +-
soil/agents/IndependentCascadeModel.py | 28 +-
soil/agents/ModelM2.py | 166 +++++++-----
soil/agents/SISaModel.py | 64 +++--
soil/agents/SentimentCorrelationModel.py | 100 ++++---
soil/agents/__init__.py | 330 ++++++++++++++---------
soil/config.py | 169 ++++++------
soil/datacollection.py | 2 +-
soil/debugging.py | 79 +++---
soil/environment.py | 132 +++++----
soil/exporters.py | 127 +++++----
soil/network.py | 41 +--
soil/serialization.py | 83 +++---
soil/simulation.py | 161 ++++++-----
soil/time.py | 21 +-
soil/utils.py | 63 +++--
soil/version.py | 9 +-
soil/visualization.py | 1 +
soil/web/__init__.py | 270 +++++++++++--------
soil/web/__main__.py | 2 +-
soil/web/run.py | 27 +-
26 files changed, 1254 insertions(+), 899 deletions(-)
diff --git a/soil/__init__.py b/soil/__init__.py
index be53c47..46d56bd 100644
--- a/soil/__init__.py
+++ b/soil/__init__.py
@@ -22,58 +22,107 @@ from .utils import logger
from .time import *
-def main(cfg='simulation.yml', exporters=None, parallel=None, output="soil_output", *, do_run=False, debug=False, **kwargs):
+def main(
+ cfg="simulation.yml",
+ exporters=None,
+ parallel=None,
+ output="soil_output",
+ *,
+ do_run=False,
+ debug=False,
+ **kwargs,
+):
import argparse
from . import simulation
- logger.info('Running SOIL version: {}'.format(__version__))
+ logger.info("Running SOIL version: {}".format(__version__))
- parser = argparse.ArgumentParser(description='Run a SOIL simulation')
- parser.add_argument('file', type=str,
- nargs="?",
- default=cfg,
- help='Configuration file for the simulation (e.g., YAML or JSON)')
- parser.add_argument('--version', action='store_true',
- help='Show version info and exit')
- parser.add_argument('--module', '-m', type=str,
- help='file containing the code of any custom agents.')
- parser.add_argument('--dry-run', '--dry', action='store_true',
- help='Do not store the results of the simulation to disk, show in terminal instead.')
- parser.add_argument('--pdb', action='store_true',
- help='Use a pdb console in case of exception.')
- parser.add_argument('--debug', action='store_true',
- help='Run a customized version of a pdb console to debug a simulation.')
- parser.add_argument('--graph', '-g', action='store_true',
- help='Dump each trial\'s network topology as a GEXF graph. Defaults to false.')
- parser.add_argument('--csv', action='store_true',
- help='Dump all data collected in CSV format. Defaults to false.')
- parser.add_argument('--level', type=str,
- help='Logging level')
- parser.add_argument('--output', '-o', type=str, default=output or "soil_output",
- help='folder to write results to. It defaults to the current directory.')
+ parser = argparse.ArgumentParser(description="Run a SOIL simulation")
+ parser.add_argument(
+ "file",
+ type=str,
+ nargs="?",
+ default=cfg,
+ help="Configuration file for the simulation (e.g., YAML or JSON)",
+ )
+ parser.add_argument(
+ "--version", action="store_true", help="Show version info and exit"
+ )
+ parser.add_argument(
+ "--module",
+ "-m",
+ type=str,
+ help="file containing the code of any custom agents.",
+ )
+ parser.add_argument(
+ "--dry-run",
+ "--dry",
+ action="store_true",
+ help="Do not store the results of the simulation to disk, show in terminal instead.",
+ )
+ parser.add_argument(
+ "--pdb", action="store_true", help="Use a pdb console in case of exception."
+ )
+ parser.add_argument(
+ "--debug",
+ action="store_true",
+ help="Run a customized version of a pdb console to debug a simulation.",
+ )
+ parser.add_argument(
+ "--graph",
+ "-g",
+ action="store_true",
+ help="Dump each trial's network topology as a GEXF graph. Defaults to false.",
+ )
+ parser.add_argument(
+ "--csv",
+ action="store_true",
+ help="Dump all data collected in CSV format. Defaults to false.",
+ )
+ parser.add_argument("--level", type=str, help="Logging level")
+ parser.add_argument(
+ "--output",
+ "-o",
+ type=str,
+ default=output or "soil_output",
+ help="folder to write results to. It defaults to the current directory.",
+ )
if parallel is None:
- parser.add_argument('--synchronous', action='store_true',
- help='Run trials serially and synchronously instead of in parallel. Defaults to false.')
+ parser.add_argument(
+ "--synchronous",
+ action="store_true",
+ help="Run trials serially and synchronously instead of in parallel. Defaults to false.",
+ )
- parser.add_argument('-e', '--exporter', action='append',
- default=[],
- help='Export environment and/or simulations using this exporter')
+ parser.add_argument(
+ "-e",
+ "--exporter",
+ action="append",
+ default=[],
+ help="Export environment and/or simulations using this exporter",
+ )
- parser.add_argument('--only-convert', '--convert', action='store_true',
- help='Do not run the simulation, only convert the configuration file(s) and output them.')
+ parser.add_argument(
+ "--only-convert",
+ "--convert",
+ action="store_true",
+ help="Do not run the simulation, only convert the configuration file(s) and output them.",
+ )
- parser.add_argument("--set",
- metavar="KEY=VALUE",
- action='append',
- help="Set a number of parameters that will be passed to the simulation."
- "(do not put spaces before or after the = sign). "
- "If a value contains spaces, you should define "
- "it with double quotes: "
- 'foo="this is a sentence". Note that '
- "values are always treated as strings.")
+ parser.add_argument(
+ "--set",
+ metavar="KEY=VALUE",
+ action="append",
+ help="Set a number of parameters that will be passed to the simulation."
+ "(do not put spaces before or after the = sign). "
+ "If a value contains spaces, you should define "
+ "it with double quotes: "
+ 'foo="this is a sentence". Note that '
+ "values are always treated as strings.",
+ )
args = parser.parse_args()
- logger.setLevel(getattr(logging, (args.level or 'INFO').upper()))
+ logger.setLevel(getattr(logging, (args.level or "INFO").upper()))
if args.version:
return
@@ -81,14 +130,16 @@ def main(cfg='simulation.yml', exporters=None, parallel=None, output="soil_outpu
if parallel is None:
parallel = not args.synchronous
- exporters = exporters or ['default', ]
+ exporters = exporters or [
+ "default",
+ ]
for exp in args.exporter:
if exp not in exporters:
exporters.append(exp)
if args.csv:
- exporters.append('csv')
+ exporters.append("csv")
if args.graph:
- exporters.append('gexf')
+ exporters.append("gexf")
if os.getcwd() not in sys.path:
sys.path.append(os.getcwd())
@@ -97,38 +148,38 @@ def main(cfg='simulation.yml', exporters=None, parallel=None, output="soil_outpu
if output is None:
output = args.output
-
- logger.info('Loading config file: {}'.format(args.file))
+ logger.info("Loading config file: {}".format(args.file))
debug = debug or args.debug
if args.pdb or debug:
args.synchronous = True
-
res = []
try:
exp_params = {}
if not os.path.exists(args.file):
- logger.error('Please, input a valid file')
+ logger.error("Please, input a valid file")
return
- for sim in simulation.iter_from_config(args.file,
- dry_run=args.dry_run,
- exporters=exporters,
- parallel=parallel,
- outdir=output,
- exporter_params=exp_params,
- **kwargs):
+ for sim in simulation.iter_from_config(
+ args.file,
+ dry_run=args.dry_run,
+ exporters=exporters,
+ parallel=parallel,
+ outdir=output,
+ exporter_params=exp_params,
+ **kwargs,
+ ):
if args.set:
for s in args.set:
- k, v = s.split('=', 1)[:2]
+ k, v = s.split("=", 1)[:2]
v = eval(v)
- tail, *head = k.rsplit('.', 1)[::-1]
+ tail, *head = k.rsplit(".", 1)[::-1]
target = sim
if head:
- for part in head[0].split('.'):
+ for part in head[0].split("."):
try:
target = getattr(target, part)
except AttributeError:
@@ -144,19 +195,21 @@ def main(cfg='simulation.yml', exporters=None, parallel=None, output="soil_outpu
if do_run:
res.append(sim.run())
else:
- print('not running')
+ print("not running")
res.append(sim)
except Exception as ex:
if args.pdb:
from .debugging import post_mortem
+
print(traceback.format_exc())
post_mortem()
else:
raise
if debug:
from .debugging import set_trace
- os.environ['SOIL_DEBUG'] = 'true'
+
+ os.environ["SOIL_DEBUG"] = "true"
set_trace()
return res
@@ -165,5 +218,5 @@ def easy(cfg, debug=False, **kwargs):
return main(cfg, **kwargs)[0]
-if __name__ == '__main__':
+if __name__ == "__main__":
main(do_run=True)
diff --git a/soil/__main__.py b/soil/__main__.py
index 9ad5c4f..0c76791 100644
--- a/soil/__main__.py
+++ b/soil/__main__.py
@@ -1,7 +1,9 @@
from . import main as init_main
+
def main():
init_main(do_run=True)
-if __name__ == '__main__':
+
+if __name__ == "__main__":
init_main(do_run=True)
diff --git a/soil/agents/BassModel.py b/soil/agents/BassModel.py
index e3f5015..416063d 100644
--- a/soil/agents/BassModel.py
+++ b/soil/agents/BassModel.py
@@ -7,6 +7,7 @@ class BassModel(FSM):
innovation_prob
imitation_prob
"""
+
sentimentCorrelation = 0
def step(self):
@@ -21,7 +22,7 @@ class BassModel(FSM):
else:
aware_neighbors = self.get_neighboring_agents(state_id=self.aware.id)
num_neighbors_aware = len(aware_neighbors)
- if self.prob((self['imitation_prob']*num_neighbors_aware)):
+ if self.prob((self["imitation_prob"] * num_neighbors_aware)):
self.sentimentCorrelation = 1
return self.aware
diff --git a/soil/agents/BigMarketModel.py b/soil/agents/BigMarketModel.py
index 7db663d..5a93b23 100644
--- a/soil/agents/BigMarketModel.py
+++ b/soil/agents/BigMarketModel.py
@@ -6,42 +6,54 @@ class BigMarketModel(FSM):
Settings:
Names:
enterprises [Array]
-
+
tweet_probability_enterprises [Array]
Users:
tweet_probability_users
-
+
tweet_relevant_probability
-
+
tweet_probability_about [Array]
-
+
sentiment_about [Array]
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
- self.enterprises = self.env.environment_params['enterprises']
+ self.enterprises = self.env.environment_params["enterprises"]
self.type = ""
if self.id < len(self.enterprises): # Enterprises
self.set_state(self.enterprise.id)
self.type = "Enterprise"
- self.tweet_probability = environment.environment_params['tweet_probability_enterprises'][self.id]
+ self.tweet_probability = environment.environment_params[
+ "tweet_probability_enterprises"
+ ][self.id]
else: # normal users
self.type = "User"
self.set_state(self.user.id)
- self.tweet_probability = environment.environment_params['tweet_probability_users']
- self.tweet_relevant_probability = environment.environment_params['tweet_relevant_probability']
- self.tweet_probability_about = environment.environment_params['tweet_probability_about'] # List
- self.sentiment_about = environment.environment_params['sentiment_about'] # List
+ self.tweet_probability = environment.environment_params[
+ "tweet_probability_users"
+ ]
+ self.tweet_relevant_probability = environment.environment_params[
+ "tweet_relevant_probability"
+ ]
+ self.tweet_probability_about = environment.environment_params[
+ "tweet_probability_about"
+ ] # List
+ self.sentiment_about = environment.environment_params[
+ "sentiment_about"
+ ] # List
@state
def enterprise(self):
if self.random.random() < self.tweet_probability: # Tweets
- aware_neighbors = self.get_neighboring_agents(state_id=self.number_of_enterprises) # Nodes neighbour users
+ aware_neighbors = self.get_neighboring_agents(
+ state_id=self.number_of_enterprises
+ ) # Nodes neighbour users
for x in aware_neighbors:
- if self.random.uniform(0,10) < 5:
+ if self.random.uniform(0, 10) < 5:
x.sentiment_about[self.id] += 0.1 # Increments for enterprise
else:
x.sentiment_about[self.id] -= 0.1 # Decrements for enterprise
@@ -49,15 +61,19 @@ class BigMarketModel(FSM):
# Establecemos limites
if x.sentiment_about[self.id] > 1:
x.sentiment_about[self.id] = 1
- if x.sentiment_about[self.id]< -1:
+ if x.sentiment_about[self.id] < -1:
x.sentiment_about[self.id] = -1
- x.attrs['sentiment_enterprise_%s'% self.enterprises[self.id]] = x.sentiment_about[self.id]
+ x.attrs[
+ "sentiment_enterprise_%s" % self.enterprises[self.id]
+ ] = x.sentiment_about[self.id]
@state
def user(self):
if self.random.random() < self.tweet_probability: # Tweets
- if self.random.random() < self.tweet_relevant_probability: # Tweets something relevant
+ if (
+ self.random.random() < self.tweet_relevant_probability
+ ): # Tweets something relevant
# Tweet probability per enterprise
for i in range(len(self.enterprises)):
random_num = self.random.random()
@@ -65,23 +81,29 @@ class BigMarketModel(FSM):
# The condition is fulfilled, sentiments are evaluated towards that enterprise
if self.sentiment_about[i] < 0:
# NEGATIVO
- self.userTweets("negative",i)
+ self.userTweets("negative", i)
elif self.sentiment_about[i] == 0:
# NEUTRO
pass
else:
# POSITIVO
- self.userTweets("positive",i)
- for i in range(len(self.enterprises)): # So that it never is set to 0 if there are not changes (logs)
- self.attrs['sentiment_enterprise_%s'% self.enterprises[i]] = self.sentiment_about[i]
+ self.userTweets("positive", i)
+ for i in range(
+ len(self.enterprises)
+ ): # So that it never is set to 0 if there are not changes (logs)
+ self.attrs[
+ "sentiment_enterprise_%s" % self.enterprises[i]
+ ] = self.sentiment_about[i]
- def userTweets(self, sentiment,enterprise):
- aware_neighbors = self.get_neighboring_agents(state_id=self.number_of_enterprises) # Nodes neighbours users
+ def userTweets(self, sentiment, enterprise):
+ aware_neighbors = self.get_neighboring_agents(
+ state_id=self.number_of_enterprises
+ ) # Nodes neighbours users
for x in aware_neighbors:
if sentiment == "positive":
- x.sentiment_about[enterprise] +=0.003
+ x.sentiment_about[enterprise] += 0.003
elif sentiment == "negative":
- x.sentiment_about[enterprise] -=0.003
+ x.sentiment_about[enterprise] -= 0.003
else:
pass
@@ -91,4 +113,6 @@ class BigMarketModel(FSM):
if x.sentiment_about[enterprise] < -1:
x.sentiment_about[enterprise] = -1
- x.attrs['sentiment_enterprise_%s'% self.enterprises[enterprise]] = x.sentiment_about[enterprise]
+ x.attrs[
+ "sentiment_enterprise_%s" % self.enterprises[enterprise]
+ ] = x.sentiment_about[enterprise]
diff --git a/soil/agents/CounterModel.py b/soil/agents/CounterModel.py
index 97c7356..731c61d 100644
--- a/soil/agents/CounterModel.py
+++ b/soil/agents/CounterModel.py
@@ -15,9 +15,9 @@ class CounterModel(NetworkAgent):
# Outside effects
total = len(list(self.model.schedule._agents))
neighbors = len(list(self.get_neighboring_agents()))
- self['times'] = self.get('times', 0) + 1
- self['neighbors'] = neighbors
- self['total'] = total
+ self["times"] = self.get("times", 0) + 1
+ self["neighbors"] = neighbors
+ self["total"] = total
class AggregatedCounter(NetworkAgent):
@@ -32,9 +32,9 @@ class AggregatedCounter(NetworkAgent):
def step(self):
# Outside effects
- self['times'] += 1
+ self["times"] += 1
neighbors = len(list(self.get_neighboring_agents()))
- self['neighbors'] += neighbors
+ self["neighbors"] += neighbors
total = len(list(self.model.schedule.agents))
- self['total'] += total
- self.debug('Running for step: {}. Total: {}'.format(self.now, total))
+ self["total"] += total
+ self.debug("Running for step: {}. Total: {}".format(self.now, total))
diff --git a/soil/agents/Geo.py b/soil/agents/Geo.py
index bf505bf..d61d1ce 100644
--- a/soil/agents/Geo.py
+++ b/soil/agents/Geo.py
@@ -2,20 +2,20 @@ from scipy.spatial import cKDTree as KDTree
import networkx as nx
from . import NetworkAgent, as_node
+
class Geo(NetworkAgent):
- '''In this type of network, nodes have a "pos" attribute.'''
+ """In this type of network, nodes have a "pos" attribute."""
def geo_search(self, radius, node=None, center=False, **kwargs):
- '''Get a list of nodes whose coordinates are closer than *radius* to *node*.'''
+ """Get a list of nodes whose coordinates are closer than *radius* to *node*."""
node = as_node(node if node is not None else self)
G = self.subgraph(**kwargs)
- pos = nx.get_node_attributes(G, 'pos')
+ pos = nx.get_node_attributes(G, "pos")
if not pos:
return []
nodes, coords = list(zip(*pos.items()))
kdtree = KDTree(coords) # Cannot provide generator.
indices = kdtree.query_ball_point(pos[node], radius)
return [nodes[i] for i in indices if center or (nodes[i] != node)]
-
diff --git a/soil/agents/IndependentCascadeModel.py b/soil/agents/IndependentCascadeModel.py
index e927a6f..d3280e0 100644
--- a/soil/agents/IndependentCascadeModel.py
+++ b/soil/agents/IndependentCascadeModel.py
@@ -11,10 +11,10 @@ class IndependentCascadeModel(BaseAgent):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
- self.innovation_prob = self.env.environment_params['innovation_prob']
- self.imitation_prob = self.env.environment_params['imitation_prob']
- self.state['time_awareness'] = 0
- self.state['sentimentCorrelation'] = 0
+ self.innovation_prob = self.env.environment_params["innovation_prob"]
+ self.imitation_prob = self.env.environment_params["imitation_prob"]
+ self.state["time_awareness"] = 0
+ self.state["sentimentCorrelation"] = 0
def step(self):
self.behaviour()
@@ -23,25 +23,27 @@ class IndependentCascadeModel(BaseAgent):
aware_neighbors_1_time_step = []
# Outside effects
if self.prob(self.innovation_prob):
- if self.state['id'] == 0:
- self.state['id'] = 1
- self.state['sentimentCorrelation'] = 1
- self.state['time_awareness'] = self.env.now # To know when they have been infected
+ if self.state["id"] == 0:
+ self.state["id"] = 1
+ self.state["sentimentCorrelation"] = 1
+ self.state[
+ "time_awareness"
+ ] = self.env.now # To know when they have been infected
else:
pass
return
# Imitation effects
- if self.state['id'] == 0:
+ if self.state["id"] == 0:
aware_neighbors = self.get_neighboring_agents(state_id=1)
for x in aware_neighbors:
- if x.state['time_awareness'] == (self.env.now-1):
+ if x.state["time_awareness"] == (self.env.now - 1):
aware_neighbors_1_time_step.append(x)
num_neighbors_aware = len(aware_neighbors_1_time_step)
- if self.prob(self.imitation_prob*num_neighbors_aware):
- self.state['id'] = 1
- self.state['sentimentCorrelation'] = 1
+ if self.prob(self.imitation_prob * num_neighbors_aware):
+ self.state["id"] = 1
+ self.state["sentimentCorrelation"] = 1
else:
pass
diff --git a/soil/agents/ModelM2.py b/soil/agents/ModelM2.py
index dec6b97..b22cafa 100644
--- a/soil/agents/ModelM2.py
+++ b/soil/agents/ModelM2.py
@@ -23,36 +23,49 @@ class SpreadModelM2(BaseAgent):
def __init__(self, model=None, unique_id=0, state=()):
super().__init__(model=environment, unique_id=unique_id, state=state)
-
# Use a single generator with the same seed as `self.random`
random = np.random.default_rng(seed=self._seed)
- self.prob_neutral_making_denier = random.normal(environment.environment_params['prob_neutral_making_denier'],
- environment.environment_params['standard_variance'])
+ self.prob_neutral_making_denier = random.normal(
+ environment.environment_params["prob_neutral_making_denier"],
+ environment.environment_params["standard_variance"],
+ )
- self.prob_infect = random.normal(environment.environment_params['prob_infect'],
- environment.environment_params['standard_variance'])
+ self.prob_infect = random.normal(
+ environment.environment_params["prob_infect"],
+ environment.environment_params["standard_variance"],
+ )
- self.prob_cured_healing_infected = random.normal(environment.environment_params['prob_cured_healing_infected'],
- environment.environment_params['standard_variance'])
- self.prob_cured_vaccinate_neutral = random.normal(environment.environment_params['prob_cured_vaccinate_neutral'],
- environment.environment_params['standard_variance'])
+ self.prob_cured_healing_infected = random.normal(
+ environment.environment_params["prob_cured_healing_infected"],
+ environment.environment_params["standard_variance"],
+ )
+ self.prob_cured_vaccinate_neutral = random.normal(
+ environment.environment_params["prob_cured_vaccinate_neutral"],
+ environment.environment_params["standard_variance"],
+ )
- self.prob_vaccinated_healing_infected = random.normal(environment.environment_params['prob_vaccinated_healing_infected'],
- environment.environment_params['standard_variance'])
- self.prob_vaccinated_vaccinate_neutral = random.normal(environment.environment_params['prob_vaccinated_vaccinate_neutral'],
- environment.environment_params['standard_variance'])
- self.prob_generate_anti_rumor = random.normal(environment.environment_params['prob_generate_anti_rumor'],
- environment.environment_params['standard_variance'])
+ self.prob_vaccinated_healing_infected = random.normal(
+ environment.environment_params["prob_vaccinated_healing_infected"],
+ environment.environment_params["standard_variance"],
+ )
+ self.prob_vaccinated_vaccinate_neutral = random.normal(
+ environment.environment_params["prob_vaccinated_vaccinate_neutral"],
+ environment.environment_params["standard_variance"],
+ )
+ self.prob_generate_anti_rumor = random.normal(
+ environment.environment_params["prob_generate_anti_rumor"],
+ environment.environment_params["standard_variance"],
+ )
def step(self):
- if self.state['id'] == 0: # Neutral
+ if self.state["id"] == 0: # Neutral
self.neutral_behaviour()
- elif self.state['id'] == 1: # Infected
+ elif self.state["id"] == 1: # Infected
self.infected_behaviour()
- elif self.state['id'] == 2: # Cured
+ elif self.state["id"] == 2: # Cured
self.cured_behaviour()
- elif self.state['id'] == 3: # Vaccinated
+ elif self.state["id"] == 3: # Vaccinated
self.vaccinated_behaviour()
def neutral_behaviour(self):
@@ -61,7 +74,7 @@ class SpreadModelM2(BaseAgent):
infected_neighbors = self.get_neighboring_agents(state_id=1)
if len(infected_neighbors) > 0:
if self.prob(self.prob_neutral_making_denier):
- self.state['id'] = 3 # Vaccinated making denier
+ self.state["id"] = 3 # Vaccinated making denier
def infected_behaviour(self):
@@ -69,7 +82,7 @@ class SpreadModelM2(BaseAgent):
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_infect):
- neighbor.state['id'] = 1 # Infected
+ neighbor.state["id"] = 1 # Infected
def cured_behaviour(self):
@@ -77,13 +90,13 @@ class SpreadModelM2(BaseAgent):
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_cured_vaccinate_neutral):
- neighbor.state['id'] = 3 # Vaccinated
+ neighbor.state["id"] = 3 # Vaccinated
# Cure
infected_neighbors = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors:
if self.prob(self.prob_cured_healing_infected):
- neighbor.state['id'] = 2 # Cured
+ neighbor.state["id"] = 2 # Cured
def vaccinated_behaviour(self):
@@ -91,19 +104,19 @@ class SpreadModelM2(BaseAgent):
infected_neighbors = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors:
if self.prob(self.prob_cured_healing_infected):
- neighbor.state['id'] = 2 # Cured
+ neighbor.state["id"] = 2 # Cured
# Vaccinate
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_cured_vaccinate_neutral):
- neighbor.state['id'] = 3 # Vaccinated
+ neighbor.state["id"] = 3 # Vaccinated
# Generate anti-rumor
infected_neighbors_2 = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors_2:
if self.prob(self.prob_generate_anti_rumor):
- neighbor.state['id'] = 2 # Cured
+ neighbor.state["id"] = 2 # Cured
class ControlModelM2(BaseAgent):
@@ -112,63 +125,76 @@ class ControlModelM2(BaseAgent):
prob_neutral_making_denier
prob_infect
-
+
prob_cured_healing_infected
-
+
prob_cured_vaccinate_neutral
-
+
prob_vaccinated_healing_infected
-
+
prob_vaccinated_vaccinate_neutral
-
+
prob_generate_anti_rumor
"""
-
def __init__(self, model=None, unique_id=0, state=()):
super().__init__(model=environment, unique_id=unique_id, state=state)
- self.prob_neutral_making_denier = np.random.normal(environment.environment_params['prob_neutral_making_denier'],
- environment.environment_params['standard_variance'])
+ self.prob_neutral_making_denier = np.random.normal(
+ environment.environment_params["prob_neutral_making_denier"],
+ environment.environment_params["standard_variance"],
+ )
- self.prob_infect = np.random.normal(environment.environment_params['prob_infect'],
- environment.environment_params['standard_variance'])
+ self.prob_infect = np.random.normal(
+ environment.environment_params["prob_infect"],
+ environment.environment_params["standard_variance"],
+ )
- self.prob_cured_healing_infected = np.random.normal(environment.environment_params['prob_cured_healing_infected'],
- environment.environment_params['standard_variance'])
- self.prob_cured_vaccinate_neutral = np.random.normal(environment.environment_params['prob_cured_vaccinate_neutral'],
- environment.environment_params['standard_variance'])
+ self.prob_cured_healing_infected = np.random.normal(
+ environment.environment_params["prob_cured_healing_infected"],
+ environment.environment_params["standard_variance"],
+ )
+ self.prob_cured_vaccinate_neutral = np.random.normal(
+ environment.environment_params["prob_cured_vaccinate_neutral"],
+ environment.environment_params["standard_variance"],
+ )
- self.prob_vaccinated_healing_infected = np.random.normal(environment.environment_params['prob_vaccinated_healing_infected'],
- environment.environment_params['standard_variance'])
- self.prob_vaccinated_vaccinate_neutral = np.random.normal(environment.environment_params['prob_vaccinated_vaccinate_neutral'],
- environment.environment_params['standard_variance'])
- self.prob_generate_anti_rumor = np.random.normal(environment.environment_params['prob_generate_anti_rumor'],
- environment.environment_params['standard_variance'])
+ self.prob_vaccinated_healing_infected = np.random.normal(
+ environment.environment_params["prob_vaccinated_healing_infected"],
+ environment.environment_params["standard_variance"],
+ )
+ self.prob_vaccinated_vaccinate_neutral = np.random.normal(
+ environment.environment_params["prob_vaccinated_vaccinate_neutral"],
+ environment.environment_params["standard_variance"],
+ )
+ self.prob_generate_anti_rumor = np.random.normal(
+ environment.environment_params["prob_generate_anti_rumor"],
+ environment.environment_params["standard_variance"],
+ )
def step(self):
- if self.state['id'] == 0: # Neutral
+ if self.state["id"] == 0: # Neutral
self.neutral_behaviour()
- elif self.state['id'] == 1: # Infected
+ elif self.state["id"] == 1: # Infected
self.infected_behaviour()
- elif self.state['id'] == 2: # Cured
+ elif self.state["id"] == 2: # Cured
self.cured_behaviour()
- elif self.state['id'] == 3: # Vaccinated
+ elif self.state["id"] == 3: # Vaccinated
self.vaccinated_behaviour()
- elif self.state['id'] == 4: # Beacon-off
+ elif self.state["id"] == 4: # Beacon-off
self.beacon_off_behaviour()
- elif self.state['id'] == 5: # Beacon-on
+ elif self.state["id"] == 5: # Beacon-on
self.beacon_on_behaviour()
def neutral_behaviour(self):
- self.state['visible'] = False
+ self.state["visible"] = False
# Infected
infected_neighbors = self.get_neighboring_agents(state_id=1)
if len(infected_neighbors) > 0:
if self.random(self.prob_neutral_making_denier):
- self.state['id'] = 3 # Vaccinated making denier
+ self.state["id"] = 3 # Vaccinated making denier
def infected_behaviour(self):
@@ -176,69 +202,69 @@ class ControlModelM2(BaseAgent):
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_infect):
- neighbor.state['id'] = 1 # Infected
- self.state['visible'] = False
+ neighbor.state["id"] = 1 # Infected
+ self.state["visible"] = False
def cured_behaviour(self):
- self.state['visible'] = True
+ self.state["visible"] = True
# Vaccinate
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_cured_vaccinate_neutral):
- neighbor.state['id'] = 3 # Vaccinated
+ neighbor.state["id"] = 3 # Vaccinated
# Cure
infected_neighbors = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors:
if self.prob(self.prob_cured_healing_infected):
- neighbor.state['id'] = 2 # Cured
+ neighbor.state["id"] = 2 # Cured
def vaccinated_behaviour(self):
- self.state['visible'] = True
+ self.state["visible"] = True
# Cure
infected_neighbors = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors:
if self.prob(self.prob_cured_healing_infected):
- neighbor.state['id'] = 2 # Cured
+ neighbor.state["id"] = 2 # Cured
# Vaccinate
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_cured_vaccinate_neutral):
- neighbor.state['id'] = 3 # Vaccinated
+ neighbor.state["id"] = 3 # Vaccinated
# Generate anti-rumor
infected_neighbors_2 = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors_2:
if self.prob(self.prob_generate_anti_rumor):
- neighbor.state['id'] = 2 # Cured
+ neighbor.state["id"] = 2 # Cured
def beacon_off_behaviour(self):
- self.state['visible'] = False
+ self.state["visible"] = False
infected_neighbors = self.get_neighboring_agents(state_id=1)
if len(infected_neighbors) > 0:
- self.state['id'] == 5 # Beacon on
+ self.state["id"] == 5 # Beacon on
def beacon_on_behaviour(self):
- self.state['visible'] = False
+ self.state["visible"] = False
# Cure (M2 feature added)
infected_neighbors = self.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors:
if self.prob(self.prob_generate_anti_rumor):
- neighbor.state['id'] = 2 # Cured
+ neighbor.state["id"] = 2 # Cured
neutral_neighbors_infected = neighbor.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors_infected:
if self.prob(self.prob_generate_anti_rumor):
- neighbor.state['id'] = 3 # Vaccinated
+ neighbor.state["id"] = 3 # Vaccinated
infected_neighbors_infected = neighbor.get_neighboring_agents(state_id=1)
for neighbor in infected_neighbors_infected:
if self.prob(self.prob_generate_anti_rumor):
- neighbor.state['id'] = 2 # Cured
+ neighbor.state["id"] = 2 # Cured
# Vaccinate
neutral_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_cured_vaccinate_neutral):
- neighbor.state['id'] = 3 # Vaccinated
+ neighbor.state["id"] = 3 # Vaccinated
diff --git a/soil/agents/SISaModel.py b/soil/agents/SISaModel.py
index fa0d224..e298e8a 100644
--- a/soil/agents/SISaModel.py
+++ b/soil/agents/SISaModel.py
@@ -6,25 +6,25 @@ class SISaModel(FSM):
"""
Settings:
neutral_discontent_spon_prob
-
+
neutral_discontent_infected_prob
-
+
neutral_content_spon_prob
-
+
neutral_content_infected_prob
-
+
discontent_neutral
-
+
discontent_content
-
+
variance_d_c
-
+
content_discontent
-
+
variance_c_d
-
+
content_neutral
-
+
standard_variance
"""
@@ -33,24 +33,32 @@ class SISaModel(FSM):
random = np.random.default_rng(seed=self._seed)
- self.neutral_discontent_spon_prob = random.normal(self.env['neutral_discontent_spon_prob'],
- self.env['standard_variance'])
- self.neutral_discontent_infected_prob = random.normal(self.env['neutral_discontent_infected_prob'],
- self.env['standard_variance'])
- self.neutral_content_spon_prob = random.normal(self.env['neutral_content_spon_prob'],
- self.env['standard_variance'])
- self.neutral_content_infected_prob = random.normal(self.env['neutral_content_infected_prob'],
- self.env['standard_variance'])
+ self.neutral_discontent_spon_prob = random.normal(
+ self.env["neutral_discontent_spon_prob"], self.env["standard_variance"]
+ )
+ self.neutral_discontent_infected_prob = random.normal(
+ self.env["neutral_discontent_infected_prob"], self.env["standard_variance"]
+ )
+ self.neutral_content_spon_prob = random.normal(
+ self.env["neutral_content_spon_prob"], self.env["standard_variance"]
+ )
+ self.neutral_content_infected_prob = random.normal(
+ self.env["neutral_content_infected_prob"], self.env["standard_variance"]
+ )
- self.discontent_neutral = random.normal(self.env['discontent_neutral'],
- self.env['standard_variance'])
- self.discontent_content = random.normal(self.env['discontent_content'],
- self.env['variance_d_c'])
+ self.discontent_neutral = random.normal(
+ self.env["discontent_neutral"], self.env["standard_variance"]
+ )
+ self.discontent_content = random.normal(
+ self.env["discontent_content"], self.env["variance_d_c"]
+ )
- self.content_discontent = random.normal(self.env['content_discontent'],
- self.env['variance_c_d'])
- self.content_neutral = random.normal(self.env['content_neutral'],
- self.env['standard_variance'])
+ self.content_discontent = random.normal(
+ self.env["content_discontent"], self.env["variance_c_d"]
+ )
+ self.content_neutral = random.normal(
+ self.env["content_neutral"], self.env["standard_variance"]
+ )
@state
def neutral(self):
@@ -88,7 +96,9 @@ class SISaModel(FSM):
return self.neutral
# Superinfected
- discontent_neighbors = self.count_neighboring_agents(state_id=self.discontent.id)
+ discontent_neighbors = self.count_neighboring_agents(
+ state_id=self.discontent.id
+ )
if self.prob(scontent_neighbors * self.content_discontent):
self.discontent
return self.content
diff --git a/soil/agents/SentimentCorrelationModel.py b/soil/agents/SentimentCorrelationModel.py
index 96907aa..721d026 100644
--- a/soil/agents/SentimentCorrelationModel.py
+++ b/soil/agents/SentimentCorrelationModel.py
@@ -5,27 +5,31 @@ class SentimentCorrelationModel(BaseAgent):
"""
Settings:
outside_effects_prob
-
+
anger_prob
-
+
joy_prob
-
+
sadness_prob
-
+
disgust_prob
"""
def __init__(self, environment, unique_id=0, state=()):
super().__init__(model=environment, unique_id=unique_id, state=state)
- self.outside_effects_prob = environment.environment_params['outside_effects_prob']
- self.anger_prob = environment.environment_params['anger_prob']
- self.joy_prob = environment.environment_params['joy_prob']
- self.sadness_prob = environment.environment_params['sadness_prob']
- self.disgust_prob = environment.environment_params['disgust_prob']
- self.state['time_awareness'] = []
+ self.outside_effects_prob = environment.environment_params[
+ "outside_effects_prob"
+ ]
+ self.anger_prob = environment.environment_params["anger_prob"]
+ self.joy_prob = environment.environment_params["joy_prob"]
+ self.sadness_prob = environment.environment_params["sadness_prob"]
+ self.disgust_prob = environment.environment_params["disgust_prob"]
+ self.state["time_awareness"] = []
for i in range(4): # In this model we have 4 sentiments
- self.state['time_awareness'].append(0) # 0-> Anger, 1-> joy, 2->sadness, 3 -> disgust
- self.state['sentimentCorrelation'] = 0
+ self.state["time_awareness"].append(
+ 0
+ ) # 0-> Anger, 1-> joy, 2->sadness, 3 -> disgust
+ self.state["sentimentCorrelation"] = 0
def step(self):
self.behaviour()
@@ -39,63 +43,73 @@ class SentimentCorrelationModel(BaseAgent):
angry_neighbors = self.get_neighboring_agents(state_id=1)
for x in angry_neighbors:
- if x.state['time_awareness'][0] > (self.env.now-500):
+ if x.state["time_awareness"][0] > (self.env.now - 500):
angry_neighbors_1_time_step.append(x)
num_neighbors_angry = len(angry_neighbors_1_time_step)
joyful_neighbors = self.get_neighboring_agents(state_id=2)
for x in joyful_neighbors:
- if x.state['time_awareness'][1] > (self.env.now-500):
+ if x.state["time_awareness"][1] > (self.env.now - 500):
joyful_neighbors_1_time_step.append(x)
num_neighbors_joyful = len(joyful_neighbors_1_time_step)
sad_neighbors = self.get_neighboring_agents(state_id=3)
for x in sad_neighbors:
- if x.state['time_awareness'][2] > (self.env.now-500):
+ if x.state["time_awareness"][2] > (self.env.now - 500):
sad_neighbors_1_time_step.append(x)
num_neighbors_sad = len(sad_neighbors_1_time_step)
disgusted_neighbors = self.get_neighboring_agents(state_id=4)
for x in disgusted_neighbors:
- if x.state['time_awareness'][3] > (self.env.now-500):
+ if x.state["time_awareness"][3] > (self.env.now - 500):
disgusted_neighbors_1_time_step.append(x)
num_neighbors_disgusted = len(disgusted_neighbors_1_time_step)
- anger_prob = self.anger_prob+(len(angry_neighbors_1_time_step)*self.anger_prob)
- joy_prob = self.joy_prob+(len(joyful_neighbors_1_time_step)*self.joy_prob)
- sadness_prob = self.sadness_prob+(len(sad_neighbors_1_time_step)*self.sadness_prob)
- disgust_prob = self.disgust_prob+(len(disgusted_neighbors_1_time_step)*self.disgust_prob)
+ anger_prob = self.anger_prob + (
+ len(angry_neighbors_1_time_step) * self.anger_prob
+ )
+ joy_prob = self.joy_prob + (len(joyful_neighbors_1_time_step) * self.joy_prob)
+ sadness_prob = self.sadness_prob + (
+ len(sad_neighbors_1_time_step) * self.sadness_prob
+ )
+ disgust_prob = self.disgust_prob + (
+ len(disgusted_neighbors_1_time_step) * self.disgust_prob
+ )
outside_effects_prob = self.outside_effects_prob
num = self.random.random()
- if num anger_prob:
- self.state['id'] = 1
- self.state['sentimentCorrelation'] = 1
- self.state['time_awareness'][self.state['id']-1] = self.env.now
- elif (numanger_prob):
+ self.state["id"] = 2
+ self.state["sentimentCorrelation"] = 2
+ self.state["time_awareness"][self.state["id"] - 1] = self.env.now
+ elif num < sadness_prob + anger_prob + joy_prob and num > joy_prob + anger_prob:
- self.state['id'] = 2
- self.state['sentimentCorrelation'] = 2
- self.state['time_awareness'][self.state['id']-1] = self.env.now
- elif (numjoy_prob+anger_prob):
+ self.state["id"] = 3
+ self.state["sentimentCorrelation"] = 3
+ self.state["time_awareness"][self.state["id"] - 1] = self.env.now
+ elif (
+ num < disgust_prob + sadness_prob + anger_prob + joy_prob
+ and num > sadness_prob + anger_prob + joy_prob
+ ):
- self.state['id'] = 3
- self.state['sentimentCorrelation'] = 3
- self.state['time_awareness'][self.state['id']-1] = self.env.now
- elif (numsadness_prob+anger_prob+joy_prob):
+ self.state["id"] = 4
+ self.state["sentimentCorrelation"] = 4
+ self.state["time_awareness"][self.state["id"] - 1] = self.env.now
- self.state['id'] = 4
- self.state['sentimentCorrelation'] = 4
- self.state['time_awareness'][self.state['id']-1] = self.env.now
-
- self.state['sentiment'] = self.state['id']
+ self.state["sentiment"] = self.state["id"]
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index ad3e4a7..c284604 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -20,13 +20,13 @@ from typing import Dict, List
from .. import serialization, utils, time, config
-
def as_node(agent):
if isinstance(agent, BaseAgent):
return agent.id
return agent
-IGNORED_FIELDS = ('model', 'logger')
+
+IGNORED_FIELDS = ("model", "logger")
class DeadAgent(Exception):
@@ -43,13 +43,18 @@ class MetaAgent(ABCMeta):
defaults.update(i._defaults)
new_nmspc = {
- '_defaults': defaults,
+ "_defaults": defaults,
}
for attr, func in namespace.items():
- if isinstance(func, types.FunctionType) or isinstance(func, property) or isinstance(func, classmethod) or attr[0] == '_':
+ if (
+ isinstance(func, types.FunctionType)
+ or isinstance(func, property)
+ or isinstance(func, classmethod)
+ or attr[0] == "_"
+ ):
new_nmspc[attr] = func
- elif attr == 'defaults':
+ elif attr == "defaults":
defaults.update(func)
else:
defaults[attr] = copy(func)
@@ -69,12 +74,7 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
Any attribute that is not preceded by an underscore (`_`) will also be added to its state.
"""
- def __init__(self,
- unique_id,
- model,
- name=None,
- interval=None,
- **kwargs):
+ def __init__(self, unique_id, model, name=None, interval=None, **kwargs):
# Check for REQUIRED arguments
# Initialize agent parameters
if isinstance(unique_id, MesaAgent):
@@ -82,16 +82,19 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
assert isinstance(unique_id, int)
super().__init__(unique_id=unique_id, model=model)
- self.name = str(name) if name else'{}[{}]'.format(type(self).__name__, self.unique_id)
-
+ self.name = (
+ str(name) if name else "{}[{}]".format(type(self).__name__, self.unique_id)
+ )
self.alive = True
- self.interval = interval or self.get('interval', 1)
- logger = utils.logger.getChild(getattr(self.model, 'id', self.model)).getChild(self.name)
- self.logger = logging.LoggerAdapter(logger, {'agent_name': self.name})
+ self.interval = interval or self.get("interval", 1)
+ logger = utils.logger.getChild(getattr(self.model, "id", self.model)).getChild(
+ self.name
+ )
+ self.logger = logging.LoggerAdapter(logger, {"agent_name": self.name})
- if hasattr(self, 'level'):
+ if hasattr(self, "level"):
self.logger.setLevel(self.level)
for (k, v) in self._defaults.items():
@@ -117,20 +120,22 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
def from_dict(cls, model, attrs, warn_extra=True):
ignored = {}
args = {}
- for k, v in attrs.items():
+ for k, v in attrs.items():
if k in inspect.signature(cls).parameters:
args[k] = v
else:
ignored[k] = v
if ignored and warn_extra:
- utils.logger.info(f'Ignoring the following arguments for agent class { agent_class.__name__ }: { ignored }')
+ utils.logger.info(
+ f"Ignoring the following arguments for agent class { agent_class.__name__ }: { ignored }"
+ )
return cls(model=model, **args)
def __getitem__(self, key):
try:
return getattr(self, key)
except AttributeError:
- raise KeyError(f'key {key} not found in agent')
+ raise KeyError(f"key {key} not found in agent")
def __delitem__(self, key):
return delattr(self, key)
@@ -148,7 +153,7 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
return self.items()
def keys(self):
- return (k for k in self.__dict__ if k[0] != '_' and k not in IGNORED_FIELDS)
+ return (k for k in self.__dict__ if k[0] != "_" and k not in IGNORED_FIELDS)
def items(self, keys=None, skip=None):
keys = keys if keys is not None else self.keys()
@@ -156,7 +161,7 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
if skip:
return filter(lambda x: x[0] not in skip, it)
return it
-
+
def get(self, key, default=None):
return self[key] if key in self else default
@@ -169,7 +174,7 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
return None
def die(self):
- self.info(f'agent dying')
+ self.info(f"agent dying")
self.alive = False
return time.NEVER
@@ -186,9 +191,9 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
for k, v in kwargs:
message += " {k}={v} ".format(k, v)
extra = {}
- extra['now'] = self.now
- extra['unique_id'] = self.unique_id
- extra['agent_name'] = self.name
+ extra["now"] = self.now
+ extra["unique_id"] = self.unique_id
+ extra["agent_name"] = self.name
return self.logger.log(level, message, extra=extra)
def debug(self, *args, **kwargs):
@@ -214,10 +219,10 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
content = dict(self.items(keys=keys))
if pretty and content:
d = content
- content = '\n'
+ content = "\n"
for k, v in d.items():
- content += f'- {k}: {v}\n'
- content = textwrap.indent(content, ' ')
+ content += f"- {k}: {v}\n"
+ content = textwrap.indent(content, " ")
return f"{repr(self)}{content}"
def __repr__(self):
@@ -225,7 +230,6 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
class NetworkAgent(BaseAgent):
-
def __init__(self, *args, topology, node_id, **kwargs):
super().__init__(*args, **kwargs)
@@ -248,18 +252,21 @@ class NetworkAgent(BaseAgent):
def node(self):
return self.topology.nodes[self.node_id]
-
def iter_agents(self, unique_id=None, *, limit_neighbors=False, **kwargs):
unique_ids = None
if isinstance(unique_id, list):
unique_ids = set(unique_id)
elif unique_id is not None:
- unique_ids = set([unique_id,])
+ unique_ids = set(
+ [
+ unique_id,
+ ]
+ )
if limit_neighbors:
neighbor_ids = set()
for node_id in self.G.neighbors(self.node_id):
- if self.G.nodes[node_id].get('agent') is not None:
+ if self.G.nodes[node_id].get("agent") is not None:
neighbor_ids.add(node_id)
if unique_ids:
unique_ids = unique_ids & neighbor_ids
@@ -272,7 +279,9 @@ class NetworkAgent(BaseAgent):
def subgraph(self, center=True, **kwargs):
include = [self] if center else []
- G = self.G.subgraph(n.node_id for n in list(self.get_agents(**kwargs)+include))
+ G = self.G.subgraph(
+ n.node_id for n in list(self.get_agents(**kwargs) + include)
+ )
return G
def remove_node(self):
@@ -280,11 +289,19 @@ class NetworkAgent(BaseAgent):
def add_edge(self, other, edge_attr_dict=None, *edge_attrs):
if self.node_id not in self.G.nodes(data=False):
- raise ValueError('{} not in list of existing agents in the network'.format(self.unique_id))
+ raise ValueError(
+ "{} not in list of existing agents in the network".format(
+ self.unique_id
+ )
+ )
if other.node_id not in self.G.nodes(data=False):
- raise ValueError('{} not in list of existing agents in the network'.format(other))
+ raise ValueError(
+ "{} not in list of existing agents in the network".format(other)
+ )
- self.G.add_edge(self.node_id, other.node_id, edge_attr_dict=edge_attr_dict, *edge_attrs)
+ self.G.add_edge(
+ self.node_id, other.node_id, edge_attr_dict=edge_attr_dict, *edge_attrs
+ )
def die(self, remove=True):
if remove:
@@ -294,11 +311,11 @@ class NetworkAgent(BaseAgent):
def state(name=None):
def decorator(func, name=None):
- '''
+ """
A state function should return either a state id, or a tuple (state_id, when)
The default value for state_id is the current state id.
The default value for when is the interval defined in the environment.
- '''
+ """
if inspect.isgeneratorfunction(func):
orig_func = func
@@ -348,32 +365,38 @@ class MetaFSM(MetaAgent):
# Add new states
for attr, func in namespace.items():
- if hasattr(func, 'id'):
+ if hasattr(func, "id"):
if func.is_default:
default_state = func
states[func.id] = func
- namespace.update({
- '_default_state': default_state,
- '_states': states,
- })
+ namespace.update(
+ {
+ "_default_state": default_state,
+ "_states": states,
+ }
+ )
- return super(MetaFSM, mcls).__new__(mcls=mcls, name=name, bases=bases, namespace=namespace)
+ return super(MetaFSM, mcls).__new__(
+ mcls=mcls, name=name, bases=bases, namespace=namespace
+ )
class FSM(BaseAgent, metaclass=MetaFSM):
def __init__(self, *args, **kwargs):
super(FSM, self).__init__(*args, **kwargs)
- if not hasattr(self, 'state_id'):
+ if not hasattr(self, "state_id"):
if not self._default_state:
- raise ValueError('No default state specified for {}'.format(self.unique_id))
+ raise ValueError(
+ "No default state specified for {}".format(self.unique_id)
+ )
self.state_id = self._default_state.id
self._coroutine = None
self.set_state(self.state_id)
def step(self):
- self.debug(f'Agent {self.unique_id} @ state {self.state_id}')
+ self.debug(f"Agent {self.unique_id} @ state {self.state_id}")
default_interval = super().step()
next_state = self._states[self.state_id](self)
@@ -386,7 +409,9 @@ class FSM(BaseAgent, metaclass=MetaFSM):
elif len(when) == 1:
when = when[0]
else:
- raise ValueError('Too many values returned. Only state (and time) allowed')
+ raise ValueError(
+ "Too many values returned. Only state (and time) allowed"
+ )
except TypeError:
pass
@@ -396,10 +421,10 @@ class FSM(BaseAgent, metaclass=MetaFSM):
return when or default_interval
def set_state(self, state, when=None):
- if hasattr(state, 'id'):
+ if hasattr(state, "id"):
state = state.id
if state not in self._states:
- raise ValueError('{} is not a valid state'.format(state))
+ raise ValueError("{} is not a valid state".format(state))
self.state_id = state
if when is not None:
self.model.schedule.add(self, when=when)
@@ -414,23 +439,22 @@ class FSM(BaseAgent, metaclass=MetaFSM):
def prob(prob, random):
- '''
+ """
A true/False uniform distribution with a given probability.
To be used like this:
.. code-block:: python
-
+
if prob(0.3):
do_something()
- '''
+ """
r = random.random()
return r < prob
-def calculate_distribution(network_agents=None,
- agent_class=None):
- '''
+def calculate_distribution(network_agents=None, agent_class=None):
+ """
Calculate the threshold values (thresholds for a uniform distribution)
of an agent distribution given the weights of each agent type.
@@ -453,26 +477,28 @@ def calculate_distribution(network_agents=None,
In this example, 20% of the nodes will be marked as type
'agent_class_1'.
- '''
+ """
if network_agents:
- network_agents = [deepcopy(agent) for agent in network_agents if not hasattr(agent, 'id')]
+ network_agents = [
+ deepcopy(agent) for agent in network_agents if not hasattr(agent, "id")
+ ]
elif agent_class:
- network_agents = [{'agent_class': agent_class}]
+ network_agents = [{"agent_class": agent_class}]
else:
- raise ValueError('Specify a distribution or a default agent type')
+ raise ValueError("Specify a distribution or a default agent type")
# Fix missing weights and incompatible types
for x in network_agents:
- x['weight'] = float(x.get('weight', 1))
+ x["weight"] = float(x.get("weight", 1))
# Calculate the thresholds
- total = sum(x['weight'] for x in network_agents)
+ total = sum(x["weight"] for x in network_agents)
acc = 0
for v in network_agents:
- if 'ids' in v:
+ if "ids" in v:
continue
- upper = acc + (v['weight']/total)
- v['threshold'] = [acc, upper]
+ upper = acc + (v["weight"] / total)
+ v["threshold"] = [acc, upper]
acc = upper
return network_agents
@@ -480,28 +506,29 @@ def calculate_distribution(network_agents=None,
def serialize_type(agent_class, known_modules=[], **kwargs):
if isinstance(agent_class, str):
return agent_class
- known_modules += ['soil.agents']
- return serialization.serialize(agent_class, known_modules=known_modules, **kwargs)[1] # Get the name of the class
+ known_modules += ["soil.agents"]
+ return serialization.serialize(agent_class, known_modules=known_modules, **kwargs)[
+ 1
+ ] # Get the name of the class
def serialize_definition(network_agents, known_modules=[]):
- '''
+ """
When serializing an agent distribution, remove the thresholds, in order
to avoid cluttering the YAML definition file.
- '''
+ """
d = deepcopy(list(network_agents))
for v in d:
- if 'threshold' in v:
- del v['threshold']
- v['agent_class'] = serialize_type(v['agent_class'],
- known_modules=known_modules)
+ if "threshold" in v:
+ del v["threshold"]
+ v["agent_class"] = serialize_type(v["agent_class"], known_modules=known_modules)
return d
def deserialize_type(agent_class, known_modules=[]):
if not isinstance(agent_class, str):
return agent_class
- known = known_modules + ['soil.agents', 'soil.agents.custom' ]
+ known = known_modules + ["soil.agents", "soil.agents.custom"]
agent_class = serialization.deserializer(agent_class, known_modules=known)
return agent_class
@@ -509,12 +536,12 @@ def deserialize_type(agent_class, known_modules=[]):
def deserialize_definition(ind, **kwargs):
d = deepcopy(ind)
for v in d:
- v['agent_class'] = deserialize_type(v['agent_class'], **kwargs)
+ v["agent_class"] = deserialize_type(v["agent_class"], **kwargs)
return d
def _validate_states(states, topology):
- '''Validate states to avoid ignoring states during initialization'''
+ """Validate states to avoid ignoring states during initialization"""
states = states or []
if isinstance(states, dict):
for x in states:
@@ -525,7 +552,7 @@ def _validate_states(states, topology):
def _convert_agent_classs(ind, to_string=False, **kwargs):
- '''Convenience method to allow specifying agents by class or class name.'''
+ """Convenience method to allow specifying agents by class or class name."""
if to_string:
return serialize_definition(ind, **kwargs)
return deserialize_definition(ind, **kwargs)
@@ -609,12 +636,10 @@ def _convert_agent_classs(ind, to_string=False, **kwargs):
class AgentView(Mapping, Set):
- """A lazy-loaded list of agents.
- """
+ """A lazy-loaded list of agents."""
__slots__ = ("_agents",)
-
def __init__(self, agents):
self._agents = agents
@@ -657,11 +682,20 @@ class AgentView(Mapping, Set):
return f"{self.__class__.__name__}({self})"
-def filter_agents(agents, *id_args, unique_id=None, state_id=None, agent_class=None, ignore=None, state=None,
- limit=None, **kwargs):
- '''
+def filter_agents(
+ agents,
+ *id_args,
+ unique_id=None,
+ state_id=None,
+ agent_class=None,
+ ignore=None,
+ state=None,
+ limit=None,
+ **kwargs,
+):
+ """
Filter agents given as a dict, by the criteria given as arguments (e.g., certain type or state id).
- '''
+ """
assert isinstance(agents, dict)
ids = []
@@ -694,7 +728,7 @@ def filter_agents(agents, *id_args, unique_id=None, state_id=None, agent_class=N
f = filter(lambda x: x not in ignore, f)
if state_id is not None:
- f = filter(lambda agent: agent.get('state_id', None) in state_id, f)
+ f = filter(lambda agent: agent.get("state_id", None) in state_id, f)
if agent_class is not None:
f = filter(lambda agent: isinstance(agent, agent_class), f)
@@ -711,23 +745,25 @@ def filter_agents(agents, *id_args, unique_id=None, state_id=None, agent_class=N
yield from f
-def from_config(cfg: config.AgentConfig, random, topology: nx.Graph = None) -> List[Dict[str, Any]]:
- '''
+def from_config(
+ cfg: config.AgentConfig, random, topology: nx.Graph = None
+) -> List[Dict[str, Any]]:
+ """
This function turns an agentconfig into a list of individual "agent specifications", which are just a dictionary
with the parameters that the environment will use to construct each agent.
This function does NOT return a list of agents, mostly because some attributes to the agent are not known at the
time of calling this function, such as `unique_id`.
- '''
+ """
default = cfg or config.AgentConfig()
if not isinstance(cfg, config.AgentConfig):
cfg = config.AgentConfig(**cfg)
return _agents_from_config(cfg, topology=topology, random=random)
-def _agents_from_config(cfg: config.AgentConfig,
- topology: nx.Graph,
- random) -> List[Dict[str, Any]]:
+def _agents_from_config(
+ cfg: config.AgentConfig, topology: nx.Graph, random
+) -> List[Dict[str, Any]]:
if cfg and not isinstance(cfg, config.AgentConfig):
cfg = config.AgentConfig(**cfg)
@@ -737,7 +773,9 @@ def _agents_from_config(cfg: config.AgentConfig,
assigned_network = 0
if cfg.fixed is not None:
- agents, assigned_total, assigned_network = _from_fixed(cfg.fixed, topology=cfg.topology, default=cfg)
+ agents, assigned_total, assigned_network = _from_fixed(
+ cfg.fixed, topology=cfg.topology, default=cfg
+ )
n = cfg.n
@@ -749,46 +787,56 @@ def _agents_from_config(cfg: config.AgentConfig,
for d in cfg.distribution:
if d.strategy == config.Strategy.topology:
- topo = d.topology if ('topology' in d.__fields_set__) else cfg.topology
+ topo = d.topology if ("topology" in d.__fields_set__) else cfg.topology
if not topo:
- raise ValueError('The "topology" strategy only works if the topology parameter is set to True')
+ raise ValueError(
+ 'The "topology" strategy only works if the topology parameter is set to True'
+ )
if not topo_size:
- raise ValueError(f'Topology does not have enough free nodes to assign one to the agent')
+ raise ValueError(
+ f"Topology does not have enough free nodes to assign one to the agent"
+ )
networked.append(d)
if d.strategy == config.Strategy.total:
if not cfg.n:
- raise ValueError('Cannot use the "total" strategy without providing the total number of agents')
+ raise ValueError(
+ 'Cannot use the "total" strategy without providing the total number of agents'
+ )
total.append(d)
-
if networked:
- new_agents = _from_distro(networked,
- n= topo_size - assigned_network,
- topology=topo,
- default=cfg,
- random=random)
+ new_agents = _from_distro(
+ networked,
+ n=topo_size - assigned_network,
+ topology=topo,
+ default=cfg,
+ random=random,
+ )
assigned_total += len(new_agents)
assigned_network += len(new_agents)
agents += new_agents
if total:
- remaining = n - assigned_total
- agents += _from_distro(total, n=remaining,
- default=cfg,
- random=random)
-
+ remaining = n - assigned_total
+ agents += _from_distro(total, n=remaining, default=cfg, random=random)
if assigned_network < topo_size:
- utils.logger.warn(f'The total number of agents does not match the total number of nodes in '
- 'every topology. This may be due to a definition error: assigned: '
- f'{ assigned } total size: { topo_size }')
+ utils.logger.warn(
+ f"The total number of agents does not match the total number of nodes in "
+ "every topology. This may be due to a definition error: assigned: "
+ f"{ assigned } total size: { topo_size }"
+ )
return agents
-def _from_fixed(lst: List[config.FixedAgentConfig], topology: bool, default: config.SingleAgentConfig) -> List[Dict[str, Any]]:
+def _from_fixed(
+ lst: List[config.FixedAgentConfig],
+ topology: bool,
+ default: config.SingleAgentConfig,
+) -> List[Dict[str, Any]]:
agents = []
counts_total = 0
@@ -799,12 +847,18 @@ def _from_fixed(lst: List[config.FixedAgentConfig], topology: bool, default: con
if default:
agent = default.state.copy()
agent.update(fixed.state)
- cls = serialization.deserialize(fixed.agent_class or (default and default.agent_class))
- agent['agent_class'] = cls
- topo = fixed.topology if ('topology' in fixed.__fields_set__) else topology or default.topology
+ cls = serialization.deserialize(
+ fixed.agent_class or (default and default.agent_class)
+ )
+ agent["agent_class"] = cls
+ topo = (
+ fixed.topology
+ if ("topology" in fixed.__fields_set__)
+ else topology or default.topology
+ )
if topo:
- agent['topology'] = True
+ agent["topology"] = True
counts_network += 1
if not fixed.hidden:
counts_total += 1
@@ -813,17 +867,21 @@ def _from_fixed(lst: List[config.FixedAgentConfig], topology: bool, default: con
return agents, counts_total, counts_network
-def _from_distro(distro: List[config.AgentDistro],
- n: int,
- topology: str,
- default: config.SingleAgentConfig,
- random) -> List[Dict[str, Any]]:
+def _from_distro(
+ distro: List[config.AgentDistro],
+ n: int,
+ topology: str,
+ default: config.SingleAgentConfig,
+ random,
+) -> List[Dict[str, Any]]:
agents = []
if n is None:
if any(lambda dist: dist.n is None, distro):
- raise ValueError('You must provide a total number of agents, or the number of each type')
+ raise ValueError(
+ "You must provide a total number of agents, or the number of each type"
+ )
n = sum(dist.n for dist in distro)
weights = list(dist.weight if dist.weight is not None else 1 for dist in distro)
@@ -836,29 +894,40 @@ def _from_distro(distro: List[config.AgentDistro],
# So instead we calculate our own distribution to make sure the actual ratios are close to what we would expect
# Calculate how many times each has to appear
- indices = list(chain.from_iterable([idx] * int(n*chunk) for (idx, n) in enumerate(norm)))
+ indices = list(
+ chain.from_iterable([idx] * int(n * chunk) for (idx, n) in enumerate(norm))
+ )
# Complete with random agents following the original weight distribution
if len(indices) < n:
- indices += random.choices(list(range(len(distro))), weights=[d.weight for d in distro], k=n-len(indices))
+ indices += random.choices(
+ list(range(len(distro))),
+ weights=[d.weight for d in distro],
+ k=n - len(indices),
+ )
# Deserialize classes for efficiency
- classes = list(serialization.deserialize(i.agent_class or default.agent_class) for i in distro)
+ classes = list(
+ serialization.deserialize(i.agent_class or default.agent_class) for i in distro
+ )
# Add them in random order
random.shuffle(indices)
-
for idx in indices:
d = distro[idx]
agent = d.state.copy()
cls = classes[idx]
- agent['agent_class'] = cls
+ agent["agent_class"] = cls
if default:
agent.update(default.state)
- topology = d.topology if ('topology' in d.__fields_set__) else topology or default.topology
+ topology = (
+ d.topology
+ if ("topology" in d.__fields_set__)
+ else topology or default.topology
+ )
if topology:
- agent['topology'] = topology
+ agent["topology"] = topology
agents.append(agent)
return agents
@@ -877,4 +946,5 @@ try:
from .Geo import Geo
except ImportError:
import sys
- print('Could not load the Geo Agent, scipy is not installed', file=sys.stderr)
+
+ print("Could not load the Geo Agent, scipy is not installed", file=sys.stderr)
diff --git a/soil/config.py b/soil/config.py
index 7b39154..8dbbffa 100644
--- a/soil/config.py
+++ b/soil/config.py
@@ -19,6 +19,7 @@ import networkx as nx
# Could use TypeAlias in python >= 3.10
nodeId = int
+
class Node(BaseModel):
id: nodeId
state: Optional[Dict[str, Any]] = {}
@@ -38,7 +39,7 @@ class Topology(BaseModel):
class NetParams(BaseModel, extra=Extra.allow):
generator: Union[Callable, str]
- n: int
+ n: int
class NetConfig(BaseModel):
@@ -54,14 +55,15 @@ class NetConfig(BaseModel):
return NetConfig(topology=None, params=None)
@root_validator
- def validate_all(cls, values):
- if 'params' not in values and 'topology' not in values:
- raise ValueError('You must specify either a topology or the parameters to generate a graph')
+ def validate_all(cls, values):
+ if "params" not in values and "topology" not in values:
+ raise ValueError(
+ "You must specify either a topology or the parameters to generate a graph"
+ )
return values
class EnvConfig(BaseModel):
-
@staticmethod
def default():
return EnvConfig()
@@ -80,9 +82,11 @@ class FixedAgentConfig(SingleAgentConfig):
hidden: Optional[bool] = False # Do not count this agent towards total agent count
@root_validator
- def validate_all(cls, values):
- if values.get('unique_id', None) is not None and values.get('n', 1) > 1:
- raise ValueError(f"An unique_id can only be provided when there is only one agent ({values.get('n')} given)")
+ def validate_all(cls, values):
+ if values.get("unique_id", None) is not None and values.get("n", 1) > 1:
+ raise ValueError(
+ f"An unique_id can only be provided when there is only one agent ({values.get('n')} given)"
+ )
return values
@@ -91,8 +95,8 @@ class OverrideAgentConfig(FixedAgentConfig):
class Strategy(Enum):
- topology = 'topology'
- total = 'total'
+ topology = "topology"
+ total = "total"
class AgentDistro(SingleAgentConfig):
@@ -111,16 +115,20 @@ class AgentConfig(SingleAgentConfig):
return AgentConfig()
@root_validator
- def validate_all(cls, values):
- if 'distribution' in values and ('n' not in values and 'topology' not in values):
- raise ValueError("You need to provide the number of agents or a topology to extract the value from.")
+ def validate_all(cls, values):
+ if "distribution" in values and (
+ "n" not in values and "topology" not in values
+ ):
+ raise ValueError(
+ "You need to provide the number of agents or a topology to extract the value from."
+ )
return values
class Config(BaseModel, extra=Extra.allow):
- version: Optional[str] = '1'
+ version: Optional[str] = "1"
- name: str = 'Unnamed Simulation'
+ name: str = "Unnamed Simulation"
description: Optional[str] = None
group: str = None
dir_path: Optional[str] = None
@@ -140,45 +148,48 @@ class Config(BaseModel, extra=Extra.allow):
def from_raw(cls, cfg):
if isinstance(cfg, Config):
return cfg
- if cfg.get('version', '1') == '1' and any(k in cfg for k in ['agents', 'agent_class', 'topology', 'environment_class']):
+ if cfg.get("version", "1") == "1" and any(
+ k in cfg for k in ["agents", "agent_class", "topology", "environment_class"]
+ ):
return convert_old(cfg)
return Config(**cfg)
def convert_old(old, strict=True):
- '''
+ """
Try to convert old style configs into the new format.
This is still a work in progress and might not work in many cases.
- '''
+ """
- utils.logger.warning('The old configuration format is deprecated. The converted file MAY NOT yield the right results')
+ utils.logger.warning(
+ "The old configuration format is deprecated. The converted file MAY NOT yield the right results"
+ )
new = old.copy()
network = {}
- if 'topology' in old:
- del new['topology']
- network['topology'] = old['topology']
+ if "topology" in old:
+ del new["topology"]
+ network["topology"] = old["topology"]
- if 'network_params' in old and old['network_params']:
- del new['network_params']
- for (k, v) in old['network_params'].items():
- if k == 'path':
- network['path'] = v
+ if "network_params" in old and old["network_params"]:
+ del new["network_params"]
+ for (k, v) in old["network_params"].items():
+ if k == "path":
+ network["path"] = v
else:
- network.setdefault('params', {})[k] = v
+ network.setdefault("params", {})[k] = v
topology = None
if network:
topology = network
-
- agents = {'fixed': [], 'distribution': []}
+ agents = {"fixed": [], "distribution": []}
def updated_agent(agent):
- '''Convert an agent definition'''
+ """Convert an agent definition"""
newagent = dict(agent)
return newagent
@@ -186,80 +197,74 @@ def convert_old(old, strict=True):
fixed = []
override = []
- if 'environment_agents' in new:
+ if "environment_agents" in new:
- for agent in new['environment_agents']:
- agent.setdefault('state', {})['group'] = 'environment'
- if 'agent_id' in agent:
- agent['state']['name'] = agent['agent_id']
- del agent['agent_id']
- agent['hidden'] = True
- agent['topology'] = False
+ for agent in new["environment_agents"]:
+ agent.setdefault("state", {})["group"] = "environment"
+ if "agent_id" in agent:
+ agent["state"]["name"] = agent["agent_id"]
+ del agent["agent_id"]
+ agent["hidden"] = True
+ agent["topology"] = False
fixed.append(updated_agent(agent))
- del new['environment_agents']
+ del new["environment_agents"]
+ if "agent_class" in old:
+ del new["agent_class"]
+ agents["agent_class"] = old["agent_class"]
- if 'agent_class' in old:
- del new['agent_class']
- agents['agent_class'] = old['agent_class']
+ if "default_state" in old:
+ del new["default_state"]
+ agents["state"] = old["default_state"]
- if 'default_state' in old:
- del new['default_state']
- agents['state'] = old['default_state']
+ if "network_agents" in old:
+ agents["topology"] = True
- if 'network_agents' in old:
- agents['topology'] = True
+ agents.setdefault("state", {})["group"] = "network"
- agents.setdefault('state', {})['group'] = 'network'
-
- for agent in new['network_agents']:
+ for agent in new["network_agents"]:
agent = updated_agent(agent)
- if 'agent_id' in agent:
- agent['state']['name'] = agent['agent_id']
- del agent['agent_id']
+ if "agent_id" in agent:
+ agent["state"]["name"] = agent["agent_id"]
+ del agent["agent_id"]
fixed.append(agent)
else:
by_weight.append(agent)
- del new['network_agents']
+ del new["network_agents"]
- if 'agent_class' in old and (not fixed and not by_weight):
- agents['topology'] = True
- by_weight = [{'agent_class': old['agent_class'], 'weight': 1}]
+ if "agent_class" in old and (not fixed and not by_weight):
+ agents["topology"] = True
+ by_weight = [{"agent_class": old["agent_class"], "weight": 1}]
-
# TODO: translate states properly
- if 'states' in old:
- del new['states']
- states = old['states']
+ if "states" in old:
+ del new["states"]
+ states = old["states"]
if isinstance(states, dict):
states = states.items()
else:
states = enumerate(states)
for (k, v) in states:
- override.append({'filter': {'node_id': k},
- 'state': v})
-
- agents['override'] = override
- agents['fixed'] = fixed
- agents['distribution'] = by_weight
+ override.append({"filter": {"node_id": k}, "state": v})
+ agents["override"] = override
+ agents["fixed"] = fixed
+ agents["distribution"] = by_weight
model_params = {}
- if 'environment_params' in new:
- del new['environment_params']
- model_params = dict(old['environment_params'])
+ if "environment_params" in new:
+ del new["environment_params"]
+ model_params = dict(old["environment_params"])
- if 'environment_class' in old:
- del new['environment_class']
- new['model_class'] = old['environment_class']
+ if "environment_class" in old:
+ del new["environment_class"]
+ new["model_class"] = old["environment_class"]
- if 'dump' in old:
- del new['dump']
- new['dry_run'] = not old['dump']
+ if "dump" in old:
+ del new["dump"]
+ new["dry_run"] = not old["dump"]
- model_params['topology'] = topology
- model_params['agents'] = agents
+ model_params["topology"] = topology
+ model_params["agents"] = agents
- return Config(version='2',
- model_params=model_params,
- **new)
+ return Config(version="2", model_params=model_params, **new)
diff --git a/soil/datacollection.py b/soil/datacollection.py
index a889a76..dea9f1d 100644
--- a/soil/datacollection.py
+++ b/soil/datacollection.py
@@ -1,6 +1,6 @@
from mesa import DataCollector as MDC
-class SoilDataCollector(MDC):
+class SoilDataCollector(MDC):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
diff --git a/soil/debugging.py b/soil/debugging.py
index 863c50a..607996b 100644
--- a/soil/debugging.py
+++ b/soil/debugging.py
@@ -18,9 +18,9 @@ def wrapcmd(func):
known = globals()
known.update(self.curframe.f_globals)
known.update(self.curframe.f_locals)
- known['agent'] = known.get('self', None)
- known['model'] = known.get('self', {}).get('model')
- known['attrs'] = arg.strip().split()
+ known["agent"] = known.get("self", None)
+ known["model"] = known.get("self", {}).get("model")
+ known["attrs"] = arg.strip().split()
exec(func.__code__, known, known)
@@ -29,12 +29,12 @@ def wrapcmd(func):
class Debug(pdb.Pdb):
def __init__(self, *args, skip_soil=False, **kwargs):
- skip = kwargs.get('skip', [])
- skip.append('soil')
+ skip = kwargs.get("skip", [])
+ skip.append("soil")
if skip_soil:
- skip.append('soil')
- skip.append('soil.*')
- skip.append('mesa.*')
+ skip.append("soil")
+ skip.append("soil.*")
+ skip.append("mesa.*")
super(Debug, self).__init__(*args, skip=skip, **kwargs)
self.prompt = "[soil-pdb] "
@@ -42,7 +42,7 @@ class Debug(pdb.Pdb):
def _soil_agents(model, attrs=None, pretty=True, **kwargs):
for agent in model.agents(**kwargs):
d = agent
- print(' - ' + indent(agent.to_str(keys=attrs, pretty=pretty), ' '))
+ print(" - " + indent(agent.to_str(keys=attrs, pretty=pretty), " "))
@wrapcmd
def do_soil_agents():
@@ -52,20 +52,20 @@ class Debug(pdb.Pdb):
@wrapcmd
def do_soil_list():
- return Debug._soil_agents(model, attrs=['state_id'], pretty=False)
+ return Debug._soil_agents(model, attrs=["state_id"], pretty=False)
do_sl = do_soil_list
def do_continue_state(self, arg):
self.do_break_state(arg, temporary=True)
- return self.do_continue('')
+ return self.do_continue("")
do_cs = do_continue_state
@wrapcmd
def do_soil_agent():
if not agent:
- print('No agent available')
+ print("No agent available")
return
keys = None
@@ -81,9 +81,9 @@ class Debug(pdb.Pdb):
do_aa = do_soil_agent
def do_break_state(self, arg: str, instances=None, temporary=False):
- '''
+ """
Break before a specified state is stepped into.
- '''
+ """
klass = None
state = arg
@@ -95,39 +95,39 @@ class Debug(pdb.Pdb):
if tokens:
instances = list(eval(token) for token in tokens)
- colon = state.find(':')
+ colon = state.find(":")
if colon > 0:
klass = state[:colon].rstrip()
- state = state[colon+1:].strip()
-
+ state = state[colon + 1 :].strip()
print(klass, state, tokens)
- klass = eval(klass,
- self.curframe.f_globals,
- self.curframe_locals)
+ klass = eval(klass, self.curframe.f_globals, self.curframe_locals)
if klass:
klasses = [klass]
else:
- klasses = [k for k in self.curframe.f_globals.values() if isinstance(k, type) and issubclass(k, FSM)]
+ klasses = [
+ k
+ for k in self.curframe.f_globals.values()
+ if isinstance(k, type) and issubclass(k, FSM)
+ ]
if not klasses:
- self.error('No agent classes found')
-
-
+ self.error("No agent classes found")
+
for klass in klasses:
try:
func = getattr(klass, state)
except AttributeError:
- self.error(f'State {state} not found in class {klass}')
+ self.error(f"State {state} not found in class {klass}")
continue
- if hasattr(func, '__func__'):
+ if hasattr(func, "__func__"):
func = func.__func__
code = func.__code__
- #use co_name to identify the bkpt (function names
- #could be aliased, but co_name is invariant)
+ # use co_name to identify the bkpt (function names
+ # could be aliased, but co_name is invariant)
funcname = code.co_name
lineno = code.co_firstlineno
filename = code.co_filename
@@ -135,38 +135,36 @@ class Debug(pdb.Pdb):
# Check for reasonable breakpoint
line = self.checkline(filename, lineno)
if not line:
- raise ValueError('no line found')
+ raise ValueError("no line found")
# now set the break point
cond = None
if instances:
- cond = f'self.unique_id in { repr(instances) }'
+ cond = f"self.unique_id in { repr(instances) }"
existing = self.get_breaks(filename, line)
if existing:
- self.message("Breakpoint already exists at %s:%d" %
- (filename, line))
+ self.message("Breakpoint already exists at %s:%d" % (filename, line))
continue
err = self.set_break(filename, line, temporary, cond, funcname)
if err:
self.error(err)
else:
bp = self.get_breaks(filename, line)[-1]
- self.message("Breakpoint %d at %s:%d" %
- (bp.number, bp.file, bp.line))
+ self.message("Breakpoint %d at %s:%d" % (bp.number, bp.file, bp.line))
do_bs = do_break_state
def do_break_state_self(self, arg: str, temporary=False):
- '''
+ """
Break before a specified state is stepped into, for the current agent
- '''
- agent = self.curframe.f_locals.get('self')
+ """
+ agent = self.curframe.f_locals.get("self")
if not agent:
- self.error('No current agent.')
- self.error('Try this again when the debugger is stopped inside an agent')
+ self.error("No current agent.")
+ self.error("Try this again when the debugger is stopped inside an agent")
return
- arg = f'{agent.__class__.__name__}:{ arg } {agent.unique_id}'
+ arg = f"{agent.__class__.__name__}:{ arg } {agent.unique_id}"
return self.do_break_state(arg)
do_bss = do_break_state_self
@@ -174,6 +172,7 @@ class Debug(pdb.Pdb):
debugger = None
+
def set_trace(frame=None, **kwargs):
global debugger
if debugger is None:
diff --git a/soil/environment.py b/soil/environment.py
index 8588eaf..d89585e 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -35,18 +35,20 @@ class BaseEnvironment(Model):
:meth:`soil.environment.Environment.get` method.
"""
- def __init__(self,
- id='unnamed_env',
- seed='default',
- schedule=None,
- dir_path=None,
- interval=1,
- agent_class=None,
- agents: [tuple[type, Dict[str, Any]]] = {},
- agent_reporters: Optional[Any] = None,
- model_reporters: Optional[Any] = None,
- tables: Optional[Any] = None,
- **env_params):
+ def __init__(
+ self,
+ id="unnamed_env",
+ seed="default",
+ schedule=None,
+ dir_path=None,
+ interval=1,
+ agent_class=None,
+ agents: [tuple[type, Dict[str, Any]]] = {},
+ agent_reporters: Optional[Any] = None,
+ model_reporters: Optional[Any] = None,
+ tables: Optional[Any] = None,
+ **env_params,
+ ):
super().__init__(seed=seed)
self.env_params = env_params or {}
@@ -75,27 +77,26 @@ class BaseEnvironment(Model):
)
def _agent_from_dict(self, agent):
- '''
+ """
Translate an agent dictionary into an agent
- '''
+ """
agent = dict(**agent)
- cls = agent.pop('agent_class', None) or self.agent_class
- unique_id = agent.pop('unique_id', None)
+ cls = agent.pop("agent_class", None) or self.agent_class
+ unique_id = agent.pop("unique_id", None)
if unique_id is None:
unique_id = self.next_id()
- return serialization.deserialize(cls)(unique_id=unique_id,
- model=self, **agent)
+ return serialization.deserialize(cls)(unique_id=unique_id, model=self, **agent)
def init_agents(self, agents: Union[config.AgentConfig, [Dict[str, Any]]] = {}):
- '''
+ """
Initialize the agents in the model from either a `soil.config.AgentConfig` or a list of
dictionaries that each describes an agent.
If given a list of dictionaries, an agent will be created for each dictionary. The agent
class can be specified through the `agent_class` key. The rest of the items will be used
as parameters to the agent.
- '''
+ """
if not agents:
return
@@ -108,11 +109,10 @@ class BaseEnvironment(Model):
override = lst.override
lst = self._agent_dict_from_config(lst)
- #TODO: check override is working again. It cannot (easily) be part of agents.from_config anymore,
+ # TODO: check override is working again. It cannot (easily) be part of agents.from_config anymore,
# because it needs attribute such as unique_id, which are only present after init
new_agents = [self._agent_from_dict(agent) for agent in lst]
-
for a in new_agents:
self.schedule.add(a)
@@ -122,8 +122,7 @@ class BaseEnvironment(Model):
setattr(agent, attr, value)
def _agent_dict_from_config(self, cfg):
- return agentmod.from_config(cfg,
- random=self.random)
+ return agentmod.from_config(cfg, random=self.random)
@property
def agents(self):
@@ -131,7 +130,7 @@ class BaseEnvironment(Model):
def find_one(self, *args, **kwargs):
return agentmod.AgentView(self.schedule._agents).one(*args, **kwargs)
-
+
def count_agents(self, *args, **kwargs):
return sum(1 for i in self.agents(*args, **kwargs))
@@ -139,18 +138,16 @@ class BaseEnvironment(Model):
def now(self):
if self.schedule:
return self.schedule.time
- raise Exception('The environment has not been scheduled, so it has no sense of time')
-
+ raise Exception(
+ "The environment has not been scheduled, so it has no sense of time"
+ )
def add_agent(self, agent_class, unique_id=None, **kwargs):
a = None
if unique_id is None:
unique_id = self.next_id()
-
- a = agent_class(model=self,
- unique_id=unique_id,
- **args)
+ a = agent_class(model=self, unique_id=unique_id, **args)
self.schedule.add(a)
return a
@@ -163,16 +160,16 @@ class BaseEnvironment(Model):
for k, v in kwargs:
message += " {k}={v} ".format(k, v)
extra = {}
- extra['now'] = self.now
- extra['id'] = self.id
+ extra["now"] = self.now
+ extra["id"] = self.id
return self.logger.log(level, message, extra=extra)
def step(self):
- '''
+ """
Advance one step in the simulation, and update the data collection and scheduler appropriately
- '''
+ """
super().step()
- self.logger.info(f'--- Step {self.now:^5} ---')
+ self.logger.info(f"--- Step {self.now:^5} ---")
self.schedule.step()
self.datacollector.collect(self)
@@ -180,10 +177,10 @@ class BaseEnvironment(Model):
return key in self.env_params
def get(self, key, default=None):
- '''
+ """
Get the value of an environment attribute.
Return `default` if the value is not set.
- '''
+ """
return self.env_params.get(key, default)
def __getitem__(self, key):
@@ -197,13 +194,15 @@ class BaseEnvironment(Model):
class NetworkEnvironment(BaseEnvironment):
- '''
+ """
The NetworkEnvironment is an environment that includes one or more networkx.Graph intances
and methods to associate agents to nodes and vice versa.
- '''
+ """
- def __init__(self, *args, topology: Union[config.NetConfig, nx.Graph] = None, **kwargs):
- agents = kwargs.pop('agents', None)
+ def __init__(
+ self, *args, topology: Union[config.NetConfig, nx.Graph] = None, **kwargs
+ ):
+ agents = kwargs.pop("agents", None)
super().__init__(*args, agents=None, **kwargs)
self._set_topology(topology)
@@ -211,37 +210,35 @@ class NetworkEnvironment(BaseEnvironment):
self.init_agents(agents)
def init_agents(self, *args, **kwargs):
- '''Initialize the agents from a '''
+ """Initialize the agents from a"""
super().init_agents(*args, **kwargs)
for agent in self.schedule._agents.values():
- if hasattr(agent, 'node_id'):
+ if hasattr(agent, "node_id"):
self._init_node(agent)
def _init_node(self, agent):
- '''
+ """
Make sure the node for a given agent has the proper attributes.
- '''
- self.G.nodes[agent.node_id]['agent'] = agent
+ """
+ self.G.nodes[agent.node_id]["agent"] = agent
def _agent_dict_from_config(self, cfg):
- return agentmod.from_config(cfg,
- topology=self.G,
- random=self.random)
+ return agentmod.from_config(cfg, topology=self.G, random=self.random)
def _agent_from_dict(self, agent, unique_id=None):
agent = dict(agent)
- if not agent.get('topology', False):
+ if not agent.get("topology", False):
return super()._agent_from_dict(agent)
if unique_id is None:
unique_id = self.next_id()
- node_id = agent.get('node_id', None)
+ node_id = agent.get("node_id", None)
if node_id is None:
node_id = network.find_unassigned(self.G, random=self.random)
- agent['node_id'] = node_id
- agent['unique_id'] = unique_id
- agent['topology'] = self.G
+ agent["node_id"] = node_id
+ agent["unique_id"] = unique_id
+ agent["topology"] = self.G
node_attrs = self.G.nodes[node_id]
node_attrs.update(agent)
agent = node_attrs
@@ -269,32 +266,33 @@ class NetworkEnvironment(BaseEnvironment):
if unique_id is None:
unique_id = self.next_id()
if node_id is None:
- node_id = network.find_unassigned(G=self.G,
- shuffle=True,
- random=self.random)
-
+ node_id = network.find_unassigned(
+ G=self.G, shuffle=True, random=self.random
+ )
+
if node_id in G.nodes:
- self.G.nodes[node_id]['agent'] = None # Reserve
+ self.G.nodes[node_id]["agent"] = None # Reserve
else:
self.G.add_node(node_id)
- a = self.add_agent(unique_id=unique_id, agent_class=agent_class, node_id=node_id, **kwargs)
- a['visible'] = True
+ a = self.add_agent(
+ unique_id=unique_id, agent_class=agent_class, node_id=node_id, **kwargs
+ )
+ a["visible"] = True
return a
def agent_for_node_id(self, node_id):
- return self.G.nodes[node_id].get('agent')
+ return self.G.nodes[node_id].get("agent")
def populate_network(self, agent_class, weights=None, **agent_params):
- if not hasattr(agent_class, 'len'):
+ if not hasattr(agent_class, "len"):
agent_class = [agent_class]
weights = None
for (node_id, node) in self.G.nodes(data=True):
- if 'agent' in node:
+ if "agent" in node:
continue
a_class = self.random.choices(agent_class, weights)[0]
- self.add_agent(node_id=node_id,
- agent_class=a_class, **agent_params)
+ self.add_agent(node_id=node_id, agent_class=a_class, **agent_params)
Environment = NetworkEnvironment
diff --git a/soil/exporters.py b/soil/exporters.py
index 648ba77..a31921d 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -24,56 +24,58 @@ class DryRunner(BytesIO):
def write(self, txt):
if self.__copy_to:
- self.__copy_to.write('{}:::{}'.format(self.__fname, txt))
+ self.__copy_to.write("{}:::{}".format(self.__fname, txt))
try:
super().write(txt)
except TypeError:
- super().write(bytes(txt, 'utf-8'))
+ super().write(bytes(txt, "utf-8"))
def close(self):
- content = '(binary data not shown)'
+ content = "(binary data not shown)"
try:
content = self.getvalue().decode()
except UnicodeDecodeError:
pass
- logger.info('**Not** written to {} (dry run mode):\n\n{}\n\n'.format(self.__fname, content))
+ logger.info(
+ "**Not** written to {} (dry run mode):\n\n{}\n\n".format(
+ self.__fname, content
+ )
+ )
super().close()
class Exporter:
- '''
+ """
Interface for all exporters. It is not necessary, but it is useful
if you don't plan to implement all the methods.
- '''
+ """
def __init__(self, simulation, outdir=None, dry_run=None, copy_to=None):
self.simulation = simulation
- outdir = outdir or os.path.join(os.getcwd(), 'soil_output')
- self.outdir = os.path.join(outdir,
- simulation.group or '',
- simulation.name)
+ outdir = outdir or os.path.join(os.getcwd(), "soil_output")
+ self.outdir = os.path.join(outdir, simulation.group or "", simulation.name)
self.dry_run = dry_run
if copy_to is None and dry_run:
copy_to = sys.stdout
self.copy_to = copy_to
def sim_start(self):
- '''Method to call when the simulation starts'''
+ """Method to call when the simulation starts"""
pass
def sim_end(self):
- '''Method to call when the simulation ends'''
+ """Method to call when the simulation ends"""
pass
def trial_start(self, env):
- '''Method to call when a trial start'''
+ """Method to call when a trial start"""
pass
def trial_end(self, env):
- '''Method to call when a trial ends'''
+ """Method to call when a trial ends"""
pass
- def output(self, f, mode='w', **kwargs):
+ def output(self, f, mode="w", **kwargs):
if self.dry_run:
f = DryRunner(f, copy_to=self.copy_to)
else:
@@ -86,102 +88,117 @@ class Exporter:
class default(Exporter):
- '''Default exporter. Writes sqlite results, as well as the simulation YAML'''
+ """Default exporter. Writes sqlite results, as well as the simulation YAML"""
def sim_start(self):
if not self.dry_run:
- logger.info('Dumping results to %s', self.outdir)
- with self.output(self.simulation.name + '.dumped.yml') as f:
+ logger.info("Dumping results to %s", self.outdir)
+ with self.output(self.simulation.name + ".dumped.yml") as f:
f.write(self.simulation.to_yaml())
else:
- logger.info('NOT dumping results')
+ logger.info("NOT dumping results")
def trial_end(self, env):
if self.dry_run:
- logger.info('Running in DRY_RUN mode, the database will NOT be created')
+ logger.info("Running in DRY_RUN mode, the database will NOT be created")
return
- with timer('Dumping simulation {} trial {}'.format(self.simulation.name,
- env.id)):
+ with timer(
+ "Dumping simulation {} trial {}".format(self.simulation.name, env.id)
+ ):
- fpath = os.path.join(self.outdir, f'{env.id}.sqlite')
- engine = create_engine(f'sqlite:///{fpath}', echo=False)
+ fpath = os.path.join(self.outdir, f"{env.id}.sqlite")
+ engine = create_engine(f"sqlite:///{fpath}", echo=False)
dc = env.datacollector
for (t, df) in get_dc_dfs(dc):
- df.to_sql(t, con=engine, if_exists='append')
+ df.to_sql(t, con=engine, if_exists="append")
def get_dc_dfs(dc):
- dfs = {'env': dc.get_model_vars_dataframe(),
- 'agents': dc.get_agent_vars_dataframe() }
+ dfs = {
+ "env": dc.get_model_vars_dataframe(),
+ "agents": dc.get_agent_vars_dataframe(),
+ }
for table_name in dc.tables:
dfs[table_name] = dc.get_table_dataframe(table_name)
- yield from dfs.items()
+ yield from dfs.items()
class csv(Exporter):
- '''Export the state of each environment (and its agents) in a separate CSV file'''
+ """Export the state of each environment (and its agents) in a separate CSV file"""
+
def trial_end(self, env):
- with timer('[CSV] Dumping simulation {} trial {} @ dir {}'.format(self.simulation.name,
- env.id,
- self.outdir)):
+ with timer(
+ "[CSV] Dumping simulation {} trial {} @ dir {}".format(
+ self.simulation.name, env.id, self.outdir
+ )
+ ):
for (df_name, df) in get_dc_dfs(env.datacollector):
- with self.output('{}.{}.csv'.format(env.id, df_name)) as f:
+ with self.output("{}.{}.csv".format(env.id, df_name)) as f:
df.to_csv(f)
-#TODO: reimplement GEXF exporting without history
+# TODO: reimplement GEXF exporting without history
class gexf(Exporter):
def trial_end(self, env):
if self.dry_run:
- logger.info('Not dumping GEXF in dry_run mode')
+ logger.info("Not dumping GEXF in dry_run mode")
return
- with timer('[GEXF] Dumping simulation {} trial {}'.format(self.simulation.name,
- env.id)):
- with self.output('{}.gexf'.format(env.id), mode='wb') as f:
+ with timer(
+ "[GEXF] Dumping simulation {} trial {}".format(self.simulation.name, env.id)
+ ):
+ with self.output("{}.gexf".format(env.id), mode="wb") as f:
network.dump_gexf(env.history_to_graph(), f)
self.dump_gexf(env, f)
class dummy(Exporter):
-
def sim_start(self):
- with self.output('dummy', 'w') as f:
- f.write('simulation started @ {}\n'.format(current_time()))
+ with self.output("dummy", "w") as f:
+ f.write("simulation started @ {}\n".format(current_time()))
def trial_start(self, env):
- with self.output('dummy', 'w') as f:
- f.write('trial started@ {}\n'.format(current_time()))
+ with self.output("dummy", "w") as f:
+ f.write("trial started@ {}\n".format(current_time()))
def trial_end(self, env):
- with self.output('dummy', 'w') as f:
- f.write('trial ended@ {}\n'.format(current_time()))
+ with self.output("dummy", "w") as f:
+ f.write("trial ended@ {}\n".format(current_time()))
def sim_end(self):
- with self.output('dummy', 'a') as f:
- f.write('simulation ended @ {}\n'.format(current_time()))
+ with self.output("dummy", "a") as f:
+ f.write("simulation ended @ {}\n".format(current_time()))
+
class graphdrawing(Exporter):
-
def trial_end(self, env):
# Outside effects
f = plt.figure()
- nx.draw(env.G, node_size=10, width=0.2, pos=nx.spring_layout(env.G, scale=100), ax=f.add_subplot(111))
- with open('graph-{}.png'.format(env.id)) as f:
+ nx.draw(
+ env.G,
+ node_size=10,
+ width=0.2,
+ pos=nx.spring_layout(env.G, scale=100),
+ ax=f.add_subplot(111),
+ )
+ with open("graph-{}.png".format(env.id)) as f:
f.savefig(f)
-'''
+
+"""
Convert an environment into a NetworkX graph
-'''
+"""
+
+
def env_to_graph(env, history=None):
G = nx.Graph(env.G)
for agent in env.network_agents:
- attributes = {'agent': str(agent.__class__)}
+ attributes = {"agent": str(agent.__class__)}
lastattributes = {}
spells = []
lastvisible = False
@@ -189,7 +206,7 @@ def env_to_graph(env, history=None):
if not history:
history = sorted(list(env.state_to_tuples()))
for _, t_step, attribute, value in history:
- if attribute == 'visible':
+ if attribute == "visible":
nowvisible = value
if nowvisible and not lastvisible:
laststep = t_step
@@ -198,7 +215,7 @@ def env_to_graph(env, history=None):
lastvisible = nowvisible
continue
- key = 'attr_' + attribute
+ key = "attr_" + attribute
if key not in attributes:
attributes[key] = list()
if key not in lastattributes:
diff --git a/soil/network.py b/soil/network.py
index bc69716..5c0b005 100644
--- a/soil/network.py
+++ b/soil/network.py
@@ -9,6 +9,7 @@ import networkx as nx
from . import config, serialization, basestring
+
def from_config(cfg: config.NetConfig, dir_path: str = None):
if not isinstance(cfg, config.NetConfig):
cfg = config.NetConfig(**cfg)
@@ -19,24 +20,28 @@ def from_config(cfg: config.NetConfig, dir_path: str = None):
path = os.path.join(dir_path, path)
extension = os.path.splitext(path)[1][1:]
kwargs = {}
- if extension == 'gexf':
- kwargs['version'] = '1.2draft'
- kwargs['node_type'] = int
+ if extension == "gexf":
+ kwargs["version"] = "1.2draft"
+ kwargs["node_type"] = int
try:
- method = getattr(nx.readwrite, 'read_' + extension)
+ method = getattr(nx.readwrite, "read_" + extension)
except AttributeError:
- raise AttributeError('Unknown format')
+ raise AttributeError("Unknown format")
return method(path, **kwargs)
if cfg.params:
net_args = cfg.params.dict()
- net_gen = net_args.pop('generator')
+ net_gen = net_args.pop("generator")
if dir_path not in sys.path:
sys.path.append(dir_path)
- method = serialization.deserializer(net_gen,
- known_modules=['networkx.generators',])
+ method = serialization.deserializer(
+ net_gen,
+ known_modules=[
+ "networkx.generators",
+ ],
+ )
return method(**net_args)
if isinstance(cfg.fixed, config.Topology):
@@ -49,17 +54,17 @@ def from_config(cfg: config.NetConfig, dir_path: str = None):
def find_unassigned(G, shuffle=False, random=random):
- '''
+ """
Link an agent to a node in a topology.
If node_id is None, a node without an agent_id will be found.
- '''
- #TODO: test
+ """
+ # TODO: test
candidates = list(G.nodes(data=True))
if shuffle:
random.shuffle(candidates)
for next_id, data in candidates:
- if 'agent' not in data:
+ if "agent" not in data:
node_id = next_id
break
@@ -68,8 +73,14 @@ def find_unassigned(G, shuffle=False, random=random):
def dump_gexf(G, f):
for node in G.nodes():
- if 'pos' in G.nodes[node]:
- G.nodes[node]['viz'] = {"position": {"x": G.nodes[node]['pos'][0], "y": G.nodes[node]['pos'][1], "z": 0.0}}
- del (G.nodes[node]['pos'])
+ if "pos" in G.nodes[node]:
+ G.nodes[node]["viz"] = {
+ "position": {
+ "x": G.nodes[node]["pos"][0],
+ "y": G.nodes[node]["pos"][1],
+ "z": 0.0,
+ }
+ }
+ del G.nodes[node]["pos"]
nx.write_gexf(G, f, version="1.2draft")
diff --git a/soil/serialization.py b/soil/serialization.py
index 972ca69..b728983 100644
--- a/soil/serialization.py
+++ b/soil/serialization.py
@@ -15,13 +15,14 @@ import networkx as nx
from jinja2 import Template
-logger = logging.getLogger('soil')
+logger = logging.getLogger("soil")
+
def load_file(infile):
folder = os.path.dirname(infile)
if folder not in sys.path:
sys.path.append(folder)
- with open(infile, 'r') as f:
+ with open(infile, "r") as f:
return list(chain.from_iterable(map(expand_template, load_string(f))))
@@ -30,14 +31,15 @@ def load_string(string):
def expand_template(config):
- if 'template' not in config:
+ if "template" not in config:
yield config
return
- if 'vars' not in config:
- raise ValueError(('You must provide a definition of variables'
- ' for the template.'))
+ if "vars" not in config:
+ raise ValueError(
+ ("You must provide a definition of variables" " for the template.")
+ )
- template = config['template']
+ template = config["template"]
if not isinstance(template, str):
template = yaml.dump(template)
@@ -49,9 +51,9 @@ def expand_template(config):
blank_str = template.render({k: 0 for k in params[0].keys()})
blank = list(load_string(blank_str))
if len(blank) > 1:
- raise ValueError('Templates must not return more than one configuration')
- if 'name' in blank[0]:
- raise ValueError('Templates cannot be named, use group instead')
+ raise ValueError("Templates must not return more than one configuration")
+ if "name" in blank[0]:
+ raise ValueError("Templates cannot be named, use group instead")
for ps in params:
string = template.render(ps)
@@ -60,25 +62,25 @@ def expand_template(config):
def params_for_template(config):
- sampler_config = config.get('sampler', {'N': 100})
- sampler = sampler_config.pop('method', 'SALib.sample.morris.sample')
+ sampler_config = config.get("sampler", {"N": 100})
+ sampler = sampler_config.pop("method", "SALib.sample.morris.sample")
sampler = deserializer(sampler)
- bounds = config['vars']['bounds']
+ bounds = config["vars"]["bounds"]
problem = {
- 'num_vars': len(bounds),
- 'names': list(bounds.keys()),
- 'bounds': list(v for v in bounds.values())
+ "num_vars": len(bounds),
+ "names": list(bounds.keys()),
+ "bounds": list(v for v in bounds.values()),
}
samples = sampler(problem, **sampler_config)
- lists = config['vars'].get('lists', {})
+ lists = config["vars"].get("lists", {})
names = list(lists.keys())
values = list(lists.values())
combs = list(product(*values))
- allnames = names + problem['names']
- allvalues = [(list(i[0])+list(i[1])) for i in product(combs, samples)]
+ allnames = names + problem["names"]
+ allvalues = [(list(i[0]) + list(i[1])) for i in product(combs, samples)]
params = list(map(lambda x: dict(zip(allnames, x)), allvalues))
return params
@@ -100,22 +102,24 @@ def load_config(cfg):
yield from load_files(cfg)
-builtins = importlib.import_module('builtins')
+builtins = importlib.import_module("builtins")
-KNOWN_MODULES = ['soil', ]
+KNOWN_MODULES = [
+ "soil",
+]
def name(value, known_modules=KNOWN_MODULES):
- '''Return a name that can be imported, to serialize/deserialize an object'''
+ """Return a name that can be imported, to serialize/deserialize an object"""
if value is None:
- return 'None'
+ return "None"
if not isinstance(value, type): # Get the class name first
value = type(value)
tname = value.__name__
if hasattr(builtins, tname):
return tname
modname = value.__module__
- if modname == '__main__':
+ if modname == "__main__":
return tname
if known_modules and modname in known_modules:
return tname
@@ -125,17 +129,17 @@ def name(value, known_modules=KNOWN_MODULES):
module = importlib.import_module(kmod)
if hasattr(module, tname):
return tname
- return '{}.{}'.format(modname, tname)
+ return "{}.{}".format(modname, tname)
def serializer(type_):
- if type_ != 'str' and hasattr(builtins, type_):
+ if type_ != "str" and hasattr(builtins, type_):
return repr
return lambda x: x
def serialize(v, known_modules=KNOWN_MODULES):
- '''Get a text representation of an object.'''
+ """Get a text representation of an object."""
tname = name(v, known_modules=known_modules)
func = serializer(tname)
return func(v), tname
@@ -160,9 +164,9 @@ IS_CLASS = re.compile(r"")
def deserializer(type_, known_modules=KNOWN_MODULES):
if type(type_) != str: # Already deserialized
return type_
- if type_ == 'str':
- return lambda x='': x
- if type_ == 'None':
+ if type_ == "str":
+ return lambda x="": x
+ if type_ == "None":
return lambda x=None: None
if hasattr(builtins, type_): # Check if it's a builtin type
cls = getattr(builtins, type_)
@@ -172,8 +176,8 @@ def deserializer(type_, known_modules=KNOWN_MODULES):
modname, tname = match.group(1).rsplit(".", 1)
module = importlib.import_module(modname)
cls = getattr(module, tname)
- return getattr(cls, 'deserialize', cls)
-
+ return getattr(cls, "deserialize", cls)
+
# Otherwise, see if we can find the module and the class
options = []
@@ -181,7 +185,7 @@ def deserializer(type_, known_modules=KNOWN_MODULES):
if mod:
options.append((mod, type_))
- if '.' in type_: # Fully qualified module
+ if "." in type_: # Fully qualified module
module, type_ = type_.rsplit(".", 1)
options.append((module, type_))
@@ -190,32 +194,31 @@ def deserializer(type_, known_modules=KNOWN_MODULES):
try:
module = importlib.import_module(modname)
cls = getattr(module, tname)
- return getattr(cls, 'deserialize', cls)
+ return getattr(cls, "deserialize", cls)
except (ImportError, AttributeError) as ex:
errors.append((modname, tname, ex))
raise Exception('Could not find type "{}". Tried: {}'.format(type_, errors))
def deserialize(type_, value=None, globs=None, **kwargs):
- '''Get an object from a text representation'''
+ """Get an object from a text representation"""
if not isinstance(type_, str):
return type_
if globs and type_ in globs:
des = globs[type_]
else:
- des = deserializer(type_, **kwargs)
+ des = deserializer(type_, **kwargs)
if value is None:
return des
return des(value)
def deserialize_all(names, *args, known_modules=KNOWN_MODULES, **kwargs):
- '''Return the list of deserialized objects'''
- #TODO: remove
- print('SERIALIZATION', kwargs)
+ """Return the list of deserialized objects"""
+ # TODO: remove
+ print("SERIALIZATION", kwargs)
objects = []
for name in names:
mod = deserialize(name, known_modules=known_modules)
objects.append(mod(*args, **kwargs))
return objects
-
diff --git a/soil/simulation.py b/soil/simulation.py
index baee50f..7c79d92 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -1,5 +1,5 @@
import os
-from time import time as current_time, strftime
+from time import time as current_time, strftime
import importlib
import sys
import yaml
@@ -25,7 +25,7 @@ from .time import INFINITY
from .config import Config, convert_old
-#TODO: change documentation for simulation
+# TODO: change documentation for simulation
@dataclass
class Simulation:
"""
@@ -36,15 +36,16 @@ class Simulation:
kwargs: parameters to use to initialize a new configuration, if one not been provided.
"""
- version: str = '2'
- name: str = 'Unnamed simulation'
- description: Optional[str] = ''
+
+ version: str = "2"
+ name: str = "Unnamed simulation"
+ description: Optional[str] = ""
group: str = None
- model_class: Union[str, type] = 'soil.Environment'
+ model_class: Union[str, type] = "soil.Environment"
model_params: dict = field(default_factory=dict)
seed: str = field(default_factory=lambda: current_time())
dir_path: str = field(default_factory=lambda: os.getcwd())
- max_time: float = float('inf')
+ max_time: float = float("inf")
max_steps: int = -1
interval: int = 1
num_trials: int = 3
@@ -56,14 +57,15 @@ class Simulation:
extra: Dict[str, Any] = field(default_factory=dict)
@classmethod
- def from_dict(cls, env, **kwargs):
+ def from_dict(cls, env, **kwargs):
- ignored = {k: v for k, v in env.items()
- if k not in inspect.signature(cls).parameters}
+ ignored = {
+ k: v for k, v in env.items() if k not in inspect.signature(cls).parameters
+ }
- d = {k:v for k, v in env.items() if k not in ignored}
+ d = {k: v for k, v in env.items() if k not in ignored}
if ignored:
- d.setdefault('extra', {}).update(ignored)
+ d.setdefault("extra", {}).update(ignored)
if ignored:
print(f'Warning: Ignoring these parameters (added to "extra"): { ignored }')
d.update(kwargs)
@@ -74,24 +76,34 @@ class Simulation:
return self.run(*args, **kwargs)
def run(self, *args, **kwargs):
- '''Run the simulation and return the list of resulting environments'''
- logger.info(dedent('''
+ """Run the simulation and return the list of resulting environments"""
+ logger.info(
+ dedent(
+ """
Simulation:
---
- ''') +
- self.to_yaml())
+ """
+ )
+ + self.to_yaml()
+ )
return list(self.run_gen(*args, **kwargs))
- def run_gen(self, parallel=False, dry_run=None,
- exporters=None, outdir=None, exporter_params={},
- log_level=None,
- **kwargs):
- '''Run the simulation and yield the resulting environments.'''
+ def run_gen(
+ self,
+ parallel=False,
+ dry_run=None,
+ exporters=None,
+ outdir=None,
+ exporter_params={},
+ log_level=None,
+ **kwargs,
+ ):
+ """Run the simulation and yield the resulting environments."""
if log_level:
logger.setLevel(log_level)
outdir = outdir or self.outdir
- logger.info('Using exporters: %s', exporters or [])
- logger.info('Output directory: %s', outdir)
+ logger.info("Using exporters: %s", exporters or [])
+ logger.info("Output directory: %s", outdir)
if dry_run is None:
dry_run = self.dry_run
if exporters is None:
@@ -99,22 +111,28 @@ class Simulation:
if not exporter_params:
exporter_params = self.exporter_params
- exporters = serialization.deserialize_all(exporters,
- simulation=self,
- known_modules=['soil.exporters', ],
- dry_run=dry_run,
- outdir=outdir,
- **exporter_params)
+ exporters = serialization.deserialize_all(
+ exporters,
+ simulation=self,
+ known_modules=[
+ "soil.exporters",
+ ],
+ dry_run=dry_run,
+ outdir=outdir,
+ **exporter_params,
+ )
- with utils.timer('simulation {}'.format(self.name)):
+ with utils.timer("simulation {}".format(self.name)):
for exporter in exporters:
exporter.sim_start()
- for env in utils.run_parallel(func=self.run_trial,
- iterable=range(int(self.num_trials)),
- parallel=parallel,
- log_level=log_level,
- **kwargs):
+ for env in utils.run_parallel(
+ func=self.run_trial,
+ iterable=range(int(self.num_trials)),
+ parallel=parallel,
+ log_level=log_level,
+ **kwargs,
+ ):
for exporter in exporters:
exporter.trial_start(env)
@@ -128,11 +146,12 @@ class Simulation:
exporter.sim_end()
def get_env(self, trial_id=0, model_params=None, **kwargs):
- '''Create an environment for a trial of the simulation'''
+ """Create an environment for a trial of the simulation"""
+
def deserialize_reporters(reporters):
for (k, v) in reporters.items():
- if isinstance(v, str) and v.startswith('py:'):
- reporters[k] = serialization.deserialize(value.lsplit(':', 1)[1])
+ if isinstance(v, str) and v.startswith("py:"):
+ reporters[k] = serialization.deserialize(value.lsplit(":", 1)[1])
return reporters
params = self.model_params.copy()
@@ -140,18 +159,22 @@ class Simulation:
params.update(model_params)
params.update(kwargs)
- agent_reporters = deserialize_reporters(params.pop('agent_reporters', {}))
- model_reporters = deserialize_reporters(params.pop('model_reporters', {}))
+ agent_reporters = deserialize_reporters(params.pop("agent_reporters", {}))
+ model_reporters = deserialize_reporters(params.pop("model_reporters", {}))
- env = serialization.deserialize(self.model_class)
- return env(id=f'{self.name}_trial_{trial_id}',
- seed=f'{self.seed}_trial_{trial_id}',
- dir_path=self.dir_path,
- agent_reporters=agent_reporters,
- model_reporters=model_reporters,
- **params)
+ env = serialization.deserialize(self.model_class)
+ return env(
+ id=f"{self.name}_trial_{trial_id}",
+ seed=f"{self.seed}_trial_{trial_id}",
+ dir_path=self.dir_path,
+ agent_reporters=agent_reporters,
+ model_reporters=model_reporters,
+ **params,
+ )
- def run_trial(self, trial_id=None, until=None, log_file=False, log_level=logging.INFO, **opts):
+ def run_trial(
+ self, trial_id=None, until=None, log_file=False, log_level=logging.INFO, **opts
+ ):
"""
Run a single trial of the simulation
@@ -160,50 +183,58 @@ class Simulation:
logger.setLevel(log_level)
model = self.get_env(trial_id, **opts)
trial_id = trial_id if trial_id is not None else current_time()
- with utils.timer('Simulation {} trial {}'.format(self.name, trial_id)):
- return self.run_model(model=model, trial_id=trial_id, until=until, log_level=log_level)
+ with utils.timer("Simulation {} trial {}".format(self.name, trial_id)):
+ return self.run_model(
+ model=model, trial_id=trial_id, until=until, log_level=log_level
+ )
def run_model(self, model, until=None, **opts):
# Set-up trial environment and graph
- until = float(until or self.max_time or 'inf')
+ until = float(until or self.max_time or "inf")
# Set up agents on nodes
def is_done():
return False
- if until and hasattr(model.schedule, 'time'):
+ if until and hasattr(model.schedule, "time"):
prev = is_done
def is_done():
return prev() or model.schedule.time >= until
- if self.max_steps and self.max_steps > 0 and hasattr(model.schedule, 'steps'):
+ if self.max_steps and self.max_steps > 0 and hasattr(model.schedule, "steps"):
prev_steps = is_done
def is_done():
return prev_steps() or model.schedule.steps >= self.max_steps
- newline = '\n'
- logger.info(dedent(f'''
+ newline = "\n"
+ logger.info(
+ dedent(
+ f"""
Model stats:
Agents (total: { model.schedule.get_agent_count() }):
- { (newline + ' - ').join(str(a) for a in model.schedule.agents) }
Topology size: { len(model.G) if hasattr(model, "G") else 0 }
- '''))
+ """
+ )
+ )
while not is_done():
- utils.logger.debug(f'Simulation time {model.schedule.time}/{until}. Next: {getattr(model.schedule, "next_time", model.schedule.time + self.interval)}')
+ utils.logger.debug(
+ f'Simulation time {model.schedule.time}/{until}. Next: {getattr(model.schedule, "next_time", model.schedule.time + self.interval)}'
+ )
model.step()
return model
def to_dict(self):
d = asdict(self)
- if not isinstance(d['model_class'], str):
- d['model_class'] = serialization.name(d['model_class'])
- d['model_params'] = serialization.serialize_dict(d['model_params'])
- d['dir_path'] = str(d['dir_path'])
- d['version'] = '2'
+ if not isinstance(d["model_class"], str):
+ d["model_class"] = serialization.name(d["model_class"])
+ d["model_params"] = serialization.serialize_dict(d["model_params"])
+ d["dir_path"] = str(d["dir_path"])
+ d["version"] = "2"
return d
def to_yaml(self):
@@ -215,15 +246,15 @@ def iter_from_config(*cfgs, **kwargs):
configs = list(serialization.load_config(config))
for config, path in configs:
d = dict(config)
- if 'dir_path' not in d:
- d['dir_path'] = os.path.dirname(path)
+ if "dir_path" not in d:
+ d["dir_path"] = os.path.dirname(path)
yield Simulation.from_dict(d, **kwargs)
def from_config(conf_or_path):
lst = list(iter_from_config(conf_or_path))
if len(lst) > 1:
- raise AttributeError('Provide only one configuration')
+ raise AttributeError("Provide only one configuration")
return lst[0]
diff --git a/soil/time.py b/soil/time.py
index 602aa8c..11e3178 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -6,7 +6,8 @@ from .utils import logger
from mesa import Agent as MesaAgent
-INFINITY = float('inf')
+INFINITY = float("inf")
+
class When:
def __init__(self, time):
@@ -42,7 +43,7 @@ class TimedActivation(BaseScheduler):
self._next = {}
self._queue = []
self.next_time = 0
- self.logger = logger.getChild(f'time_{ self.model }')
+ self.logger = logger.getChild(f"time_{ self.model }")
def add(self, agent: MesaAgent, when=None):
if when is None:
@@ -51,7 +52,7 @@ class TimedActivation(BaseScheduler):
self._queue.remove((self._next[agent.unique_id], agent.unique_id))
del self._agents[agent.unique_id]
heapify(self._queue)
-
+
heappush(self._queue, (when, agent.unique_id))
self._next[agent.unique_id] = when
super().add(agent)
@@ -62,7 +63,7 @@ class TimedActivation(BaseScheduler):
an agent will signal when it wants to be scheduled next.
"""
- self.logger.debug(f'Simulation step {self.next_time}')
+ self.logger.debug(f"Simulation step {self.next_time}")
if not self.model.running:
return
@@ -71,18 +72,22 @@ class TimedActivation(BaseScheduler):
while self._queue and self._queue[0][0] == self.time:
(when, agent_id) = heappop(self._queue)
- self.logger.debug(f'Stepping agent {agent_id}')
+ self.logger.debug(f"Stepping agent {agent_id}")
agent = self._agents[agent_id]
returned = agent.step()
- if not getattr(agent, 'alive', True):
+ if not getattr(agent, "alive", True):
self.remove(agent)
continue
when = (returned or Delta(1)).abs(self.time)
if when < self.time:
- raise Exception("Cannot schedule an agent for a time in the past ({} < {})".format(when, self.time))
+ raise Exception(
+ "Cannot schedule an agent for a time in the past ({} < {})".format(
+ when, self.time
+ )
+ )
self._next[agent_id] = when
heappush(self._queue, (when, agent_id))
@@ -96,4 +101,4 @@ class TimedActivation(BaseScheduler):
return self.time
self.next_time = self._queue[0][0]
- self.logger.debug(f'Next step: {self.next_time}')
+ self.logger.debug(f"Next step: {self.next_time}")
diff --git a/soil/utils.py b/soil/utils.py
index 6c25dbc..9c4bcc7 100644
--- a/soil/utils.py
+++ b/soil/utils.py
@@ -9,12 +9,12 @@ from multiprocessing import Pool
from contextlib import contextmanager
-logger = logging.getLogger('soil')
+logger = logging.getLogger("soil")
logger.setLevel(logging.INFO)
timeformat = "%H:%M:%S"
-if os.environ.get('SOIL_VERBOSE', ''):
+if os.environ.get("SOIL_VERBOSE", ""):
logformat = "[%(levelname)-5.5s][%(asctime)s][%(name)s]: %(message)s"
else:
logformat = "[%(levelname)-5.5s][%(asctime)s] %(message)s"
@@ -23,38 +23,44 @@ logFormatter = logging.Formatter(logformat, timeformat)
consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
-logging.basicConfig(level=logging.INFO,
- handlers=[consoleHandler,])
+logging.basicConfig(
+ level=logging.INFO,
+ handlers=[
+ consoleHandler,
+ ],
+)
@contextmanager
-def timer(name='task', pre="", function=logger.info, to_object=None):
+def timer(name="task", pre="", function=logger.info, to_object=None):
start = current_time()
- function('{}Starting {} at {}.'.format(pre, name,
- strftime("%X", gmtime(start))))
+ function("{}Starting {} at {}.".format(pre, name, strftime("%X", gmtime(start))))
yield start
end = current_time()
- function('{}Finished {} at {} in {} seconds'.format(pre, name,
- strftime("%X", gmtime(end)),
- str(end-start)))
+ function(
+ "{}Finished {} at {} in {} seconds".format(
+ pre, name, strftime("%X", gmtime(end)), str(end - start)
+ )
+ )
if to_object:
to_object.start = start
to_object.end = end
-def safe_open(path, mode='r', backup=True, **kwargs):
+def safe_open(path, mode="r", backup=True, **kwargs):
outdir = os.path.dirname(path)
if outdir and not os.path.exists(outdir):
os.makedirs(outdir)
- if backup and 'w' in mode and os.path.exists(path):
+ if backup and "w" in mode and os.path.exists(path):
creation = os.path.getctime(path)
- stamp = strftime('%Y-%m-%d_%H.%M.%S', localtime(creation))
+ stamp = strftime("%Y-%m-%d_%H.%M.%S", localtime(creation))
- backup_dir = os.path.join(outdir, 'backup')
+ backup_dir = os.path.join(outdir, "backup")
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
- newpath = os.path.join(backup_dir, '{}@{}'.format(os.path.basename(path),
- stamp))
+ newpath = os.path.join(
+ backup_dir, "{}@{}".format(os.path.basename(path), stamp)
+ )
copyfile(path, newpath)
return open(path, mode=mode, **kwargs)
@@ -67,21 +73,23 @@ def open_or_reuse(f, *args, **kwargs):
except (AttributeError, TypeError):
yield f
+
def flatten_dict(d):
if not isinstance(d, dict):
return d
return dict(_flatten_dict(d))
-def _flatten_dict(d, prefix=''):
+
+def _flatten_dict(d, prefix=""):
if not isinstance(d, dict):
# print('END:', prefix, d)
yield prefix, d
return
if prefix:
- prefix = prefix + '.'
+ prefix = prefix + "."
for k, v in d.items():
# print(k, v)
- res = list(_flatten_dict(v, prefix='{}{}'.format(prefix, k)))
+ res = list(_flatten_dict(v, prefix="{}{}".format(prefix, k)))
# print('RES:', res)
yield from res
@@ -93,7 +101,7 @@ def unflatten_dict(d):
if not isinstance(k, str):
target[k] = v
continue
- tokens = k.split('.')
+ tokens = k.split(".")
if len(tokens) < 2:
target[k] = v
continue
@@ -106,27 +114,28 @@ def unflatten_dict(d):
def run_and_return_exceptions(func, *args, **kwargs):
- '''
+ """
A wrapper for run_trial that catches exceptions and returns them.
It is meant for async simulations.
- '''
+ """
try:
return func(*args, **kwargs)
except Exception as ex:
if ex.__cause__ is not None:
ex = ex.__cause__
- ex.message = ''.join(traceback.format_exception(type(ex), ex, ex.__traceback__)[:])
+ ex.message = "".join(
+ traceback.format_exception(type(ex), ex, ex.__traceback__)[:]
+ )
return ex
def run_parallel(func, iterable, parallel=False, **kwargs):
- if parallel and not os.environ.get('SOIL_DEBUG', None):
+ if parallel and not os.environ.get("SOIL_DEBUG", None):
p = Pool()
- wrapped_func = partial(run_and_return_exceptions,
- func, **kwargs)
+ wrapped_func = partial(run_and_return_exceptions, func, **kwargs)
for i in p.imap_unordered(wrapped_func, iterable):
if isinstance(i, Exception):
- logger.error('Trial failed:\n\t%s', i.message)
+ logger.error("Trial failed:\n\t%s", i.message)
continue
yield i
else:
diff --git a/soil/version.py b/soil/version.py
index ea5b40a..ae66caa 100644
--- a/soil/version.py
+++ b/soil/version.py
@@ -4,7 +4,7 @@ import logging
logger = logging.getLogger(__name__)
ROOT = os.path.dirname(__file__)
-DEFAULT_FILE = os.path.join(ROOT, 'VERSION')
+DEFAULT_FILE = os.path.join(ROOT, "VERSION")
def read_version(versionfile=DEFAULT_FILE):
@@ -12,9 +12,10 @@ def read_version(versionfile=DEFAULT_FILE):
with open(versionfile) as f:
return f.read().strip()
except IOError: # pragma: no cover
- logger.error(('Running an unknown version of {}.'
- 'Be careful!.').format(__name__))
- return '0.0'
+ logger.error(
+ ("Running an unknown version of {}." "Be careful!.").format(__name__)
+ )
+ return "0.0"
__version__ = read_version()
diff --git a/soil/visualization.py b/soil/visualization.py
index fe12aca..a1cb7b8 100644
--- a/soil/visualization.py
+++ b/soil/visualization.py
@@ -1,5 +1,6 @@
from mesa.visualization.UserParam import UserSettableParameter
+
class UserSettableParameter(UserSettableParameter):
def __str__(self):
return self.value
diff --git a/soil/web/__init__.py b/soil/web/__init__.py
index 2339288..5327703 100644
--- a/soil/web/__init__.py
+++ b/soil/web/__init__.py
@@ -20,6 +20,7 @@ from tornado.concurrent import run_on_executor
from concurrent.futures import ThreadPoolExecutor
from ..simulation import Simulation
+
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
@@ -31,140 +32,183 @@ LOGGING_INTERVAL = 0.5
# Workaround to let Soil load the required modules
sys.path.append(ROOT)
+
class PageHandler(tornado.web.RequestHandler):
- """ Handler for the HTML template which holds the visualization. """
+ """Handler for the HTML template which holds the visualization."""
def get(self):
- self.render('index.html', port=self.application.port,
- name=self.application.name)
+ self.render(
+ "index.html", port=self.application.port, name=self.application.name
+ )
class SocketHandler(tornado.websocket.WebSocketHandler):
- """ Handler for websocket. """
+ """Handler for websocket."""
+
executor = ThreadPoolExecutor(max_workers=MAX_WORKERS)
def open(self):
if self.application.verbose:
- logger.info('Socket opened!')
+ logger.info("Socket opened!")
def check_origin(self, origin):
return True
def on_message(self, message):
- """ Receiving a message from the websocket, parse, and act accordingly. """
+ """Receiving a message from the websocket, parse, and act accordingly."""
msg = tornado.escape.json_decode(message)
- if msg['type'] == 'config_file':
+ if msg["type"] == "config_file":
if self.application.verbose:
- print(msg['data'])
+ print(msg["data"])
- self.config = list(yaml.load_all(msg['data']))
+ self.config = list(yaml.load_all(msg["data"]))
if len(self.config) > 1:
- error = 'Please, provide only one configuration.'
+ error = "Please, provide only one configuration."
if self.application.verbose:
logger.error(error)
- self.write_message({'type': 'error',
- 'error': error})
+ self.write_message({"type": "error", "error": error})
return
self.config = self.config[0]
- self.send_log('INFO.' + self.simulation_name,
- 'Using config: {name}'.format(name=self.config['name']))
+ self.send_log(
+ "INFO." + self.simulation_name,
+ "Using config: {name}".format(name=self.config["name"]),
+ )
- if 'visualization_params' in self.config:
- self.write_message({'type': 'visualization_params',
- 'data': self.config['visualization_params']})
- self.name = self.config['name']
+ if "visualization_params" in self.config:
+ self.write_message(
+ {
+ "type": "visualization_params",
+ "data": self.config["visualization_params"],
+ }
+ )
+ self.name = self.config["name"]
self.run_simulation()
settings = []
- for key in self.config['environment_params']:
- if type(self.config['environment_params'][key]) == float or type(self.config['environment_params'][key]) == int:
- if self.config['environment_params'][key] <= 1:
- setting_type = 'number'
+ for key in self.config["environment_params"]:
+ if (
+ type(self.config["environment_params"][key]) == float
+ or type(self.config["environment_params"][key]) == int
+ ):
+ if self.config["environment_params"][key] <= 1:
+ setting_type = "number"
else:
- setting_type = 'great_number'
- elif type(self.config['environment_params'][key]) == bool:
- setting_type = 'boolean'
+ setting_type = "great_number"
+ elif type(self.config["environment_params"][key]) == bool:
+ setting_type = "boolean"
else:
- setting_type = 'undefined'
+ setting_type = "undefined"
- settings.append({
- 'label': key,
- 'type': setting_type,
- 'value': self.config['environment_params'][key]
- })
+ settings.append(
+ {
+ "label": key,
+ "type": setting_type,
+ "value": self.config["environment_params"][key],
+ }
+ )
- self.write_message({'type': 'settings',
- 'data': settings})
+ self.write_message({"type": "settings", "data": settings})
- elif msg['type'] == 'get_trial':
+ elif msg["type"] == "get_trial":
if self.application.verbose:
- logger.info('Trial {} requested!'.format(msg['data']))
- self.send_log('INFO.' + __name__, 'Trial {} requested!'.format(msg['data']))
- self.write_message({'type': 'get_trial',
- 'data': self.get_trial(int(msg['data']))})
+ logger.info("Trial {} requested!".format(msg["data"]))
+ self.send_log("INFO." + __name__, "Trial {} requested!".format(msg["data"]))
+ self.write_message(
+ {"type": "get_trial", "data": self.get_trial(int(msg["data"]))}
+ )
- elif msg['type'] == 'run_simulation':
+ elif msg["type"] == "run_simulation":
if self.application.verbose:
- logger.info('Running new simulation for {name}'.format(name=self.config['name']))
- self.send_log('INFO.' + self.simulation_name, 'Running new simulation for {name}'.format(name=self.config['name']))
- self.config['environment_params'] = msg['data']
+ logger.info(
+ "Running new simulation for {name}".format(name=self.config["name"])
+ )
+ self.send_log(
+ "INFO." + self.simulation_name,
+ "Running new simulation for {name}".format(name=self.config["name"]),
+ )
+ self.config["environment_params"] = msg["data"]
self.run_simulation()
- elif msg['type'] == 'download_gexf':
- G = self.trials[ int(msg['data']) ].history_to_graph()
+ elif msg["type"] == "download_gexf":
+ G = self.trials[int(msg["data"])].history_to_graph()
for node in G.nodes():
- if 'pos' in G.nodes[node]:
- G.nodes[node]['viz'] = {"position": {"x": G.nodes[node]['pos'][0], "y": G.nodes[node]['pos'][1], "z": 0.0}}
- del (G.nodes[node]['pos'])
- writer = nx.readwrite.gexf.GEXFWriter(version='1.2draft')
+ if "pos" in G.nodes[node]:
+ G.nodes[node]["viz"] = {
+ "position": {
+ "x": G.nodes[node]["pos"][0],
+ "y": G.nodes[node]["pos"][1],
+ "z": 0.0,
+ }
+ }
+ del G.nodes[node]["pos"]
+ writer = nx.readwrite.gexf.GEXFWriter(version="1.2draft")
writer.add_graph(G)
- self.write_message({'type': 'download_gexf',
- 'filename': self.config['name'] + '_trial_' + str(msg['data']),
- 'data': tostring(writer.xml).decode(writer.encoding) })
+ self.write_message(
+ {
+ "type": "download_gexf",
+ "filename": self.config["name"] + "_trial_" + str(msg["data"]),
+ "data": tostring(writer.xml).decode(writer.encoding),
+ }
+ )
- elif msg['type'] == 'download_json':
- G = self.trials[ int(msg['data']) ].history_to_graph()
+ elif msg["type"] == "download_json":
+ G = self.trials[int(msg["data"])].history_to_graph()
for node in G.nodes():
- if 'pos' in G.nodes[node]:
- G.nodes[node]['viz'] = {"position": {"x": G.nodes[node]['pos'][0], "y": G.nodes[node]['pos'][1], "z": 0.0}}
- del (G.nodes[node]['pos'])
- self.write_message({'type': 'download_json',
- 'filename': self.config['name'] + '_trial_' + str(msg['data']),
- 'data': nx.node_link_data(G) })
+ if "pos" in G.nodes[node]:
+ G.nodes[node]["viz"] = {
+ "position": {
+ "x": G.nodes[node]["pos"][0],
+ "y": G.nodes[node]["pos"][1],
+ "z": 0.0,
+ }
+ }
+ del G.nodes[node]["pos"]
+ self.write_message(
+ {
+ "type": "download_json",
+ "filename": self.config["name"] + "_trial_" + str(msg["data"]),
+ "data": nx.node_link_data(G),
+ }
+ )
else:
if self.application.verbose:
- logger.info('Unexpected message!')
+ logger.info("Unexpected message!")
def update_logging(self):
try:
- if (not self.log_capture_string.closed and self.log_capture_string.getvalue()):
- for i in range(len(self.log_capture_string.getvalue().split('\n')) - 1):
- self.send_log('INFO.' + self.simulation_name, self.log_capture_string.getvalue().split('\n')[i])
+ if (
+ not self.log_capture_string.closed
+ and self.log_capture_string.getvalue()
+ ):
+ for i in range(len(self.log_capture_string.getvalue().split("\n")) - 1):
+ self.send_log(
+ "INFO." + self.simulation_name,
+ self.log_capture_string.getvalue().split("\n")[i],
+ )
self.log_capture_string.truncate(0)
self.log_capture_string.seek(0)
finally:
if self.capture_logging:
- tornado.ioloop.IOLoop.current().call_later(LOGGING_INTERVAL, self.update_logging)
-
+ tornado.ioloop.IOLoop.current().call_later(
+ LOGGING_INTERVAL, self.update_logging
+ )
def on_close(self):
if self.application.verbose:
- logger.info('Socket closed!')
+ logger.info("Socket closed!")
def send_log(self, logger, logging):
- self.write_message({'type': 'log',
- 'logger': logger,
- 'logging': logging})
+ self.write_message({"type": "log", "logger": logger, "logging": logging})
@property
def simulation_name(self):
- return self.config.get('name', 'NoSimulationRunning')
+ return self.config.get("name", "NoSimulationRunning")
@run_on_executor
def nonblocking(self, config):
@@ -174,28 +218,31 @@ class SocketHandler(tornado.websocket.WebSocketHandler):
@tornado.gen.coroutine
def run_simulation(self):
# Run simulation and capture logs
- logger.info('Running simulation!')
- if 'visualization_params' in self.config:
- del self.config['visualization_params']
+ logger.info("Running simulation!")
+ if "visualization_params" in self.config:
+ del self.config["visualization_params"]
with self.logging(self.simulation_name):
try:
config = dict(**self.config)
- config['outdir'] = os.path.join(self.application.outdir, config['name'])
- config['dump'] = self.application.dump
+ config["outdir"] = os.path.join(self.application.outdir, config["name"])
+ config["dump"] = self.application.dump
self.trials = yield self.nonblocking(config)
- self.write_message({'type': 'trials',
- 'data': list(trial.name for trial in self.trials) })
+ self.write_message(
+ {
+ "type": "trials",
+ "data": list(trial.name for trial in self.trials),
+ }
+ )
except Exception as ex:
- error = 'Something went wrong:\n\t{}'.format(ex)
+ error = "Something went wrong:\n\t{}".format(ex)
logging.info(error)
- self.write_message({'type': 'error',
- 'error': error})
- self.send_log('ERROR.' + self.simulation_name, error)
+ self.write_message({"type": "error", "error": error})
+ self.send_log("ERROR." + self.simulation_name, error)
def get_trial(self, trial):
- logger.info('Available trials: %s ' % len(self.trials))
- logger.info('Ask for : %s' % trial)
+ logger.info("Available trials: %s " % len(self.trials))
+ logger.info("Ask for : %s" % trial)
trial = self.trials[trial]
G = trial.history_to_graph()
return nx.node_link_data(G)
@@ -215,25 +262,28 @@ class SocketHandler(tornado.websocket.WebSocketHandler):
self.logger_application.removeHandler(ch)
self.capture_logging = False
return self.capture_logging
-
+
class ModularServer(tornado.web.Application):
- """ Main visualization application. """
+ """Main visualization application."""
port = 8001
- page_handler = (r'/', PageHandler)
- socket_handler = (r'/ws', SocketHandler)
- static_handler = (r'/(.*)', tornado.web.StaticFileHandler,
- {'path': os.path.join(ROOT, 'static')})
- local_handler = (r'/local/(.*)', tornado.web.StaticFileHandler,
- {'path': ''})
+ page_handler = (r"/", PageHandler)
+ socket_handler = (r"/ws", SocketHandler)
+ static_handler = (
+ r"/(.*)",
+ tornado.web.StaticFileHandler,
+ {"path": os.path.join(ROOT, "static")},
+ )
+ local_handler = (r"/local/(.*)", tornado.web.StaticFileHandler, {"path": ""})
handlers = [page_handler, socket_handler, static_handler, local_handler]
- settings = {'debug': True,
- 'template_path': ROOT + '/templates'}
+ settings = {"debug": True, "template_path": ROOT + "/templates"}
+
+ def __init__(
+ self, dump=False, outdir="output", name="SOIL", verbose=True, *args, **kwargs
+ ):
- def __init__(self, dump=False, outdir='output', name='SOIL', verbose=True, *args, **kwargs):
-
self.verbose = verbose
self.name = name
self.dump = dump
@@ -243,12 +293,12 @@ class ModularServer(tornado.web.Application):
super().__init__(self.handlers, **self.settings)
def launch(self, port=None):
- """ Run the app. """
-
+ """Run the app."""
+
if port is not None:
self.port = port
- url = 'http://127.0.0.1:{PORT}'.format(PORT=self.port)
- print('Interface starting at {url}'.format(url=url))
+ url = "http://127.0.0.1:{PORT}".format(PORT=self.port)
+ print("Interface starting at {url}".format(url=url))
self.listen(self.port)
# webbrowser.open(url)
tornado.ioloop.IOLoop.instance().start()
@@ -263,12 +313,22 @@ def run(*args, **kwargs):
def main():
import argparse
- parser = argparse.ArgumentParser(description='Visualization of a Graph Model')
+ parser = argparse.ArgumentParser(description="Visualization of a Graph Model")
- parser.add_argument('--name', '-n', nargs=1, default='SOIL', help='name of the simulation')
- parser.add_argument('--dump', '-d', help='dumping results in folder output', action='store_true')
- parser.add_argument('--port', '-p', nargs=1, default=8001, help='port for launching the server')
- parser.add_argument('--verbose', '-v', help='verbose mode', action='store_true')
+ parser.add_argument(
+ "--name", "-n", nargs=1, default="SOIL", help="name of the simulation"
+ )
+ parser.add_argument(
+ "--dump", "-d", help="dumping results in folder output", action="store_true"
+ )
+ parser.add_argument(
+ "--port", "-p", nargs=1, default=8001, help="port for launching the server"
+ )
+ parser.add_argument("--verbose", "-v", help="verbose mode", action="store_true")
args = parser.parse_args()
- run(name=args.name, port=(args.port[0] if isinstance(args.port, list) else args.port), verbose=args.verbose)
+ run(
+ name=args.name,
+ port=(args.port[0] if isinstance(args.port, list) else args.port),
+ verbose=args.verbose,
+ )
diff --git a/soil/web/__main__.py b/soil/web/__main__.py
index 5c211a8..29c2e0a 100644
--- a/soil/web/__main__.py
+++ b/soil/web/__main__.py
@@ -2,4 +2,4 @@ from . import main
if __name__ == "__main__":
- main()
\ No newline at end of file
+ main()
diff --git a/soil/web/run.py b/soil/web/run.py
index a0b1416..b13ca56 100644
--- a/soil/web/run.py
+++ b/soil/web/run.py
@@ -4,20 +4,33 @@ from simulator import Simulator
def run(simulator, name="SOIL", port=8001, verbose=False):
- server = ModularServer(simulator, name=(name[0] if isinstance(name, list) else name), verbose=verbose)
+ server = ModularServer(
+ simulator, name=(name[0] if isinstance(name, list) else name), verbose=verbose
+ )
server.port = port
server.launch()
if __name__ == "__main__":
- parser = argparse.ArgumentParser(description='Visualization of a Graph Model')
+ parser = argparse.ArgumentParser(description="Visualization of a Graph Model")
- parser.add_argument('--name', '-n', nargs=1, default='SOIL', help='name of the simulation')
- parser.add_argument('--dump', '-d', help='dumping results in folder output', action='store_true')
- parser.add_argument('--port', '-p', nargs=1, default=8001, help='port for launching the server')
- parser.add_argument('--verbose', '-v', help='verbose mode', action='store_true')
+ parser.add_argument(
+ "--name", "-n", nargs=1, default="SOIL", help="name of the simulation"
+ )
+ parser.add_argument(
+ "--dump", "-d", help="dumping results in folder output", action="store_true"
+ )
+ parser.add_argument(
+ "--port", "-p", nargs=1, default=8001, help="port for launching the server"
+ )
+ parser.add_argument("--verbose", "-v", help="verbose mode", action="store_true")
args = parser.parse_args()
soil = Simulator(dump=args.dump)
- run(soil, name=args.name, port=(args.port[0] if isinstance(args.port, list) else args.port), verbose=args.verbose)
+ run(
+ soil,
+ name=args.name,
+ port=(args.port[0] if isinstance(args.port, list) else args.port),
+ verbose=args.verbose,
+ )
From 0efcd24d904b2bee289e4b63d45478e610984d63 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Sun, 16 Oct 2022 21:57:30 +0200
Subject: [PATCH 11/39] Improve exporters
---
examples/rabbits/basic/rabbit_agents.py | 26 +++++++++++++----
examples/rabbits/basic/rabbits.yml | 8 +++--
soil/exporters.py | 26 ++++++++++-------
soil/serialization.py | 10 +++++--
soil/simulation.py | 2 +-
soil/utils.py | 39 ++++++++++++++++---------
tests/test_exporters.py | 2 +-
7 files changed, 78 insertions(+), 35 deletions(-)
diff --git a/examples/rabbits/basic/rabbit_agents.py b/examples/rabbits/basic/rabbit_agents.py
index fc7b73b..bd05057 100644
--- a/examples/rabbits/basic/rabbit_agents.py
+++ b/examples/rabbits/basic/rabbit_agents.py
@@ -1,4 +1,4 @@
-from soil.agents import FSM, state, default_state, BaseAgent, NetworkAgent
+from soil import FSM, state, default_state, BaseAgent, NetworkAgent, Environment
from soil.time import Delta
from enum import Enum
from collections import Counter
@@ -6,7 +6,23 @@ import logging
import math
-class RabbitModel(FSM, NetworkAgent):
+class RabbitEnv(Environment):
+
+ @property
+ def num_rabbits(self):
+ return self.count_agents(agent_class=Rabbit)
+
+ @property
+ def num_males(self):
+ return self.count_agents(agent_class=Male)
+
+ @property
+ def num_females(self):
+ return self.count_agents(agent_class=Female)
+
+
+
+class Rabbit(FSM, NetworkAgent):
sexual_maturity = 30
life_expectancy = 300
@@ -35,7 +51,7 @@ class RabbitModel(FSM, NetworkAgent):
self.die()
-class Male(RabbitModel):
+class Male(Rabbit):
max_females = 5
mating_prob = 0.001
@@ -56,7 +72,7 @@ class Male(RabbitModel):
break # Take a break
-class Female(RabbitModel):
+class Female(Rabbit):
gestation = 30
@state
@@ -119,7 +135,7 @@ class RandomAccident(BaseAgent):
prob_death = self.model.get('prob_death', 1e-100)*math.floor(math.log10(max(1, rabbits_alive)))
self.debug('Killing some rabbits with prob={}!'.format(prob_death))
- for i in self.iter_agents(agent_class=RabbitModel):
+ for i in self.iter_agents(agent_class=Rabbit):
if i.state_id == i.dead.id:
continue
if self.prob(prob_death):
diff --git a/examples/rabbits/basic/rabbits.yml b/examples/rabbits/basic/rabbits.yml
index 6945f67..a137844 100644
--- a/examples/rabbits/basic/rabbits.yml
+++ b/examples/rabbits/basic/rabbits.yml
@@ -7,11 +7,10 @@ description: null
group: null
interval: 1.0
max_time: 100
-model_class: soil.environment.Environment
+model_class: rabbit_agents.RabbitEnv
model_params:
agents:
topology: true
- agent_class: rabbit_agents.RabbitModel
distribution:
- agent_class: rabbit_agents.Male
weight: 1
@@ -34,5 +33,10 @@ model_params:
nodes:
- id: 1
- id: 0
+ model_reporters:
+ num_males: 'num_males'
+ num_females: 'num_females'
+ num_rabbits: |
+ py:lambda env: env.num_males + env.num_females
extra:
visualization_params: {}
diff --git a/soil/exporters.py b/soil/exporters.py
index a31921d..b1850f4 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -10,7 +10,7 @@ import networkx as nx
from .serialization import deserialize
-from .utils import open_or_reuse, logger, timer
+from .utils import try_backup, open_or_reuse, logger, timer
from . import utils, network
@@ -91,12 +91,14 @@ class default(Exporter):
"""Default exporter. Writes sqlite results, as well as the simulation YAML"""
def sim_start(self):
- if not self.dry_run:
- logger.info("Dumping results to %s", self.outdir)
- with self.output(self.simulation.name + ".dumped.yml") as f:
- f.write(self.simulation.to_yaml())
- else:
+ if self.dry_run:
logger.info("NOT dumping results")
+ return
+ logger.info("Dumping results to %s", self.outdir)
+ with self.output(self.simulation.name + ".dumped.yml") as f:
+ f.write(self.simulation.to_yaml())
+ self.dbpath = os.path.join(self.outdir, f"{self.simulation.name}.sqlite")
+ try_backup(self.dbpath, move=True)
def trial_end(self, env):
if self.dry_run:
@@ -107,21 +109,23 @@ class default(Exporter):
"Dumping simulation {} trial {}".format(self.simulation.name, env.id)
):
- fpath = os.path.join(self.outdir, f"{env.id}.sqlite")
- engine = create_engine(f"sqlite:///{fpath}", echo=False)
+ engine = create_engine(f"sqlite:///{self.dbpath}", echo=False)
dc = env.datacollector
- for (t, df) in get_dc_dfs(dc):
+ for (t, df) in get_dc_dfs(dc, trial_id=env.id):
df.to_sql(t, con=engine, if_exists="append")
-def get_dc_dfs(dc):
+def get_dc_dfs(dc, trial_id=None):
dfs = {
"env": dc.get_model_vars_dataframe(),
"agents": dc.get_agent_vars_dataframe(),
}
for table_name in dc.tables:
dfs[table_name] = dc.get_table_dataframe(table_name)
+ if trial_id:
+ for (name, df) in dfs.items():
+ df['trial_id'] = trial_id
yield from dfs.items()
@@ -135,7 +139,7 @@ class csv(Exporter):
self.simulation.name, env.id, self.outdir
)
):
- for (df_name, df) in get_dc_dfs(env.datacollector):
+ for (df_name, df) in get_dc_dfs(env.datacollector, trial_id=env.id):
with self.output("{}.{}.csv".format(env.id, df_name)) as f:
df.to_csv(f)
diff --git a/soil/serialization.py b/soil/serialization.py
index b728983..f0a98df 100644
--- a/soil/serialization.py
+++ b/soil/serialization.py
@@ -197,7 +197,7 @@ def deserializer(type_, known_modules=KNOWN_MODULES):
return getattr(cls, "deserialize", cls)
except (ImportError, AttributeError) as ex:
errors.append((modname, tname, ex))
- raise Exception('Could not find type "{}". Tried: {}'.format(type_, errors))
+ raise ValueError('Could not find type "{}". Tried: {}'.format(type_, errors))
def deserialize(type_, value=None, globs=None, **kwargs):
@@ -207,7 +207,13 @@ def deserialize(type_, value=None, globs=None, **kwargs):
if globs and type_ in globs:
des = globs[type_]
else:
- des = deserializer(type_, **kwargs)
+ try:
+ des = deserializer(type_, **kwargs)
+ except ValueError as ex:
+ try:
+ des = eval(type_)
+ except Exception:
+ raise ex
if value is None:
return des
return des(value)
diff --git a/soil/simulation.py b/soil/simulation.py
index 7c79d92..e5f5526 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -151,7 +151,7 @@ class Simulation:
def deserialize_reporters(reporters):
for (k, v) in reporters.items():
if isinstance(v, str) and v.startswith("py:"):
- reporters[k] = serialization.deserialize(value.lsplit(":", 1)[1])
+ reporters[k] = serialization.deserialize(v.split(":", 1)[1])
return reporters
params = self.model_params.copy()
diff --git a/soil/utils.py b/soil/utils.py
index 9c4bcc7..0422f48 100644
--- a/soil/utils.py
+++ b/soil/utils.py
@@ -4,7 +4,7 @@ import os
import traceback
from functools import partial
-from shutil import copyfile
+from shutil import copyfile, move
from multiprocessing import Pool
from contextlib import contextmanager
@@ -47,21 +47,34 @@ def timer(name="task", pre="", function=logger.info, to_object=None):
to_object.end = end
+def try_backup(path, move=False):
+ if not os.path.exists(path):
+ return None
+ outdir = os.path.dirname(path)
+ if outdir and not os.path.exists(outdir):
+ os.makedirs(outdir)
+ creation = os.path.getctime(path)
+ stamp = strftime("%Y-%m-%d_%H.%M.%S", localtime(creation))
+
+ backup_dir = os.path.join(outdir, "backup")
+ if not os.path.exists(backup_dir):
+ os.makedirs(backup_dir)
+ newpath = os.path.join(
+ backup_dir, "{}@{}".format(os.path.basename(path), stamp)
+ )
+ if move:
+ move(path, newpath)
+ else:
+ copyfile(path, newpath)
+ return newpath
+
+
def safe_open(path, mode="r", backup=True, **kwargs):
outdir = os.path.dirname(path)
if outdir and not os.path.exists(outdir):
os.makedirs(outdir)
- if backup and "w" in mode and os.path.exists(path):
- creation = os.path.getctime(path)
- stamp = strftime("%Y-%m-%d_%H.%M.%S", localtime(creation))
-
- backup_dir = os.path.join(outdir, "backup")
- if not os.path.exists(backup_dir):
- os.makedirs(backup_dir)
- newpath = os.path.join(
- backup_dir, "{}@{}".format(os.path.basename(path), stamp)
- )
- copyfile(path, newpath)
+ if backup and "w" in mode:
+ try_backup(path)
return open(path, mode=mode, **kwargs)
@@ -70,7 +83,7 @@ def open_or_reuse(f, *args, **kwargs):
try:
with safe_open(f, *args, **kwargs) as f:
yield f
- except (AttributeError, TypeError):
+ except (AttributeError, TypeError) as ex:
yield f
diff --git a/tests/test_exporters.py b/tests/test_exporters.py
index 973bd06..baf9d83 100644
--- a/tests/test_exporters.py
+++ b/tests/test_exporters.py
@@ -99,7 +99,7 @@ class Exporters(TestCase):
try:
for e in envs:
- db = sqlite3.connect(os.path.join(simdir, f"{e.id}.sqlite"))
+ db = sqlite3.connect(os.path.join(simdir, f"{s.name}.sqlite"))
cur = db.cursor()
agent_entries = cur.execute("SELECT * from agents").fetchall()
env_entries = cur.execute("SELECT * from env").fetchall()
From 77d08fc59211b74b639a9340bc932e2b33bc125c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Mon, 17 Oct 2022 08:58:51 +0200
Subject: [PATCH 12/39] Agent step can be a generator
---
examples/rabbits/basic/rabbit_agents.py | 4 +---
soil/agents/__init__.py | 28 ++++++++++++++++++----
soil/exporters.py | 2 +-
soil/utils.py | 4 +---
tests/test_agents.py | 31 +++++++++++++++++++++----
5 files changed, 52 insertions(+), 17 deletions(-)
diff --git a/examples/rabbits/basic/rabbit_agents.py b/examples/rabbits/basic/rabbit_agents.py
index bd05057..284c08a 100644
--- a/examples/rabbits/basic/rabbit_agents.py
+++ b/examples/rabbits/basic/rabbit_agents.py
@@ -21,7 +21,6 @@ class RabbitEnv(Environment):
return self.count_agents(agent_class=Female)
-
class Rabbit(FSM, NetworkAgent):
sexual_maturity = 30
@@ -125,8 +124,6 @@ class Female(Rabbit):
class RandomAccident(BaseAgent):
- level = logging.INFO
-
def step(self):
rabbits_alive = self.model.G.number_of_nodes()
@@ -144,6 +141,7 @@ class RandomAccident(BaseAgent):
i.set_state(i.dead)
self.debug('Rabbits alive: {}'.format(rabbits_alive))
+
if __name__ == '__main__':
from soil import easy
sim = easy('rabbits.yml')
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index c284604..0ed5bf3 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -47,11 +47,29 @@ class MetaAgent(ABCMeta):
}
for attr, func in namespace.items():
- if (
- isinstance(func, types.FunctionType)
- or isinstance(func, property)
- or isinstance(func, classmethod)
- or attr[0] == "_"
+ if attr == 'step' and inspect.isgeneratorfunction(func):
+ orig_func = func
+ new_nmspc['_MetaAgent__coroutine'] = None
+
+ @wraps(func)
+ def func(self):
+ while True:
+ if not self.__coroutine:
+ self.__coroutine = orig_func(self)
+ try:
+ return next(self.__coroutine)
+ except StopIteration as ex:
+ self.__coroutine = None
+ return ex.value
+
+ func.id = name or func.__name__
+ func.is_default = False
+ new_nmspc[attr] = func
+ elif (
+ isinstance(func, types.FunctionType)
+ or isinstance(func, property)
+ or isinstance(func, classmethod)
+ or attr[0] == "_"
):
new_nmspc[attr] = func
elif attr == "defaults":
diff --git a/soil/exporters.py b/soil/exporters.py
index b1850f4..55a5597 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -125,7 +125,7 @@ def get_dc_dfs(dc, trial_id=None):
dfs[table_name] = dc.get_table_dataframe(table_name)
if trial_id:
for (name, df) in dfs.items():
- df['trial_id'] = trial_id
+ df["trial_id"] = trial_id
yield from dfs.items()
diff --git a/soil/utils.py b/soil/utils.py
index 0422f48..92d9d74 100644
--- a/soil/utils.py
+++ b/soil/utils.py
@@ -59,9 +59,7 @@ def try_backup(path, move=False):
backup_dir = os.path.join(outdir, "backup")
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
- newpath = os.path.join(
- backup_dir, "{}@{}".format(os.path.basename(path), stamp)
- )
+ newpath = os.path.join(backup_dir, "{}@{}".format(os.path.basename(path), stamp))
if move:
move(path, newpath)
else:
diff --git a/tests/test_agents.py b/tests/test_agents.py
index bee9a9a..8603b1e 100644
--- a/tests/test_agents.py
+++ b/tests/test_agents.py
@@ -13,14 +13,35 @@ class Dead(agents.FSM):
class TestMain(TestCase):
+ def test_die_returns_infinity(self):
+ '''The last step of a dead agent should return time.INFINITY'''
+ d = Dead(unique_id=0, model=environment.Environment())
+ ret = d.step().abs(0)
+ print(ret, "next")
+ assert ret == stime.INFINITY
+
def test_die_raises_exception(self):
+ '''A dead agent should raise an exception if it is stepped after death'''
d = Dead(unique_id=0, model=environment.Environment())
d.step()
with pytest.raises(agents.DeadAgent):
d.step()
- def test_die_returns_infinity(self):
- d = Dead(unique_id=0, model=environment.Environment())
- ret = d.step().abs(0)
- print(ret, "next")
- assert ret == stime.INFINITY
+
+ def test_agent_generator(self):
+ '''
+ The step function of an agent could be a generator. In that case, the state of the
+ agent will be resumed after every call to step.
+ '''
+ class Gen(agents.BaseAgent):
+ def step(self):
+ a = 0
+ for i in range(5):
+ yield a
+ a += 1
+ e = environment.Environment()
+ g = Gen(model=e, unique_id=e.next_id())
+
+ for i in range(5):
+ t = g.step()
+ assert t == i
From 5d759d0072568815fd8a806066961c0fa5024e04 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Mon, 17 Oct 2022 13:58:14 +0200
Subject: [PATCH 13/39] Add conditional time values
---
soil/environment.py | 2 +-
soil/exporters.py | 117 ++++++++++++----------------------
soil/simulation.py | 6 +-
soil/time.py | 136 +++++++++++++++++++++++++++++++---------
soil/utils.py | 2 +-
tests/test_agents.py | 2 +-
tests/test_exporters.py | 1 -
7 files changed, 155 insertions(+), 111 deletions(-)
diff --git a/soil/environment.py b/soil/environment.py
index d89585e..238c494 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -169,7 +169,7 @@ class BaseEnvironment(Model):
Advance one step in the simulation, and update the data collection and scheduler appropriately
"""
super().step()
- self.logger.info(f"--- Step {self.now:^5} ---")
+ self.logger.info(f"--- Step: {self.schedule.steps:^5} - Time: {self.now:^5} ---")
self.schedule.step()
self.datacollector.collect(self)
diff --git a/soil/exporters.py b/soil/exporters.py
index 55a5597..405b2f8 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -3,6 +3,7 @@ import sys
from time import time as current_time
from io import BytesIO
from sqlalchemy import create_engine
+from textwrap import dedent, indent
import matplotlib.pyplot as plt
@@ -86,34 +87,8 @@ class Exporter:
pass
return open_or_reuse(f, mode=mode, **kwargs)
-
-class default(Exporter):
- """Default exporter. Writes sqlite results, as well as the simulation YAML"""
-
- def sim_start(self):
- if self.dry_run:
- logger.info("NOT dumping results")
- return
- logger.info("Dumping results to %s", self.outdir)
- with self.output(self.simulation.name + ".dumped.yml") as f:
- f.write(self.simulation.to_yaml())
- self.dbpath = os.path.join(self.outdir, f"{self.simulation.name}.sqlite")
- try_backup(self.dbpath, move=True)
-
- def trial_end(self, env):
- if self.dry_run:
- logger.info("Running in DRY_RUN mode, the database will NOT be created")
- return
-
- with timer(
- "Dumping simulation {} trial {}".format(self.simulation.name, env.id)
- ):
-
- engine = create_engine(f"sqlite:///{self.dbpath}", echo=False)
-
- dc = env.datacollector
- for (t, df) in get_dc_dfs(dc, trial_id=env.id):
- df.to_sql(t, con=engine, if_exists="append")
+ def get_dfs(self, env):
+ yield from get_dc_dfs(env.datacollector, trial_id=env.id)
def get_dc_dfs(dc, trial_id=None):
@@ -129,6 +104,34 @@ def get_dc_dfs(dc, trial_id=None):
yield from dfs.items()
+class default(Exporter):
+ """Default exporter. Writes sqlite results, as well as the simulation YAML"""
+
+ def sim_start(self):
+ if self.dry_run:
+ logger.info("NOT dumping results")
+ return
+ logger.info("Dumping results to %s", self.outdir)
+ with self.output(self.simulation.name + ".dumped.yml") as f:
+ f.write(self.simulation.to_yaml())
+ self.dbpath = os.path.join(self.outdir, f"{self.simulation.name}.sqlite")
+ try_backup(self.dbpath, remove=True)
+
+ def trial_end(self, env):
+ if self.dry_run:
+ logger.info("Running in DRY_RUN mode, the database will NOT be created")
+ return
+
+ with timer(
+ "Dumping simulation {} trial {}".format(self.simulation.name, env.id)
+ ):
+
+ engine = create_engine(f"sqlite:///{self.dbpath}", echo=False)
+
+ for (t, df) in self.get_dfs(env):
+ df.to_sql(t, con=engine, if_exists="append")
+
+
class csv(Exporter):
"""Export the state of each environment (and its agents) in a separate CSV file"""
@@ -139,7 +142,7 @@ class csv(Exporter):
self.simulation.name, env.id, self.outdir
)
):
- for (df_name, df) in get_dc_dfs(env.datacollector, trial_id=env.id):
+ for (df_name, df) in self.get_dfs(env):
with self.output("{}.{}.csv".format(env.id, df_name)) as f:
df.to_csv(f)
@@ -192,52 +195,14 @@ class graphdrawing(Exporter):
f.savefig(f)
-"""
-Convert an environment into a NetworkX graph
-"""
+class summary(Exporter):
+ """Print a summary of each trial to sys.stdout"""
-
-def env_to_graph(env, history=None):
- G = nx.Graph(env.G)
-
- for agent in env.network_agents:
-
- attributes = {"agent": str(agent.__class__)}
- lastattributes = {}
- spells = []
- lastvisible = False
- laststep = None
- if not history:
- history = sorted(list(env.state_to_tuples()))
- for _, t_step, attribute, value in history:
- if attribute == "visible":
- nowvisible = value
- if nowvisible and not lastvisible:
- laststep = t_step
- if not nowvisible and lastvisible:
- spells.append((laststep, t_step))
-
- lastvisible = nowvisible
+ def trial_end(self, env):
+ for (t, df) in self.get_dfs(env):
+ if not len(df):
continue
- key = "attr_" + attribute
- if key not in attributes:
- attributes[key] = list()
- if key not in lastattributes:
- lastattributes[key] = (value, t_step)
- elif lastattributes[key][0] != value:
- last_value, laststep = lastattributes[key]
- commit_value = (last_value, laststep, t_step)
- if key not in attributes:
- attributes[key] = list()
- attributes[key].append(commit_value)
- lastattributes[key] = (value, t_step)
- for k, v in lastattributes.items():
- attributes[k].append((v[0], v[1], None))
- if lastvisible:
- spells.append((laststep, None))
- if spells:
- G.add_node(agent.id, spells=spells, **attributes)
- else:
- G.add_node(agent.id, **attributes)
-
- return G
+ msg = indent(str(df.describe()), ' ')
+ logger.info(dedent(f'''
+ Dataframe {t}:
+ ''') + msg)
diff --git a/soil/simulation.py b/soil/simulation.py
index e5f5526..946023f 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -21,7 +21,6 @@ import pickle
from . import serialization, exporters, utils, basestring, agents
from .environment import Environment
from .utils import logger, run_and_return_exceptions
-from .time import INFINITY
from .config import Config, convert_old
@@ -194,7 +193,7 @@ class Simulation:
# Set up agents on nodes
def is_done():
- return False
+ return not model.running
if until and hasattr(model.schedule, "time"):
prev = is_done
@@ -226,6 +225,9 @@ Model stats:
f'Simulation time {model.schedule.time}/{until}. Next: {getattr(model.schedule, "next_time", model.schedule.time + self.interval)}'
)
model.step()
+
+ if model.schedule.time < until: # Simulation ended (no more steps) before until (i.e., no changes expected)
+ model.schedule.time = until
return model
def to_dict(self):
diff --git a/soil/time.py b/soil/time.py
index 11e3178..661e35e 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -2,6 +2,10 @@ from mesa.time import BaseScheduler
from queue import Empty
from heapq import heappush, heappop, heapify
import math
+
+from inspect import getsource
+from numbers import Number
+
from .utils import logger
from mesa import Agent as MesaAgent
@@ -15,9 +19,55 @@ class When:
return time
self._time = time
- def abs(self, time):
+ def next(self, time):
return self._time
+ def abs(self, time):
+ return self
+
+ def __repr__(self):
+ return str(f"When({self._time})")
+
+ def __lt__(self, other):
+ if isinstance(other, Number):
+ return self._time < other
+ return self._time < other.next(self._time)
+
+ def __gt__(self, other):
+ if isinstance(other, Number):
+ return self._time > other
+ return self._time > other.next(self._time)
+
+ def ready(self, time):
+ return self._time <= time
+
+
+class Cond(When):
+ def __init__(self, func, delta=1):
+ self._func = func
+ self._delta = delta
+
+ def next(self, time):
+ return time + self._delta
+
+ def abs(self, time):
+ return self
+
+ def ready(self, time):
+ return self._func(time)
+
+ def __eq__(self, other):
+ return False
+
+ def __lt__(self, other):
+ return True
+
+ def __gt__(self, other):
+ return False
+
+ def __repr__(self):
+ return str(f'Cond("{getsource(self._func)}")')
+
NEVER = When(INFINITY)
@@ -27,11 +77,19 @@ class Delta(When):
self._delta = delta
def __eq__(self, other):
- return self._delta == other._delta
+ if isinstance(other, Delta):
+ return self._delta == other._delta
+ return False
def abs(self, time):
+ return When(self._delta + time)
+
+ def next(self, time):
return time + self._delta
+ def __repr__(self):
+ return str(f"Delta({self._delta})")
+
class TimedActivation(BaseScheduler):
"""A scheduler which activates each agent when the agent requests.
@@ -47,14 +105,15 @@ class TimedActivation(BaseScheduler):
def add(self, agent: MesaAgent, when=None):
if when is None:
- when = self.time
+ when = When(self.time)
+ elif not isinstance(when, When):
+ when = When(when)
if agent.unique_id in self._agents:
- self._queue.remove((self._next[agent.unique_id], agent.unique_id))
+ self._queue.remove((self._next[agent.unique_id], agent))
del self._agents[agent.unique_id]
heapify(self._queue)
- heappush(self._queue, (when, agent.unique_id))
- self._next[agent.unique_id] = when
+ heappush(self._queue, (when, agent))
super().add(agent)
def step(self) -> None:
@@ -63,42 +122,61 @@ class TimedActivation(BaseScheduler):
an agent will signal when it wants to be scheduled next.
"""
- self.logger.debug(f"Simulation step {self.next_time}")
+ self.logger.debug(f"Simulation step {self.time}")
if not self.model.running:
return
- self.time = self.next_time
- when = self.time
+ when = NEVER
- while self._queue and self._queue[0][0] == self.time:
- (when, agent_id) = heappop(self._queue)
- self.logger.debug(f"Stepping agent {agent_id}")
+ to_process = []
+ skipped = []
+ next_time = INFINITY
- agent = self._agents[agent_id]
- returned = agent.step()
+ ix = 0
+
+ while self._queue:
+ (when, agent) = self._queue[0]
+ if when > self.time:
+ break
+ heappop(self._queue)
+ if when.ready(self.time):
+ to_process.append(agent)
+ continue
+
+ next_time = min(next_time, when.next(self.time))
+ self._next[agent.unique_id] = next_time
+ skipped.append((when, agent))
+
+ if self._queue:
+ next_time = min(next_time, self._queue[0][0].next(self.time))
+
+ self._queue = [*skipped, *self._queue]
+
+ for agent in to_process:
+ self.logger.debug(f"Stepping agent {agent}")
+
+ returned = ((agent.step() or Delta(1))).abs(self.time)
if not getattr(agent, "alive", True):
self.remove(agent)
continue
- when = (returned or Delta(1)).abs(self.time)
- if when < self.time:
- raise Exception(
- "Cannot schedule an agent for a time in the past ({} < {})".format(
- when, self.time
- )
- )
+ value = when.next(self.time)
- self._next[agent_id] = when
- heappush(self._queue, (when, agent_id))
+ if value < self.time:
+ raise Exception(
+ f"Cannot schedule an agent for a time in the past ({when} < {self.time})"
+ )
+ if value < INFINITY:
+ next_time = min(value, next_time)
+
+ self._next[agent.unique_id] = returned
+ heappush(self._queue, (returned, agent))
self.steps += 1
+ self.logger.debug(f"Updating time step: {self.time} -> {next_time}")
+ self.time = next_time
- if not self._queue:
- self.time = INFINITY
- self.next_time = INFINITY
+ if not self._queue or next_time == INFINITY:
self.model.running = False
return self.time
-
- self.next_time = self._queue[0][0]
- self.logger.debug(f"Next step: {self.next_time}")
diff --git a/soil/utils.py b/soil/utils.py
index 92d9d74..e1b3580 100644
--- a/soil/utils.py
+++ b/soil/utils.py
@@ -47,7 +47,7 @@ def timer(name="task", pre="", function=logger.info, to_object=None):
to_object.end = end
-def try_backup(path, move=False):
+def try_backup(path, remove=False):
if not os.path.exists(path):
return None
outdir = os.path.dirname(path)
diff --git a/tests/test_agents.py b/tests/test_agents.py
index 8603b1e..d3db80e 100644
--- a/tests/test_agents.py
+++ b/tests/test_agents.py
@@ -18,7 +18,7 @@ class TestMain(TestCase):
d = Dead(unique_id=0, model=environment.Environment())
ret = d.step().abs(0)
print(ret, "next")
- assert ret == stime.INFINITY
+ assert ret == stime.NEVER
def test_die_raises_exception(self):
'''A dead agent should raise an exception if it is stepped after death'''
diff --git a/tests/test_exporters.py b/tests/test_exporters.py
index baf9d83..1b1b072 100644
--- a/tests/test_exporters.py
+++ b/tests/test_exporters.py
@@ -50,7 +50,6 @@ class Exporters(TestCase):
for env in s.run_simulation(exporters=[Dummy], dry_run=True):
assert len(env.agents) == 1
- assert env.now == max_time
assert Dummy.started
assert Dummy.ended
From 227fdf050e307de3032aa471d79a2459d273d392 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Mon, 17 Oct 2022 19:29:39 +0200
Subject: [PATCH 14/39] Fix conditionals
---
examples/pubcrawl/pubcrawl.py | 7 +-
examples/rabbits/README.md | 10 ++
examples/rabbits/basic/rabbit_agents.py | 66 ++++----
examples/rabbits/improved/rabbit_agents.py | 179 ++++++++++++---------
examples/rabbits/improved/rabbits.yml | 8 +-
soil/__init__.py | 20 ++-
soil/__main__.py | 4 +-
soil/agents/__init__.py | 103 ++----------
soil/debugging.py | 4 +-
soil/environment.py | 26 ++-
soil/network.py | 6 +-
soil/simulation.py | 2 +-
soil/time.py | 40 +++--
tests/test_agents.py | 2 +-
tests/test_time.py | 74 +++++++++
15 files changed, 320 insertions(+), 231 deletions(-)
create mode 100644 tests/test_time.py
diff --git a/examples/pubcrawl/pubcrawl.py b/examples/pubcrawl/pubcrawl.py
index b220856..9fd1b04 100644
--- a/examples/pubcrawl/pubcrawl.py
+++ b/examples/pubcrawl/pubcrawl.py
@@ -64,6 +64,7 @@ class Patron(FSM, NetworkAgent):
drunk = False
pints = 0
max_pints = 3
+ kicked_out = False
@default_state
@state
@@ -105,7 +106,9 @@ class Patron(FSM, NetworkAgent):
'''I'm out. Take me home!'''
self.info('I\'m so drunk. Take me home!')
self['drunk'] = True
- pass # out drunk
+ if self.kicked_out:
+ return self.at_home
+ pass # out drun
@state
def at_home(self):
@@ -118,7 +121,7 @@ class Patron(FSM, NetworkAgent):
self.debug('Cheers to that')
def kick_out(self):
- self.set_state(self.at_home)
+ self.kicked_out = True
def befriend(self, other_agent, force=False):
'''
diff --git a/examples/rabbits/README.md b/examples/rabbits/README.md
index 42b6011..dfee8ef 100644
--- a/examples/rabbits/README.md
+++ b/examples/rabbits/README.md
@@ -2,3 +2,13 @@ There are two similar implementations of this simulation.
- `basic`. Using simple primites
- `improved`. Using more advanced features such as the `time` module to avoid unnecessary computations (i.e., skip steps), and generator functions.
+
+The examples can be run directly in the terminal, and they accept command like arguments.
+For example, to enable the CSV exporter and the Summary exporter, while setting `max_time` to `100` and `seed` to `CustomSeed`:
+
+```
+python rabbit_agents.py --set max_time=100 --csv -e summary --set 'seed="CustomSeed"'
+```
+
+To learn more about how this functionality works, check out the `soil.easy` function.
+
diff --git a/examples/rabbits/basic/rabbit_agents.py b/examples/rabbits/basic/rabbit_agents.py
index 284c08a..60a0d15 100644
--- a/examples/rabbits/basic/rabbit_agents.py
+++ b/examples/rabbits/basic/rabbit_agents.py
@@ -1,6 +1,4 @@
from soil import FSM, state, default_state, BaseAgent, NetworkAgent, Environment
-from soil.time import Delta
-from enum import Enum
from collections import Counter
import logging
import math
@@ -21,7 +19,7 @@ class RabbitEnv(Environment):
return self.count_agents(agent_class=Female)
-class Rabbit(FSM, NetworkAgent):
+class Rabbit(NetworkAgent, FSM):
sexual_maturity = 30
life_expectancy = 300
@@ -72,7 +70,8 @@ class Male(Rabbit):
class Female(Rabbit):
- gestation = 30
+ gestation = 10
+ pregnancy = -1
@state
def fertile(self):
@@ -80,46 +79,49 @@ class Female(Rabbit):
self.age += 1
if self.age > self.life_expectancy:
return self.dead
+ if self.pregnancy >= 0:
+ return self.pregnant
def impregnate(self, male):
- self.info(f'{repr(male)} impregnating female {repr(self)}')
+ self.info(f'impregnated by {repr(male)}')
self.mate = male
- self.pregnancy = -1
- self.set_state(self.pregnant, when=self.now)
+ self.pregnancy = 0
self.number_of_babies = int(8+4*self.random.random())
@state
def pregnant(self):
- self.debug('I am pregnant')
+ self.info('I am pregnant')
self.age += 1
- self.pregnancy += 1
- if self.prob(self.age / self.life_expectancy):
+ if self.age >= self.life_expectancy:
return self.die()
- if self.pregnancy >= self.gestation:
- self.info('Having {} babies'.format(self.number_of_babies))
- for i in range(self.number_of_babies):
- state = {}
- agent_class = self.random.choice([Male, Female])
- child = self.model.add_node(agent_class=agent_class,
- **state)
- child.add_edge(self)
- try:
- child.add_edge(self.mate)
- self.model.agents[self.mate].offspring += 1
- except ValueError:
- self.debug('The father has passed away')
+ if self.pregnancy < self.gestation:
+ self.pregnancy += 1
+ return
- self.offspring += 1
- self.mate = None
- return self.fertile
+ self.info('Having {} babies'.format(self.number_of_babies))
+ for i in range(self.number_of_babies):
+ state = {}
+ agent_class = self.random.choice([Male, Female])
+ child = self.model.add_node(agent_class=agent_class,
+ **state)
+ child.add_edge(self)
+ try:
+ child.add_edge(self.mate)
+ self.model.agents[self.mate].offspring += 1
+ except ValueError:
+ self.debug('The father has passed away')
- @state
- def dead(self):
- super().dead()
+ self.offspring += 1
+ self.mate = None
+ self.pregnancy = -1
+ return self.fertile
+
+ def die(self):
if 'pregnancy' in self and self['pregnancy'] > -1:
self.info('A mother has died carrying a baby!!')
+ return super().die()
class RandomAccident(BaseAgent):
@@ -138,11 +140,11 @@ class RandomAccident(BaseAgent):
if self.prob(prob_death):
self.info('I killed a rabbit: {}'.format(i.id))
rabbits_alive -= 1
- i.set_state(i.dead)
+ i.die()
self.debug('Rabbits alive: {}'.format(rabbits_alive))
if __name__ == '__main__':
from soil import easy
- sim = easy('rabbits.yml')
- sim.run()
+ with easy('rabbits.yml') as sim:
+ sim.run()
diff --git a/examples/rabbits/improved/rabbit_agents.py b/examples/rabbits/improved/rabbit_agents.py
index d97b7e7..c7d995d 100644
--- a/examples/rabbits/improved/rabbit_agents.py
+++ b/examples/rabbits/improved/rabbit_agents.py
@@ -1,130 +1,157 @@
-from soil.agents import FSM, state, default_state, BaseAgent, NetworkAgent
-from soil.time import Delta, When, NEVER
+from soil import FSM, state, default_state, BaseAgent, NetworkAgent, Environment
+from soil.time import Delta
from enum import Enum
+from collections import Counter
import logging
import math
-class RabbitModel(FSM, NetworkAgent):
+class RabbitEnv(Environment):
- mating_prob = 0.005
- offspring = 0
+ @property
+ def num_rabbits(self):
+ return self.count_agents(agent_class=Rabbit)
+
+ @property
+ def num_males(self):
+ return self.count_agents(agent_class=Male)
+
+ @property
+ def num_females(self):
+ return self.count_agents(agent_class=Female)
+
+
+class Rabbit(FSM, NetworkAgent):
+
+ sexual_maturity = 30
+ life_expectancy = 300
birth = None
- sexual_maturity = 3
- life_expectancy = 30
+ @property
+ def age(self):
+ if self.birth is None:
+ return None
+ return self.now - self.birth
@default_state
@state
def newborn(self):
+ self.info('I am a newborn.')
self.birth = self.now
- self.info(f'I am a newborn.')
- self.model['rabbits_alive'] = self.model.get('rabbits_alive', 0) + 1
+ self.offspring = 0
+ return self.youngling, Delta(self.sexual_maturity - self.age)
- # Here we can skip the `youngling` state by using a coroutine/generator.
- while self.age < self.sexual_maturity:
- interval = self.sexual_maturity - self.age
- yield Delta(interval)
-
- self.info(f'I am fertile! My age is {self.age}')
- return self.fertile
-
- @property
- def age(self):
- return self.now - self.birth
+ @state
+ def youngling(self):
+ if self.age >= self.sexual_maturity:
+ self.info(f'I am fertile! My age is {self.age}')
+ return self.fertile
@state
def fertile(self):
raise Exception("Each subclass should define its fertile state")
- def step(self):
- super().step()
- if self.prob(self.age / self.life_expectancy):
- return self.die()
+ @state
+ def dead(self):
+ self.die()
-class Male(RabbitModel):
-
+class Male(Rabbit):
max_females = 5
+ mating_prob = 0.001
@state
def fertile(self):
+ if self.age > self.life_expectancy:
+ return self.dead
+
# Males try to mate
for f in self.model.agents(agent_class=Female,
state_id=Female.fertile.id,
limit=self.max_females):
- self.debug('Found a female:', repr(f))
+ self.debug('FOUND A FEMALE: ', repr(f), self.mating_prob)
if self.prob(self['mating_prob']):
f.impregnate(self)
- break # Take a break, don't try to impregnate the rest
+ break # Do not try to impregnate other females
-
-class Female(RabbitModel):
- due_date = None
- age_of_pregnancy = None
+
+class Female(Rabbit):
gestation = 10
- mate = None
+ conception = None
@state
def fertile(self):
- return self.fertile, NEVER
+ # Just wait for a Male
+ if self.age > self.life_expectancy:
+ return self.dead
+ if self.conception is not None:
+ return self.pregnant
+
+ @property
+ def pregnancy(self):
+ if self.conception is None:
+ return None
+ return self.now - self.conception
+
+ def impregnate(self, male):
+ self.info(f'impregnated by {repr(male)}')
+ self.mate = male
+ self.conception = self.now
+ self.number_of_babies = int(8+4*self.random.random())
@state
def pregnant(self):
- self.info('I am pregnant')
+ self.debug('I am pregnant')
+
if self.age > self.life_expectancy:
- return self.dead
+ self.info("Dying before giving birth")
+ return self.die()
- self.due_date = self.now + self.gestation
+ if self.pregnancy >= self.gestation:
+ self.info('Having {} babies'.format(self.number_of_babies))
+ for i in range(self.number_of_babies):
+ state = {}
+ agent_class = self.random.choice([Male, Female])
+ child = self.model.add_node(agent_class=agent_class,
+ **state)
+ child.add_edge(self)
+ if self.mate:
+ child.add_edge(self.mate)
+ self.mate.offspring += 1
+ else:
+ self.debug('The father has passed away')
- number_of_babies = int(8+4*self.random.random())
+ self.offspring += 1
+ self.mate = None
+ return self.fertile
- while self.now < self.due_date:
- yield When(self.due_date)
-
- self.info('Having {} babies'.format(number_of_babies))
- for i in range(number_of_babies):
- agent_class = self.random.choice([Male, Female])
- child = self.model.add_node(agent_class=agent_class,
- topology=self.topology)
- self.model.add_edge(self, child)
- self.model.add_edge(self.mate, child)
- self.offspring += 1
- self.model.agents[self.mate].offspring += 1
- self.mate = None
- self.due_date = None
- return self.fertile
-
- @state
- def dead(self):
- super().dead()
- if self.due_date is not None:
+ def die(self):
+ if self.pregnancy is not None:
self.info('A mother has died carrying a baby!!')
-
- def impregnate(self, male):
- self.info(f'{repr(male)} impregnating female {repr(self)}')
- self.mate = male
- self.set_state(self.pregnant, when=self.now)
+ return super().die()
class RandomAccident(BaseAgent):
- level = logging.INFO
-
def step(self):
- rabbits_total = self.model.topology.number_of_nodes()
- if 'rabbits_alive' not in self.model:
- self.model['rabbits_alive'] = 0
- rabbits_alive = self.model.get('rabbits_alive', rabbits_total)
+ rabbits_alive = self.model.G.number_of_nodes()
+
+ if not rabbits_alive:
+ return self.die()
+
prob_death = self.model.get('prob_death', 1e-100)*math.floor(math.log10(max(1, rabbits_alive)))
self.debug('Killing some rabbits with prob={}!'.format(prob_death))
- for i in self.model.network_agents:
- if i.state.id == i.dead.id:
+ for i in self.iter_agents(agent_class=Rabbit):
+ if i.state_id == i.dead.id:
continue
if self.prob(prob_death):
self.info('I killed a rabbit: {}'.format(i.id))
- rabbits_alive = self.model['rabbits_alive'] = rabbits_alive -1
- i.set_state(i.dead)
- self.debug('Rabbits alive: {}/{}'.format(rabbits_alive, rabbits_total))
- if self.model.count_agents(state_id=RabbitModel.dead.id) == self.model.topology.number_of_nodes():
- self.die()
+ rabbits_alive -= 1
+ i.die()
+ self.debug('Rabbits alive: {}'.format(rabbits_alive))
+
+
+if __name__ == '__main__':
+ from soil import easy
+ with easy('rabbits.yml') as sim:
+ sim.run()
diff --git a/examples/rabbits/improved/rabbits.yml b/examples/rabbits/improved/rabbits.yml
index dd13c4e..204270c 100644
--- a/examples/rabbits/improved/rabbits.yml
+++ b/examples/rabbits/improved/rabbits.yml
@@ -7,11 +7,10 @@ description: null
group: null
interval: 1.0
max_time: 100
-model_class: soil.environment.Environment
+model_class: rabbit_agents.RabbitEnv
model_params:
agents:
topology: true
- agent_class: rabbit_agents.RabbitModel
distribution:
- agent_class: rabbit_agents.Male
weight: 1
@@ -34,5 +33,10 @@ model_params:
nodes:
- id: 1
- id: 0
+ model_reporters:
+ num_males: 'num_males'
+ num_females: 'num_females'
+ num_rabbits: |
+ py:lambda env: env.num_males + env.num_females
extra:
visualization_params: {}
diff --git a/soil/__init__.py b/soil/__init__.py
index 46d56bd..a49462b 100644
--- a/soil/__init__.py
+++ b/soil/__init__.py
@@ -5,6 +5,7 @@ import sys
import os
import logging
import traceback
+from contextlib import contextmanager
from .version import __version__
@@ -30,6 +31,7 @@ def main(
*,
do_run=False,
debug=False,
+ pdb=False,
**kwargs,
):
import argparse
@@ -154,6 +156,7 @@ def main(
if args.pdb or debug:
args.synchronous = True
+ os.environ["SOIL_POSTMORTEM"] = "true"
res = []
try:
@@ -214,9 +217,20 @@ def main(
return res
-def easy(cfg, debug=False, **kwargs):
- return main(cfg, **kwargs)[0]
-
+@contextmanager
+def easy(cfg, pdb=False, debug=False, **kwargs):
+ ex = None
+ try:
+ yield main(cfg, **kwargs)[0]
+ except Exception as e:
+ if os.environ.get("SOIL_POSTMORTEM"):
+ from .debugging import post_mortem
+ print(traceback.format_exc())
+ post_mortem()
+ ex = e
+ finally:
+ if ex:
+ raise ex
if __name__ == "__main__":
main(do_run=True)
diff --git a/soil/__main__.py b/soil/__main__.py
index 0c76791..9ad5c4f 100644
--- a/soil/__main__.py
+++ b/soil/__main__.py
@@ -1,9 +1,7 @@
from . import main as init_main
-
def main():
init_main(do_run=True)
-
-if __name__ == "__main__":
+if __name__ == '__main__':
init_main(do_run=True)
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index 0ed5bf3..b316caa 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -29,10 +29,6 @@ def as_node(agent):
IGNORED_FIELDS = ("model", "logger")
-class DeadAgent(Exception):
- pass
-
-
class MetaAgent(ABCMeta):
def __new__(mcls, name, bases, namespace):
defaults = {}
@@ -198,7 +194,7 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
def step(self):
if not self.alive:
- raise DeadAgent(self.unique_id)
+ raise time.DeadAgent(self.unique_id)
return super().step() or time.Delta(self.interval)
def log(self, message, *args, level=logging.INFO, **kwargs):
@@ -264,6 +260,10 @@ class NetworkAgent(BaseAgent):
return list(self.iter_agents(limit_neighbors=True, **kwargs))
def add_edge(self, other):
+ assert self.node_id
+ assert other.node_id
+ assert self.node_id in self.G.nodes
+ assert other.node_id in self.G.nodes
self.topology.add_edge(self.node_id, other.node_id)
@property
@@ -303,7 +303,9 @@ class NetworkAgent(BaseAgent):
return G
def remove_node(self):
+ print(f'Removing node for {self.unique_id}: {self.node_id}')
self.G.remove_node(self.node_id)
+ self.node_id = None
def add_edge(self, other, edge_attr_dict=None, *edge_attrs):
if self.node_id not in self.G.nodes(data=False):
@@ -322,6 +324,8 @@ class NetworkAgent(BaseAgent):
)
def die(self, remove=True):
+ if not self.alive:
+ return
if remove:
self.remove_node()
return super().die()
@@ -351,7 +355,7 @@ def state(name=None):
self._coroutine = None
next_state = ex.value
if next_state is not None:
- self.set_state(next_state)
+ self._set_state(next_state)
return next_state
func.id = name or func.__name__
@@ -401,8 +405,8 @@ class MetaFSM(MetaAgent):
class FSM(BaseAgent, metaclass=MetaFSM):
- def __init__(self, *args, **kwargs):
- super(FSM, self).__init__(*args, **kwargs)
+ def __init__(self, **kwargs):
+ super(FSM, self).__init__(**kwargs)
if not hasattr(self, "state_id"):
if not self._default_state:
raise ValueError(
@@ -411,7 +415,7 @@ class FSM(BaseAgent, metaclass=MetaFSM):
self.state_id = self._default_state.id
self._coroutine = None
- self.set_state(self.state_id)
+ self._set_state(self.state_id)
def step(self):
self.debug(f"Agent {self.unique_id} @ state {self.state_id}")
@@ -434,11 +438,11 @@ class FSM(BaseAgent, metaclass=MetaFSM):
pass
if next_state is not None:
- self.set_state(next_state)
+ self._set_state(next_state)
return when or default_interval
- def set_state(self, state, when=None):
+ def _set_state(self, state, when=None):
if hasattr(state, "id"):
state = state.id
if state not in self._states:
@@ -576,83 +580,6 @@ def _convert_agent_classs(ind, to_string=False, **kwargs):
return deserialize_definition(ind, **kwargs)
-# def _agent_from_definition(definition, random, value=-1, unique_id=None):
-# """Used in the initialization of agents given an agent distribution."""
-# if value < 0:
-# value = random.random()
-# for d in sorted(definition, key=lambda x: x.get('threshold')):
-# threshold = d.get('threshold', (-1, -1))
-# # Check if the definition matches by id (first) or by threshold
-# if (unique_id is not None and unique_id in d.get('ids', [])) or \
-# (value >= threshold[0] and value < threshold[1]):
-# state = {}
-# if 'state' in d:
-# state = deepcopy(d['state'])
-# return d['agent_class'], state
-
-# raise Exception('Definition for value {} not found in: {}'.format(value, definition))
-
-
-# def _definition_to_dict(definition, random, size=None, default_state=None):
-# state = default_state or {}
-# agents = {}
-# remaining = {}
-# if size:
-# for ix in range(size):
-# remaining[ix] = copy(state)
-# else:
-# remaining = defaultdict(lambda x: copy(state))
-
-# distro = sorted([item for item in definition if 'weight' in item])
-
-# id = 0
-
-# def init_agent(item, id=ix):
-# while id in agents:
-# id += 1
-
-# agent = remaining[id]
-# agent['state'].update(copy(item.get('state', {})))
-# agents[agent.unique_id] = agent
-# del remaining[id]
-# return agent
-
-# for item in definition:
-# if 'ids' in item:
-# ids = item['ids']
-# del item['ids']
-# for id in ids:
-# agent = init_agent(item, id)
-
-# for item in definition:
-# if 'number' in item:
-# times = item['number']
-# del item['number']
-# for times in range(times):
-# if size:
-# ix = random.choice(remaining.keys())
-# agent = init_agent(item, id)
-# else:
-# agent = init_agent(item)
-# if not size:
-# return agents
-
-# if len(remaining) < 0:
-# raise Exception('Invalid definition. Too many agents to add')
-
-
-# total_weight = float(sum(s['weight'] for s in distro))
-# unit = size / total_weight
-
-# for item in distro:
-# times = unit * item['weight']
-# del item['weight']
-# for times in range(times):
-# ix = random.choice(remaining.keys())
-# agent = init_agent(item, id)
-# return agents
-
-
class AgentView(Mapping, Set):
"""A lazy-loaded list of agents."""
diff --git a/soil/debugging.py b/soil/debugging.py
index 607996b..f5a43e7 100644
--- a/soil/debugging.py
+++ b/soil/debugging.py
@@ -31,8 +31,8 @@ class Debug(pdb.Pdb):
def __init__(self, *args, skip_soil=False, **kwargs):
skip = kwargs.get("skip", [])
skip.append("soil")
+ skip.append("contextlib")
if skip_soil:
- skip.append("soil")
skip.append("soil.*")
skip.append("mesa.*")
super(Debug, self).__init__(*args, skip=skip, **kwargs)
@@ -181,7 +181,7 @@ def set_trace(frame=None, **kwargs):
debugger.set_trace(frame)
-def post_mortem(traceback=None):
+def post_mortem(traceback=None, **kwargs):
global debugger
if debugger is None:
debugger = Debug(**kwargs)
diff --git a/soil/environment.py b/soil/environment.py
index 238c494..fb4823f 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -142,12 +142,12 @@ class BaseEnvironment(Model):
"The environment has not been scheduled, so it has no sense of time"
)
- def add_agent(self, agent_class, unique_id=None, **kwargs):
- a = None
+ def add_agent(self, unique_id=None, **kwargs):
if unique_id is None:
unique_id = self.next_id()
- a = agent_class(model=self, unique_id=unique_id, **args)
+ kwargs['unique_id'] = unique_id
+ a = self._agent_from_dict(kwargs)
self.schedule.add(a)
return a
@@ -236,6 +236,7 @@ class NetworkEnvironment(BaseEnvironment):
node_id = agent.get("node_id", None)
if node_id is None:
node_id = network.find_unassigned(self.G, random=self.random)
+ self.G.nodes[node_id]['agent'] = None
agent["node_id"] = node_id
agent["unique_id"] = unique_id
agent["topology"] = self.G
@@ -269,18 +270,29 @@ class NetworkEnvironment(BaseEnvironment):
node_id = network.find_unassigned(
G=self.G, shuffle=True, random=self.random
)
+ if node_id is None:
+ node_id = f'node_for_{unique_id}'
- if node_id in G.nodes:
- self.G.nodes[node_id]["agent"] = None # Reserve
- else:
+ if node_id not in self.G.nodes:
self.G.add_node(node_id)
+ assert "agent" not in self.G.nodes[node_id]
+ self.G.nodes[node_id]["agent"] = None # Reserve
+
a = self.add_agent(
- unique_id=unique_id, agent_class=agent_class, node_id=node_id, **kwargs
+ unique_id=unique_id, agent_class=agent_class, topology=self.G, node_id=node_id, **kwargs
)
a["visible"] = True
return a
+ def add_agent(self, *args, **kwargs):
+ a = super().add_agent(*args, **kwargs)
+ if 'node_id' in a:
+ if a.node_id == 24:
+ import pdb;pdb.set_trace()
+ assert self.G.nodes[a.node_id]['agent'] == a
+ return a
+
def agent_for_node_id(self, node_id):
return self.G.nodes[node_id].get("agent")
diff --git a/soil/network.py b/soil/network.py
index 5c0b005..be7d96f 100644
--- a/soil/network.py
+++ b/soil/network.py
@@ -65,10 +65,8 @@ def find_unassigned(G, shuffle=False, random=random):
random.shuffle(candidates)
for next_id, data in candidates:
if "agent" not in data:
- node_id = next_id
- break
-
- return node_id
+ return next_id
+ return None
def dump_gexf(G, f):
diff --git a/soil/simulation.py b/soil/simulation.py
index 946023f..fc50ab8 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -226,7 +226,7 @@ Model stats:
)
model.step()
- if model.schedule.time < until: # Simulation ended (no more steps) before until (i.e., no changes expected)
+ if model.schedule.time < until: # Simulation ended (no more steps) before the expected time
model.schedule.time = until
return model
diff --git a/soil/time.py b/soil/time.py
index 661e35e..26c4259 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -13,6 +13,10 @@ from mesa import Agent as MesaAgent
INFINITY = float("inf")
+class DeadAgent(Exception):
+ pass
+
+
class When:
def __init__(self, time):
if isinstance(time, When):
@@ -38,23 +42,27 @@ class When:
return self._time > other
return self._time > other.next(self._time)
- def ready(self, time):
- return self._time <= time
+ def ready(self, agent):
+ return self._time <= agent.model.schedule.time
class Cond(When):
def __init__(self, func, delta=1):
self._func = func
self._delta = delta
+ self._checked = False
def next(self, time):
- return time + self._delta
+ if self._checked:
+ return time + self._delta
+ return time
def abs(self, time):
return self
- def ready(self, time):
- return self._func(time)
+ def ready(self, agent):
+ self._checked = True
+ return self._func(agent)
def __eq__(self, other):
return False
@@ -109,10 +117,12 @@ class TimedActivation(BaseScheduler):
elif not isinstance(when, When):
when = When(when)
if agent.unique_id in self._agents:
- self._queue.remove((self._next[agent.unique_id], agent))
del self._agents[agent.unique_id]
- heapify(self._queue)
+ if agent.unique_id in self._next:
+ self._queue.remove((self._next[agent.unique_id], agent))
+ heapify(self._queue)
+ self._next[agent.unique_id] = when
heappush(self._queue, (when, agent))
super().add(agent)
@@ -139,8 +149,9 @@ class TimedActivation(BaseScheduler):
if when > self.time:
break
heappop(self._queue)
- if when.ready(self.time):
+ if when.ready(agent):
to_process.append(agent)
+ self._next.pop(agent.unique_id, None)
continue
next_time = min(next_time, when.next(self.time))
@@ -155,13 +166,20 @@ class TimedActivation(BaseScheduler):
for agent in to_process:
self.logger.debug(f"Stepping agent {agent}")
- returned = ((agent.step() or Delta(1))).abs(self.time)
+ try:
+ returned = ((agent.step() or Delta(1))).abs(self.time)
+ except DeadAgent:
+ if agent.unique_id in self._next:
+ del self._next[agent.unique_id]
+ agent.alive = False
+ continue
+
if not getattr(agent, "alive", True):
self.remove(agent)
continue
- value = when.next(self.time)
+ value = returned.next(self.time)
if value < self.time:
raise Exception(
@@ -172,6 +190,8 @@ class TimedActivation(BaseScheduler):
self._next[agent.unique_id] = returned
heappush(self._queue, (returned, agent))
+ else:
+ assert not self._next[agent.unique_id]
self.steps += 1
self.logger.debug(f"Updating time step: {self.time} -> {next_time}")
diff --git a/tests/test_agents.py b/tests/test_agents.py
index d3db80e..4006e9d 100644
--- a/tests/test_agents.py
+++ b/tests/test_agents.py
@@ -24,7 +24,7 @@ class TestMain(TestCase):
'''A dead agent should raise an exception if it is stepped after death'''
d = Dead(unique_id=0, model=environment.Environment())
d.step()
- with pytest.raises(agents.DeadAgent):
+ with pytest.raises(stime.DeadAgent):
d.step()
diff --git a/tests/test_time.py b/tests/test_time.py
new file mode 100644
index 0000000..db16609
--- /dev/null
+++ b/tests/test_time.py
@@ -0,0 +1,74 @@
+from unittest import TestCase
+
+from soil import time, agents, environment
+
+class TestMain(TestCase):
+ def test_cond(self):
+ '''
+ A condition should match a When if the concition is True
+ '''
+
+ t = time.Cond(lambda t: True)
+ f = time.Cond(lambda t: False)
+ for i in range(10):
+ w = time.When(i)
+ assert w == t
+ assert w is not f
+
+ def test_cond(self):
+ '''
+ Comparing a Cond to a Delta should always return False
+ '''
+
+ c = time.Cond(lambda t: False)
+ d = time.Delta(1)
+ assert c is not d
+
+ def test_cond_env(self):
+ '''
+ '''
+
+ times_started = []
+ times_awakened = []
+ times = []
+ done = 0
+
+ class CondAgent(agents.BaseAgent):
+
+ def step(self):
+ nonlocal done
+ times_started.append(self.now)
+ while True:
+ yield time.Cond(lambda agent: agent.model.schedule.time >= 10)
+ times_awakened.append(self.now)
+ if self.now >= 10:
+ break
+ done += 1
+
+ env = environment.Environment(agents=[{'agent_class': CondAgent}])
+
+
+ while env.schedule.time < 11:
+ env.step()
+ times.append(env.now)
+ assert env.schedule.time == 11
+ assert times_started == [0]
+ assert times_awakened == [10]
+ assert done == 1
+ # The first time will produce the Cond.
+ # Since there are no other agents, time will not advance, but the number
+ # of steps will.
+ assert env.schedule.steps == 12
+ assert len(times) == 12
+
+ while env.schedule.time < 12:
+ env.step()
+ times.append(env.now)
+
+ assert env.schedule.time == 12
+ assert times_started == [0, 11]
+ assert times_awakened == [10, 11]
+ assert done == 2
+ # Once more to yield the cond, another one to continue
+ assert env.schedule.steps == 14
+ assert len(times) == 14
From 880a9f2a1cf59b00415d1608a28fd1abdc7366d1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Mon, 17 Oct 2022 20:23:57 +0200
Subject: [PATCH 15/39] black formatting
---
examples/custom_generator/mymodule.py | 13 +-
examples/custom_timeouts/custom_timeouts.py | 33 ++--
examples/mesa/server.py | 32 ++--
examples/mesa/social_wealth.py | 65 ++++---
examples/mesa/wealth.py | 40 +++--
examples/newsspread/newsspread.py | 51 +++---
examples/programmatic/programmatic.py | 23 +--
examples/pubcrawl/pubcrawl.py | 134 +++++++--------
examples/rabbits/basic/rabbit_agents.py | 48 +++---
examples/rabbits/improved/rabbit_agents.py | 46 ++---
examples/random_delays/random_delays.py | 35 ++--
examples/terrorism/TerroristNetworkModel.py | 180 +++++++++++++-------
soil/__init__.py | 2 +
soil/__main__.py | 4 +-
soil/agents/__init__.py | 14 +-
soil/environment.py | 24 ++-
soil/exporters.py | 11 +-
soil/simulation.py | 4 +-
soil/time.py | 1 -
19 files changed, 431 insertions(+), 329 deletions(-)
diff --git a/examples/custom_generator/mymodule.py b/examples/custom_generator/mymodule.py
index 85226e0..241ddcb 100644
--- a/examples/custom_generator/mymodule.py
+++ b/examples/custom_generator/mymodule.py
@@ -2,16 +2,17 @@ from networkx import Graph
import random
import networkx as nx
+
def mygenerator(n=5, n_edges=5):
- '''
+ """
Just a simple generator that creates a network with n nodes and
n_edges edges. Edges are assigned randomly, only avoiding self loops.
- '''
+ """
G = nx.Graph()
for i in range(n):
G.add_node(i)
-
+
for i in range(n_edges):
nodes = list(G.nodes)
n_in = random.choice(nodes)
@@ -19,9 +20,3 @@ def mygenerator(n=5, n_edges=5):
n_out = random.choice(nodes)
G.add_edge(n_in, n_out)
return G
-
-
-
-
-
-
diff --git a/examples/custom_timeouts/custom_timeouts.py b/examples/custom_timeouts/custom_timeouts.py
index b269c0a..838ccfc 100644
--- a/examples/custom_timeouts/custom_timeouts.py
+++ b/examples/custom_timeouts/custom_timeouts.py
@@ -2,34 +2,37 @@ from soil.agents import FSM, state, default_state
class Fibonacci(FSM):
- '''Agent that only executes in t_steps that are Fibonacci numbers'''
+ """Agent that only executes in t_steps that are Fibonacci numbers"""
- defaults = {
- 'prev': 1
- }
+ defaults = {"prev": 1}
@default_state
@state
def counting(self):
- self.log('Stopping at {}'.format(self.now))
- prev, self['prev'] = self['prev'], max([self.now, self['prev']])
+ self.log("Stopping at {}".format(self.now))
+ prev, self["prev"] = self["prev"], max([self.now, self["prev"]])
return None, self.env.timeout(prev)
class Odds(FSM):
- '''Agent that only executes in odd t_steps'''
+ """Agent that only executes in odd t_steps"""
+
@default_state
@state
def odds(self):
- self.log('Stopping at {}'.format(self.now))
- return None, self.env.timeout(1+self.now%2)
+ self.log("Stopping at {}".format(self.now))
+ return None, self.env.timeout(1 + self.now % 2)
-if __name__ == '__main__':
+if __name__ == "__main__":
from soil import Simulation
- s = Simulation(network_agents=[{'ids': [0], 'agent_class': Fibonacci},
- {'ids': [1], 'agent_class': Odds}],
- network_params={"generator": "complete_graph", "n": 2},
- max_time=100,
- )
+
+ s = Simulation(
+ network_agents=[
+ {"ids": [0], "agent_class": Fibonacci},
+ {"ids": [1], "agent_class": Odds},
+ ],
+ network_params={"generator": "complete_graph", "n": 2},
+ max_time=100,
+ )
s.run(dry_run=True)
diff --git a/examples/mesa/server.py b/examples/mesa/server.py
index 7fe820f..ea00658 100644
--- a/examples/mesa/server.py
+++ b/examples/mesa/server.py
@@ -14,16 +14,18 @@ def network_portrayal(env):
# The model ensures there is 0 or 1 agent per node
portrayal = dict()
- wealths = {node_id: data['agent'].wealth for (node_id, data) in env.G.nodes(data=True)}
+ wealths = {
+ node_id: data["agent"].wealth for (node_id, data) in env.G.nodes(data=True)
+ }
portrayal["nodes"] = [
{
"id": node_id,
- "size": 2*(wealth+1),
+ "size": 2 * (wealth + 1),
"color": "#CC0000" if wealth == 0 else "#007959",
# "color": "#CC0000",
"label": f"{node_id}: {wealth}",
- } for (node_id, wealth) in wealths.items()
-
+ }
+ for (node_id, wealth) in wealths.items()
]
portrayal["edges"] = [
@@ -41,7 +43,7 @@ def gridPortrayal(agent):
:param agent: the agent in the simulation
:return: the portrayal dictionary
"""
- color = max(10, min(agent.wealth*10, 100))
+ color = max(10, min(agent.wealth * 10, 100))
return {
"Shape": "rect",
"w": 1,
@@ -52,7 +54,7 @@ def gridPortrayal(agent):
"Text": agent.unique_id,
"x": agent.pos[0],
"y": agent.pos[1],
- "Color": f"rgba(31, 10, 255, 0.{color})"
+ "Color": f"rgba(31, 10, 255, 0.{color})",
}
@@ -79,7 +81,7 @@ model_params = {
10,
1,
description="Grid height",
- ),
+ ),
"width": UserSettableParameter(
"slider",
"width",
@@ -88,16 +90,20 @@ model_params = {
10,
1,
description="Grid width",
- ),
- "agent_class": UserSettableParameter('choice', 'Agent class', value='MoneyAgent',
- choices=['MoneyAgent', 'SocialMoneyAgent']),
+ ),
+ "agent_class": UserSettableParameter(
+ "choice",
+ "Agent class",
+ value="MoneyAgent",
+ choices=["MoneyAgent", "SocialMoneyAgent"],
+ ),
"generator": graph_generator,
}
-canvas_element = CanvasGrid(gridPortrayal,
- model_params["width"].value,
- model_params["height"].value, 500, 500)
+canvas_element = CanvasGrid(
+ gridPortrayal, model_params["width"].value, model_params["height"].value, 500, 500
+)
server = ModularServer(
diff --git a/examples/mesa/social_wealth.py b/examples/mesa/social_wealth.py
index c8b1701..b4ae99f 100644
--- a/examples/mesa/social_wealth.py
+++ b/examples/mesa/social_wealth.py
@@ -1,9 +1,10 @@
-'''
+"""
This is an example that adds soil agents and environment in a normal
mesa workflow.
-'''
+"""
from mesa import Agent as MesaAgent
from mesa.space import MultiGrid
+
# from mesa.time import RandomActivation
from mesa.datacollection import DataCollector
from mesa.batchrunner import BatchRunner
@@ -12,12 +13,13 @@ import networkx as nx
from soil import NetworkAgent, Environment, serialization
+
def compute_gini(model):
agent_wealths = [agent.wealth for agent in model.agents]
x = sorted(agent_wealths)
N = len(list(model.agents))
- B = sum( xi * (N-i) for i,xi in enumerate(x) ) / (N*sum(x))
- return (1 + (1/N) - 2*B)
+ B = sum(xi * (N - i) for i, xi in enumerate(x)) / (N * sum(x))
+ return 1 + (1 / N) - 2 * B
class MoneyAgent(MesaAgent):
@@ -32,9 +34,8 @@ class MoneyAgent(MesaAgent):
def move(self):
possible_steps = self.model.grid.get_neighborhood(
- self.pos,
- moore=True,
- include_center=False)
+ self.pos, moore=True, include_center=False
+ )
new_position = self.random.choice(possible_steps)
self.model.grid.move_agent(self, new_position)
@@ -69,6 +70,7 @@ class SocialMoneyAgent(NetworkAgent, MoneyAgent):
other.wealth += 1
self.wealth -= 1
+
def graph_generator(n=5):
G = nx.Graph()
for ix in range(n):
@@ -78,16 +80,22 @@ def graph_generator(n=5):
class MoneyEnv(Environment):
"""A model with some number of agents."""
- def __init__(self, width, height, N, generator=graph_generator,
- agent_class=SocialMoneyAgent,
- topology=None, **kwargs):
+
+ def __init__(
+ self,
+ width,
+ height,
+ N,
+ generator=graph_generator,
+ agent_class=SocialMoneyAgent,
+ topology=None,
+ **kwargs
+ ):
generator = serialization.deserialize(generator)
agent_class = serialization.deserialize(agent_class, globs=globals())
topology = generator(n=N)
- super().__init__(topology=topology,
- N=N,
- **kwargs)
+ super().__init__(topology=topology, N=N, **kwargs)
self.grid = MultiGrid(width, height, False)
self.populate_network(agent_class=agent_class)
@@ -99,26 +107,29 @@ class MoneyEnv(Environment):
self.grid.place_agent(agent, (x, y))
self.datacollector = DataCollector(
- model_reporters={"Gini": compute_gini},
- agent_reporters={"Wealth": "wealth"})
+ model_reporters={"Gini": compute_gini}, agent_reporters={"Wealth": "wealth"}
+ )
-if __name__ == '__main__':
+if __name__ == "__main__":
- fixed_params = {"generator": nx.complete_graph,
- "width": 10,
- "network_agents": [{"agent_class": SocialMoneyAgent,
- 'weight': 1}],
- "height": 10}
+ fixed_params = {
+ "generator": nx.complete_graph,
+ "width": 10,
+ "network_agents": [{"agent_class": SocialMoneyAgent, "weight": 1}],
+ "height": 10,
+ }
variable_params = {"N": range(10, 100, 10)}
- batch_run = BatchRunner(MoneyEnv,
- variable_parameters=variable_params,
- fixed_parameters=fixed_params,
- iterations=5,
- max_steps=100,
- model_reporters={"Gini": compute_gini})
+ batch_run = BatchRunner(
+ MoneyEnv,
+ variable_parameters=variable_params,
+ fixed_parameters=fixed_params,
+ iterations=5,
+ max_steps=100,
+ model_reporters={"Gini": compute_gini},
+ )
batch_run.run_all()
run_data = batch_run.get_model_vars_dataframe()
diff --git a/examples/mesa/wealth.py b/examples/mesa/wealth.py
index c7934de..ca0d9bf 100644
--- a/examples/mesa/wealth.py
+++ b/examples/mesa/wealth.py
@@ -4,24 +4,26 @@ from mesa.time import RandomActivation
from mesa.datacollection import DataCollector
from mesa.batchrunner import BatchRunner
+
def compute_gini(model):
agent_wealths = [agent.wealth for agent in model.schedule.agents]
x = sorted(agent_wealths)
N = model.num_agents
- B = sum( xi * (N-i) for i,xi in enumerate(x) ) / (N*sum(x))
- return (1 + (1/N) - 2*B)
+ B = sum(xi * (N - i) for i, xi in enumerate(x)) / (N * sum(x))
+ return 1 + (1 / N) - 2 * B
+
class MoneyAgent(Agent):
- """ An agent with fixed initial wealth."""
+ """An agent with fixed initial wealth."""
+
def __init__(self, unique_id, model):
super().__init__(unique_id, model)
self.wealth = 1
def move(self):
possible_steps = self.model.grid.get_neighborhood(
- self.pos,
- moore=True,
- include_center=False)
+ self.pos, moore=True, include_center=False
+ )
new_position = self.random.choice(possible_steps)
self.model.grid.move_agent(self, new_position)
@@ -37,8 +39,10 @@ class MoneyAgent(Agent):
if self.wealth > 0:
self.give_money()
+
class MoneyModel(Model):
"""A model with some number of agents."""
+
def __init__(self, N, width, height):
self.num_agents = N
self.grid = MultiGrid(width, height, True)
@@ -55,29 +59,29 @@ class MoneyModel(Model):
self.grid.place_agent(a, (x, y))
self.datacollector = DataCollector(
- model_reporters={"Gini": compute_gini},
- agent_reporters={"Wealth": "wealth"})
+ model_reporters={"Gini": compute_gini}, agent_reporters={"Wealth": "wealth"}
+ )
def step(self):
self.datacollector.collect(self)
self.schedule.step()
-if __name__ == '__main__':
+if __name__ == "__main__":
- fixed_params = {"width": 10,
- "height": 10}
+ fixed_params = {"width": 10, "height": 10}
variable_params = {"N": range(10, 500, 10)}
- batch_run = BatchRunner(MoneyModel,
- variable_params,
- fixed_params,
- iterations=5,
- max_steps=100,
- model_reporters={"Gini": compute_gini})
+ batch_run = BatchRunner(
+ MoneyModel,
+ variable_params,
+ fixed_params,
+ iterations=5,
+ max_steps=100,
+ model_reporters={"Gini": compute_gini},
+ )
batch_run.run_all()
run_data = batch_run.get_model_vars_dataframe()
run_data.head()
print(run_data.Gini)
-
diff --git a/examples/newsspread/newsspread.py b/examples/newsspread/newsspread.py
index 14d666f..f747f8e 100644
--- a/examples/newsspread/newsspread.py
+++ b/examples/newsspread/newsspread.py
@@ -3,84 +3,83 @@ import logging
class DumbViewer(FSM, NetworkAgent):
- '''
+ """
A viewer that gets infected via TV (if it has one) and tries to infect
its neighbors once it's infected.
- '''
+ """
+
defaults = {
- 'prob_neighbor_spread': 0.5,
- 'prob_tv_spread': 0.1,
+ "prob_neighbor_spread": 0.5,
+ "prob_tv_spread": 0.1,
}
@default_state
@state
def neutral(self):
- if self['has_tv']:
- if self.prob(self.model['prob_tv_spread']):
+ if self["has_tv"]:
+ if self.prob(self.model["prob_tv_spread"]):
return self.infected
@state
def infected(self):
for neighbor in self.get_neighboring_agents(state_id=self.neutral.id):
- if self.prob(self.model['prob_neighbor_spread']):
+ if self.prob(self.model["prob_neighbor_spread"]):
neighbor.infect()
def infect(self):
- '''
+ """
This is not a state. It is a function that other agents can use to try to
infect this agent. DumbViewer always gets infected, but other agents like
HerdViewer might not become infected right away
- '''
+ """
self.set_state(self.infected)
class HerdViewer(DumbViewer):
- '''
+ """
A viewer whose probability of infection depends on the state of its neighbors.
- '''
+ """
def infect(self):
- '''Notice again that this is NOT a state. See DumbViewer.infect for reference'''
+ """Notice again that this is NOT a state. See DumbViewer.infect for reference"""
infected = self.count_neighboring_agents(state_id=self.infected.id)
total = self.count_neighboring_agents()
- prob_infect = self.model['prob_neighbor_spread'] * infected/total
- self.debug('prob_infect', prob_infect)
+ prob_infect = self.model["prob_neighbor_spread"] * infected / total
+ self.debug("prob_infect", prob_infect)
if self.prob(prob_infect):
self.set_state(self.infected)
class WiseViewer(HerdViewer):
- '''
+ """
A viewer that can change its mind.
- '''
+ """
defaults = {
- 'prob_neighbor_spread': 0.5,
- 'prob_neighbor_cure': 0.25,
- 'prob_tv_spread': 0.1,
+ "prob_neighbor_spread": 0.5,
+ "prob_neighbor_cure": 0.25,
+ "prob_tv_spread": 0.1,
}
@state
def cured(self):
- prob_cure = self.model['prob_neighbor_cure']
+ prob_cure = self.model["prob_neighbor_cure"]
for neighbor in self.get_neighboring_agents(state_id=self.infected.id):
if self.prob(prob_cure):
try:
neighbor.cure()
except AttributeError:
- self.debug('Viewer {} cannot be cured'.format(neighbor.id))
+ self.debug("Viewer {} cannot be cured".format(neighbor.id))
def cure(self):
self.set_state(self.cured.id)
@state
def infected(self):
- cured = max(self.count_neighboring_agents(self.cured.id),
- 1.0)
- infected = max(self.count_neighboring_agents(self.infected.id),
- 1.0)
- prob_cure = self.model['prob_neighbor_cure'] * (cured/infected)
+ cured = max(self.count_neighboring_agents(self.cured.id), 1.0)
+ infected = max(self.count_neighboring_agents(self.infected.id), 1.0)
+ prob_cure = self.model["prob_neighbor_cure"] * (cured / infected)
if self.prob(prob_cure):
return self.cured
return self.set_state(super().infected)
diff --git a/examples/programmatic/programmatic.py b/examples/programmatic/programmatic.py
index 3b9f86f..0cb912f 100644
--- a/examples/programmatic/programmatic.py
+++ b/examples/programmatic/programmatic.py
@@ -1,6 +1,6 @@
-'''
+"""
Example of a fully programmatic simulation, without definition files.
-'''
+"""
from soil import Simulation, agents
from networkx import Graph
import logging
@@ -14,21 +14,22 @@ def mygenerator():
class MyAgent(agents.FSM):
-
@agents.default_state
@agents.state
def neutral(self):
- self.debug('I am running')
+ self.debug("I am running")
if agents.prob(0.2):
- self.info('This runs 2/10 times on average')
+ self.info("This runs 2/10 times on average")
-s = Simulation(name='Programmatic',
- network_params={'generator': mygenerator},
- num_trials=1,
- max_time=100,
- agent_class=MyAgent,
- dry_run=True)
+s = Simulation(
+ name="Programmatic",
+ network_params={"generator": mygenerator},
+ num_trials=1,
+ max_time=100,
+ agent_class=MyAgent,
+ dry_run=True,
+)
# By default, logging will only print WARNING logs (and above).
diff --git a/examples/pubcrawl/pubcrawl.py b/examples/pubcrawl/pubcrawl.py
index 9fd1b04..110a44c 100644
--- a/examples/pubcrawl/pubcrawl.py
+++ b/examples/pubcrawl/pubcrawl.py
@@ -5,7 +5,8 @@ import logging
class CityPubs(Environment):
- '''Environment with Pubs'''
+ """Environment with Pubs"""
+
level = logging.INFO
def __init__(self, *args, number_of_pubs=3, pub_capacity=10, **kwargs):
@@ -13,51 +14,52 @@ class CityPubs(Environment):
pubs = {}
for i in range(number_of_pubs):
newpub = {
- 'name': 'The awesome pub #{}'.format(i),
- 'open': True,
- 'capacity': pub_capacity,
- 'occupancy': 0,
+ "name": "The awesome pub #{}".format(i),
+ "open": True,
+ "capacity": pub_capacity,
+ "occupancy": 0,
}
- pubs[newpub['name']] = newpub
- self['pubs'] = pubs
+ pubs[newpub["name"]] = newpub
+ self["pubs"] = pubs
def enter(self, pub_id, *nodes):
- '''Agents will try to enter. The pub checks if it is possible'''
+ """Agents will try to enter. The pub checks if it is possible"""
try:
- pub = self['pubs'][pub_id]
+ pub = self["pubs"][pub_id]
except KeyError:
- raise ValueError('Pub {} is not available'.format(pub_id))
- if not pub['open'] or (pub['capacity'] < (len(nodes) + pub['occupancy'])):
+ raise ValueError("Pub {} is not available".format(pub_id))
+ if not pub["open"] or (pub["capacity"] < (len(nodes) + pub["occupancy"])):
return False
- pub['occupancy'] += len(nodes)
+ pub["occupancy"] += len(nodes)
for node in nodes:
- node['pub'] = pub_id
+ node["pub"] = pub_id
return True
def available_pubs(self):
- for pub in self['pubs'].values():
- if pub['open'] and (pub['occupancy'] < pub['capacity']):
- yield pub['name']
+ for pub in self["pubs"].values():
+ if pub["open"] and (pub["occupancy"] < pub["capacity"]):
+ yield pub["name"]
def exit(self, pub_id, *node_ids):
- '''Agents will notify the pub they want to leave'''
+ """Agents will notify the pub they want to leave"""
try:
- pub = self['pubs'][pub_id]
+ pub = self["pubs"][pub_id]
except KeyError:
- raise ValueError('Pub {} is not available'.format(pub_id))
+ raise ValueError("Pub {} is not available".format(pub_id))
for node_id in node_ids:
node = self.get_agent(node_id)
- if pub_id == node['pub']:
- del node['pub']
- pub['occupancy'] -= 1
+ if pub_id == node["pub"]:
+ del node["pub"]
+ pub["occupancy"] -= 1
class Patron(FSM, NetworkAgent):
- '''Agent that looks for friends to drink with. It will do three things:
- 1) Look for other patrons to drink with
- 2) Look for a bar where the agent and other agents in the same group can get in.
- 3) While in the bar, patrons only drink, until they get drunk and taken home.
- '''
+ """Agent that looks for friends to drink with. It will do three things:
+ 1) Look for other patrons to drink with
+ 2) Look for a bar where the agent and other agents in the same group can get in.
+ 3) While in the bar, patrons only drink, until they get drunk and taken home.
+ """
+
level = logging.DEBUG
pub = None
@@ -69,13 +71,13 @@ class Patron(FSM, NetworkAgent):
@default_state
@state
def looking_for_friends(self):
- '''Look for friends to drink with'''
- self.info('I am looking for friends')
- available_friends = list(self.get_agents(drunk=False,
- pub=None,
- state_id=self.looking_for_friends.id))
+ """Look for friends to drink with"""
+ self.info("I am looking for friends")
+ available_friends = list(
+ self.get_agents(drunk=False, pub=None, state_id=self.looking_for_friends.id)
+ )
if not available_friends:
- self.info('Life sucks and I\'m alone!')
+ self.info("Life sucks and I'm alone!")
return self.at_home
befriended = self.try_friends(available_friends)
if befriended:
@@ -83,93 +85,91 @@ class Patron(FSM, NetworkAgent):
@state
def looking_for_pub(self):
- '''Look for a pub that accepts me and my friends'''
- if self['pub'] != None:
+ """Look for a pub that accepts me and my friends"""
+ if self["pub"] != None:
return self.sober_in_pub
- self.debug('I am looking for a pub')
+ self.debug("I am looking for a pub")
group = list(self.get_neighboring_agents())
for pub in self.model.available_pubs():
- self.debug('We\'re trying to get into {}: total: {}'.format(pub, len(group)))
+ self.debug("We're trying to get into {}: total: {}".format(pub, len(group)))
if self.model.enter(pub, self, *group):
- self.info('We\'re all {} getting in {}!'.format(len(group), pub))
+ self.info("We're all {} getting in {}!".format(len(group), pub))
return self.sober_in_pub
@state
def sober_in_pub(self):
- '''Drink up.'''
+ """Drink up."""
self.drink()
- if self['pints'] > self['max_pints']:
+ if self["pints"] > self["max_pints"]:
return self.drunk_in_pub
@state
def drunk_in_pub(self):
- '''I'm out. Take me home!'''
- self.info('I\'m so drunk. Take me home!')
- self['drunk'] = True
+ """I'm out. Take me home!"""
+ self.info("I'm so drunk. Take me home!")
+ self["drunk"] = True
if self.kicked_out:
return self.at_home
pass # out drun
@state
def at_home(self):
- '''The end'''
+ """The end"""
others = self.get_agents(state_id=Patron.at_home.id, limit_neighbors=True)
- self.debug('I\'m home. Just like {} of my friends'.format(len(others)))
-
+ self.debug("I'm home. Just like {} of my friends".format(len(others)))
+
def drink(self):
- self['pints'] += 1
- self.debug('Cheers to that')
-
+ self["pints"] += 1
+ self.debug("Cheers to that")
+
def kick_out(self):
self.kicked_out = True
def befriend(self, other_agent, force=False):
- '''
+ """
Try to become friends with another agent. The chances of
success depend on both agents' openness.
- '''
- if force or self['openness'] > self.random.random():
+ """
+ if force or self["openness"] > self.random.random():
self.add_edge(self, other_agent)
- self.info('Made some friend {}'.format(other_agent))
+ self.info("Made some friend {}".format(other_agent))
return True
return False
def try_friends(self, others):
- ''' Look for random agents around me and try to befriend them'''
+ """Look for random agents around me and try to befriend them"""
befriended = False
- k = int(10*self['openness'])
+ k = int(10 * self["openness"])
self.random.shuffle(others)
for friend in islice(others, k): # random.choice >= 3.7
if friend == self:
continue
if friend.befriend(self):
self.befriend(friend, force=True)
- self.debug('Hooray! new friend: {}'.format(friend.id))
+ self.debug("Hooray! new friend: {}".format(friend.id))
befriended = True
else:
- self.debug('{} does not want to be friends'.format(friend.id))
+ self.debug("{} does not want to be friends".format(friend.id))
return befriended
class Police(FSM):
- '''Simple agent to take drunk people out of pubs.'''
+ """Simple agent to take drunk people out of pubs."""
+
level = logging.INFO
@default_state
@state
def patrol(self):
- drunksters = list(self.get_agents(drunk=True,
- state_id=Patron.drunk_in_pub.id))
+ drunksters = list(self.get_agents(drunk=True, state_id=Patron.drunk_in_pub.id))
for drunk in drunksters:
- self.info('Kicking out the trash: {}'.format(drunk.id))
+ self.info("Kicking out the trash: {}".format(drunk.id))
drunk.kick_out()
else:
- self.info('No trash to take out. Too bad.')
+ self.info("No trash to take out. Too bad.")
-if __name__ == '__main__':
+if __name__ == "__main__":
from soil import simulation
- simulation.run_from_config('pubcrawl.yml',
- dry_run=True,
- dump=None,
- parallel=False)
+
+ simulation.run_from_config("pubcrawl.yml", dry_run=True, dump=None, parallel=False)
diff --git a/examples/rabbits/basic/rabbit_agents.py b/examples/rabbits/basic/rabbit_agents.py
index 60a0d15..b28d2e9 100644
--- a/examples/rabbits/basic/rabbit_agents.py
+++ b/examples/rabbits/basic/rabbit_agents.py
@@ -5,7 +5,6 @@ import math
class RabbitEnv(Environment):
-
@property
def num_rabbits(self):
return self.count_agents(agent_class=Rabbit)
@@ -27,7 +26,7 @@ class Rabbit(NetworkAgent, FSM):
@default_state
@state
def newborn(self):
- self.info('I am a newborn.')
+ self.info("I am a newborn.")
self.age = 0
self.offspring = 0
return self.youngling
@@ -36,7 +35,7 @@ class Rabbit(NetworkAgent, FSM):
def youngling(self):
self.age += 1
if self.age >= self.sexual_maturity:
- self.info(f'I am fertile! My age is {self.age}')
+ self.info(f"I am fertile! My age is {self.age}")
return self.fertile
@state
@@ -60,11 +59,11 @@ class Male(Rabbit):
return self.dead
# Males try to mate
- for f in self.model.agents(agent_class=Female,
- state_id=Female.fertile.id,
- limit=self.max_females):
- self.debug('FOUND A FEMALE: ', repr(f), self.mating_prob)
- if self.prob(self['mating_prob']):
+ for f in self.model.agents(
+ agent_class=Female, state_id=Female.fertile.id, limit=self.max_females
+ ):
+ self.debug("FOUND A FEMALE: ", repr(f), self.mating_prob)
+ if self.prob(self["mating_prob"]):
f.impregnate(self)
break # Take a break
@@ -83,14 +82,14 @@ class Female(Rabbit):
return self.pregnant
def impregnate(self, male):
- self.info(f'impregnated by {repr(male)}')
+ self.info(f"impregnated by {repr(male)}")
self.mate = male
self.pregnancy = 0
- self.number_of_babies = int(8+4*self.random.random())
+ self.number_of_babies = int(8 + 4 * self.random.random())
@state
def pregnant(self):
- self.info('I am pregnant')
+ self.info("I am pregnant")
self.age += 1
if self.age >= self.life_expectancy:
@@ -100,18 +99,17 @@ class Female(Rabbit):
self.pregnancy += 1
return
- self.info('Having {} babies'.format(self.number_of_babies))
+ self.info("Having {} babies".format(self.number_of_babies))
for i in range(self.number_of_babies):
state = {}
agent_class = self.random.choice([Male, Female])
- child = self.model.add_node(agent_class=agent_class,
- **state)
+ child = self.model.add_node(agent_class=agent_class, **state)
child.add_edge(self)
try:
child.add_edge(self.mate)
self.model.agents[self.mate].offspring += 1
except ValueError:
- self.debug('The father has passed away')
+ self.debug("The father has passed away")
self.offspring += 1
self.mate = None
@@ -119,32 +117,34 @@ class Female(Rabbit):
return self.fertile
def die(self):
- if 'pregnancy' in self and self['pregnancy'] > -1:
- self.info('A mother has died carrying a baby!!')
+ if "pregnancy" in self and self["pregnancy"] > -1:
+ self.info("A mother has died carrying a baby!!")
return super().die()
class RandomAccident(BaseAgent):
-
def step(self):
rabbits_alive = self.model.G.number_of_nodes()
if not rabbits_alive:
return self.die()
- prob_death = self.model.get('prob_death', 1e-100)*math.floor(math.log10(max(1, rabbits_alive)))
- self.debug('Killing some rabbits with prob={}!'.format(prob_death))
+ prob_death = self.model.get("prob_death", 1e-100) * math.floor(
+ math.log10(max(1, rabbits_alive))
+ )
+ self.debug("Killing some rabbits with prob={}!".format(prob_death))
for i in self.iter_agents(agent_class=Rabbit):
if i.state_id == i.dead.id:
continue
if self.prob(prob_death):
- self.info('I killed a rabbit: {}'.format(i.id))
+ self.info("I killed a rabbit: {}".format(i.id))
rabbits_alive -= 1
i.die()
- self.debug('Rabbits alive: {}'.format(rabbits_alive))
+ self.debug("Rabbits alive: {}".format(rabbits_alive))
-if __name__ == '__main__':
+if __name__ == "__main__":
from soil import easy
- with easy('rabbits.yml') as sim:
+
+ with easy("rabbits.yml") as sim:
sim.run()
diff --git a/examples/rabbits/improved/rabbit_agents.py b/examples/rabbits/improved/rabbit_agents.py
index c7d995d..0f45d9a 100644
--- a/examples/rabbits/improved/rabbit_agents.py
+++ b/examples/rabbits/improved/rabbit_agents.py
@@ -7,7 +7,6 @@ import math
class RabbitEnv(Environment):
-
@property
def num_rabbits(self):
return self.count_agents(agent_class=Rabbit)
@@ -36,7 +35,7 @@ class Rabbit(FSM, NetworkAgent):
@default_state
@state
def newborn(self):
- self.info('I am a newborn.')
+ self.info("I am a newborn.")
self.birth = self.now
self.offspring = 0
return self.youngling, Delta(self.sexual_maturity - self.age)
@@ -44,7 +43,7 @@ class Rabbit(FSM, NetworkAgent):
@state
def youngling(self):
if self.age >= self.sexual_maturity:
- self.info(f'I am fertile! My age is {self.age}')
+ self.info(f"I am fertile! My age is {self.age}")
return self.fertile
@state
@@ -66,11 +65,11 @@ class Male(Rabbit):
return self.dead
# Males try to mate
- for f in self.model.agents(agent_class=Female,
- state_id=Female.fertile.id,
- limit=self.max_females):
- self.debug('FOUND A FEMALE: ', repr(f), self.mating_prob)
- if self.prob(self['mating_prob']):
+ for f in self.model.agents(
+ agent_class=Female, state_id=Female.fertile.id, limit=self.max_females
+ ):
+ self.debug("FOUND A FEMALE: ", repr(f), self.mating_prob)
+ if self.prob(self["mating_prob"]):
f.impregnate(self)
break # Do not try to impregnate other females
@@ -94,32 +93,31 @@ class Female(Rabbit):
return self.now - self.conception
def impregnate(self, male):
- self.info(f'impregnated by {repr(male)}')
+ self.info(f"impregnated by {repr(male)}")
self.mate = male
self.conception = self.now
- self.number_of_babies = int(8+4*self.random.random())
+ self.number_of_babies = int(8 + 4 * self.random.random())
@state
def pregnant(self):
- self.debug('I am pregnant')
+ self.debug("I am pregnant")
if self.age > self.life_expectancy:
self.info("Dying before giving birth")
return self.die()
if self.pregnancy >= self.gestation:
- self.info('Having {} babies'.format(self.number_of_babies))
+ self.info("Having {} babies".format(self.number_of_babies))
for i in range(self.number_of_babies):
state = {}
agent_class = self.random.choice([Male, Female])
- child = self.model.add_node(agent_class=agent_class,
- **state)
+ child = self.model.add_node(agent_class=agent_class, **state)
child.add_edge(self)
if self.mate:
child.add_edge(self.mate)
self.mate.offspring += 1
else:
- self.debug('The father has passed away')
+ self.debug("The father has passed away")
self.offspring += 1
self.mate = None
@@ -127,31 +125,33 @@ class Female(Rabbit):
def die(self):
if self.pregnancy is not None:
- self.info('A mother has died carrying a baby!!')
+ self.info("A mother has died carrying a baby!!")
return super().die()
class RandomAccident(BaseAgent):
-
def step(self):
rabbits_alive = self.model.G.number_of_nodes()
if not rabbits_alive:
return self.die()
- prob_death = self.model.get('prob_death', 1e-100)*math.floor(math.log10(max(1, rabbits_alive)))
- self.debug('Killing some rabbits with prob={}!'.format(prob_death))
+ prob_death = self.model.get("prob_death", 1e-100) * math.floor(
+ math.log10(max(1, rabbits_alive))
+ )
+ self.debug("Killing some rabbits with prob={}!".format(prob_death))
for i in self.iter_agents(agent_class=Rabbit):
if i.state_id == i.dead.id:
continue
if self.prob(prob_death):
- self.info('I killed a rabbit: {}'.format(i.id))
+ self.info("I killed a rabbit: {}".format(i.id))
rabbits_alive -= 1
i.die()
- self.debug('Rabbits alive: {}'.format(rabbits_alive))
+ self.debug("Rabbits alive: {}".format(rabbits_alive))
-if __name__ == '__main__':
+if __name__ == "__main__":
from soil import easy
- with easy('rabbits.yml') as sim:
+
+ with easy("rabbits.yml") as sim:
sim.run()
diff --git a/examples/random_delays/random_delays.py b/examples/random_delays/random_delays.py
index 8455e5e..1bed03e 100644
--- a/examples/random_delays/random_delays.py
+++ b/examples/random_delays/random_delays.py
@@ -1,42 +1,43 @@
-'''
+"""
Example of setting a
Example of a fully programmatic simulation, without definition files.
-'''
+"""
from soil import Simulation, agents
from soil.time import Delta
-
class MyAgent(agents.FSM):
- '''
+ """
An agent that first does a ping
- '''
+ """
- defaults = {'pong_counts': 2}
+ defaults = {"pong_counts": 2}
@agents.default_state
@agents.state
def ping(self):
- self.info('Ping')
- return self.pong, Delta(self.random.expovariate(1/16))
+ self.info("Ping")
+ return self.pong, Delta(self.random.expovariate(1 / 16))
@agents.state
def pong(self):
- self.info('Pong')
+ self.info("Pong")
self.pong_counts -= 1
self.info(str(self.pong_counts))
if self.pong_counts < 1:
return self.die()
- return None, Delta(self.random.expovariate(1/16))
+ return None, Delta(self.random.expovariate(1 / 16))
-s = Simulation(name='Programmatic',
- network_agents=[{'agent_class': MyAgent, 'id': 0}],
- topology={'nodes': [{'id': 0}], 'links': []},
- num_trials=1,
- max_time=100,
- agent_class=MyAgent,
- dry_run=True)
+s = Simulation(
+ name="Programmatic",
+ network_agents=[{"agent_class": MyAgent, "id": 0}],
+ topology={"nodes": [{"id": 0}], "links": []},
+ num_trials=1,
+ max_time=100,
+ agent_class=MyAgent,
+ dry_run=True,
+)
envs = s.run()
diff --git a/examples/terrorism/TerroristNetworkModel.py b/examples/terrorism/TerroristNetworkModel.py
index bf5045f..8fa6563 100644
--- a/examples/terrorism/TerroristNetworkModel.py
+++ b/examples/terrorism/TerroristNetworkModel.py
@@ -20,56 +20,83 @@ class TerroristSpreadModel(FSM, Geo):
def __init__(self, model=None, unique_id=0, state=()):
super().__init__(model=model, unique_id=unique_id, state=state)
- self.information_spread_intensity = model.environment_params['information_spread_intensity']
- self.terrorist_additional_influence = model.environment_params['terrorist_additional_influence']
- self.prob_interaction = model.environment_params['prob_interaction']
+ self.information_spread_intensity = model.environment_params[
+ "information_spread_intensity"
+ ]
+ self.terrorist_additional_influence = model.environment_params[
+ "terrorist_additional_influence"
+ ]
+ self.prob_interaction = model.environment_params["prob_interaction"]
- if self['id'] == self.civilian.id: # Civilian
+ if self["id"] == self.civilian.id: # Civilian
self.mean_belief = self.random.uniform(0.00, 0.5)
- elif self['id'] == self.terrorist.id: # Terrorist
+ elif self["id"] == self.terrorist.id: # Terrorist
self.mean_belief = self.random.uniform(0.8, 1.00)
- elif self['id'] == self.leader.id: # Leader
+ elif self["id"] == self.leader.id: # Leader
self.mean_belief = 1.00
else:
- raise Exception('Invalid state id: {}'.format(self['id']))
-
- if 'min_vulnerability' in model.environment_params:
- self.vulnerability = self.random.uniform( model.environment_params['min_vulnerability'], model.environment_params['max_vulnerability'] )
- else :
- self.vulnerability = self.random.uniform( 0, model.environment_params['max_vulnerability'] )
+ raise Exception("Invalid state id: {}".format(self["id"]))
+ if "min_vulnerability" in model.environment_params:
+ self.vulnerability = self.random.uniform(
+ model.environment_params["min_vulnerability"],
+ model.environment_params["max_vulnerability"],
+ )
+ else:
+ self.vulnerability = self.random.uniform(
+ 0, model.environment_params["max_vulnerability"]
+ )
@state
def civilian(self):
neighbours = list(self.get_neighboring_agents(agent_class=TerroristSpreadModel))
if len(neighbours) > 0:
# Only interact with some of the neighbors
- interactions = list(n for n in neighbours if self.random.random() <= self.prob_interaction)
- influence = sum( self.degree(i) for i in interactions )
- mean_belief = sum( i.mean_belief * self.degree(i) / influence for i in interactions )
- mean_belief = mean_belief * self.information_spread_intensity + self.mean_belief * ( 1 - self.information_spread_intensity )
- self.mean_belief = mean_belief * self.vulnerability + self.mean_belief * ( 1 - self.vulnerability )
-
+ interactions = list(
+ n for n in neighbours if self.random.random() <= self.prob_interaction
+ )
+ influence = sum(self.degree(i) for i in interactions)
+ mean_belief = sum(
+ i.mean_belief * self.degree(i) / influence for i in interactions
+ )
+ mean_belief = (
+ mean_belief * self.information_spread_intensity
+ + self.mean_belief * (1 - self.information_spread_intensity)
+ )
+ self.mean_belief = mean_belief * self.vulnerability + self.mean_belief * (
+ 1 - self.vulnerability
+ )
+
if self.mean_belief >= 0.8:
return self.terrorist
@state
def leader(self):
- self.mean_belief = self.mean_belief ** ( 1 - self.terrorist_additional_influence )
- for neighbour in self.get_neighboring_agents(state_id=[self.terrorist.id, self.leader.id]):
+ self.mean_belief = self.mean_belief ** (1 - self.terrorist_additional_influence)
+ for neighbour in self.get_neighboring_agents(
+ state_id=[self.terrorist.id, self.leader.id]
+ ):
if self.betweenness(neighbour) > self.betweenness(self):
return self.terrorist
@state
def terrorist(self):
- neighbours = self.get_agents(state_id=[self.terrorist.id, self.leader.id],
- agent_class=TerroristSpreadModel,
- limit_neighbors=True)
+ neighbours = self.get_agents(
+ state_id=[self.terrorist.id, self.leader.id],
+ agent_class=TerroristSpreadModel,
+ limit_neighbors=True,
+ )
if len(neighbours) > 0:
- influence = sum( self.degree(n) for n in neighbours )
- mean_belief = sum( n.mean_belief * self.degree(n) / influence for n in neighbours )
- mean_belief = mean_belief * self.vulnerability + self.mean_belief * ( 1 - self.vulnerability )
- self.mean_belief = self.mean_belief ** ( 1 - self.terrorist_additional_influence )
+ influence = sum(self.degree(n) for n in neighbours)
+ mean_belief = sum(
+ n.mean_belief * self.degree(n) / influence for n in neighbours
+ )
+ mean_belief = mean_belief * self.vulnerability + self.mean_belief * (
+ 1 - self.vulnerability
+ )
+ self.mean_belief = self.mean_belief ** (
+ 1 - self.terrorist_additional_influence
+ )
# Check if there are any leaders in the group
leaders = list(filter(lambda x: x.state.id == self.leader.id, neighbours))
@@ -82,21 +109,29 @@ class TerroristSpreadModel(FSM, Geo):
return self.leader
def ego_search(self, steps=1, center=False, node=None, **kwargs):
- '''Get a list of nodes in the ego network of *node* of radius *steps*'''
+ """Get a list of nodes in the ego network of *node* of radius *steps*"""
node = as_node(node if node is not None else self)
G = self.subgraph(**kwargs)
return nx.ego_graph(G, node, center=center, radius=steps).nodes()
def degree(self, node, force=False):
node = as_node(node)
- if force or (not hasattr(self.model, '_degree')) or getattr(self.model, '_last_step', 0) < self.now:
+ if (
+ force
+ or (not hasattr(self.model, "_degree"))
+ or getattr(self.model, "_last_step", 0) < self.now
+ ):
self.model._degree = nx.degree_centrality(self.G)
self.model._last_step = self.now
return self.model._degree[node]
def betweenness(self, node, force=False):
node = as_node(node)
- if force or (not hasattr(self.model, '_betweenness')) or getattr(self.model, '_last_step', 0) < self.now:
+ if (
+ force
+ or (not hasattr(self.model, "_betweenness"))
+ or getattr(self.model, "_last_step", 0) < self.now
+ ):
self.model._betweenness = nx.betweenness_centrality(self.G)
self.model._last_step = self.now
return self.model._betweenness[node]
@@ -114,17 +149,20 @@ class TrainingAreaModel(FSM, Geo):
def __init__(self, model=None, unique_id=0, state=()):
super().__init__(model=model, unique_id=unique_id, state=state)
- self.training_influence = model.environment_params['training_influence']
- if 'min_vulnerability' in model.environment_params:
- self.min_vulnerability = model.environment_params['min_vulnerability']
- else: self.min_vulnerability = 0
+ self.training_influence = model.environment_params["training_influence"]
+ if "min_vulnerability" in model.environment_params:
+ self.min_vulnerability = model.environment_params["min_vulnerability"]
+ else:
+ self.min_vulnerability = 0
@default_state
@state
def terrorist(self):
for neighbour in self.get_neighboring_agents(agent_class=TerroristSpreadModel):
if neighbour.vulnerability > self.min_vulnerability:
- neighbour.vulnerability = neighbour.vulnerability ** ( 1 - self.training_influence )
+ neighbour.vulnerability = neighbour.vulnerability ** (
+ 1 - self.training_influence
+ )
class HavenModel(FSM, Geo):
@@ -141,11 +179,12 @@ class HavenModel(FSM, Geo):
def __init__(self, model=None, unique_id=0, state=()):
super().__init__(model=model, unique_id=unique_id, state=state)
- self.haven_influence = model.environment_params['haven_influence']
- if 'min_vulnerability' in model.environment_params:
- self.min_vulnerability = model.environment_params['min_vulnerability']
- else: self.min_vulnerability = 0
- self.max_vulnerability = model.environment_params['max_vulnerability']
+ self.haven_influence = model.environment_params["haven_influence"]
+ if "min_vulnerability" in model.environment_params:
+ self.min_vulnerability = model.environment_params["min_vulnerability"]
+ else:
+ self.min_vulnerability = 0
+ self.max_vulnerability = model.environment_params["max_vulnerability"]
def get_occupants(self, **kwargs):
return self.get_neighboring_agents(agent_class=TerroristSpreadModel, **kwargs)
@@ -158,14 +197,18 @@ class HavenModel(FSM, Geo):
for neighbour in self.get_occupants():
if neighbour.vulnerability > self.min_vulnerability:
- neighbour.vulnerability = neighbour.vulnerability * ( 1 - self.haven_influence )
+ neighbour.vulnerability = neighbour.vulnerability * (
+ 1 - self.haven_influence
+ )
return self.civilian
@state
def terrorist(self):
for neighbour in self.get_occupants():
if neighbour.vulnerability < self.max_vulnerability:
- neighbour.vulnerability = neighbour.vulnerability ** ( 1 - self.haven_influence )
+ neighbour.vulnerability = neighbour.vulnerability ** (
+ 1 - self.haven_influence
+ )
return self.terrorist
@@ -184,10 +227,10 @@ class TerroristNetworkModel(TerroristSpreadModel):
def __init__(self, model=None, unique_id=0, state=()):
super().__init__(model=model, unique_id=unique_id, state=state)
- self.vision_range = model.environment_params['vision_range']
- self.sphere_influence = model.environment_params['sphere_influence']
- self.weight_social_distance = model.environment_params['weight_social_distance']
- self.weight_link_distance = model.environment_params['weight_link_distance']
+ self.vision_range = model.environment_params["vision_range"]
+ self.sphere_influence = model.environment_params["sphere_influence"]
+ self.weight_social_distance = model.environment_params["weight_social_distance"]
+ self.weight_link_distance = model.environment_params["weight_link_distance"]
@state
def terrorist(self):
@@ -201,27 +244,48 @@ class TerroristNetworkModel(TerroristSpreadModel):
def update_relationships(self):
if self.count_neighboring_agents(state_id=self.civilian.id) == 0:
- close_ups = set(self.geo_search(radius=self.vision_range, agent_class=TerroristNetworkModel))
- step_neighbours = set(self.ego_search(self.sphere_influence, agent_class=TerroristNetworkModel, center=False))
- neighbours = set(agent.id for agent in self.get_neighboring_agents(agent_class=TerroristNetworkModel))
+ close_ups = set(
+ self.geo_search(
+ radius=self.vision_range, agent_class=TerroristNetworkModel
+ )
+ )
+ step_neighbours = set(
+ self.ego_search(
+ self.sphere_influence,
+ agent_class=TerroristNetworkModel,
+ center=False,
+ )
+ )
+ neighbours = set(
+ agent.id
+ for agent in self.get_neighboring_agents(
+ agent_class=TerroristNetworkModel
+ )
+ )
search = (close_ups | step_neighbours) - neighbours
for agent in self.get_agents(search):
social_distance = 1 / self.shortest_path_length(agent.id)
- spatial_proximity = ( 1 - self.get_distance(agent.id) )
- prob_new_interaction = self.weight_social_distance * social_distance + self.weight_link_distance * spatial_proximity
- if agent['id'] == agent.civilian.id and self.random.random() < prob_new_interaction:
+ spatial_proximity = 1 - self.get_distance(agent.id)
+ prob_new_interaction = (
+ self.weight_social_distance * social_distance
+ + self.weight_link_distance * spatial_proximity
+ )
+ if (
+ agent["id"] == agent.civilian.id
+ and self.random.random() < prob_new_interaction
+ ):
self.add_edge(agent)
break
def get_distance(self, target):
- source_x, source_y = nx.get_node_attributes(self.G, 'pos')[self.id]
- target_x, target_y = nx.get_node_attributes(self.G, 'pos')[target]
- dx = abs( source_x - target_x )
- dy = abs( source_y - target_y )
- return ( dx ** 2 + dy ** 2 ) ** ( 1 / 2 )
+ source_x, source_y = nx.get_node_attributes(self.G, "pos")[self.id]
+ target_x, target_y = nx.get_node_attributes(self.G, "pos")[target]
+ dx = abs(source_x - target_x)
+ dy = abs(source_y - target_y)
+ return (dx**2 + dy**2) ** (1 / 2)
def shortest_path_length(self, target):
try:
return nx.shortest_path_length(self.G, self.id, target)
except nx.NetworkXNoPath:
- return float('inf')
+ return float("inf")
diff --git a/soil/__init__.py b/soil/__init__.py
index a49462b..92bc79f 100644
--- a/soil/__init__.py
+++ b/soil/__init__.py
@@ -225,6 +225,7 @@ def easy(cfg, pdb=False, debug=False, **kwargs):
except Exception as e:
if os.environ.get("SOIL_POSTMORTEM"):
from .debugging import post_mortem
+
print(traceback.format_exc())
post_mortem()
ex = e
@@ -232,5 +233,6 @@ def easy(cfg, pdb=False, debug=False, **kwargs):
if ex:
raise ex
+
if __name__ == "__main__":
main(do_run=True)
diff --git a/soil/__main__.py b/soil/__main__.py
index 9ad5c4f..0c76791 100644
--- a/soil/__main__.py
+++ b/soil/__main__.py
@@ -1,7 +1,9 @@
from . import main as init_main
+
def main():
init_main(do_run=True)
-if __name__ == '__main__':
+
+if __name__ == "__main__":
init_main(do_run=True)
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index b316caa..714b15e 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -43,9 +43,9 @@ class MetaAgent(ABCMeta):
}
for attr, func in namespace.items():
- if attr == 'step' and inspect.isgeneratorfunction(func):
+ if attr == "step" and inspect.isgeneratorfunction(func):
orig_func = func
- new_nmspc['_MetaAgent__coroutine'] = None
+ new_nmspc["_MetaAgent__coroutine"] = None
@wraps(func)
def func(self):
@@ -62,10 +62,10 @@ class MetaAgent(ABCMeta):
func.is_default = False
new_nmspc[attr] = func
elif (
- isinstance(func, types.FunctionType)
- or isinstance(func, property)
- or isinstance(func, classmethod)
- or attr[0] == "_"
+ isinstance(func, types.FunctionType)
+ or isinstance(func, property)
+ or isinstance(func, classmethod)
+ or attr[0] == "_"
):
new_nmspc[attr] = func
elif attr == "defaults":
@@ -303,7 +303,7 @@ class NetworkAgent(BaseAgent):
return G
def remove_node(self):
- print(f'Removing node for {self.unique_id}: {self.node_id}')
+ print(f"Removing node for {self.unique_id}: {self.node_id}")
self.G.remove_node(self.node_id)
self.node_id = None
diff --git a/soil/environment.py b/soil/environment.py
index fb4823f..8245ca0 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -146,7 +146,7 @@ class BaseEnvironment(Model):
if unique_id is None:
unique_id = self.next_id()
- kwargs['unique_id'] = unique_id
+ kwargs["unique_id"] = unique_id
a = self._agent_from_dict(kwargs)
self.schedule.add(a)
@@ -169,7 +169,9 @@ class BaseEnvironment(Model):
Advance one step in the simulation, and update the data collection and scheduler appropriately
"""
super().step()
- self.logger.info(f"--- Step: {self.schedule.steps:^5} - Time: {self.now:^5} ---")
+ self.logger.info(
+ f"--- Step: {self.schedule.steps:^5} - Time: {self.now:^5} ---"
+ )
self.schedule.step()
self.datacollector.collect(self)
@@ -236,7 +238,7 @@ class NetworkEnvironment(BaseEnvironment):
node_id = agent.get("node_id", None)
if node_id is None:
node_id = network.find_unassigned(self.G, random=self.random)
- self.G.nodes[node_id]['agent'] = None
+ self.G.nodes[node_id]["agent"] = None
agent["node_id"] = node_id
agent["unique_id"] = unique_id
agent["topology"] = self.G
@@ -271,7 +273,7 @@ class NetworkEnvironment(BaseEnvironment):
G=self.G, shuffle=True, random=self.random
)
if node_id is None:
- node_id = f'node_for_{unique_id}'
+ node_id = f"node_for_{unique_id}"
if node_id not in self.G.nodes:
self.G.add_node(node_id)
@@ -280,17 +282,23 @@ class NetworkEnvironment(BaseEnvironment):
self.G.nodes[node_id]["agent"] = None # Reserve
a = self.add_agent(
- unique_id=unique_id, agent_class=agent_class, topology=self.G, node_id=node_id, **kwargs
+ unique_id=unique_id,
+ agent_class=agent_class,
+ topology=self.G,
+ node_id=node_id,
+ **kwargs,
)
a["visible"] = True
return a
def add_agent(self, *args, **kwargs):
a = super().add_agent(*args, **kwargs)
- if 'node_id' in a:
+ if "node_id" in a:
if a.node_id == 24:
- import pdb;pdb.set_trace()
- assert self.G.nodes[a.node_id]['agent'] == a
+ import pdb
+
+ pdb.set_trace()
+ assert self.G.nodes[a.node_id]["agent"] == a
return a
def agent_for_node_id(self, node_id):
diff --git a/soil/exporters.py b/soil/exporters.py
index 405b2f8..6efe70a 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -202,7 +202,12 @@ class summary(Exporter):
for (t, df) in self.get_dfs(env):
if not len(df):
continue
- msg = indent(str(df.describe()), ' ')
- logger.info(dedent(f'''
+ msg = indent(str(df.describe()), " ")
+ logger.info(
+ dedent(
+ f"""
Dataframe {t}:
- ''') + msg)
+ """
+ )
+ + msg
+ )
diff --git a/soil/simulation.py b/soil/simulation.py
index fc50ab8..f5738d4 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -226,7 +226,9 @@ Model stats:
)
model.step()
- if model.schedule.time < until: # Simulation ended (no more steps) before the expected time
+ if (
+ model.schedule.time < until
+ ): # Simulation ended (no more steps) before the expected time
model.schedule.time = until
return model
diff --git a/soil/time.py b/soil/time.py
index 26c4259..e7acbac 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -174,7 +174,6 @@ class TimedActivation(BaseScheduler):
agent.alive = False
continue
-
if not getattr(agent, "alive", True):
self.remove(agent)
continue
From 3776c4e5c5958a7389a3ffe65087c28d0d5d533b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Mon, 17 Oct 2022 21:36:21 +0200
Subject: [PATCH 16/39] Refactor
* Removed references to `set_state`
* Split some functionality from `agents` into separate files (`fsm` and
`network_agents`)
* Rename `neighboring_agents` to `neighbors`
* Delete some spurious functions
---
examples/mesa/social_wealth.py | 2 +-
examples/newsspread/newsspread.py | 30 ++-
examples/pubcrawl/pubcrawl.py | 2 +-
examples/terrorism/TerroristNetworkModel.py | 12 +-
soil/agents/BassModel.py | 2 +-
soil/agents/BigMarketModel.py | 8 +-
soil/agents/CounterModel.py | 4 +-
soil/agents/IndependentCascadeModel.py | 2 +-
soil/agents/ModelM2.py | 38 +--
soil/agents/SISaModel.py | 10 +-
soil/agents/SentimentCorrelationModel.py | 8 +-
soil/agents/__init__.py | 271 +-------------------
soil/agents/fsm.py | 133 ++++++++++
soil/agents/network_agents.py | 82 ++++++
tests/test_agents.py | 14 +
tests/test_main.py | 24 +-
16 files changed, 295 insertions(+), 347 deletions(-)
create mode 100644 soil/agents/fsm.py
create mode 100644 soil/agents/network_agents.py
diff --git a/examples/mesa/social_wealth.py b/examples/mesa/social_wealth.py
index b4ae99f..8085543 100644
--- a/examples/mesa/social_wealth.py
+++ b/examples/mesa/social_wealth.py
@@ -58,7 +58,7 @@ class SocialMoneyAgent(NetworkAgent, MoneyAgent):
def give_money(self):
cellmates = set(self.model.grid.get_cell_list_contents([self.pos]))
- friends = set(self.get_neighboring_agents())
+ friends = set(self.get_neighbors())
self.info("Trying to give money")
self.info("Cellmates: ", cellmates)
self.info("Friends: ", friends)
diff --git a/examples/newsspread/newsspread.py b/examples/newsspread/newsspread.py
index f747f8e..bfcdbc9 100644
--- a/examples/newsspread/newsspread.py
+++ b/examples/newsspread/newsspread.py
@@ -8,10 +8,9 @@ class DumbViewer(FSM, NetworkAgent):
its neighbors once it's infected.
"""
- defaults = {
- "prob_neighbor_spread": 0.5,
- "prob_tv_spread": 0.1,
- }
+ prob_neighbor_spread = 0.5
+ prob_tv_spread = 0.1
+ has_been_infected = False
@default_state
@state
@@ -19,10 +18,12 @@ class DumbViewer(FSM, NetworkAgent):
if self["has_tv"]:
if self.prob(self.model["prob_tv_spread"]):
return self.infected
+ if self.has_been_infected:
+ return self.infected
@state
def infected(self):
- for neighbor in self.get_neighboring_agents(state_id=self.neutral.id):
+ for neighbor in self.get_neighbors(state_id=self.neutral.id):
if self.prob(self.model["prob_neighbor_spread"]):
neighbor.infect()
@@ -33,7 +34,7 @@ class DumbViewer(FSM, NetworkAgent):
HerdViewer might not become infected right away
"""
- self.set_state(self.infected)
+ self.has_been_infected = True
class HerdViewer(DumbViewer):
@@ -43,12 +44,12 @@ class HerdViewer(DumbViewer):
def infect(self):
"""Notice again that this is NOT a state. See DumbViewer.infect for reference"""
- infected = self.count_neighboring_agents(state_id=self.infected.id)
- total = self.count_neighboring_agents()
+ infected = self.count_neighbors(state_id=self.infected.id)
+ total = self.count_neighbors()
prob_infect = self.model["prob_neighbor_spread"] * infected / total
self.debug("prob_infect", prob_infect)
if self.prob(prob_infect):
- self.set_state(self.infected)
+ self.has_been_infected = True
class WiseViewer(HerdViewer):
@@ -65,7 +66,7 @@ class WiseViewer(HerdViewer):
@state
def cured(self):
prob_cure = self.model["prob_neighbor_cure"]
- for neighbor in self.get_neighboring_agents(state_id=self.infected.id):
+ for neighbor in self.get_neighbors(state_id=self.infected.id):
if self.prob(prob_cure):
try:
neighbor.cure()
@@ -73,13 +74,14 @@ class WiseViewer(HerdViewer):
self.debug("Viewer {} cannot be cured".format(neighbor.id))
def cure(self):
- self.set_state(self.cured.id)
+ self.has_been_cured = True
@state
def infected(self):
- cured = max(self.count_neighboring_agents(self.cured.id), 1.0)
- infected = max(self.count_neighboring_agents(self.infected.id), 1.0)
+ if self.has_been_cured:
+ return self.cured
+ cured = max(self.count_neighbors(self.cured.id), 1.0)
+ infected = max(self.count_neighbors(self.infected.id), 1.0)
prob_cure = self.model["prob_neighbor_cure"] * (cured / infected)
if self.prob(prob_cure):
return self.cured
- return self.set_state(super().infected)
diff --git a/examples/pubcrawl/pubcrawl.py b/examples/pubcrawl/pubcrawl.py
index 110a44c..be8a2b4 100644
--- a/examples/pubcrawl/pubcrawl.py
+++ b/examples/pubcrawl/pubcrawl.py
@@ -89,7 +89,7 @@ class Patron(FSM, NetworkAgent):
if self["pub"] != None:
return self.sober_in_pub
self.debug("I am looking for a pub")
- group = list(self.get_neighboring_agents())
+ group = list(self.get_neighbors())
for pub in self.model.available_pubs():
self.debug("We're trying to get into {}: total: {}".format(pub, len(group)))
if self.model.enter(pub, self, *group):
diff --git a/examples/terrorism/TerroristNetworkModel.py b/examples/terrorism/TerroristNetworkModel.py
index 8fa6563..fe3034f 100644
--- a/examples/terrorism/TerroristNetworkModel.py
+++ b/examples/terrorism/TerroristNetworkModel.py
@@ -49,7 +49,7 @@ class TerroristSpreadModel(FSM, Geo):
@state
def civilian(self):
- neighbours = list(self.get_neighboring_agents(agent_class=TerroristSpreadModel))
+ neighbours = list(self.get_neighbors(agent_class=TerroristSpreadModel))
if len(neighbours) > 0:
# Only interact with some of the neighbors
interactions = list(
@@ -73,7 +73,7 @@ class TerroristSpreadModel(FSM, Geo):
@state
def leader(self):
self.mean_belief = self.mean_belief ** (1 - self.terrorist_additional_influence)
- for neighbour in self.get_neighboring_agents(
+ for neighbour in self.get_neighbors(
state_id=[self.terrorist.id, self.leader.id]
):
if self.betweenness(neighbour) > self.betweenness(self):
@@ -158,7 +158,7 @@ class TrainingAreaModel(FSM, Geo):
@default_state
@state
def terrorist(self):
- for neighbour in self.get_neighboring_agents(agent_class=TerroristSpreadModel):
+ for neighbour in self.get_neighbors(agent_class=TerroristSpreadModel):
if neighbour.vulnerability > self.min_vulnerability:
neighbour.vulnerability = neighbour.vulnerability ** (
1 - self.training_influence
@@ -187,7 +187,7 @@ class HavenModel(FSM, Geo):
self.max_vulnerability = model.environment_params["max_vulnerability"]
def get_occupants(self, **kwargs):
- return self.get_neighboring_agents(agent_class=TerroristSpreadModel, **kwargs)
+ return self.get_neighbors(agent_class=TerroristSpreadModel, **kwargs)
@state
def civilian(self):
@@ -243,7 +243,7 @@ class TerroristNetworkModel(TerroristSpreadModel):
return super().leader()
def update_relationships(self):
- if self.count_neighboring_agents(state_id=self.civilian.id) == 0:
+ if self.count_neighbors(state_id=self.civilian.id) == 0:
close_ups = set(
self.geo_search(
radius=self.vision_range, agent_class=TerroristNetworkModel
@@ -258,7 +258,7 @@ class TerroristNetworkModel(TerroristSpreadModel):
)
neighbours = set(
agent.id
- for agent in self.get_neighboring_agents(
+ for agent in self.get_neighbors(
agent_class=TerroristNetworkModel
)
)
diff --git a/soil/agents/BassModel.py b/soil/agents/BassModel.py
index 416063d..4410d82 100644
--- a/soil/agents/BassModel.py
+++ b/soil/agents/BassModel.py
@@ -20,7 +20,7 @@ class BassModel(FSM):
self.sentimentCorrelation = 1
return self.aware
else:
- aware_neighbors = self.get_neighboring_agents(state_id=self.aware.id)
+ aware_neighbors = self.get_neighbors(state_id=self.aware.id)
num_neighbors_aware = len(aware_neighbors)
if self.prob((self["imitation_prob"] * num_neighbors_aware)):
self.sentimentCorrelation = 1
diff --git a/soil/agents/BigMarketModel.py b/soil/agents/BigMarketModel.py
index 5a93b23..e606e0a 100644
--- a/soil/agents/BigMarketModel.py
+++ b/soil/agents/BigMarketModel.py
@@ -24,14 +24,14 @@ class BigMarketModel(FSM):
self.type = ""
if self.id < len(self.enterprises): # Enterprises
- self.set_state(self.enterprise.id)
+ self._set_state(self.enterprise.id)
self.type = "Enterprise"
self.tweet_probability = environment.environment_params[
"tweet_probability_enterprises"
][self.id]
else: # normal users
self.type = "User"
- self.set_state(self.user.id)
+ self._set_state(self.user.id)
self.tweet_probability = environment.environment_params[
"tweet_probability_users"
]
@@ -49,7 +49,7 @@ class BigMarketModel(FSM):
def enterprise(self):
if self.random.random() < self.tweet_probability: # Tweets
- aware_neighbors = self.get_neighboring_agents(
+ aware_neighbors = self.get_neighbors(
state_id=self.number_of_enterprises
) # Nodes neighbour users
for x in aware_neighbors:
@@ -96,7 +96,7 @@ class BigMarketModel(FSM):
] = self.sentiment_about[i]
def userTweets(self, sentiment, enterprise):
- aware_neighbors = self.get_neighboring_agents(
+ aware_neighbors = self.get_neighbors(
state_id=self.number_of_enterprises
) # Nodes neighbours users
for x in aware_neighbors:
diff --git a/soil/agents/CounterModel.py b/soil/agents/CounterModel.py
index 731c61d..6cd41fb 100644
--- a/soil/agents/CounterModel.py
+++ b/soil/agents/CounterModel.py
@@ -14,7 +14,7 @@ class CounterModel(NetworkAgent):
def step(self):
# Outside effects
total = len(list(self.model.schedule._agents))
- neighbors = len(list(self.get_neighboring_agents()))
+ neighbors = len(list(self.get_neighbors()))
self["times"] = self.get("times", 0) + 1
self["neighbors"] = neighbors
self["total"] = total
@@ -33,7 +33,7 @@ class AggregatedCounter(NetworkAgent):
def step(self):
# Outside effects
self["times"] += 1
- neighbors = len(list(self.get_neighboring_agents()))
+ neighbors = len(list(self.get_neighbors()))
self["neighbors"] += neighbors
total = len(list(self.model.schedule.agents))
self["total"] += total
diff --git a/soil/agents/IndependentCascadeModel.py b/soil/agents/IndependentCascadeModel.py
index d3280e0..e332b07 100644
--- a/soil/agents/IndependentCascadeModel.py
+++ b/soil/agents/IndependentCascadeModel.py
@@ -36,7 +36,7 @@ class IndependentCascadeModel(BaseAgent):
# Imitation effects
if self.state["id"] == 0:
- aware_neighbors = self.get_neighboring_agents(state_id=1)
+ aware_neighbors = self.get_neighbors(state_id=1)
for x in aware_neighbors:
if x.state["time_awareness"] == (self.env.now - 1):
aware_neighbors_1_time_step.append(x)
diff --git a/soil/agents/ModelM2.py b/soil/agents/ModelM2.py
index b22cafa..4fac2b8 100644
--- a/soil/agents/ModelM2.py
+++ b/soil/agents/ModelM2.py
@@ -71,7 +71,7 @@ class SpreadModelM2(BaseAgent):
def neutral_behaviour(self):
# Infected
- infected_neighbors = self.get_neighboring_agents(state_id=1)
+ infected_neighbors = self.get_neighbors(state_id=1)
if len(infected_neighbors) > 0:
if self.prob(self.prob_neutral_making_denier):
self.state["id"] = 3 # Vaccinated making denier
@@ -79,7 +79,7 @@ class SpreadModelM2(BaseAgent):
def infected_behaviour(self):
# Neutral
- neutral_neighbors = self.get_neighboring_agents(state_id=0)
+ neutral_neighbors = self.get_neighbors(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_infect):
neighbor.state["id"] = 1 # Infected
@@ -87,13 +87,13 @@ class SpreadModelM2(BaseAgent):
def cured_behaviour(self):
# Vaccinate
- neutral_neighbors = self.get_neighboring_agents(state_id=0)
+ neutral_neighbors = self.get_neighbors(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_cured_vaccinate_neutral):
neighbor.state["id"] = 3 # Vaccinated
# Cure
- infected_neighbors = self.get_neighboring_agents(state_id=1)
+ infected_neighbors = self.get_neighbors(state_id=1)
for neighbor in infected_neighbors:
if self.prob(self.prob_cured_healing_infected):
neighbor.state["id"] = 2 # Cured
@@ -101,19 +101,19 @@ class SpreadModelM2(BaseAgent):
def vaccinated_behaviour(self):
# Cure
- infected_neighbors = self.get_neighboring_agents(state_id=1)
+ infected_neighbors = self.get_neighbors(state_id=1)
for neighbor in infected_neighbors:
if self.prob(self.prob_cured_healing_infected):
neighbor.state["id"] = 2 # Cured
# Vaccinate
- neutral_neighbors = self.get_neighboring_agents(state_id=0)
+ neutral_neighbors = self.get_neighbors(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_cured_vaccinate_neutral):
neighbor.state["id"] = 3 # Vaccinated
# Generate anti-rumor
- infected_neighbors_2 = self.get_neighboring_agents(state_id=1)
+ infected_neighbors_2 = self.get_neighbors(state_id=1)
for neighbor in infected_neighbors_2:
if self.prob(self.prob_generate_anti_rumor):
neighbor.state["id"] = 2 # Cured
@@ -191,7 +191,7 @@ class ControlModelM2(BaseAgent):
self.state["visible"] = False
# Infected
- infected_neighbors = self.get_neighboring_agents(state_id=1)
+ infected_neighbors = self.get_neighbors(state_id=1)
if len(infected_neighbors) > 0:
if self.random(self.prob_neutral_making_denier):
self.state["id"] = 3 # Vaccinated making denier
@@ -199,7 +199,7 @@ class ControlModelM2(BaseAgent):
def infected_behaviour(self):
# Neutral
- neutral_neighbors = self.get_neighboring_agents(state_id=0)
+ neutral_neighbors = self.get_neighbors(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_infect):
neighbor.state["id"] = 1 # Infected
@@ -209,13 +209,13 @@ class ControlModelM2(BaseAgent):
self.state["visible"] = True
# Vaccinate
- neutral_neighbors = self.get_neighboring_agents(state_id=0)
+ neutral_neighbors = self.get_neighbors(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_cured_vaccinate_neutral):
neighbor.state["id"] = 3 # Vaccinated
# Cure
- infected_neighbors = self.get_neighboring_agents(state_id=1)
+ infected_neighbors = self.get_neighbors(state_id=1)
for neighbor in infected_neighbors:
if self.prob(self.prob_cured_healing_infected):
neighbor.state["id"] = 2 # Cured
@@ -224,47 +224,47 @@ class ControlModelM2(BaseAgent):
self.state["visible"] = True
# Cure
- infected_neighbors = self.get_neighboring_agents(state_id=1)
+ infected_neighbors = self.get_neighbors(state_id=1)
for neighbor in infected_neighbors:
if self.prob(self.prob_cured_healing_infected):
neighbor.state["id"] = 2 # Cured
# Vaccinate
- neutral_neighbors = self.get_neighboring_agents(state_id=0)
+ neutral_neighbors = self.get_neighbors(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_cured_vaccinate_neutral):
neighbor.state["id"] = 3 # Vaccinated
# Generate anti-rumor
- infected_neighbors_2 = self.get_neighboring_agents(state_id=1)
+ infected_neighbors_2 = self.get_neighbors(state_id=1)
for neighbor in infected_neighbors_2:
if self.prob(self.prob_generate_anti_rumor):
neighbor.state["id"] = 2 # Cured
def beacon_off_behaviour(self):
self.state["visible"] = False
- infected_neighbors = self.get_neighboring_agents(state_id=1)
+ infected_neighbors = self.get_neighbors(state_id=1)
if len(infected_neighbors) > 0:
self.state["id"] == 5 # Beacon on
def beacon_on_behaviour(self):
self.state["visible"] = False
# Cure (M2 feature added)
- infected_neighbors = self.get_neighboring_agents(state_id=1)
+ infected_neighbors = self.get_neighbors(state_id=1)
for neighbor in infected_neighbors:
if self.prob(self.prob_generate_anti_rumor):
neighbor.state["id"] = 2 # Cured
- neutral_neighbors_infected = neighbor.get_neighboring_agents(state_id=0)
+ neutral_neighbors_infected = neighbor.get_neighbors(state_id=0)
for neighbor in neutral_neighbors_infected:
if self.prob(self.prob_generate_anti_rumor):
neighbor.state["id"] = 3 # Vaccinated
- infected_neighbors_infected = neighbor.get_neighboring_agents(state_id=1)
+ infected_neighbors_infected = neighbor.get_neighbors(state_id=1)
for neighbor in infected_neighbors_infected:
if self.prob(self.prob_generate_anti_rumor):
neighbor.state["id"] = 2 # Cured
# Vaccinate
- neutral_neighbors = self.get_neighboring_agents(state_id=0)
+ neutral_neighbors = self.get_neighbors(state_id=0)
for neighbor in neutral_neighbors:
if self.prob(self.prob_cured_vaccinate_neutral):
neighbor.state["id"] = 3 # Vaccinated
diff --git a/soil/agents/SISaModel.py b/soil/agents/SISaModel.py
index e298e8a..45d9328 100644
--- a/soil/agents/SISaModel.py
+++ b/soil/agents/SISaModel.py
@@ -69,10 +69,10 @@ class SISaModel(FSM):
return self.content
# Infected
- discontent_neighbors = self.count_neighboring_agents(state_id=self.discontent)
+ discontent_neighbors = self.count_neighbors(state_id=self.discontent)
if self.prob(scontent_neighbors * self.neutral_discontent_infected_prob):
return self.discontent
- content_neighbors = self.count_neighboring_agents(state_id=self.content.id)
+ content_neighbors = self.count_neighbors(state_id=self.content.id)
if self.prob(s * self.neutral_content_infected_prob):
return self.content
return self.neutral
@@ -84,7 +84,7 @@ class SISaModel(FSM):
return self.neutral
# Superinfected
- content_neighbors = self.count_neighboring_agents(state_id=self.content.id)
+ content_neighbors = self.count_neighbors(state_id=self.content.id)
if self.prob(s * self.discontent_content):
return self.content
return self.discontent
@@ -96,9 +96,7 @@ class SISaModel(FSM):
return self.neutral
# Superinfected
- discontent_neighbors = self.count_neighboring_agents(
- state_id=self.discontent.id
- )
+ discontent_neighbors = self.count_neighbors(state_id=self.discontent.id)
if self.prob(scontent_neighbors * self.content_discontent):
self.discontent
return self.content
diff --git a/soil/agents/SentimentCorrelationModel.py b/soil/agents/SentimentCorrelationModel.py
index 721d026..751a59a 100644
--- a/soil/agents/SentimentCorrelationModel.py
+++ b/soil/agents/SentimentCorrelationModel.py
@@ -41,25 +41,25 @@ class SentimentCorrelationModel(BaseAgent):
sad_neighbors_1_time_step = []
disgusted_neighbors_1_time_step = []
- angry_neighbors = self.get_neighboring_agents(state_id=1)
+ angry_neighbors = self.get_neighbors(state_id=1)
for x in angry_neighbors:
if x.state["time_awareness"][0] > (self.env.now - 500):
angry_neighbors_1_time_step.append(x)
num_neighbors_angry = len(angry_neighbors_1_time_step)
- joyful_neighbors = self.get_neighboring_agents(state_id=2)
+ joyful_neighbors = self.get_neighbors(state_id=2)
for x in joyful_neighbors:
if x.state["time_awareness"][1] > (self.env.now - 500):
joyful_neighbors_1_time_step.append(x)
num_neighbors_joyful = len(joyful_neighbors_1_time_step)
- sad_neighbors = self.get_neighboring_agents(state_id=3)
+ sad_neighbors = self.get_neighbors(state_id=3)
for x in sad_neighbors:
if x.state["time_awareness"][2] > (self.env.now - 500):
sad_neighbors_1_time_step.append(x)
num_neighbors_sad = len(sad_neighbors_1_time_step)
- disgusted_neighbors = self.get_neighboring_agents(state_id=4)
+ disgusted_neighbors = self.get_neighbors(state_id=4)
for x in disgusted_neighbors:
if x.state["time_awareness"][3] > (self.env.now - 500):
disgusted_neighbors_1_time_step.append(x)
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index 714b15e..9b5736b 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -243,223 +243,6 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
return f"{self.__class__.__name__}({self.unique_id})"
-class NetworkAgent(BaseAgent):
- def __init__(self, *args, topology, node_id, **kwargs):
- super().__init__(*args, **kwargs)
-
- assert topology is not None
- assert node_id is not None
- self.G = topology
- assert self.G
- self.node_id = node_id
-
- def count_neighboring_agents(self, state_id=None, **kwargs):
- return len(self.get_neighboring_agents(state_id=state_id, **kwargs))
-
- def get_neighboring_agents(self, **kwargs):
- return list(self.iter_agents(limit_neighbors=True, **kwargs))
-
- def add_edge(self, other):
- assert self.node_id
- assert other.node_id
- assert self.node_id in self.G.nodes
- assert other.node_id in self.G.nodes
- self.topology.add_edge(self.node_id, other.node_id)
-
- @property
- def node(self):
- return self.topology.nodes[self.node_id]
-
- def iter_agents(self, unique_id=None, *, limit_neighbors=False, **kwargs):
- unique_ids = None
- if isinstance(unique_id, list):
- unique_ids = set(unique_id)
- elif unique_id is not None:
- unique_ids = set(
- [
- unique_id,
- ]
- )
-
- if limit_neighbors:
- neighbor_ids = set()
- for node_id in self.G.neighbors(self.node_id):
- if self.G.nodes[node_id].get("agent") is not None:
- neighbor_ids.add(node_id)
- if unique_ids:
- unique_ids = unique_ids & neighbor_ids
- else:
- unique_ids = neighbor_ids
- if not unique_ids:
- return
- unique_ids = list(unique_ids)
- yield from super().iter_agents(unique_id=unique_ids, **kwargs)
-
- def subgraph(self, center=True, **kwargs):
- include = [self] if center else []
- G = self.G.subgraph(
- n.node_id for n in list(self.get_agents(**kwargs) + include)
- )
- return G
-
- def remove_node(self):
- print(f"Removing node for {self.unique_id}: {self.node_id}")
- self.G.remove_node(self.node_id)
- self.node_id = None
-
- def add_edge(self, other, edge_attr_dict=None, *edge_attrs):
- if self.node_id not in self.G.nodes(data=False):
- raise ValueError(
- "{} not in list of existing agents in the network".format(
- self.unique_id
- )
- )
- if other.node_id not in self.G.nodes(data=False):
- raise ValueError(
- "{} not in list of existing agents in the network".format(other)
- )
-
- self.G.add_edge(
- self.node_id, other.node_id, edge_attr_dict=edge_attr_dict, *edge_attrs
- )
-
- def die(self, remove=True):
- if not self.alive:
- return
- if remove:
- self.remove_node()
- return super().die()
-
-
-def state(name=None):
- def decorator(func, name=None):
- """
- A state function should return either a state id, or a tuple (state_id, when)
- The default value for state_id is the current state id.
- The default value for when is the interval defined in the environment.
- """
- if inspect.isgeneratorfunction(func):
- orig_func = func
-
- @wraps(func)
- def func(self):
- while True:
- if not self._coroutine:
- self._coroutine = orig_func(self)
- try:
- n = next(self._coroutine)
- if n:
- return None, n
- return
- except StopIteration as ex:
- self._coroutine = None
- next_state = ex.value
- if next_state is not None:
- self._set_state(next_state)
- return next_state
-
- func.id = name or func.__name__
- func.is_default = False
- return func
-
- if callable(name):
- return decorator(name)
- else:
- return partial(decorator, name=name)
-
-
-def default_state(func):
- func.is_default = True
- return func
-
-
-class MetaFSM(MetaAgent):
- def __new__(mcls, name, bases, namespace):
- states = {}
- # Re-use states from inherited classes
- default_state = None
- for i in bases:
- if isinstance(i, MetaFSM):
- for state_id, state in i._states.items():
- if state.is_default:
- default_state = state
- states[state_id] = state
-
- # Add new states
- for attr, func in namespace.items():
- if hasattr(func, "id"):
- if func.is_default:
- default_state = func
- states[func.id] = func
-
- namespace.update(
- {
- "_default_state": default_state,
- "_states": states,
- }
- )
-
- return super(MetaFSM, mcls).__new__(
- mcls=mcls, name=name, bases=bases, namespace=namespace
- )
-
-
-class FSM(BaseAgent, metaclass=MetaFSM):
- def __init__(self, **kwargs):
- super(FSM, self).__init__(**kwargs)
- if not hasattr(self, "state_id"):
- if not self._default_state:
- raise ValueError(
- "No default state specified for {}".format(self.unique_id)
- )
- self.state_id = self._default_state.id
-
- self._coroutine = None
- self._set_state(self.state_id)
-
- def step(self):
- self.debug(f"Agent {self.unique_id} @ state {self.state_id}")
- default_interval = super().step()
-
- next_state = self._states[self.state_id](self)
-
- when = None
- try:
- next_state, *when = next_state
- if not when:
- when = None
- elif len(when) == 1:
- when = when[0]
- else:
- raise ValueError(
- "Too many values returned. Only state (and time) allowed"
- )
- except TypeError:
- pass
-
- if next_state is not None:
- self._set_state(next_state)
-
- return when or default_interval
-
- def _set_state(self, state, when=None):
- if hasattr(state, "id"):
- state = state.id
- if state not in self._states:
- raise ValueError("{} is not a valid state".format(state))
- self.state_id = state
- if when is not None:
- self.model.schedule.add(self, when=when)
- return state
-
- def die(self):
- return self.dead, super().die()
-
- @state
- def dead(self):
- return self.die()
-
-
def prob(prob, random):
"""
A true/False uniform distribution with a given probability.
@@ -525,7 +308,7 @@ def calculate_distribution(network_agents=None, agent_class=None):
return network_agents
-def serialize_type(agent_class, known_modules=[], **kwargs):
+def _serialize_type(agent_class, known_modules=[], **kwargs):
if isinstance(agent_class, str):
return agent_class
known_modules += ["soil.agents"]
@@ -534,20 +317,7 @@ def serialize_type(agent_class, known_modules=[], **kwargs):
] # Get the name of the class
-def serialize_definition(network_agents, known_modules=[]):
- """
- When serializing an agent distribution, remove the thresholds, in order
- to avoid cluttering the YAML definition file.
- """
- d = deepcopy(list(network_agents))
- for v in d:
- if "threshold" in v:
- del v["threshold"]
- v["agent_class"] = serialize_type(v["agent_class"], known_modules=known_modules)
- return d
-
-
-def deserialize_type(agent_class, known_modules=[]):
+def _deserialize_type(agent_class, known_modules=[]):
if not isinstance(agent_class, str):
return agent_class
known = known_modules + ["soil.agents", "soil.agents.custom"]
@@ -555,31 +325,6 @@ def deserialize_type(agent_class, known_modules=[]):
return agent_class
-def deserialize_definition(ind, **kwargs):
- d = deepcopy(ind)
- for v in d:
- v["agent_class"] = deserialize_type(v["agent_class"], **kwargs)
- return d
-
-
-def _validate_states(states, topology):
- """Validate states to avoid ignoring states during initialization"""
- states = states or []
- if isinstance(states, dict):
- for x in states:
- assert x in topology.nodes
- else:
- assert len(states) <= len(topology)
- return states
-
-
-def _convert_agent_classs(ind, to_string=False, **kwargs):
- """Convenience method to allow specifying agents by class or class name."""
- if to_string:
- return serialize_definition(ind, **kwargs)
- return deserialize_definition(ind, **kwargs)
-
-
class AgentView(Mapping, Set):
"""A lazy-loaded list of agents."""
@@ -663,7 +408,7 @@ def filter_agents(
state_id = tuple([state_id])
if agent_class is not None:
- agent_class = deserialize_type(agent_class)
+ agent_class = _deserialize_type(agent_class)
try:
agent_class = tuple(agent_class)
except TypeError:
@@ -703,14 +448,6 @@ def from_config(
default = cfg or config.AgentConfig()
if not isinstance(cfg, config.AgentConfig):
cfg = config.AgentConfig(**cfg)
- return _agents_from_config(cfg, topology=topology, random=random)
-
-
-def _agents_from_config(
- cfg: config.AgentConfig, topology: nx.Graph, random
-) -> List[Dict[str, Any]]:
- if cfg and not isinstance(cfg, config.AgentConfig):
- cfg = config.AgentConfig(**cfg)
agents = []
@@ -878,6 +615,8 @@ def _from_distro(
return agents
+from .network_agents import *
+from .fsm import *
from .BassModel import *
from .BigMarketModel import *
from .IndependentCascadeModel import *
diff --git a/soil/agents/fsm.py b/soil/agents/fsm.py
new file mode 100644
index 0000000..729313d
--- /dev/null
+++ b/soil/agents/fsm.py
@@ -0,0 +1,133 @@
+from . import MetaAgent, BaseAgent
+
+from functools import partial
+import inspect
+
+
+def state(name=None):
+ def decorator(func, name=None):
+ """
+ A state function should return either a state id, or a tuple (state_id, when)
+ The default value for state_id is the current state id.
+ The default value for when is the interval defined in the environment.
+ """
+ if inspect.isgeneratorfunction(func):
+ orig_func = func
+
+ @wraps(func)
+ def func(self):
+ while True:
+ if not self._coroutine:
+ self._coroutine = orig_func(self)
+ try:
+ n = next(self._coroutine)
+ if n:
+ return None, n
+ return
+ except StopIteration as ex:
+ self._coroutine = None
+ next_state = ex.value
+ if next_state is not None:
+ self._set_state(next_state)
+ return next_state
+
+ func.id = name or func.__name__
+ func.is_default = False
+ return func
+
+ if callable(name):
+ return decorator(name)
+ else:
+ return partial(decorator, name=name)
+
+
+def default_state(func):
+ func.is_default = True
+ return func
+
+
+class MetaFSM(MetaAgent):
+ def __new__(mcls, name, bases, namespace):
+ states = {}
+ # Re-use states from inherited classes
+ default_state = None
+ for i in bases:
+ if isinstance(i, MetaFSM):
+ for state_id, state in i._states.items():
+ if state.is_default:
+ default_state = state
+ states[state_id] = state
+
+ # Add new states
+ for attr, func in namespace.items():
+ if hasattr(func, "id"):
+ if func.is_default:
+ default_state = func
+ states[func.id] = func
+
+ namespace.update(
+ {
+ "_default_state": default_state,
+ "_states": states,
+ }
+ )
+
+ return super(MetaFSM, mcls).__new__(
+ mcls=mcls, name=name, bases=bases, namespace=namespace
+ )
+
+
+class FSM(BaseAgent, metaclass=MetaFSM):
+ def __init__(self, **kwargs):
+ super(FSM, self).__init__(**kwargs)
+ if not hasattr(self, "state_id"):
+ if not self._default_state:
+ raise ValueError(
+ "No default state specified for {}".format(self.unique_id)
+ )
+ self.state_id = self._default_state.id
+
+ self._coroutine = None
+ self._set_state(self.state_id)
+
+ def step(self):
+ self.debug(f"Agent {self.unique_id} @ state {self.state_id}")
+ default_interval = super().step()
+
+ next_state = self._states[self.state_id](self)
+
+ when = None
+ try:
+ next_state, *when = next_state
+ if not when:
+ when = None
+ elif len(when) == 1:
+ when = when[0]
+ else:
+ raise ValueError(
+ "Too many values returned. Only state (and time) allowed"
+ )
+ except TypeError:
+ pass
+
+ if next_state is not None:
+ self._set_state(next_state)
+
+ return when or default_interval
+
+ def _set_state(self, state, when=None):
+ if hasattr(state, "id"):
+ state = state.id
+ if state not in self._states:
+ raise ValueError("{} is not a valid state".format(state))
+ self.state_id = state
+ if when is not None:
+ self.model.schedule.add(self, when=when)
+ return state
+
+ def die(self):
+ return self.dead, super().die()
+
+ @state
+ def dead(self):
+ return self.die()
diff --git a/soil/agents/network_agents.py b/soil/agents/network_agents.py
new file mode 100644
index 0000000..d9950cf
--- /dev/null
+++ b/soil/agents/network_agents.py
@@ -0,0 +1,82 @@
+from . import BaseAgent
+
+
+class NetworkAgent(BaseAgent):
+ def __init__(self, *args, topology, node_id, **kwargs):
+ super().__init__(*args, **kwargs)
+
+ assert topology is not None
+ assert node_id is not None
+ self.G = topology
+ assert self.G
+ self.node_id = node_id
+
+ def count_neighbors(self, state_id=None, **kwargs):
+ return len(self.get_neighbors(state_id=state_id, **kwargs))
+
+ def get_neighbors(self, **kwargs):
+ return list(self.iter_agents(limit_neighbors=True, **kwargs))
+
+ @property
+ def node(self):
+ return self.G.nodes[self.node_id]
+
+ def iter_agents(self, unique_id=None, *, limit_neighbors=False, **kwargs):
+ unique_ids = None
+ if isinstance(unique_id, list):
+ unique_ids = set(unique_id)
+ elif unique_id is not None:
+ unique_ids = set(
+ [
+ unique_id,
+ ]
+ )
+
+ if limit_neighbors:
+ neighbor_ids = set()
+ for node_id in self.G.neighbors(self.node_id):
+ if self.G.nodes[node_id].get("agent") is not None:
+ neighbor_ids.add(node_id)
+ if unique_ids:
+ unique_ids = unique_ids & neighbor_ids
+ else:
+ unique_ids = neighbor_ids
+ if not unique_ids:
+ return
+ unique_ids = list(unique_ids)
+ yield from super().iter_agents(unique_id=unique_ids, **kwargs)
+
+ def subgraph(self, center=True, **kwargs):
+ include = [self] if center else []
+ G = self.G.subgraph(
+ n.node_id for n in list(self.get_agents(**kwargs) + include)
+ )
+ return G
+
+ def remove_node(self):
+ print(f"Removing node for {self.unique_id}: {self.node_id}")
+ self.G.remove_node(self.node_id)
+ self.node_id = None
+
+ def add_edge(self, other, edge_attr_dict=None, *edge_attrs):
+ if self.node_id not in self.G.nodes(data=False):
+ raise ValueError(
+ "{} not in list of existing agents in the network".format(
+ self.unique_id
+ )
+ )
+ if other.node_id not in self.G.nodes(data=False):
+ raise ValueError(
+ "{} not in list of existing agents in the network".format(other)
+ )
+
+ self.G.add_edge(
+ self.node_id, other.node_id, edge_attr_dict=edge_attr_dict, *edge_attrs
+ )
+
+ def die(self, remove=True):
+ if not self.alive:
+ return None
+ if remove:
+ self.remove_node()
+ return super().die()
diff --git a/tests/test_agents.py b/tests/test_agents.py
index 4006e9d..35526e3 100644
--- a/tests/test_agents.py
+++ b/tests/test_agents.py
@@ -45,3 +45,17 @@ class TestMain(TestCase):
for i in range(5):
t = g.step()
assert t == i
+
+ def test_state_decorator(self):
+ class MyAgent(agents.FSM):
+ run = 0
+ @agents.default_state
+ @agents.state('original')
+ def root(self):
+ self.run += 1
+ e = environment.Environment()
+ a = MyAgent(model=e, unique_id=e.next_id())
+ a.step()
+ assert a.run == 1
+ a.step()
+ assert a.run == 2
diff --git a/tests/test_main.py b/tests/test_main.py
index f2004ad..8f4f97c 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -160,32 +160,12 @@ class TestMain(TestCase):
def test_serialize_agent_class(self):
"""A class from soil.agents should be serialized without the module part"""
- ser = agents.serialize_type(CustomAgent)
+ ser = agents._serialize_type(CustomAgent)
assert ser == "test_main.CustomAgent"
- ser = agents.serialize_type(agents.BaseAgent)
+ ser = agents._serialize_type(agents.BaseAgent)
assert ser == "BaseAgent"
pickle.dumps(ser)
- def test_deserialize_agent_distribution(self):
- agent_distro = [
- {"agent_class": "CounterModel", "weight": 1},
- {"agent_class": "test_main.CustomAgent", "weight": 2},
- ]
- converted = agents.deserialize_definition(agent_distro)
- assert converted[0]["agent_class"] == agents.CounterModel
- assert converted[1]["agent_class"] == CustomAgent
- pickle.dumps(converted)
-
- def test_serialize_agent_distribution(self):
- agent_distro = [
- {"agent_class": agents.CounterModel, "weight": 1},
- {"agent_class": CustomAgent, "weight": 2},
- ]
- converted = agents.serialize_definition(agent_distro)
- assert converted[0]["agent_class"] == "CounterModel"
- assert converted[1]["agent_class"] == "test_main.CustomAgent"
- pickle.dumps(converted)
-
def test_templates(self):
"""Loading a template should result in several configs"""
configs = serialization.load_file(join(EXAMPLES, "template.yml"))
From 159c9a90779ae915400b1940d4eefd1fdcb6b5d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Tue, 18 Oct 2022 13:11:01 +0200
Subject: [PATCH 17/39] Add events
---
examples/events_and_messages/cars.py | 141 +++++++++++++++++++++++++++
soil/__init__.py | 47 +++++----
soil/agents/__init__.py | 23 ++++-
soil/agents/evented.py | 57 +++++++++++
soil/agents/fsm.py | 15 ++-
soil/debugging.py | 4 +-
soil/environment.py | 18 ++--
soil/events.py | 43 ++++++++
soil/simulation.py | 2 +-
soil/time.py | 20 +++-
tests/test_agents.py | 16 ++-
11 files changed, 342 insertions(+), 44 deletions(-)
create mode 100644 examples/events_and_messages/cars.py
create mode 100644 soil/agents/evented.py
create mode 100644 soil/events.py
diff --git a/examples/events_and_messages/cars.py b/examples/events_and_messages/cars.py
new file mode 100644
index 0000000..ecb5b17
--- /dev/null
+++ b/examples/events_and_messages/cars.py
@@ -0,0 +1,141 @@
+from __future__ import annotations
+from soil import *
+from soil import events
+from mesa.space import MultiGrid
+from enum import Enum
+
+
+@dataclass
+class Journey:
+ origin: (int, int)
+ destination: (int, int)
+ tip: float
+
+ passenger: Passenger = None
+ driver: Driver = None
+
+
+class City(EventedEnvironment):
+ def __init__(self, *args, n_cars=1, height=100, width=100, n_passengers=10, agents=None, **kwargs):
+ self.grid = MultiGrid(width=width, height=height, torus=False)
+ if agents is None:
+ agents = []
+ for i in range(n_cars):
+ agents.append({'agent_class': Driver})
+ for i in range(n_passengers):
+ agents.append({'agent_class': Passenger})
+ super().__init__(*args, agents=agents, **kwargs)
+ for agent in self.agents:
+ self.grid.place_agent(agent, (0, 0))
+ self.grid.move_to_empty(agent)
+
+class Driver(Evented, FSM):
+ pos = None
+ journey = None
+ earnings = 0
+
+ def on_receive(self, msg, sender):
+ if self.journey is None and isinstance(msg, Journey) and msg.driver is None:
+ msg.driver = self
+ self.journey = msg
+
+ @default_state
+ @state
+ def wandering(self):
+ target = None
+ self.check_passengers()
+ self.journey = None
+ while self.journey is None:
+ if target is None or not self.move_towards(target):
+ target = self.random.choice(self.model.grid.get_neighborhood(self.pos, moore=False))
+ self.check_passengers()
+ self.check_messages() # This will call on_receive behind the scenes
+ yield Delta(30)
+ try:
+ self.journey = yield self.journey.passenger.ask(self.journey, timeout=60)
+ except events.TimedOut:
+ self.journey = None
+ return
+ return self.driving
+
+ def check_passengers(self):
+ c = self.count_agents(agent_class=Passenger)
+ self.info(f"Passengers left {c}")
+ if not c:
+ self.die()
+
+ @state
+ def driving(self):
+ #Approaching
+ while self.move_towards(self.journey.origin):
+ yield
+ while self.move_towards(self.journey.destination, with_passenger=True):
+ yield
+ self.check_passengers()
+ return self.wandering
+
+ def move_towards(self, target, with_passenger=False):
+ '''Move one cell at a time towards a target'''
+ self.info(f"Moving { self.pos } -> { target }")
+ if target[0] == self.pos[0] and target[1] == self.pos[1]:
+ return False
+
+ next_pos = [self.pos[0], self.pos[1]]
+ for idx in [0, 1]:
+ if self.pos[idx] < target[idx]:
+ next_pos[idx] += 1
+ break
+ if self.pos[idx] > target[idx]:
+ next_pos[idx] -= 1
+ break
+ self.model.grid.move_agent(self, tuple(next_pos))
+ if with_passenger:
+ self.journey.passenger.pos = self.pos # This could be communicated through messages
+ return True
+
+
+class Passenger(Evented, FSM):
+ pos = None
+
+ @default_state
+ @state
+ def asking(self):
+ destination = (self.random.randint(0, self.model.grid.height), self.random.randint(0, self.model.grid.width))
+ self.journey = None
+ journey = Journey(origin=self.pos,
+ destination=destination,
+ tip=self.random.randint(10, 100),
+ passenger=self)
+
+ timeout = 60
+ expiration = self.now + timeout
+ self.model.broadcast(journey, ttl=timeout, sender=self, agent_class=Driver)
+ while not self.journey:
+ self.info(f"Passenger at: { self.pos }. Checking for responses.")
+ try:
+ yield self.received(expiration=expiration)
+ except events.TimedOut:
+ self.info(f"Passenger at: { self.pos }. Asking for journey.")
+ self.model.broadcast(journey, ttl=timeout, sender=self, agent_class=Driver)
+ expiration = self.now + timeout
+ self.check_messages()
+ return self.driving_home
+
+ def on_receive(self, msg, sender):
+ if isinstance(msg, Journey):
+ self.journey = msg
+ return msg
+
+ @state
+ def driving_home(self):
+ while self.pos[0] != self.journey.destination[0] or self.pos[1] != self.journey.destination[1]:
+ yield self.received(timeout=60)
+ self.info("Got home safe!")
+ self.die()
+
+
+simulation = Simulation(model_class=City, model_params={'n_passengers': 2})
+
+if __name__ == "__main__":
+ with easy(simulation) as s:
+ s.run()
diff --git a/soil/__init__.py b/soil/__init__.py
index 92bc79f..b6b62ee 100644
--- a/soil/__init__.py
+++ b/soil/__init__.py
@@ -17,7 +17,7 @@ except NameError:
from .agents import *
from . import agents
from .simulation import *
-from .environment import Environment
+from .environment import Environment, EventedEnvironment
from . import serialization
from .utils import logger
from .time import *
@@ -34,6 +34,9 @@ def main(
pdb=False,
**kwargs,
):
+
+ if isinstance(cfg, Simulation):
+ sim = cfg
import argparse
from . import simulation
@@ -44,7 +47,7 @@ def main(
"file",
type=str,
nargs="?",
- default=cfg,
+ default=cfg if sim is None else '',
help="Configuration file for the simulation (e.g., YAML or JSON)",
)
parser.add_argument(
@@ -150,7 +153,7 @@ def main(
if output is None:
output = args.output
- logger.info("Loading config file: {}".format(args.file))
+
debug = debug or args.debug
@@ -162,19 +165,27 @@ def main(
try:
exp_params = {}
- if not os.path.exists(args.file):
- logger.error("Please, input a valid file")
- return
+ if sim:
+ logger.info("Loading simulation instance")
+ sims = [sim, ]
+ else:
+ logger.info("Loading config file: {}".format(args.file))
+ if not os.path.exists(args.file):
+ logger.error("Please, input a valid file")
+ return
+
+ sims = list(simulation.iter_from_config(
+ args.file,
+ dry_run=args.dry_run,
+ exporters=exporters,
+ parallel=parallel,
+ outdir=output,
+ exporter_params=exp_params,
+ **kwargs,
+ ))
+
+ for sim in sims:
- for sim in simulation.iter_from_config(
- args.file,
- dry_run=args.dry_run,
- exporters=exporters,
- parallel=parallel,
- outdir=output,
- exporter_params=exp_params,
- **kwargs,
- ):
if args.set:
for s in args.set:
k, v = s.split("=", 1)[:2]
@@ -219,7 +230,6 @@ def main(
@contextmanager
def easy(cfg, pdb=False, debug=False, **kwargs):
- ex = None
try:
yield main(cfg, **kwargs)[0]
except Exception as e:
@@ -228,10 +238,7 @@ def easy(cfg, pdb=False, debug=False, **kwargs):
print(traceback.format_exc())
post_mortem()
- ex = e
- finally:
- if ex:
- raise ex
+ raise
if __name__ == "__main__":
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index 9b5736b..c13999f 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -40,23 +40,31 @@ class MetaAgent(ABCMeta):
new_nmspc = {
"_defaults": defaults,
+ "_last_return": None,
+ "_last_except": None,
}
for attr, func in namespace.items():
if attr == "step" and inspect.isgeneratorfunction(func):
orig_func = func
- new_nmspc["_MetaAgent__coroutine"] = None
+ new_nmspc["_coroutine"] = None
@wraps(func)
def func(self):
while True:
- if not self.__coroutine:
- self.__coroutine = orig_func(self)
+ if not self._coroutine:
+ self._coroutine = orig_func(self)
try:
- return next(self.__coroutine)
+ if self._last_except:
+ return self._coroutine.throw(self._last_except)
+ else:
+ return self._coroutine.send(self._last_return)
except StopIteration as ex:
- self.__coroutine = None
+ self._coroutine = None
return ex.value
+ finally:
+ self._last_return = None
+ self._last_except = None
func.id = name or func.__name__
func.is_default = False
@@ -190,6 +198,10 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
def die(self):
self.info(f"agent dying")
self.alive = False
+ try:
+ self.model.schedule.remove(self)
+ except KeyError:
+ pass
return time.NEVER
def step(self):
@@ -617,6 +629,7 @@ def _from_distro(
from .network_agents import *
from .fsm import *
+from .evented import *
from .BassModel import *
from .BigMarketModel import *
from .IndependentCascadeModel import *
diff --git a/soil/agents/evented.py b/soil/agents/evented.py
new file mode 100644
index 0000000..451b570
--- /dev/null
+++ b/soil/agents/evented.py
@@ -0,0 +1,57 @@
+from . import BaseAgent
+from ..events import Message, Tell, Ask, Reply, TimedOut
+from ..time import Cond
+from functools import partial
+from collections import deque
+
+
+class Evented(BaseAgent):
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self._inbox = deque()
+ self._received = 0
+ self._processed = 0
+
+
+ def on_receive(self, *args, **kwargs):
+ pass
+
+ def received(self, expiration=None, timeout=None):
+ current = self._received
+ if expiration is None:
+ expiration = float('inf') if timeout is None else self.now + timeout
+
+ if expiration < self.now:
+ raise ValueError("Invalid expiration time")
+
+ def ready(agent):
+ return agent._received > current or agent.now >= expiration
+
+ def value(agent):
+ if agent.now > expiration:
+ raise TimedOut("No message received")
+
+ c = Cond(func=ready, return_func=value)
+ c._checked = True
+ return c
+
+ def tell(self, msg, sender):
+ self._received += 1
+ self._inbox.append(Tell(payload=msg, sender=sender))
+
+ def ask(self, msg, timeout=None):
+ self._received += 1
+ ask = Ask(payload=msg)
+ self._inbox.append(ask)
+ expiration = float('inf') if timeout is None else self.now + timeout
+ return ask.replied(expiration=expiration)
+
+ def check_messages(self):
+ while self._inbox:
+ msg = self._inbox.popleft()
+ self._processed += 1
+ if msg.expired(self.now):
+ continue
+ reply = self.on_receive(msg.payload, sender=msg.sender)
+ if isinstance(msg, Ask):
+ msg.reply = reply
diff --git a/soil/agents/fsm.py b/soil/agents/fsm.py
index 729313d..4b64364 100644
--- a/soil/agents/fsm.py
+++ b/soil/agents/fsm.py
@@ -1,6 +1,6 @@
from . import MetaAgent, BaseAgent
-from functools import partial
+from functools import partial, wraps
import inspect
@@ -19,17 +19,26 @@ def state(name=None):
while True:
if not self._coroutine:
self._coroutine = orig_func(self)
+
try:
- n = next(self._coroutine)
+ if self._last_except:
+ n = self._coroutine.throw(self._last_except)
+ else:
+ n = self._coroutine.send(self._last_return)
if n:
return None, n
- return
+ return n
except StopIteration as ex:
self._coroutine = None
next_state = ex.value
if next_state is not None:
self._set_state(next_state)
return next_state
+ finally:
+ self._last_return = None
+ self._last_except = None
+
+
func.id = name or func.__name__
func.is_default = False
diff --git a/soil/debugging.py b/soil/debugging.py
index f5a43e7..4344df0 100644
--- a/soil/debugging.py
+++ b/soil/debugging.py
@@ -30,9 +30,9 @@ def wrapcmd(func):
class Debug(pdb.Pdb):
def __init__(self, *args, skip_soil=False, **kwargs):
skip = kwargs.get("skip", [])
- skip.append("soil")
- skip.append("contextlib")
if skip_soil:
+ skip.append("soil")
+ skip.append("contextlib")
skip.append("soil.*")
skip.append("mesa.*")
super(Debug, self).__init__(*args, skip=skip, **kwargs)
diff --git a/soil/environment.py b/soil/environment.py
index 8245ca0..926f26f 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -3,7 +3,6 @@ from __future__ import annotations
import os
import sqlite3
import math
-import random
import logging
import inspect
@@ -19,7 +18,7 @@ import networkx as nx
from mesa import Model
from mesa.datacollection import DataCollector
-from . import agents as agentmod, config, serialization, utils, time, network
+from . import agents as agentmod, config, serialization, utils, time, network, events
class BaseEnvironment(Model):
@@ -294,10 +293,6 @@ class NetworkEnvironment(BaseEnvironment):
def add_agent(self, *args, **kwargs):
a = super().add_agent(*args, **kwargs)
if "node_id" in a:
- if a.node_id == 24:
- import pdb
-
- pdb.set_trace()
assert self.G.nodes[a.node_id]["agent"] == a
return a
@@ -316,3 +311,14 @@ class NetworkEnvironment(BaseEnvironment):
Environment = NetworkEnvironment
+
+
+class EventedEnvironment(Environment):
+ def broadcast(self, msg, sender, expiration=None, ttl=None, **kwargs):
+ for agent in self.agents(**kwargs):
+ self.logger.info(f'Telling {repr(agent)}: {msg} ttl={ttl}')
+ try:
+ agent._inbox.append(events.Tell(payload=msg, sender=sender, expiration=expiration if ttl is None else self.now+ttl))
+ except AttributeError:
+ self.info(f'Agent {agent.unique_id} cannot receive events')
+
diff --git a/soil/events.py b/soil/events.py
new file mode 100644
index 0000000..3bc50eb
--- /dev/null
+++ b/soil/events.py
@@ -0,0 +1,43 @@
+from .time import Cond
+from dataclasses import dataclass, field
+from typing import Any
+from uuid import uuid4
+
+class Event:
+ pass
+
+@dataclass
+class Message:
+ payload: Any
+ sender: Any = None
+ expiration: float = None
+ id: int = field(default_factory=uuid4)
+
+ def expired(self, when):
+ return self.expiration is not None and self.expiration < when
+
+class Reply(Message):
+ source: Message
+
+
+class Ask(Message):
+ reply: Message = None
+
+ def replied(self, expiration=None):
+ def ready(agent):
+ return self.reply is not None or agent.now > expiration
+
+ def value(agent):
+ if agent.now > expiration:
+ raise TimedOut(f'No answer received for {self}')
+ return self.reply
+
+ return Cond(func=ready, return_func=value)
+
+
+class Tell(Message):
+ pass
+
+
+class TimedOut(Exception):
+ pass
diff --git a/soil/simulation.py b/soil/simulation.py
index f5738d4..5746e67 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -47,7 +47,7 @@ class Simulation:
max_time: float = float("inf")
max_steps: int = -1
interval: int = 1
- num_trials: int = 3
+ num_trials: int = 1
parallel: Optional[bool] = None
exporters: Optional[List[str]] = field(default_factory=list)
outdir: Optional[str] = None
diff --git a/soil/time.py b/soil/time.py
index e7acbac..ec1dc02 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -45,12 +45,16 @@ class When:
def ready(self, agent):
return self._time <= agent.model.schedule.time
+ def return_value(self, agent):
+ return None
+
class Cond(When):
- def __init__(self, func, delta=1):
+ def __init__(self, func, delta=1, return_func=lambda agent: None):
self._func = func
self._delta = delta
self._checked = False
+ self._return_func = return_func
def next(self, time):
if self._checked:
@@ -64,6 +68,9 @@ class Cond(When):
self._checked = True
return self._func(agent)
+ def return_value(self, agent):
+ return self._return_func(agent)
+
def __eq__(self, other):
return False
@@ -144,14 +151,21 @@ class TimedActivation(BaseScheduler):
ix = 0
+ self.logger.debug(f"Queue length: {len(self._queue)}")
+
while self._queue:
(when, agent) = self._queue[0]
if when > self.time:
break
heappop(self._queue)
if when.ready(agent):
- to_process.append(agent)
+ try:
+ agent._last_return = when.return_value(agent)
+ except Exception as ex:
+ agent._last_except = ex
+
self._next.pop(agent.unique_id, None)
+ to_process.append(agent)
continue
next_time = min(next_time, when.next(self.time))
@@ -175,10 +189,10 @@ class TimedActivation(BaseScheduler):
continue
if not getattr(agent, "alive", True):
- self.remove(agent)
continue
value = returned.next(self.time)
+ agent._last_return = value
if value < self.time:
raise Exception(
diff --git a/tests/test_agents.py b/tests/test_agents.py
index 35526e3..c6a603e 100644
--- a/tests/test_agents.py
+++ b/tests/test_agents.py
@@ -33,18 +33,20 @@ class TestMain(TestCase):
The step function of an agent could be a generator. In that case, the state of the
agent will be resumed after every call to step.
'''
+ a = 0
class Gen(agents.BaseAgent):
def step(self):
- a = 0
+ nonlocal a
for i in range(5):
- yield a
+ yield
a += 1
e = environment.Environment()
g = Gen(model=e, unique_id=e.next_id())
+ e.schedule.add(g)
for i in range(5):
- t = g.step()
- assert t == i
+ e.step()
+ assert a == i
def test_state_decorator(self):
class MyAgent(agents.FSM):
@@ -53,6 +55,12 @@ class TestMain(TestCase):
@agents.state('original')
def root(self):
self.run += 1
+ return self.other
+
+ @agents.state
+ def other(self):
+ self.run += 1
+
e = environment.Environment()
a = MyAgent(model=e, unique_id=e.next_id())
a.step()
From 5fcf610108b36283e38712156d9b05e04c9cc0d8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Tue, 18 Oct 2022 15:02:05 +0200
Subject: [PATCH 18/39] Version 0.30.0rc1
---
soil/VERSION | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/soil/VERSION b/soil/VERSION
index f8d54d4..a87e255 100644
--- a/soil/VERSION
+++ b/soil/VERSION
@@ -1 +1 @@
-0.20.7
\ No newline at end of file
+0.30.0rc1
\ No newline at end of file
From a2fb25c160cb2a0b252ad44d4b07bd970b58dfcc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Tue, 18 Oct 2022 17:00:34 +0200
Subject: [PATCH 19/39] Version 0.30.0rc2
* Fix CLI arguments not being used when easy is passed a simulation instance
* Docs for `examples/events_and_messages/cars.py`
---
CHANGELOG.md | 2 +-
examples/events_and_messages/README.md | 7 ++
examples/events_and_messages/cars.py | 124 +++++++++++++++++++------
soil/VERSION | 2 +-
soil/__init__.py | 8 +-
5 files changed, 108 insertions(+), 35 deletions(-)
create mode 100644 examples/events_and_messages/README.md
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0ca9fc3..1d17271 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## [0.3 UNRELEASED]
+## [0.30 UNRELEASED]
### Added
* Simple debugging capabilities in `soil.debugging`, with a custom `pdb.Debugger` subclass that exposes commands to list agents and their status and set breakpoints on states (for FSM agents). Try it with `soil --debug `
* Ability to run
diff --git a/examples/events_and_messages/README.md b/examples/events_and_messages/README.md
new file mode 100644
index 0000000..c5b77df
--- /dev/null
+++ b/examples/events_and_messages/README.md
@@ -0,0 +1,7 @@
+This example can be run like with command-line options, like this:
+
+```bash
+python cars.py --level DEBUG -e summary --csv
+```
+
+This will set the `CSV` (save the agent and model data to a CSV) and `summary` (print the a summary of the data to stdout) exporters, and set the log level to DEBUG.
diff --git a/examples/events_and_messages/cars.py b/examples/events_and_messages/cars.py
index ecb5b17..e4fed18 100644
--- a/examples/events_and_messages/cars.py
+++ b/examples/events_and_messages/cars.py
@@ -1,22 +1,63 @@
+"""
+This is an example of a simplified city, where there are Passengers and Drivers that can take those passengers
+from their location to their desired location.
+
+An example scenario could play like the following:
+
+- Drivers start in the `wandering` state, where they wander around the city until they have been assigned a journey
+- Passenger(1) tells every driver that it wants to request a Journey.
+- Each driver receives the request.
+ If Driver(2) is interested in providing the Journey, it asks Passenger(1) to confirm that it accepts Driver(2)'s request
+- When Passenger(1) accepts the request, two things happen:
+ - Passenger(1) changes its state to `driving_home`
+ - Driver(2) starts moving towards the origin of the Journey
+- Once Driver(2) reaches the origin, it starts moving itself and Passenger(1) to the destination of the Journey
+- When Driver(2) reaches the destination (carrying Passenger(1) along):
+ - Driver(2) starts wondering again
+ - Passenger(1) dies, and is removed from the simulation
+- If there are no more passengers available in the simulation, Drivers die
+"""
from __future__ import annotations
from soil import *
from soil import events
from mesa.space import MultiGrid
-from enum import Enum
+# More complex scenarios may use more than one type of message between objects.
+# A common pattern is to use `enum.Enum` to represent state changes in a request.
@dataclass
class Journey:
+ """
+ This represents a request for a journey. Passengers and drivers exchange this object.
+
+ A journey may have a driver assigned or not. If the driver has not been assigned, this
+ object is considered a "request for a journey".
+ """
origin: (int, int)
destination: (int, int)
tip: float
- passenger: Passenger = None
+ passenger: Passenger
driver: Driver = None
class City(EventedEnvironment):
- def __init__(self, *args, n_cars=1, height=100, width=100, n_passengers=10, agents=None, **kwargs):
+ """
+ An environment with a grid where drivers and passengers will be placed.
+
+ The number of drivers and riders is configurable through its parameters:
+
+ :param str n_cars: The total number of drivers to add
+ :param str n_passengers: The number of passengers in the simulation
+ :param list agents: Specific agents to use in the simulation. It overrides the `n_passengers`
+ and `n_cars` params.
+ :param int height: Height of the internal grid
+ :param int width: Width of the internal grid
+ """
+ def __init__(self, *args, n_cars=1, n_passengers=10,
+ height=100, width=100, agents=None,
+ model_reporters=None,
+ **kwargs):
self.grid = MultiGrid(width=width, height=height, torus=False)
if agents is None:
agents = []
@@ -24,53 +65,73 @@ class City(EventedEnvironment):
agents.append({'agent_class': Driver})
for i in range(n_passengers):
agents.append({'agent_class': Passenger})
- super().__init__(*args, agents=agents, **kwargs)
+ model_reporters = model_reporters or {'earnings': 'total_earnings', 'n_passengers': 'number_passengers'}
+ print('REPORTERS', model_reporters)
+ super().__init__(*args, agents=agents, model_reporters=model_reporters, **kwargs)
for agent in self.agents:
self.grid.place_agent(agent, (0, 0))
self.grid.move_to_empty(agent)
+ @property
+ def total_earnings(self):
+ return sum(d.earnings for d in self.agents(agent_class=Driver))
+
+ @property
+ def number_passengers(self):
+ return self.count_agents(agent_class=Passenger)
+
+
class Driver(Evented, FSM):
pos = None
journey = None
earnings = 0
def on_receive(self, msg, sender):
+ '''This is not a state. It will run (and block) every time check_messages is invoked'''
if self.journey is None and isinstance(msg, Journey) and msg.driver is None:
msg.driver = self
self.journey = msg
- @default_state
- @state
- def wandering(self):
- target = None
- self.check_passengers()
- self.journey = None
- while self.journey is None:
- if target is None or not self.move_towards(target):
- target = self.random.choice(self.model.grid.get_neighborhood(self.pos, moore=False))
- self.check_passengers()
- self.check_messages() # This will call on_receive behind the scenes
- yield Delta(30)
- try:
- self.journey = yield self.journey.passenger.ask(self.journey, timeout=60)
- except events.TimedOut:
- self.journey = None
- return
- return self.driving
-
def check_passengers(self):
+ '''If there are no more passengers, stop forever'''
c = self.count_agents(agent_class=Passenger)
self.info(f"Passengers left {c}")
if not c:
self.die()
+ @default_state
+ @state
+ def wandering(self):
+ '''Move around the city until a journey is accepted'''
+ target = None
+ self.check_passengers()
+ self.journey = None
+ while self.journey is None: # No potential journeys detected (see on_receive)
+ if target is None or not self.move_towards(target):
+ target = self.random.choice(self.model.grid.get_neighborhood(self.pos, moore=False))
+
+ self.check_passengers()
+ self.check_messages() # This will call on_receive behind the scenes, and the agent's status will be updated
+ yield Delta(30) # Wait at least 30 seconds before checking again
+
+ try:
+ # Re-send the journey to the passenger, to confirm that we have been selected
+ self.journey = yield self.journey.passenger.ask(self.journey, timeout=60)
+ except events.TimedOut:
+ # No journey has been accepted. Try again
+ self.journey = None
+ return
+
+ return self.driving
+
@state
def driving(self):
- #Approaching
+ '''The journey has been accepted. Pick them up and take them to their destination'''
while self.move_towards(self.journey.origin):
yield
while self.move_towards(self.journey.destination, with_passenger=True):
yield
+ self.earnings += self.journey.tip
self.check_passengers()
return self.wandering
@@ -97,6 +158,14 @@ class Driver(Evented, FSM):
class Passenger(Evented, FSM):
pos = None
+ def on_receive(self, msg, sender):
+ '''This is not a state. It will be run synchronously every time `check_messages` is run'''
+
+ if isinstance(msg, Journey):
+ self.journey = msg
+ return msg
+
+
@default_state
@state
def asking(self):
@@ -121,11 +190,6 @@ class Passenger(Evented, FSM):
self.check_messages()
return self.driving_home
- def on_receive(self, msg, sender):
- if isinstance(msg, Journey):
- self.journey = msg
- return msg
-
@state
def driving_home(self):
while self.pos[0] != self.journey.destination[0] or self.pos[1] != self.journey.destination[1]:
@@ -134,7 +198,7 @@ class Passenger(Evented, FSM):
self.die()
-simulation = Simulation(model_class=City, model_params={'n_passengers': 2})
+simulation = Simulation(name='RideHailing', model_class=City, model_params={'n_passengers': 2})
if __name__ == "__main__":
with easy(simulation) as s:
diff --git a/soil/VERSION b/soil/VERSION
index a87e255..129bfad 100644
--- a/soil/VERSION
+++ b/soil/VERSION
@@ -1 +1 @@
-0.30.0rc1
\ No newline at end of file
+0.30.0rc2
\ No newline at end of file
diff --git a/soil/__init__.py b/soil/__init__.py
index b6b62ee..6382d29 100644
--- a/soil/__init__.py
+++ b/soil/__init__.py
@@ -153,8 +153,6 @@ def main(
if output is None:
output = args.output
-
-
debug = debug or args.debug
if args.pdb or debug:
@@ -167,6 +165,10 @@ def main(
if sim:
logger.info("Loading simulation instance")
+ sim.dry_run = args.dry_run
+ sim.exporters = exporters
+ sim.parallel = parallel
+ sim.outdir = output
sims = [sim, ]
else:
logger.info("Loading config file: {}".format(args.file))
@@ -231,7 +233,7 @@ def main(
@contextmanager
def easy(cfg, pdb=False, debug=False, **kwargs):
try:
- yield main(cfg, **kwargs)[0]
+ yield main(cfg, debug=debug, pdb=pdb, **kwargs)[0]
except Exception as e:
if os.environ.get("SOIL_POSTMORTEM"):
from .debugging import post_mortem
From 2f5e5d0a74177d11f2a99add458ce191220fadae Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Tue, 18 Oct 2022 17:03:40 +0200
Subject: [PATCH 20/39] Black formatting
---
examples/events_and_messages/cars.py | 89 ++++++++++++++++++----------
1 file changed, 59 insertions(+), 30 deletions(-)
diff --git a/examples/events_and_messages/cars.py b/examples/events_and_messages/cars.py
index e4fed18..04d7894 100644
--- a/examples/events_and_messages/cars.py
+++ b/examples/events_and_messages/cars.py
@@ -28,11 +28,12 @@ from mesa.space import MultiGrid
@dataclass
class Journey:
"""
- This represents a request for a journey. Passengers and drivers exchange this object.
+ This represents a request for a journey. Passengers and drivers exchange this object.
A journey may have a driver assigned or not. If the driver has not been assigned, this
object is considered a "request for a journey".
"""
+
origin: (int, int)
destination: (int, int)
tip: float
@@ -54,20 +55,33 @@ class City(EventedEnvironment):
:param int height: Height of the internal grid
:param int width: Width of the internal grid
"""
- def __init__(self, *args, n_cars=1, n_passengers=10,
- height=100, width=100, agents=None,
- model_reporters=None,
- **kwargs):
+
+ def __init__(
+ self,
+ *args,
+ n_cars=1,
+ n_passengers=10,
+ height=100,
+ width=100,
+ agents=None,
+ model_reporters=None,
+ **kwargs,
+ ):
self.grid = MultiGrid(width=width, height=height, torus=False)
if agents is None:
agents = []
for i in range(n_cars):
- agents.append({'agent_class': Driver})
+ agents.append({"agent_class": Driver})
for i in range(n_passengers):
- agents.append({'agent_class': Passenger})
- model_reporters = model_reporters or {'earnings': 'total_earnings', 'n_passengers': 'number_passengers'}
- print('REPORTERS', model_reporters)
- super().__init__(*args, agents=agents, model_reporters=model_reporters, **kwargs)
+ agents.append({"agent_class": Passenger})
+ model_reporters = model_reporters or {
+ "earnings": "total_earnings",
+ "n_passengers": "number_passengers",
+ }
+ print("REPORTERS", model_reporters)
+ super().__init__(
+ *args, agents=agents, model_reporters=model_reporters, **kwargs
+ )
for agent in self.agents:
self.grid.place_agent(agent, (0, 0))
self.grid.move_to_empty(agent)
@@ -87,13 +101,13 @@ class Driver(Evented, FSM):
earnings = 0
def on_receive(self, msg, sender):
- '''This is not a state. It will run (and block) every time check_messages is invoked'''
+ """This is not a state. It will run (and block) every time check_messages is invoked"""
if self.journey is None and isinstance(msg, Journey) and msg.driver is None:
msg.driver = self
self.journey = msg
def check_passengers(self):
- '''If there are no more passengers, stop forever'''
+ """If there are no more passengers, stop forever"""
c = self.count_agents(agent_class=Passenger)
self.info(f"Passengers left {c}")
if not c:
@@ -102,17 +116,19 @@ class Driver(Evented, FSM):
@default_state
@state
def wandering(self):
- '''Move around the city until a journey is accepted'''
+ """Move around the city until a journey is accepted"""
target = None
self.check_passengers()
self.journey = None
while self.journey is None: # No potential journeys detected (see on_receive)
if target is None or not self.move_towards(target):
- target = self.random.choice(self.model.grid.get_neighborhood(self.pos, moore=False))
+ target = self.random.choice(
+ self.model.grid.get_neighborhood(self.pos, moore=False)
+ )
self.check_passengers()
- self.check_messages() # This will call on_receive behind the scenes, and the agent's status will be updated
- yield Delta(30) # Wait at least 30 seconds before checking again
+ self.check_messages() # This will call on_receive behind the scenes, and the agent's status will be updated
+ yield Delta(30) # Wait at least 30 seconds before checking again
try:
# Re-send the journey to the passenger, to confirm that we have been selected
@@ -126,7 +142,7 @@ class Driver(Evented, FSM):
@state
def driving(self):
- '''The journey has been accepted. Pick them up and take them to their destination'''
+ """The journey has been accepted. Pick them up and take them to their destination"""
while self.move_towards(self.journey.origin):
yield
while self.move_towards(self.journey.destination, with_passenger=True):
@@ -136,7 +152,7 @@ class Driver(Evented, FSM):
return self.wandering
def move_towards(self, target, with_passenger=False):
- '''Move one cell at a time towards a target'''
+ """Move one cell at a time towards a target"""
self.info(f"Moving { self.pos } -> { target }")
if target[0] == self.pos[0] and target[1] == self.pos[1]:
return False
@@ -151,30 +167,36 @@ class Driver(Evented, FSM):
break
self.model.grid.move_agent(self, tuple(next_pos))
if with_passenger:
- self.journey.passenger.pos = self.pos # This could be communicated through messages
+ self.journey.passenger.pos = (
+ self.pos
+ ) # This could be communicated through messages
return True
-
+
class Passenger(Evented, FSM):
pos = None
def on_receive(self, msg, sender):
- '''This is not a state. It will be run synchronously every time `check_messages` is run'''
+ """This is not a state. It will be run synchronously every time `check_messages` is run"""
if isinstance(msg, Journey):
self.journey = msg
return msg
-
@default_state
@state
def asking(self):
- destination = (self.random.randint(0, self.model.grid.height), self.random.randint(0, self.model.grid.width))
+ destination = (
+ self.random.randint(0, self.model.grid.height),
+ self.random.randint(0, self.model.grid.width),
+ )
self.journey = None
- journey = Journey(origin=self.pos,
- destination=destination,
- tip=self.random.randint(10, 100),
- passenger=self)
+ journey = Journey(
+ origin=self.pos,
+ destination=destination,
+ tip=self.random.randint(10, 100),
+ passenger=self,
+ )
timeout = 60
expiration = self.now + timeout
@@ -185,20 +207,27 @@ class Passenger(Evented, FSM):
yield self.received(expiration=expiration)
except events.TimedOut:
self.info(f"Passenger at: { self.pos }. Asking for journey.")
- self.model.broadcast(journey, ttl=timeout, sender=self, agent_class=Driver)
+ self.model.broadcast(
+ journey, ttl=timeout, sender=self, agent_class=Driver
+ )
expiration = self.now + timeout
self.check_messages()
return self.driving_home
@state
def driving_home(self):
- while self.pos[0] != self.journey.destination[0] or self.pos[1] != self.journey.destination[1]:
+ while (
+ self.pos[0] != self.journey.destination[0]
+ or self.pos[1] != self.journey.destination[1]
+ ):
yield self.received(timeout=60)
self.info("Got home safe!")
self.die()
-simulation = Simulation(name='RideHailing', model_class=City, model_params={'n_passengers': 2})
+simulation = Simulation(
+ name="RideHailing", model_class=City, model_params={"n_passengers": 2}
+)
if __name__ == "__main__":
with easy(simulation) as s:
From cbbaf735381cb0cebfafdd81ef779096938e4921 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Thu, 20 Oct 2022 12:07:56 +0200
Subject: [PATCH 21/39] Fix bug EventedEnvironment
---
soil/environment.py | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/soil/environment.py b/soil/environment.py
index 926f26f..3a48d30 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -318,7 +318,9 @@ class EventedEnvironment(Environment):
for agent in self.agents(**kwargs):
self.logger.info(f'Telling {repr(agent)}: {msg} ttl={ttl}')
try:
- agent._inbox.append(events.Tell(payload=msg, sender=sender, expiration=expiration if ttl is None else self.now+ttl))
+ inbox = agent._inbox
except AttributeError:
- self.info(f'Agent {agent.unique_id} cannot receive events')
+ self.logger.info(f'Agent {agent.unique_id} cannot receive events because it does not have an inbox')
+ continue
+ inbox.append(events.Tell(payload=msg, sender=sender, expiration=expiration if ttl is None else self.now+ttl))
From a1262edd2a54431e6e8a09711e8b274c42c7b05c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Thu, 20 Oct 2022 09:14:50 +0200
Subject: [PATCH 22/39] Refactored time
Treating time and conditions as the same entity was getting confusing, and it
added a lot of unnecessary abstraction in a critical part (the scheduler).
The scheduling queue now has the time as a floating number (faster), the agent
id (for ties) and the condition, as well as the agent. The first three
elements (time, id, condition) can be considered as the "key" for the event.
To allow for agent execution to be "randomized" within every step, a new
parameter has been added to the scheduler, which makes it add a random number to
the key in order to change the ordering.
`EventedAgent.received` now checks the messages before returning control to the
user by default.
---
examples/events_and_messages/cars.py | 12 +-
examples/rabbits/basic/rabbit_agents.py | 2 +-
soil/agents/__init__.py | 20 +--
soil/agents/evented.py | 73 +++++---
soil/agents/network_agents.py | 4 +-
soil/environment.py | 13 +-
soil/events.py | 30 ++--
soil/network.py | 1 -
soil/serialization.py | 2 -
soil/simulation.py | 2 +-
soil/time.py | 219 +++++++++++-------------
tests/test_agents.py | 98 ++++++++++-
tests/test_examples.py | 2 +
tests/test_main.py | 30 ++--
tests/test_network.py | 4 +-
tests/test_time.py | 35 ++--
16 files changed, 324 insertions(+), 223 deletions(-)
diff --git a/examples/events_and_messages/cars.py b/examples/events_and_messages/cars.py
index 04d7894..c612f70 100644
--- a/examples/events_and_messages/cars.py
+++ b/examples/events_and_messages/cars.py
@@ -127,7 +127,8 @@ class Driver(Evented, FSM):
)
self.check_passengers()
- self.check_messages() # This will call on_receive behind the scenes, and the agent's status will be updated
+ # This will call on_receive behind the scenes, and the agent's status will be updated
+ self.check_messages()
yield Delta(30) # Wait at least 30 seconds before checking again
try:
@@ -204,6 +205,8 @@ class Passenger(Evented, FSM):
while not self.journey:
self.info(f"Passenger at: { self.pos }. Checking for responses.")
try:
+ # This will call check_messages behind the scenes, and the agent's status will be updated
+ # If you want to avoid that, you can call it with: check=False
yield self.received(expiration=expiration)
except events.TimedOut:
self.info(f"Passenger at: { self.pos }. Asking for journey.")
@@ -211,7 +214,6 @@ class Passenger(Evented, FSM):
journey, ttl=timeout, sender=self, agent_class=Driver
)
expiration = self.now + timeout
- self.check_messages()
return self.driving_home
@state
@@ -220,7 +222,11 @@ class Passenger(Evented, FSM):
self.pos[0] != self.journey.destination[0]
or self.pos[1] != self.journey.destination[1]
):
- yield self.received(timeout=60)
+ try:
+ yield self.received(timeout=60)
+ except events.TimedOut:
+ pass
+
self.info("Got home safe!")
self.die()
diff --git a/examples/rabbits/basic/rabbit_agents.py b/examples/rabbits/basic/rabbit_agents.py
index b28d2e9..4c0981b 100644
--- a/examples/rabbits/basic/rabbit_agents.py
+++ b/examples/rabbits/basic/rabbit_agents.py
@@ -133,7 +133,7 @@ class RandomAccident(BaseAgent):
math.log10(max(1, rabbits_alive))
)
self.debug("Killing some rabbits with prob={}!".format(prob_death))
- for i in self.iter_agents(agent_class=Rabbit):
+ for i in self.get_agents(agent_class=Rabbit):
if i.state_id == i.dead.id:
continue
if self.prob(prob_death):
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index c13999f..a9c1fc3 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -20,12 +20,6 @@ from typing import Dict, List
from .. import serialization, utils, time, config
-def as_node(agent):
- if isinstance(agent, BaseAgent):
- return agent.id
- return agent
-
-
IGNORED_FIELDS = ("model", "logger")
@@ -97,10 +91,6 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
"""
def __init__(self, unique_id, model, name=None, interval=None, **kwargs):
- # Check for REQUIRED arguments
- # Initialize agent parameters
- if isinstance(unique_id, MesaAgent):
- raise Exception()
assert isinstance(unique_id, int)
super().__init__(unique_id=unique_id, model=model)
@@ -207,7 +197,8 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
def step(self):
if not self.alive:
raise time.DeadAgent(self.unique_id)
- return super().step() or time.Delta(self.interval)
+ super().step()
+ return time.Delta(self.interval)
def log(self, message, *args, level=logging.INFO, **kwargs):
if not self.logger.isEnabledFor(level):
@@ -270,6 +261,7 @@ def prob(prob, random):
return r < prob
+
def calculate_distribution(network_agents=None, agent_class=None):
"""
Calculate the threshold values (thresholds for a uniform distribution)
@@ -414,7 +406,7 @@ def filter_agents(
if ids:
f = (agents[aid] for aid in ids if aid in agents)
else:
- f = (a for a in agents.values())
+ f = agents.values()
if state_id is not None and not isinstance(state_id, (tuple, list)):
state_id = tuple([state_id])
@@ -638,6 +630,10 @@ from .SentimentCorrelationModel import *
from .SISaModel import *
from .CounterModel import *
+
+class Agent(NetworkAgent, EventedAgent):
+ '''Default agent class, has both network and event capabilities'''
+
try:
import scipy
from .Geo import Geo
diff --git a/soil/agents/evented.py b/soil/agents/evented.py
index 451b570..340c29a 100644
--- a/soil/agents/evented.py
+++ b/soil/agents/evented.py
@@ -1,57 +1,74 @@
from . import BaseAgent
-from ..events import Message, Tell, Ask, Reply, TimedOut
-from ..time import Cond
+from ..events import Message, Tell, Ask, TimedOut
+from ..time import BaseCond
from functools import partial
from collections import deque
-class Evented(BaseAgent):
+class ReceivedOrTimeout(BaseCond):
+ def __init__(self, agent, expiration=None, timeout=None, check=True, ignore=False, **kwargs):
+ if expiration is None:
+ if timeout is not None:
+ expiration = agent.now + timeout
+ self.expiration = expiration
+ self.ignore = ignore
+ self.check = check
+ super().__init__(**kwargs)
+
+ def expired(self, time):
+ return self.expiration and self.expiration < time
+
+ def ready(self, agent, time):
+ return len(agent._inbox) or self.expired(time)
+
+ def return_value(self, agent):
+ if not self.ignore and self.expired(agent.now):
+ raise TimedOut('No messages received')
+ if self.check:
+ agent.check_messages()
+ return None
+
+ def schedule_next(self, time, delta, first=False):
+ if self._delta is not None:
+ delta = self._delta
+ return (time + delta, self)
+
+ def __repr__(self):
+ return f'ReceivedOrTimeout(expires={self.expiration})'
+
+
+class EventedAgent(BaseAgent):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._inbox = deque()
- self._received = 0
self._processed = 0
-
def on_receive(self, *args, **kwargs):
pass
- def received(self, expiration=None, timeout=None):
- current = self._received
- if expiration is None:
- expiration = float('inf') if timeout is None else self.now + timeout
+ def received(self, *args, **kwargs):
+ return ReceivedOrTimeout(self, *args, **kwargs)
- if expiration < self.now:
- raise ValueError("Invalid expiration time")
-
- def ready(agent):
- return agent._received > current or agent.now >= expiration
-
- def value(agent):
- if agent.now > expiration:
- raise TimedOut("No message received")
-
- c = Cond(func=ready, return_func=value)
- c._checked = True
- return c
-
- def tell(self, msg, sender):
- self._received += 1
- self._inbox.append(Tell(payload=msg, sender=sender))
+ def tell(self, msg, sender=None):
+ self._inbox.append(Tell(timestamp=self.now, payload=msg, sender=sender))
def ask(self, msg, timeout=None):
- self._received += 1
- ask = Ask(payload=msg)
+ ask = Ask(timestamp=self.now, payload=msg)
self._inbox.append(ask)
expiration = float('inf') if timeout is None else self.now + timeout
return ask.replied(expiration=expiration)
def check_messages(self):
+ changed = False
while self._inbox:
msg = self._inbox.popleft()
self._processed += 1
if msg.expired(self.now):
continue
+ changed = True
reply = self.on_receive(msg.payload, sender=msg.sender)
if isinstance(msg, Ask):
msg.reply = reply
+ return changed
+
+Evented = EventedAgent
diff --git a/soil/agents/network_agents.py b/soil/agents/network_agents.py
index d9950cf..cd57943 100644
--- a/soil/agents/network_agents.py
+++ b/soil/agents/network_agents.py
@@ -54,7 +54,7 @@ class NetworkAgent(BaseAgent):
return G
def remove_node(self):
- print(f"Removing node for {self.unique_id}: {self.node_id}")
+ self.debug(f"Removing node for {self.unique_id}: {self.node_id}")
self.G.remove_node(self.node_id)
self.node_id = None
@@ -80,3 +80,5 @@ class NetworkAgent(BaseAgent):
if remove:
self.remove_node()
return super().die()
+
+NetAgent = NetworkAgent
diff --git a/soil/environment.py b/soil/environment.py
index 3a48d30..4be1625 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -310,17 +310,20 @@ class NetworkEnvironment(BaseEnvironment):
self.add_agent(node_id=node_id, agent_class=a_class, **agent_params)
-Environment = NetworkEnvironment
-
-
-class EventedEnvironment(Environment):
- def broadcast(self, msg, sender, expiration=None, ttl=None, **kwargs):
+class EventedEnvironment(BaseEnvironment):
+ def broadcast(self, msg, sender=None, expiration=None, ttl=None, **kwargs):
for agent in self.agents(**kwargs):
+ if agent == sender:
+ continue
self.logger.info(f'Telling {repr(agent)}: {msg} ttl={ttl}')
try:
inbox = agent._inbox
except AttributeError:
self.logger.info(f'Agent {agent.unique_id} cannot receive events because it does not have an inbox')
continue
+ # Allow for AttributeError exceptions in this part of the code
inbox.append(events.Tell(payload=msg, sender=sender, expiration=expiration if ttl is None else self.now+ttl))
+
+class Environment(NetworkEnvironment, EventedEnvironment):
+ '''Default environment class, has both network and event capabilities'''
diff --git a/soil/events.py b/soil/events.py
index 3bc50eb..25f471a 100644
--- a/soil/events.py
+++ b/soil/events.py
@@ -1,4 +1,4 @@
-from .time import Cond
+from .time import BaseCond
from dataclasses import dataclass, field
from typing import Any
from uuid import uuid4
@@ -11,6 +11,7 @@ class Message:
payload: Any
sender: Any = None
expiration: float = None
+ timestamp: float = None
id: int = field(default_factory=uuid4)
def expired(self, when):
@@ -20,19 +21,28 @@ class Reply(Message):
source: Message
+class ReplyCond(BaseCond):
+ def __init__(self, ask, *args, **kwargs):
+ self._ask = ask
+ super().__init__(*args, **kwargs)
+
+ def ready(self, agent, time):
+ return self._ask.reply is not None or self._ask.expired(time)
+
+ def return_value(self, agent):
+ if self._ask.expired(agent.now):
+ raise TimedOut()
+ return self._ask.reply
+
+ def __repr__(self):
+ return f"ReplyCond({self._ask.id})"
+
+
class Ask(Message):
reply: Message = None
def replied(self, expiration=None):
- def ready(agent):
- return self.reply is not None or agent.now > expiration
-
- def value(agent):
- if agent.now > expiration:
- raise TimedOut(f'No answer received for {self}')
- return self.reply
-
- return Cond(func=ready, return_func=value)
+ return ReplyCond(self)
class Tell(Message):
diff --git a/soil/network.py b/soil/network.py
index be7d96f..a717021 100644
--- a/soil/network.py
+++ b/soil/network.py
@@ -59,7 +59,6 @@ def find_unassigned(G, shuffle=False, random=random):
If node_id is None, a node without an agent_id will be found.
"""
- # TODO: test
candidates = list(G.nodes(data=True))
if shuffle:
random.shuffle(candidates)
diff --git a/soil/serialization.py b/soil/serialization.py
index f0a98df..cd34a02 100644
--- a/soil/serialization.py
+++ b/soil/serialization.py
@@ -221,8 +221,6 @@ def deserialize(type_, value=None, globs=None, **kwargs):
def deserialize_all(names, *args, known_modules=KNOWN_MODULES, **kwargs):
"""Return the list of deserialized objects"""
- # TODO: remove
- print("SERIALIZATION", kwargs)
objects = []
for name in names:
mod = deserialize(name, known_modules=known_modules)
diff --git a/soil/simulation.py b/soil/simulation.py
index 5746e67..75947de 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -66,7 +66,7 @@ class Simulation:
if ignored:
d.setdefault("extra", {}).update(ignored)
if ignored:
- print(f'Warning: Ignoring these parameters (added to "extra"): { ignored }')
+ logger.warning(f'Ignoring these parameters (added to "extra"): { ignored }')
d.update(kwargs)
return cls(**d)
diff --git a/soil/time.py b/soil/time.py
index ec1dc02..7e11201 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -1,10 +1,11 @@
from mesa.time import BaseScheduler
from queue import Empty
-from heapq import heappush, heappop, heapify
+from heapq import heappush, heappop
import math
from inspect import getsource
from numbers import Number
+from textwrap import dedent
from .utils import logger
from mesa import Agent as MesaAgent
@@ -23,65 +24,11 @@ class When:
return time
self._time = time
- def next(self, time):
+ def abs(self, time):
return self._time
- def abs(self, time):
- return self
-
- def __repr__(self):
- return str(f"When({self._time})")
-
- def __lt__(self, other):
- if isinstance(other, Number):
- return self._time < other
- return self._time < other.next(self._time)
-
- def __gt__(self, other):
- if isinstance(other, Number):
- return self._time > other
- return self._time > other.next(self._time)
-
- def ready(self, agent):
- return self._time <= agent.model.schedule.time
-
- def return_value(self, agent):
- return None
-
-
-class Cond(When):
- def __init__(self, func, delta=1, return_func=lambda agent: None):
- self._func = func
- self._delta = delta
- self._checked = False
- self._return_func = return_func
-
- def next(self, time):
- if self._checked:
- return time + self._delta
- return time
-
- def abs(self, time):
- return self
-
- def ready(self, agent):
- self._checked = True
- return self._func(agent)
-
- def return_value(self, agent):
- return self._return_func(agent)
-
- def __eq__(self, other):
- return False
-
- def __lt__(self, other):
- return True
-
- def __gt__(self, other):
- return False
-
- def __repr__(self):
- return str(f'Cond("{getsource(self._func)}")')
+ def schedule_next(self, time, delta, first=False):
+ return (self._time, None)
NEVER = When(INFINITY)
@@ -91,48 +38,94 @@ class Delta(When):
def __init__(self, delta):
self._delta = delta
+ def abs(self, time):
+ return self._time + self._delta
+
def __eq__(self, other):
if isinstance(other, Delta):
return self._delta == other._delta
return False
- def abs(self, time):
- return When(self._delta + time)
-
- def next(self, time):
- return time + self._delta
+ def schedule_next(self, time, delta, first=False):
+ return (time + self._delta, None)
def __repr__(self):
return str(f"Delta({self._delta})")
+class BaseCond:
+ def __init__(self, msg=None, delta=None, eager=False):
+ self._msg = msg
+ self._delta = delta
+ self.eager = eager
+
+ def schedule_next(self, time, delta, first=False):
+ if first and self.eager:
+ return (time, self)
+ if self._delta:
+ delta = self._delta
+ return (time + delta, self)
+
+ def return_value(self, agent):
+ return None
+
+ def __repr__(self):
+ return self._msg or self.__class__.__name__
+
+
+class Cond(BaseCond):
+ def __init__(self, func, *args, **kwargs):
+ self._func = func
+ super().__init__(*args, **kwargs)
+
+ def ready(self, agent, time):
+ return self._func(agent)
+
+ def __repr__(self):
+ if self._msg:
+ return self._msg
+ return str(f'Cond("{dedent(getsource(self._func)).strip()}")')
+
+
class TimedActivation(BaseScheduler):
"""A scheduler which activates each agent when the agent requests.
In each activation, each agent will update its 'next_time'.
"""
- def __init__(self, *args, **kwargs):
+ def __init__(self, *args, shuffle=True, **kwargs):
super().__init__(*args, **kwargs)
self._next = {}
self._queue = []
- self.next_time = 0
+ self._shuffle = shuffle
+ self.step_interval = 1
self.logger = logger.getChild(f"time_{ self.model }")
def add(self, agent: MesaAgent, when=None):
if when is None:
- when = When(self.time)
- elif not isinstance(when, When):
- when = When(when)
- if agent.unique_id in self._agents:
- del self._agents[agent.unique_id]
- if agent.unique_id in self._next:
- self._queue.remove((self._next[agent.unique_id], agent))
- heapify(self._queue)
-
- self._next[agent.unique_id] = when
- heappush(self._queue, (when, agent))
+ when = self.time
+ elif isinstance(when, When):
+ when = when.abs()
+
+ self._schedule(agent, None, when)
super().add(agent)
+ def _schedule(self, agent, condition=None, when=None):
+ if condition:
+ if not when:
+ when, condition = condition.schedule_next(when or self.time,
+ self.step_interval)
+ else:
+ if when is None:
+ when = self.time + self.step_interval
+ condition = None
+ if self._shuffle:
+ key = (when, self.model.random.random(), condition)
+ else:
+ key = (when, agent.unique_id, condition)
+ self._next[agent.unique_id] = key
+ heappush(self._queue, (key, agent))
+
+
def step(self) -> None:
"""
Executes agents in order, one at a time. After each step,
@@ -143,73 +136,59 @@ class TimedActivation(BaseScheduler):
if not self.model.running:
return
- when = NEVER
-
- to_process = []
- skipped = []
- next_time = INFINITY
-
- ix = 0
-
self.logger.debug(f"Queue length: {len(self._queue)}")
while self._queue:
- (when, agent) = self._queue[0]
+ ((when, _id, cond), agent) = self._queue[0]
if when > self.time:
break
+
heappop(self._queue)
- if when.ready(agent):
+ if cond:
+ if not cond.ready(agent, self.time):
+ self._schedule(agent, cond)
+ continue
try:
- agent._last_return = when.return_value(agent)
+ agent._last_return = cond.return_value(agent)
except Exception as ex:
agent._last_except = ex
+ else:
+ agent._last_return = None
+ agent._last_except = None
- self._next.pop(agent.unique_id, None)
- to_process.append(agent)
- continue
-
- next_time = min(next_time, when.next(self.time))
- self._next[agent.unique_id] = next_time
- skipped.append((when, agent))
-
- if self._queue:
- next_time = min(next_time, self._queue[0][0].next(self.time))
-
- self._queue = [*skipped, *self._queue]
-
- for agent in to_process:
self.logger.debug(f"Stepping agent {agent}")
+ self._next.pop(agent.unique_id, None)
try:
- returned = ((agent.step() or Delta(1))).abs(self.time)
+ returned = agent.step()
except DeadAgent:
- if agent.unique_id in self._next:
- del self._next[agent.unique_id]
agent.alive = False
continue
+ # Check status for MESA agents
if not getattr(agent, "alive", True):
continue
- value = returned.next(self.time)
- agent._last_return = value
-
- if value < self.time:
- raise Exception(
- f"Cannot schedule an agent for a time in the past ({when} < {self.time})"
- )
- if value < INFINITY:
- next_time = min(value, next_time)
-
- self._next[agent.unique_id] = returned
- heappush(self._queue, (returned, agent))
+ if returned:
+ next_check = returned.schedule_next(self.time, self.step_interval, first=True)
+ self._schedule(agent, when=next_check[0], condition=next_check[1])
else:
- assert not self._next[agent.unique_id]
+ next_check = (self.time + self.step_interval, None)
+
+ self._schedule(agent)
self.steps += 1
- self.logger.debug(f"Updating time step: {self.time} -> {next_time}")
- self.time = next_time
- if not self._queue or next_time == INFINITY:
+ if not self._queue:
+ self.time = INFINITY
self.model.running = False
return self.time
+
+ next_time = self._queue[0][0][0]
+ if next_time < self.time:
+ raise Exception(
+ f"An agent has been scheduled for a time in the past, there is probably an error ({when} < {self.time})"
+ )
+ self.logger.debug(f"Updating time step: {self.time} -> {next_time}")
+
+ self.time = next_time
diff --git a/tests/test_agents.py b/tests/test_agents.py
index c6a603e..a32d91a 100644
--- a/tests/test_agents.py
+++ b/tests/test_agents.py
@@ -12,12 +12,11 @@ class Dead(agents.FSM):
return self.die()
-class TestMain(TestCase):
+class TestAgents(TestCase):
def test_die_returns_infinity(self):
'''The last step of a dead agent should return time.INFINITY'''
d = Dead(unique_id=0, model=environment.Environment())
- ret = d.step().abs(0)
- print(ret, "next")
+ ret = d.step()
assert ret == stime.NEVER
def test_die_raises_exception(self):
@@ -66,4 +65,95 @@ class TestMain(TestCase):
a.step()
assert a.run == 1
a.step()
- assert a.run == 2
+
+
+ def test_broadcast(self):
+ '''
+ An agent should be able to broadcast messages to every other agent, AND each receiver should be able
+ to process it
+ '''
+ class BCast(agents.Evented):
+ pings_received = 0
+
+ def step(self):
+ print(self.model.broadcast)
+ try:
+ self.model.broadcast('PING')
+ except Exception as ex:
+ print(ex)
+ while True:
+ self.check_messages()
+ yield
+
+ def on_receive(self, msg, sender=None):
+ self.pings_received += 1
+
+ e = environment.EventedEnvironment()
+
+ for i in range(10):
+ e.add_agent(agent_class=BCast)
+ e.step()
+ pings_received = lambda: [a.pings_received for a in e.agents]
+ assert sorted(pings_received()) == list(range(1, 11))
+ e.step()
+ assert all(x==10 for x in pings_received())
+
+ def test_ask_messages(self):
+ '''
+ An agent should be able to ask another agent, and wait for a response.
+ '''
+
+ # #Results depend on ordering (agents are shuffled), so force the first agent
+ pings = []
+ pongs = []
+ responses = []
+
+ class Ping(agents.EventedAgent):
+ def step(self):
+ target_id = (self.unique_id + 1) % self.count_agents()
+ target = self.model.agents[target_id]
+ print('starting')
+ while True:
+ print('Pings: ', pings, responses or not pings, self.model.schedule._queue)
+ if pongs or not pings:
+ pings.append(self.now)
+ response = yield target.ask('PING')
+ responses.append(response)
+ else:
+ print('NOT sending ping')
+ print('Checking msgs')
+ # Do not advance until we have received a message.
+ # warning: it will wait at least until the next time in the simulation
+ yield self.received(check=True)
+ print('done')
+
+ def on_receive(self, msg, sender=None):
+ if msg == 'PING':
+ pongs.append(self.now)
+ return 'PONG'
+
+ e = environment.EventedEnvironment()
+ for i in range(2):
+ e.add_agent(agent_class=Ping)
+ assert e.now == 0
+
+ # There should be a delay of one step between agent 0 and 1
+ # On the first step:
+ # Agent 0 sends a PING, but blocks before a PONG
+ # Agent 1 sends a PONG, and blocks after its PING
+ # After that step, every agent can both receive (there are pending messages) and then send.
+
+ e.step()
+ assert e.now == 1
+ assert pings == [0]
+ assert pongs == []
+
+ e.step()
+ assert e.now == 2
+ assert pings == [0, 1]
+ assert pongs == [1]
+
+ e.step()
+ assert e.now == 3
+ assert pings == [0, 1, 2]
+ assert pongs == [1, 2]
diff --git a/tests/test_examples.py b/tests/test_examples.py
index a0a2bd5..b2d2750 100644
--- a/tests/test_examples.py
+++ b/tests/test_examples.py
@@ -44,6 +44,8 @@ def add_example_tests():
for cfg, path in serialization.load_files(
join(EXAMPLES, "**", "*.yml"),
):
+ if 'soil_output' in path:
+ continue
p = make_example_test(path=path, cfg=config.Config.from_raw(cfg))
fname = os.path.basename(path)
p.__name__ = "test_example_file_%s" % fname
diff --git a/tests/test_main.py b/tests/test_main.py
index 8f4f97c..d100b97 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -172,25 +172,21 @@ class TestMain(TestCase):
assert len(configs) > 0
def test_until(self):
- config = {
- "name": "until_sim",
- "model_params": {
- "network_params": {},
- "agents": {
- "fixed": [
- {
- "agent_class": agents.BaseAgent,
- }
- ]
- },
- },
- "max_time": 2,
- "num_trials": 50,
- }
- s = simulation.from_config(config)
+ n_runs = 0
+
+ class CheckRun(agents.BaseAgent):
+ def step(self):
+ nonlocal n_runs
+ n_runs += 1
+ return super().step()
+
+ n_trials = 50
+ max_time = 2
+ s = simulation.Simulation(model_params={'agents': [{'agent_class': CheckRun}]},
+ num_trials=n_trials, max_time=max_time)
runs = list(s.run_simulation(dry_run=True))
over = list(x.now for x in runs if x.now > 2)
- assert len(runs) == config["num_trials"]
+ assert len(runs) == n_trials
assert len(over) == 0
def test_fsm(self):
diff --git a/tests/test_network.py b/tests/test_network.py
index a860b14..89ff4a0 100644
--- a/tests/test_network.py
+++ b/tests/test_network.py
@@ -72,7 +72,7 @@ class TestNetwork(TestCase):
assert len(env.agents) == 2
assert env.agents[1].count_agents(state_id="normal") == 2
assert env.agents[1].count_agents(state_id="normal", limit_neighbors=True) == 1
- assert env.agents[0].neighbors == 1
+ assert env.agents[0].count_neighbors() == 1
def test_custom_agent_neighbors(self):
"""Allow for search of neighbors with a certain state_id"""
@@ -90,7 +90,7 @@ class TestNetwork(TestCase):
env = s.run_simulation(dry_run=True)[0]
assert env.agents[1].count_agents(state_id="normal") == 2
assert env.agents[1].count_agents(state_id="normal", limit_neighbors=True) == 1
- assert env.agents[0].neighbors == 1
+ assert env.agents[0].count_neighbors() == 1
def test_subgraph(self):
"""An agent should be able to subgraph the global topology"""
diff --git a/tests/test_time.py b/tests/test_time.py
index db16609..458b734 100644
--- a/tests/test_time.py
+++ b/tests/test_time.py
@@ -30,8 +30,9 @@ class TestMain(TestCase):
times_started = []
times_awakened = []
+ times_asleep = []
times = []
- done = 0
+ done = []
class CondAgent(agents.BaseAgent):
@@ -39,36 +40,38 @@ class TestMain(TestCase):
nonlocal done
times_started.append(self.now)
while True:
- yield time.Cond(lambda agent: agent.model.schedule.time >= 10)
+ times_asleep.append(self.now)
+ yield time.Cond(lambda agent: agent.now >= 10,
+ delta=2)
times_awakened.append(self.now)
if self.now >= 10:
break
- done += 1
+ done.append(self.now)
env = environment.Environment(agents=[{'agent_class': CondAgent}])
while env.schedule.time < 11:
- env.step()
times.append(env.now)
+ env.step()
+
assert env.schedule.time == 11
assert times_started == [0]
assert times_awakened == [10]
- assert done == 1
+ assert done == [10]
# The first time will produce the Cond.
- # Since there are no other agents, time will not advance, but the number
- # of steps will.
- assert env.schedule.steps == 12
- assert len(times) == 12
+ assert env.schedule.steps == 6
+ assert len(times) == 6
- while env.schedule.time < 12:
- env.step()
+ while env.schedule.time < 13:
times.append(env.now)
+ env.step()
- assert env.schedule.time == 12
+ assert times == [0, 2, 4, 6, 8, 10, 11]
+ assert env.schedule.time == 13
assert times_started == [0, 11]
- assert times_awakened == [10, 11]
- assert done == 2
+ assert times_awakened == [10]
+ assert done == [10]
# Once more to yield the cond, another one to continue
- assert env.schedule.steps == 14
- assert len(times) == 14
+ assert env.schedule.steps == 7
+ assert len(times) == 7
From b2d48cb4df38d1447f92da7785acc5a2d89a9f89 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Thu, 20 Oct 2022 14:10:34 +0200
Subject: [PATCH 23/39] Add test cases for 'ASK'
---
soil/agents/evented.py | 6 ++---
soil/environment.py | 10 +++++---
soil/time.py | 10 ++++++++
tests/test_agents.py | 55 ++++++++++++++++++++++--------------------
4 files changed, 48 insertions(+), 33 deletions(-)
diff --git a/soil/agents/evented.py b/soil/agents/evented.py
index 340c29a..9b8e144 100644
--- a/soil/agents/evented.py
+++ b/soil/agents/evented.py
@@ -52,11 +52,11 @@ class EventedAgent(BaseAgent):
def tell(self, msg, sender=None):
self._inbox.append(Tell(timestamp=self.now, payload=msg, sender=sender))
- def ask(self, msg, timeout=None):
- ask = Ask(timestamp=self.now, payload=msg)
+ def ask(self, msg, timeout=None, **kwargs):
+ ask = Ask(timestamp=self.now, payload=msg, sender=self)
self._inbox.append(ask)
expiration = float('inf') if timeout is None else self.now + timeout
- return ask.replied(expiration=expiration)
+ return ask.replied(expiration=expiration, **kwargs)
def check_messages(self):
changed = False
diff --git a/soil/environment.py b/soil/environment.py
index 4be1625..ee114e0 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -38,7 +38,7 @@ class BaseEnvironment(Model):
self,
id="unnamed_env",
seed="default",
- schedule=None,
+ schedule_class=time.TimedActivation,
dir_path=None,
interval=1,
agent_class=None,
@@ -58,9 +58,11 @@ class BaseEnvironment(Model):
self.dir_path = dir_path or os.getcwd()
- if schedule is None:
- schedule = time.TimedActivation(self)
- self.schedule = schedule
+ if schedule_class is None:
+ schedule_class = time.TimedActivation
+ else:
+ schedule_class = serialization.deserialize(schedule_class)
+ self.schedule = schedule_class(self)
self.agent_class = agent_class or agentmod.BaseAgent
diff --git a/soil/time.py b/soil/time.py
index 7e11201..6c65cc4 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -192,3 +192,13 @@ class TimedActivation(BaseScheduler):
self.logger.debug(f"Updating time step: {self.time} -> {next_time}")
self.time = next_time
+
+
+class ShuffledTimedActivation(TimedActivation):
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, shuffle=True, **kwargs)
+
+
+class OrderedTimedActivation(TimedActivation):
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, shuffle=False, **kwargs)
diff --git a/tests/test_agents.py b/tests/test_agents.py
index a32d91a..0cb7f37 100644
--- a/tests/test_agents.py
+++ b/tests/test_agents.py
@@ -103,7 +103,19 @@ class TestAgents(TestCase):
An agent should be able to ask another agent, and wait for a response.
'''
- # #Results depend on ordering (agents are shuffled), so force the first agent
+ # There are two agents, they try to send pings
+ # This is arguably a very contrived example. In practice, the or
+ # There should be a delay of one step between agent 0 and 1
+ # On the first step:
+ # Agent 0 sends a PING, but blocks before a PONG
+ # Agent 1 detects the PING, responds with a PONG, and blocks after its own PING
+ # After that step, every agent can both receive (there are pending messages) and send.
+ # In each step, for each agent, one message is sent, and another one is received
+ # (although not necessarily in that order).
+
+ # Results depend on ordering (agents are normally shuffled)
+ # so we force the timedactivation not to be shuffled
+
pings = []
pongs = []
responses = []
@@ -114,46 +126,37 @@ class TestAgents(TestCase):
target = self.model.agents[target_id]
print('starting')
while True:
- print('Pings: ', pings, responses or not pings, self.model.schedule._queue)
- if pongs or not pings:
+ if pongs or not pings: #First agent, or anyone after that
pings.append(self.now)
response = yield target.ask('PING')
responses.append(response)
else:
print('NOT sending ping')
print('Checking msgs')
- # Do not advance until we have received a message.
- # warning: it will wait at least until the next time in the simulation
- yield self.received(check=True)
+ # Do not block if we have already received a PING
+ if not self.check_messages():
+ yield self.received()
print('done')
def on_receive(self, msg, sender=None):
if msg == 'PING':
pongs.append(self.now)
return 'PONG'
+ raise Exception("This should never happen")
- e = environment.EventedEnvironment()
+ e = environment.EventedEnvironment(schedule_class=stime.OrderedTimedActivation)
for i in range(2):
e.add_agent(agent_class=Ping)
assert e.now == 0
- # There should be a delay of one step between agent 0 and 1
- # On the first step:
- # Agent 0 sends a PING, but blocks before a PONG
- # Agent 1 sends a PONG, and blocks after its PING
- # After that step, every agent can both receive (there are pending messages) and then send.
- e.step()
- assert e.now == 1
- assert pings == [0]
- assert pongs == []
-
- e.step()
- assert e.now == 2
- assert pings == [0, 1]
- assert pongs == [1]
-
- e.step()
- assert e.now == 3
- assert pings == [0, 1, 2]
- assert pongs == [1, 2]
+ for i in range(5):
+ e.step()
+ time = i + 1
+ assert e.now == time
+ assert len(pings) == 2 * time
+ assert len(pongs) == (2 * time) - 1
+ # Every step between 0 and t appears twice
+ assert sum(pings) == sum(range(time)) * 2
+ # It is the same as pings, without the leading 0
+ assert sum(pongs) == sum(range(time)) * 2
From c09e480d3742d850ed7487eee8cf3c321a2ab381 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Thu, 20 Oct 2022 14:12:10 +0200
Subject: [PATCH 24/39] black formatting
---
examples/events_and_messages/cars.py | 2 +-
examples/terrorism/TerroristNetworkModel.py | 4 +-
soil/__init__.py | 26 ++++++-----
soil/agents/__init__.py | 6 +--
soil/agents/evented.py | 11 +++--
soil/agents/fsm.py | 2 -
soil/agents/network_agents.py | 1 +
soil/environment.py | 18 +++++---
soil/events.py | 3 ++
soil/time.py | 12 ++---
tests/test_agents.py | 49 +++++++++++----------
tests/test_examples.py | 2 +-
tests/test_main.py | 7 ++-
tests/test_time.py | 19 ++++----
14 files changed, 90 insertions(+), 72 deletions(-)
diff --git a/examples/events_and_messages/cars.py b/examples/events_and_messages/cars.py
index c612f70..00e2632 100644
--- a/examples/events_and_messages/cars.py
+++ b/examples/events_and_messages/cars.py
@@ -128,7 +128,7 @@ class Driver(Evented, FSM):
self.check_passengers()
# This will call on_receive behind the scenes, and the agent's status will be updated
- self.check_messages()
+ self.check_messages()
yield Delta(30) # Wait at least 30 seconds before checking again
try:
diff --git a/examples/terrorism/TerroristNetworkModel.py b/examples/terrorism/TerroristNetworkModel.py
index fe3034f..2da9d8f 100644
--- a/examples/terrorism/TerroristNetworkModel.py
+++ b/examples/terrorism/TerroristNetworkModel.py
@@ -258,9 +258,7 @@ class TerroristNetworkModel(TerroristSpreadModel):
)
neighbours = set(
agent.id
- for agent in self.get_neighbors(
- agent_class=TerroristNetworkModel
- )
+ for agent in self.get_neighbors(agent_class=TerroristNetworkModel)
)
search = (close_ups | step_neighbours) - neighbours
for agent in self.get_agents(search):
diff --git a/soil/__init__.py b/soil/__init__.py
index 6382d29..3894897 100644
--- a/soil/__init__.py
+++ b/soil/__init__.py
@@ -47,7 +47,7 @@ def main(
"file",
type=str,
nargs="?",
- default=cfg if sim is None else '',
+ default=cfg if sim is None else "",
help="Configuration file for the simulation (e.g., YAML or JSON)",
)
parser.add_argument(
@@ -169,22 +169,26 @@ def main(
sim.exporters = exporters
sim.parallel = parallel
sim.outdir = output
- sims = [sim, ]
+ sims = [
+ sim,
+ ]
else:
logger.info("Loading config file: {}".format(args.file))
if not os.path.exists(args.file):
logger.error("Please, input a valid file")
return
- sims = list(simulation.iter_from_config(
- args.file,
- dry_run=args.dry_run,
- exporters=exporters,
- parallel=parallel,
- outdir=output,
- exporter_params=exp_params,
- **kwargs,
- ))
+ sims = list(
+ simulation.iter_from_config(
+ args.file,
+ dry_run=args.dry_run,
+ exporters=exporters,
+ parallel=parallel,
+ outdir=output,
+ exporter_params=exp_params,
+ **kwargs,
+ )
+ )
for sim in sims:
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index a9c1fc3..9cf168a 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -197,7 +197,7 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
def step(self):
if not self.alive:
raise time.DeadAgent(self.unique_id)
- super().step()
+ super().step()
return time.Delta(self.interval)
def log(self, message, *args, level=logging.INFO, **kwargs):
@@ -261,7 +261,6 @@ def prob(prob, random):
return r < prob
-
def calculate_distribution(network_agents=None, agent_class=None):
"""
Calculate the threshold values (thresholds for a uniform distribution)
@@ -632,7 +631,8 @@ from .CounterModel import *
class Agent(NetworkAgent, EventedAgent):
- '''Default agent class, has both network and event capabilities'''
+ """Default agent class, has both network and event capabilities"""
+
try:
import scipy
diff --git a/soil/agents/evented.py b/soil/agents/evented.py
index 9b8e144..22e1191 100644
--- a/soil/agents/evented.py
+++ b/soil/agents/evented.py
@@ -6,7 +6,9 @@ from collections import deque
class ReceivedOrTimeout(BaseCond):
- def __init__(self, agent, expiration=None, timeout=None, check=True, ignore=False, **kwargs):
+ def __init__(
+ self, agent, expiration=None, timeout=None, check=True, ignore=False, **kwargs
+ ):
if expiration is None:
if timeout is not None:
expiration = agent.now + timeout
@@ -23,7 +25,7 @@ class ReceivedOrTimeout(BaseCond):
def return_value(self, agent):
if not self.ignore and self.expired(agent.now):
- raise TimedOut('No messages received')
+ raise TimedOut("No messages received")
if self.check:
agent.check_messages()
return None
@@ -34,7 +36,7 @@ class ReceivedOrTimeout(BaseCond):
return (time + delta, self)
def __repr__(self):
- return f'ReceivedOrTimeout(expires={self.expiration})'
+ return f"ReceivedOrTimeout(expires={self.expiration})"
class EventedAgent(BaseAgent):
@@ -55,7 +57,7 @@ class EventedAgent(BaseAgent):
def ask(self, msg, timeout=None, **kwargs):
ask = Ask(timestamp=self.now, payload=msg, sender=self)
self._inbox.append(ask)
- expiration = float('inf') if timeout is None else self.now + timeout
+ expiration = float("inf") if timeout is None else self.now + timeout
return ask.replied(expiration=expiration, **kwargs)
def check_messages(self):
@@ -71,4 +73,5 @@ class EventedAgent(BaseAgent):
msg.reply = reply
return changed
+
Evented = EventedAgent
diff --git a/soil/agents/fsm.py b/soil/agents/fsm.py
index 4b64364..8e3f8d8 100644
--- a/soil/agents/fsm.py
+++ b/soil/agents/fsm.py
@@ -38,8 +38,6 @@ def state(name=None):
self._last_return = None
self._last_except = None
-
-
func.id = name or func.__name__
func.is_default = False
return func
diff --git a/soil/agents/network_agents.py b/soil/agents/network_agents.py
index cd57943..090a3a4 100644
--- a/soil/agents/network_agents.py
+++ b/soil/agents/network_agents.py
@@ -81,4 +81,5 @@ class NetworkAgent(BaseAgent):
self.remove_node()
return super().die()
+
NetAgent = NetworkAgent
diff --git a/soil/environment.py b/soil/environment.py
index ee114e0..aa61d43 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -313,19 +313,27 @@ class NetworkEnvironment(BaseEnvironment):
class EventedEnvironment(BaseEnvironment):
- def broadcast(self, msg, sender=None, expiration=None, ttl=None, **kwargs):
+ def broadcast(self, msg, sender=None, expiration=None, ttl=None, **kwargs):
for agent in self.agents(**kwargs):
if agent == sender:
continue
- self.logger.info(f'Telling {repr(agent)}: {msg} ttl={ttl}')
+ self.logger.info(f"Telling {repr(agent)}: {msg} ttl={ttl}")
try:
inbox = agent._inbox
except AttributeError:
- self.logger.info(f'Agent {agent.unique_id} cannot receive events because it does not have an inbox')
+ self.logger.info(
+ f"Agent {agent.unique_id} cannot receive events because it does not have an inbox"
+ )
continue
# Allow for AttributeError exceptions in this part of the code
- inbox.append(events.Tell(payload=msg, sender=sender, expiration=expiration if ttl is None else self.now+ttl))
+ inbox.append(
+ events.Tell(
+ payload=msg,
+ sender=sender,
+ expiration=expiration if ttl is None else self.now + ttl,
+ )
+ )
class Environment(NetworkEnvironment, EventedEnvironment):
- '''Default environment class, has both network and event capabilities'''
+ """Default environment class, has both network and event capabilities"""
diff --git a/soil/events.py b/soil/events.py
index 25f471a..82beaff 100644
--- a/soil/events.py
+++ b/soil/events.py
@@ -3,9 +3,11 @@ from dataclasses import dataclass, field
from typing import Any
from uuid import uuid4
+
class Event:
pass
+
@dataclass
class Message:
payload: Any
@@ -17,6 +19,7 @@ class Message:
def expired(self, when):
return self.expiration is not None and self.expiration < when
+
class Reply(Message):
source: Message
diff --git a/soil/time.py b/soil/time.py
index 6c65cc4..6dc39af 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -105,15 +105,16 @@ class TimedActivation(BaseScheduler):
when = self.time
elif isinstance(when, When):
when = when.abs()
-
+
self._schedule(agent, None, when)
super().add(agent)
def _schedule(self, agent, condition=None, when=None):
if condition:
if not when:
- when, condition = condition.schedule_next(when or self.time,
- self.step_interval)
+ when, condition = condition.schedule_next(
+ when or self.time, self.step_interval
+ )
else:
if when is None:
when = self.time + self.step_interval
@@ -125,7 +126,6 @@ class TimedActivation(BaseScheduler):
self._next[agent.unique_id] = key
heappush(self._queue, (key, agent))
-
def step(self) -> None:
"""
Executes agents in order, one at a time. After each step,
@@ -170,7 +170,9 @@ class TimedActivation(BaseScheduler):
continue
if returned:
- next_check = returned.schedule_next(self.time, self.step_interval, first=True)
+ next_check = returned.schedule_next(
+ self.time, self.step_interval, first=True
+ )
self._schedule(agent, when=next_check[0], condition=next_check[1])
else:
next_check = (self.time + self.step_interval, None)
diff --git a/tests/test_agents.py b/tests/test_agents.py
index 0cb7f37..76606cf 100644
--- a/tests/test_agents.py
+++ b/tests/test_agents.py
@@ -14,31 +14,32 @@ class Dead(agents.FSM):
class TestAgents(TestCase):
def test_die_returns_infinity(self):
- '''The last step of a dead agent should return time.INFINITY'''
+ """The last step of a dead agent should return time.INFINITY"""
d = Dead(unique_id=0, model=environment.Environment())
ret = d.step()
assert ret == stime.NEVER
def test_die_raises_exception(self):
- '''A dead agent should raise an exception if it is stepped after death'''
+ """A dead agent should raise an exception if it is stepped after death"""
d = Dead(unique_id=0, model=environment.Environment())
d.step()
with pytest.raises(stime.DeadAgent):
d.step()
-
def test_agent_generator(self):
- '''
+ """
The step function of an agent could be a generator. In that case, the state of the
agent will be resumed after every call to step.
- '''
+ """
a = 0
+
class Gen(agents.BaseAgent):
def step(self):
nonlocal a
for i in range(5):
yield
a += 1
+
e = environment.Environment()
g = Gen(model=e, unique_id=e.next_id())
e.schedule.add(g)
@@ -50,8 +51,9 @@ class TestAgents(TestCase):
def test_state_decorator(self):
class MyAgent(agents.FSM):
run = 0
+
@agents.default_state
- @agents.state('original')
+ @agents.state("original")
def root(self):
self.run += 1
return self.other
@@ -66,19 +68,19 @@ class TestAgents(TestCase):
assert a.run == 1
a.step()
-
def test_broadcast(self):
- '''
+ """
An agent should be able to broadcast messages to every other agent, AND each receiver should be able
to process it
- '''
+ """
+
class BCast(agents.Evented):
pings_received = 0
def step(self):
print(self.model.broadcast)
try:
- self.model.broadcast('PING')
+ self.model.broadcast("PING")
except Exception as ex:
print(ex)
while True:
@@ -87,7 +89,7 @@ class TestAgents(TestCase):
def on_receive(self, msg, sender=None):
self.pings_received += 1
-
+
e = environment.EventedEnvironment()
for i in range(10):
@@ -96,12 +98,12 @@ class TestAgents(TestCase):
pings_received = lambda: [a.pings_received for a in e.agents]
assert sorted(pings_received()) == list(range(1, 11))
e.step()
- assert all(x==10 for x in pings_received())
+ assert all(x == 10 for x in pings_received())
def test_ask_messages(self):
- '''
+ """
An agent should be able to ask another agent, and wait for a response.
- '''
+ """
# There are two agents, they try to send pings
# This is arguably a very contrived example. In practice, the or
@@ -124,24 +126,24 @@ class TestAgents(TestCase):
def step(self):
target_id = (self.unique_id + 1) % self.count_agents()
target = self.model.agents[target_id]
- print('starting')
+ print("starting")
while True:
- if pongs or not pings: #First agent, or anyone after that
+ if pongs or not pings: # First agent, or anyone after that
pings.append(self.now)
- response = yield target.ask('PING')
+ response = yield target.ask("PING")
responses.append(response)
else:
- print('NOT sending ping')
- print('Checking msgs')
+ print("NOT sending ping")
+ print("Checking msgs")
# Do not block if we have already received a PING
if not self.check_messages():
- yield self.received()
- print('done')
+ yield self.received()
+ print("done")
def on_receive(self, msg, sender=None):
- if msg == 'PING':
+ if msg == "PING":
pongs.append(self.now)
- return 'PONG'
+ return "PONG"
raise Exception("This should never happen")
e = environment.EventedEnvironment(schedule_class=stime.OrderedTimedActivation)
@@ -149,7 +151,6 @@ class TestAgents(TestCase):
e.add_agent(agent_class=Ping)
assert e.now == 0
-
for i in range(5):
e.step()
time = i + 1
diff --git a/tests/test_examples.py b/tests/test_examples.py
index b2d2750..f589ecb 100644
--- a/tests/test_examples.py
+++ b/tests/test_examples.py
@@ -44,7 +44,7 @@ def add_example_tests():
for cfg, path in serialization.load_files(
join(EXAMPLES, "**", "*.yml"),
):
- if 'soil_output' in path:
+ if "soil_output" in path:
continue
p = make_example_test(path=path, cfg=config.Config.from_raw(cfg))
fname = os.path.basename(path)
diff --git a/tests/test_main.py b/tests/test_main.py
index d100b97..677421a 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -182,8 +182,11 @@ class TestMain(TestCase):
n_trials = 50
max_time = 2
- s = simulation.Simulation(model_params={'agents': [{'agent_class': CheckRun}]},
- num_trials=n_trials, max_time=max_time)
+ s = simulation.Simulation(
+ model_params={"agents": [{"agent_class": CheckRun}]},
+ num_trials=n_trials,
+ max_time=max_time,
+ )
runs = list(s.run_simulation(dry_run=True))
over = list(x.now for x in runs if x.now > 2)
assert len(runs) == n_trials
diff --git a/tests/test_time.py b/tests/test_time.py
index 458b734..7fdab0b 100644
--- a/tests/test_time.py
+++ b/tests/test_time.py
@@ -2,11 +2,12 @@ from unittest import TestCase
from soil import time, agents, environment
+
class TestMain(TestCase):
def test_cond(self):
- '''
+ """
A condition should match a When if the concition is True
- '''
+ """
t = time.Cond(lambda t: True)
f = time.Cond(lambda t: False)
@@ -16,17 +17,16 @@ class TestMain(TestCase):
assert w is not f
def test_cond(self):
- '''
+ """
Comparing a Cond to a Delta should always return False
- '''
+ """
c = time.Cond(lambda t: False)
d = time.Delta(1)
assert c is not d
def test_cond_env(self):
- '''
- '''
+ """ """
times_started = []
times_awakened = []
@@ -35,21 +35,18 @@ class TestMain(TestCase):
done = []
class CondAgent(agents.BaseAgent):
-
def step(self):
nonlocal done
times_started.append(self.now)
while True:
times_asleep.append(self.now)
- yield time.Cond(lambda agent: agent.now >= 10,
- delta=2)
+ yield time.Cond(lambda agent: agent.now >= 10, delta=2)
times_awakened.append(self.now)
if self.now >= 10:
break
done.append(self.now)
- env = environment.Environment(agents=[{'agent_class': CondAgent}])
-
+ env = environment.Environment(agents=[{"agent_class": CondAgent}])
while env.schedule.time < 11:
times.append(env.now)
From 9a7b62e88ec6f0f0ec331965522555e0661ac590 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Thu, 20 Oct 2022 14:12:34 +0200
Subject: [PATCH 25/39] Release 0.30.0rc3
---
soil/VERSION | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/soil/VERSION b/soil/VERSION
index 129bfad..2a41704 100644
--- a/soil/VERSION
+++ b/soil/VERSION
@@ -1 +1 @@
-0.30.0rc2
\ No newline at end of file
+0.30.0rc3
\ No newline at end of file
From d3cee18635f682b08821b98e0304ea51f506e1f3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Thu, 20 Oct 2022 14:47:28 +0200
Subject: [PATCH 26/39] Add seed to cars example
---
examples/events_and_messages/cars.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/examples/events_and_messages/cars.py b/examples/events_and_messages/cars.py
index 00e2632..0f819c4 100644
--- a/examples/events_and_messages/cars.py
+++ b/examples/events_and_messages/cars.py
@@ -232,7 +232,10 @@ class Passenger(Evented, FSM):
simulation = Simulation(
- name="RideHailing", model_class=City, model_params={"n_passengers": 2}
+ name="RideHailing",
+ model_class=City,
+ model_params={"n_passengers": 2},
+ seed="carsSeed",
)
if __name__ == "__main__":
From 2869b1e1e61e3fe682f390d199ed254b4ab58771 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Sun, 13 Nov 2022 20:31:05 +0100
Subject: [PATCH 27/39] Clean-up
* Removed old/unnecessary models
* Added a `simulation.{iter_}from_py` method to load simulations from python
files
* Changed tests of examples to run programmatic simulations
* Fixed programmatic examples
---
README.md | 61 +++--
docs/configuration.rst | 262 -------------------
docs/example.yml | 53 ++--
docs/index.rst | 5 -
docs/installation.rst | 6 +-
docs/make.bat | 2 +-
docs/mesa.rst | 22 ++
docs/quickstart.yml | 55 ++--
docs/soil_tutorial.rst | 12 +-
examples/custom_timeouts/custom_timeouts.py | 35 ++-
examples/events_and_messages/cars.py | 6 +-
examples/mesa/server.py | 3 +-
examples/mesa/social_wealth.py | 2 +-
examples/programmatic/programmatic.py | 38 ++-
examples/pubcrawl/pubcrawl.py | 4 +-
examples/rabbits/basic/rabbit_agents.py | 4 +-
examples/random_delays/random_delays.py | 6 +-
examples/terrorism/TerroristNetworkModel.py | 12 +-
examples/tutorial/soil_tutorial.ipynb | 12 +-
soil/VERSION | 2 +-
soil/__init__.py | 5 +
soil/agents/BassModel.py | 4 +-
soil/agents/BigMarketModel.py | 118 ---------
soil/agents/Geo.py | 8 +-
soil/agents/IndependentCascadeModel.py | 56 ++--
soil/agents/ModelM2.py | 270 --------------------
soil/agents/SISaModel.py | 42 +--
soil/agents/SentimentCorrelationModel.py | 115 ---------
soil/agents/__init__.py | 15 +-
soil/agents/network_agents.py | 5 +-
soil/config.py | 9 +-
soil/datacollection.py | 17 +-
soil/environment.py | 86 ++++---
soil/exporters.py | 71 ++++-
soil/network.py | 2 +-
soil/serialization.py | 5 +-
soil/simulation.py | 47 +++-
soil/time.py | 7 +-
soil/utils.py | 12 +-
tests/test_config.py | 37 ++-
tests/test_examples.py | 66 ++---
41 files changed, 499 insertions(+), 1100 deletions(-)
delete mode 100644 docs/configuration.rst
create mode 100644 docs/mesa.rst
delete mode 100644 soil/agents/BigMarketModel.py
delete mode 100644 soil/agents/ModelM2.py
delete mode 100644 soil/agents/SentimentCorrelationModel.py
diff --git a/README.md b/README.md
index 8bcca61..2ad76be 100644
--- a/README.md
+++ b/README.md
@@ -5,8 +5,46 @@ Learn how to run your own simulations with our [documentation](http://soilsim.re
Follow our [tutorial](examples/tutorial/soil_tutorial.ipynb) to develop your own agent models.
+**Note**: Mesa 0.30 introduced many fundamental changes. Check the [documention on how to update your simulations to work with newer versions](docs/migration_0.30.rst)
-# Changes in version 0.3
+## SOIL vs MESA
+
+SOIL is a batteries-included platform that builds on top of MESA and provides the following out of the box:
+
+* Integration with (social) networks
+* The ability to more easily assign agents to your model (and optionally to its network):
+ * Assigning agents to nodes, and vice versa
+ * Using a description (e.g., 2 agents of type `Foo`, 10% of the network should be agents of type `Bar`)
+* **Several types of abstractions for agents**:
+ * Finite state machine, where methods can be turned into a state
+ * Network agents, which have convenience methods to access the model's topology
+ * Generator-based agents, whose state is paused though a `yield` and resumed on the next step
+* **Reporting and data collection**:
+ * Soil models include data collection and record some data by default (# of agents, state of each agent, etc.)
+ * All data collected are exported by default to a SQLite database and a description file
+ * Options to export to other formats, such as CSV, or defining your own exporters
+ * A summary of the data collected is shown in the command line, for easy inspection
+* **An event-based scheduler**
+ * Agents can be explicit about when their next time/step should be, and not all agents run in every step. This avoids unnecessary computation.
+ * Time intervals between each step are flexible.
+ * There are primitives to specify when the next execution of an agent should be (or conditions)
+* **Actor-inspired** message-passing
+* A simulation runner (`soil.Simulation`) that can:
+ * Run models in parallel
+ * Save results to different formats
+* Simulation configuration files
+* A command line interface (`soil`), to run multiple
+* An integrated debugger (`soil --debug`) with custom functions to print agent states and break at specific states
+
+Nevertheless, most features in SOIL have been designed to integrate with plain Mesa.
+For instance, it should be possible to run a `mesa.Model` models using a `soil.Simulation` and the `soil` CLI, or to integrate the `soil.TimedActivation` scheduler on a `mesa.Model`.
+
+Note that some combinations of `mesa` and `soil` components, while technically possible, are much less useful or even wrong.
+For instance, you may add any `soil.agent` agent (except for the `soil.NetworkAgent`, as it needs a topology) on a regular `mesa.Model` with a vanilla scheduler from `mesa.time`.
+But in that case the agents will not get any of the advanced event-based scheduling, and most agent behaviors that depend on that will greatly vary.
+
+
+## Changes in version 0.3
Version 0.3 came packed with many changes to provide much better integration with MESA.
For a long time, we tried to keep soil backwards-compatible, but it turned out to be a big endeavour and the resulting code was less readable.
@@ -18,27 +56,6 @@ If you have an older Soil simulation, you have two options:
* Update the necessary configuration files and code. You may use the examples in the `examples` folder for reference, as well as the documentation.
* Keep using a previous `soil` version.
-## Mesa compatibility
-
-Soil is in the process of becoming fully compatible with MESA.
-The idea is to provide a set of modular classes and functions that extend the functionality of mesa, whilst staying compatible.
-In the end, it should be possible to add regular mesa agents to a soil simulation, or use a soil agent within a mesa simulation/model.
-
-This is a non-exhaustive list of tasks to achieve compatibility:
-
-- [ ] Integrate `soil.Simulation` with mesa's runners:
- - [ ] `soil.Simulation` could mimic/become a `mesa.batchrunner`
-- [ ] Integrate `soil.Environment` with `mesa.Model`:
- - [x] `Soil.Environment` inherits from `mesa.Model`
- - [x] `Soil.Environment` includes a Mesa-like Scheduler (see the `soil.time` module.
- - [ ] Allow for `mesa.Model` to be used in a simulation.
-- [ ] Integrate `soil.Agent` with `mesa.Agent`:
- - [x] Rename agent.id to unique_id?
- - [x] mesa agents can be used in soil simulations (see `examples/mesa`)
-- [ ] Provide examples
- - [ ] Using mesa modules in a soil simulation
- - [ ] Using soil modules in a mesa simulation
-- [ ] Document the new APIs and usage
## Citation
diff --git a/docs/configuration.rst b/docs/configuration.rst
deleted file mode 100644
index 223fbbc..0000000
--- a/docs/configuration.rst
+++ /dev/null
@@ -1,262 +0,0 @@
-Configuring a simulation
-------------------------
-
-There are two ways to configure a simulation: programmatically and with a configuration file.
-In both cases, the parameters used are the same.
-The advantage of a configuration file is that it is a clean declarative description, and it makes it easier to reproduce.
-
-Simulation configuration files can be formatted in ``json`` or ``yaml`` and they define all the parameters of a simulation.
-Here's an example (``example.yml``).
-
-.. literalinclude:: example.yml
- :language: yaml
-
-
-This example configuration will run three trials (``num_trials``) of a simulation containing a randomly generated network (``network_params``).
-The 100 nodes in the network will be SISaModel agents (``network_agents.agent_class``), which is an agent behavior that is included in Soil.
-10% of the agents (``weight=1``) will start in the content state, 10% in the discontent state, and the remaining 80% (``weight=8``) in the neutral state.
-All agents will have access to the environment (``environment_params``), which only contains one variable, ``prob_infected``.
-The state of the agents will be updated every 2 seconds (``interval``).
-
-Now run the simulation with the command line tool:
-
-.. code:: bash
-
- soil example.yml
-
-Once the simulation finishes, its results will be stored in a folder named ``MyExampleSimulation``.
-Three types of objects are saved by default: a pickle of the simulation; a ``YAML`` representation of the simulation (which can be used to re-launch it); and for every trial, a ``sqlite`` file with the content of the state of every network node and the environment parameters at every step of the simulation.
-
-
-.. code::
-
- soil_output
- └── MyExampleSimulation
- ├── MyExampleSimulation.dumped.yml
- ├── MyExampleSimulation.simulation.pickle
- ├── MyExampleSimulation_trial_0.db.sqlite
- ├── MyExampleSimulation_trial_1.db.sqlite
- └── MyExampleSimulation_trial_2.db.sqlite
-
-
-You may also ask soil to export the states in a ``csv`` file, and the network in gephi format (``gexf``).
-
-Network
-=======
-
-The network topology for the simulation can be loaded from an existing network file or generated with one of the random network generation methods from networkx.
-
-Loading a network
-#################
-
-To load an existing network, specify its path in the configuration:
-
-.. code:: yaml
-
- ---
- network_params:
- path: /tmp/mynetwork.gexf
-
-Soil will try to guess what networkx method to use to read the file based on its extension.
-However, we only test using ``gexf`` files.
-
-For simple networks, you may also include them in the configuration itself using , using the ``topology`` parameter like so:
-
-.. code:: yaml
-
- ---
- topology:
- nodes:
- - id: First
- - id: Second
- links:
- - source: First
- target: Second
-
-
-Generating a random network
-###########################
-
-To generate a random network using one of networkx's built-in methods, specify the `graph generation algorithm `_ and other parameters.
-For example, the following configuration is equivalent to :code:`nx.complete_graph(n=100)`:
-
-.. code:: yaml
-
- network_params:
- generator: complete_graph
- n: 100
-
-Environment
-============
-
-The environment is the place where the shared state of the simulation is stored.
-That means both global parameters, such as the probability of disease outbreak.
-But it also means other data, such as a map, or a network topology that connects multiple agents.
-As a result, it is also typical to add custom functions in an environment that help agents interact with each other and with the state of the simulation.
-
-Last but not least, an environment controls when and how its agents will be executed.
-By default, soil environments incorporate a ``soil.time.TimedActivation`` model for agent execution (more on this on the following section).
-
-Soil environments are very similar, and often interchangeable with, mesa models (``mesa.Model``).
-
-A configuration may specify the initial value of the environment parameters:
-
-.. code:: yaml
-
- environment_params:
- daily_probability_of_earthquake: 0.001
- number_of_earthquakes: 0
-
-All agents have access to the environment (and its parameters).
-
-In some scenarios, it is useful to have a custom environment, to provide additional methods or to control the way agents update environment state.
-For example, if our agents play the lottery, the environment could provide a method to decide whether the agent wins, instead of leaving it to the agent.
-
-Agents
-======
-
-Agents are a way of modelling behavior.
-Agents can be characterized with two variables: agent type (``agent_class``) and state.
-The agent type is a ``soil.Agent`` class, which contains the code that encapsulates the behavior of the agent.
-The state is a set of variables, which may change during the simulation, and that the code may use to control the behavior.
-All agents provide a ``step`` method either explicitly or implicitly (by inheriting it from a superclass), which controls how the agent will behave in each step of the simulation.
-
-When and how agent steps are executed in a simulation depends entirely on the ``environment``.
-Most environments will internally use a scheduler (``mesa.time.BaseScheduler``), which controls the activation of agents.
-
-In soil, we generally used the ``soil.time.TimedActivation`` scheduler, which allows agents to specify when their next activation will happen, defaulting to a
-
-When an agent's step is executed (generally, every ``interval`` seconds), the agent has access to its state and the environment.
-Through the environment, it can access the network topology and the state of other agents.
-
-There are two types of agents according to how they are added to the simulation: network agents and environment agent.
-
-Network Agents
-##############
-
-Network agents are attached to a node in the topology.
-The configuration file allows you to specify how agents will be mapped to topology nodes.
-
-The simplest way is to specify a single type of agent.
-Hence, every node in the network will be associated to an agent of that type.
-
-.. code:: yaml
-
- agent_class: SISaModel
-
-It is also possible to add more than one type of agent to the simulation.
-
-To control the ratio of each type (using the ``weight`` property).
-For instance, with following configuration, it is five times more likely for a node to be assigned a CounterModel type than a SISaModel type.
-
-.. code:: yaml
-
- network_agents:
- - agent_class: SISaModel
- weight: 1
- - agent_class: CounterModel
- weight: 5
-
-The third option is to specify the type of agent on the node itself, e.g.:
-
-
-.. code:: yaml
-
- topology:
- nodes:
- - id: first
- agent_class: BaseAgent
- states:
- first:
- agent_class: SISaModel
-
-
-This would also work with a randomly generated network:
-
-
-.. code:: yaml
-
- network:
- generator: complete
- n: 5
- agent_class: BaseAgent
- states:
- - agent_class: SISaModel
-
-
-
-In addition to agent type, you may add a custom initial state to the distribution.
-This is very useful to add the same agent type with different states.
-e.g., to populate the network with SISaModel, roughly 10% of them with a discontent state:
-
-.. code:: yaml
-
- network_agents:
- - agent_class: SISaModel
- weight: 9
- state:
- id: neutral
- - agent_class: SISaModel
- weight: 1
- state:
- id: discontent
-
-Lastly, the configuration may include initial state for one or more nodes.
-For instance, to add a state for the two nodes in this configuration:
-
-.. code:: yaml
-
- agent_class: SISaModel
- network:
- generator: complete_graph
- n: 2
- states:
- - id: content
- - id: discontent
-
-
-Or to add state only to specific nodes (by ``id``).
-For example, to apply special skills to Linux Torvalds in a simulation:
-
-.. literalinclude:: ../examples/torvalds.yml
- :language: yaml
-
-
-Environment Agents
-##################
-In addition to network agents, more agents can be added to the simulation.
-These agents are programmed in much the same way as network agents, the only difference is that they will not be assigned to network nodes.
-
-
-.. code::
-
- environment_agents:
- - agent_class: MyAgent
- state:
- mood: happy
- - agent_class: DummyAgent
-
-
-You may use environment agents to model events that a normal agent cannot control, such as natural disasters or chance.
-They are also useful to add behavior that has little to do with the network and the interactions within that network.
-
-Templating
-==========
-
-Sometimes, it is useful to parameterize a simulation and run it over a range of values in order to compare each run and measure the effect of those parameters in the simulation.
-For instance, you may want to run a simulation with different agent distributions.
-
-This can be done in Soil using **templates**.
-A template is a configuration where some of the values are specified with a variable.
-e.g., ``weight: "{{ var1 }}"`` instead of ``weight: 1``.
-There are two types of variables, depending on how their values are decided:
-
-* Fixed. A list of values is provided, and a new simulation is run for each possible value. If more than a variable is given, a new simulation will be run per combination of values.
-* Bounded/Sampled. The bounds of the variable are provided, along with a sampler method, which will be used to compute all the configuration combinations.
-
-When fixed and bounded variables are mixed, Soil generates a new configuration per combination of fixed values and bounded values.
-
-Here is an example with a single fixed variable and two bounded variable:
-
-.. literalinclude:: ../examples/template.yml
- :language: yaml
diff --git a/docs/example.yml b/docs/example.yml
index 1554512..45661b3 100644
--- a/docs/example.yml
+++ b/docs/example.yml
@@ -3,33 +3,38 @@ name: MyExampleSimulation
max_time: 50
num_trials: 3
interval: 2
-network_params:
- generator: barabasi_albert_graph
- n: 100
- m: 2
-network_agents:
+model_params:
+ topology:
+ params:
+ generator: barabasi_albert_graph
+ n: 100
+ m: 2
+ agents:
+ distribution:
- agent_class: SISaModel
- weight: 1
+ topology: True
+ ratio: 0.1
state:
- id: content
+ state_id: content
- agent_class: SISaModel
- weight: 1
+ topology: True
+ ratio: .1
state:
- id: discontent
+ state_id: discontent
- agent_class: SISaModel
- weight: 8
+ topology: True
+ ratio: 0.8
state:
- id: neutral
-environment_params:
- prob_infect: 0.075
- neutral_discontent_spon_prob: 0.1
- neutral_discontent_infected_prob: 0.3
- neutral_content_spon_prob: 0.3
- neutral_content_infected_prob: 0.4
- discontent_neutral: 0.5
- discontent_content: 0.5
- variance_d_c: 0.2
- content_discontent: 0.2
- variance_c_d: 0.2
- content_neutral: 0.2
- standard_variance: 1
+ state_id: neutral
+ prob_infect: 0.075
+ neutral_discontent_spon_prob: 0.1
+ neutral_discontent_infected_prob: 0.3
+ neutral_content_spon_prob: 0.3
+ neutral_content_infected_prob: 0.4
+ discontent_neutral: 0.5
+ discontent_content: 0.5
+ variance_d_c: 0.2
+ content_discontent: 0.2
+ variance_c_d: 0.2
+ content_neutral: 0.2
+ standard_variance: 1
\ No newline at end of file
diff --git a/docs/index.rst b/docs/index.rst
index 92896ce..cd10280 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,8 +1,3 @@
-.. Soil documentation master file, created by
- sphinx-quickstart on Tue Apr 25 12:48:56 2017.
- You can adapt this file completely to your liking, but it should at least
- contain the root `toctree` directive.
-
Welcome to Soil's documentation!
================================
diff --git a/docs/installation.rst b/docs/installation.rst
index 9d63bca..5da4297 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -14,6 +14,10 @@ Now test that it worked by running the command line tool
soil --help
+ #or
+
+ python -m soil --help
+
Or, if you're using using soil programmatically:
.. code:: python
@@ -21,4 +25,4 @@ Or, if you're using using soil programmatically:
import soil
print(soil.__version__)
-The latest version can be installed through `GitLab `_ or `GitHub `_.
+The latest version can be installed through `GitHub `_ or `GitLab `_.
diff --git a/docs/make.bat b/docs/make.bat
index 3a6121c..8c57d1f 100644
--- a/docs/make.bat
+++ b/docs/make.bat
@@ -12,7 +12,7 @@ set BUILDDIR=_build
set SPHINXPROJ=Soil
if "%1" == "" goto help
-
+eE
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
diff --git a/docs/mesa.rst b/docs/mesa.rst
new file mode 100644
index 0000000..51ae1c1
--- /dev/null
+++ b/docs/mesa.rst
@@ -0,0 +1,22 @@
+Mesa compatibility
+------------------
+
+Soil is in the process of becoming fully compatible with MESA.
+The idea is to provide a set of modular classes and functions that extend the functionality of mesa, whilst staying compatible.
+In the end, it should be possible to add regular mesa agents to a soil simulation, or use a soil agent within a mesa simulation/model.
+
+This is a non-exhaustive list of tasks to achieve compatibility:
+
+- [ ] Integrate `soil.Simulation` with mesa's runners:
+ - [ ] `soil.Simulation` could mimic/become a `mesa.batchrunner`
+- [ ] Integrate `soil.Environment` with `mesa.Model`:
+ - [x] `Soil.Environment` inherits from `mesa.Model`
+ - [x] `Soil.Environment` includes a Mesa-like Scheduler (see the `soil.time` module.
+ - [ ] Allow for `mesa.Model` to be used in a simulation.
+- [ ] Integrate `soil.Agent` with `mesa.Agent`:
+ - [x] Rename agent.id to unique_id?
+ - [x] mesa agents can be used in soil simulations (see `examples/mesa`)
+- [ ] Provide examples
+ - [ ] Using mesa modules in a soil simulation
+ - [ ] Using soil modules in a mesa simulation
+- [ ] Document the new APIs and usage
\ No newline at end of file
diff --git a/docs/quickstart.yml b/docs/quickstart.yml
index 3b1f36d..7b21fab 100644
--- a/docs/quickstart.yml
+++ b/docs/quickstart.yml
@@ -2,29 +2,32 @@
name: quickstart
num_trials: 1
max_time: 1000
-network_agents:
- - agent_class: SISaModel
- state:
- id: neutral
- weight: 1
- - agent_class: SISaModel
- state:
- id: content
- weight: 2
-network_params:
- n: 100
- k: 5
- p: 0.2
- generator: newman_watts_strogatz_graph
-environment_params:
- neutral_discontent_spon_prob: 0.05
- neutral_discontent_infected_prob: 0.1
- neutral_content_spon_prob: 0.2
- neutral_content_infected_prob: 0.4
- discontent_neutral: 0.2
- discontent_content: 0.05
- content_discontent: 0.05
- variance_d_c: 0.05
- variance_c_d: 0.1
- content_neutral: 0.1
- standard_variance: 0.1
+model_params:
+ agents:
+ - agent_class: SISaModel
+ topology: true
+ state:
+ id: neutral
+ weight: 1
+ - agent_class: SISaModel
+ topology: true
+ state:
+ id: content
+ weight: 2
+ topology:
+ params:
+ n: 100
+ k: 5
+ p: 0.2
+ generator: newman_watts_strogatz_graph
+ neutral_discontent_spon_prob: 0.05
+ neutral_discontent_infected_prob: 0.1
+ neutral_content_spon_prob: 0.2
+ neutral_content_infected_prob: 0.4
+ discontent_neutral: 0.2
+ discontent_content: 0.05
+ content_discontent: 0.05
+ variance_d_c: 0.05
+ variance_c_d: 0.1
+ content_neutral: 0.1
+ standard_variance: 0.1
diff --git a/docs/soil_tutorial.rst b/docs/soil_tutorial.rst
index f7eefe9..1e11077 100644
--- a/docs/soil_tutorial.rst
+++ b/docs/soil_tutorial.rst
@@ -115,13 +115,13 @@ Here's the code:
@soil.agents.state
def neutral(self):
r = random.random()
- if self['has_tv'] and r < self.env['prob_tv_spread']:
+ if self['has_tv'] and r < self.model['prob_tv_spread']:
return self.infected
return
@soil.agents.state
def infected(self):
- prob_infect = self.env['prob_neighbor_spread']
+ prob_infect = self.model['prob_neighbor_spread']
for neighbor in self.get_neighboring_agents(state_id=self.neutral.id):
r = random.random()
if r < prob_infect:
@@ -146,11 +146,11 @@ spreading the rumor.
class NewsEnvironmentAgent(soil.agents.BaseAgent):
def step(self):
if self.now == self['event_time']:
- self.env['prob_tv_spread'] = 1
- self.env['prob_neighbor_spread'] = 1
+ self.model['prob_tv_spread'] = 1
+ self.model['prob_neighbor_spread'] = 1
elif self.now > self['event_time']:
- self.env['prob_tv_spread'] = self.env['prob_tv_spread'] * TV_FACTOR
- self.env['prob_neighbor_spread'] = self.env['prob_neighbor_spread'] * NEIGHBOR_FACTOR
+ self.model['prob_tv_spread'] = self.model['prob_tv_spread'] * TV_FACTOR
+ self.model['prob_neighbor_spread'] = self.model['prob_neighbor_spread'] * NEIGHBOR_FACTOR
Testing the agents
~~~~~~~~~~~~~~~~~~
diff --git a/examples/custom_timeouts/custom_timeouts.py b/examples/custom_timeouts/custom_timeouts.py
index 838ccfc..4124fa6 100644
--- a/examples/custom_timeouts/custom_timeouts.py
+++ b/examples/custom_timeouts/custom_timeouts.py
@@ -1,4 +1,5 @@
from soil.agents import FSM, state, default_state
+from soil.time import Delta
class Fibonacci(FSM):
@@ -11,7 +12,7 @@ class Fibonacci(FSM):
def counting(self):
self.log("Stopping at {}".format(self.now))
prev, self["prev"] = self["prev"], max([self.now, self["prev"]])
- return None, self.env.timeout(prev)
+ return None, Delta(prev)
class Odds(FSM):
@@ -21,18 +22,26 @@ class Odds(FSM):
@state
def odds(self):
self.log("Stopping at {}".format(self.now))
- return None, self.env.timeout(1 + self.now % 2)
+ return None, Delta(1 + self.now % 2)
+from soil import Simulation
+
+simulation = Simulation(
+ model_params={
+ 'agents':[
+ {'agent_class': Fibonacci, 'node_id': 0},
+ {'agent_class': Odds, 'node_id': 1}
+ ],
+ 'topology': {
+ 'params': {
+ 'generator': 'complete_graph',
+ 'n': 2
+ }
+ },
+ },
+ max_time=100,
+)
+
if __name__ == "__main__":
- from soil import Simulation
-
- s = Simulation(
- network_agents=[
- {"ids": [0], "agent_class": Fibonacci},
- {"ids": [1], "agent_class": Odds},
- ],
- network_params={"generator": "complete_graph", "n": 2},
- max_time=100,
- )
- s.run(dry_run=True)
+ simulation.run(dry_run=True)
diff --git a/examples/events_and_messages/cars.py b/examples/events_and_messages/cars.py
index 0f819c4..f37b88f 100644
--- a/examples/events_and_messages/cars.py
+++ b/examples/events_and_messages/cars.py
@@ -18,6 +18,7 @@ An example scenario could play like the following:
- If there are no more passengers available in the simulation, Drivers die
"""
from __future__ import annotations
+from typing import Optional
from soil import *
from soil import events
from mesa.space import MultiGrid
@@ -39,7 +40,7 @@ class Journey:
tip: float
passenger: Passenger
- driver: Driver = None
+ driver: Optional[Driver] = None
class City(EventedEnvironment):
@@ -239,5 +240,4 @@ simulation = Simulation(
)
if __name__ == "__main__":
- with easy(simulation) as s:
- s.run()
+ simulation.run()
\ No newline at end of file
diff --git a/examples/mesa/server.py b/examples/mesa/server.py
index ea00658..851f06d 100644
--- a/examples/mesa/server.py
+++ b/examples/mesa/server.py
@@ -111,4 +111,5 @@ server = ModularServer(
)
server.port = 8521
-server.launch(open_browser=False)
+if __name__ == '__main__':
+ server.launch(open_browser=False)
diff --git a/examples/mesa/social_wealth.py b/examples/mesa/social_wealth.py
index 8085543..de8a198 100644
--- a/examples/mesa/social_wealth.py
+++ b/examples/mesa/social_wealth.py
@@ -28,7 +28,7 @@ class MoneyAgent(MesaAgent):
It will only share wealth with neighbors based on grid proximity
"""
- def __init__(self, unique_id, model, wealth=1):
+ def __init__(self, unique_id, model, wealth=1, **kwargs):
super().__init__(unique_id=unique_id, model=model)
self.wealth = wealth
diff --git a/examples/programmatic/programmatic.py b/examples/programmatic/programmatic.py
index 0cb912f..9949117 100644
--- a/examples/programmatic/programmatic.py
+++ b/examples/programmatic/programmatic.py
@@ -10,32 +10,48 @@ def mygenerator():
# Add only a node
G = Graph()
G.add_node(1)
+ G.add_node(2)
return G
class MyAgent(agents.FSM):
+ times_run = 0
@agents.default_state
@agents.state
def neutral(self):
self.debug("I am running")
- if agents.prob(0.2):
+ if self.prob(0.2):
+ self.times_run += 1
self.info("This runs 2/10 times on average")
-s = Simulation(
+simulation = Simulation(
name="Programmatic",
- network_params={"generator": mygenerator},
+ model_params={
+ 'topology': {
+ 'params': {
+ 'generator': mygenerator
+ },
+ },
+ 'agents': {
+ 'distribution': [{
+ 'agent_class': MyAgent,
+ 'topology': True,
+ }]
+ }
+ },
+ seed='Program',
+ agent_reporters={'times_run': 'times_run'},
num_trials=1,
max_time=100,
- agent_class=MyAgent,
dry_run=True,
)
+if __name__ == "__main__":
+ # By default, logging will only print WARNING logs (and above).
+ # You need to choose a lower logging level to get INFO/DEBUG traces
+ logging.basicConfig(level=logging.INFO)
+ envs = simulation.run()
-# By default, logging will only print WARNING logs (and above).
-# You need to choose a lower logging level to get INFO/DEBUG traces
-logging.basicConfig(level=logging.INFO)
-envs = s.run()
-
-# Uncomment this to output the simulation to a YAML file
-# s.dump_yaml('simulation.yaml')
+ for agent in envs[0].agents:
+ print(agent.times_run)
diff --git a/examples/pubcrawl/pubcrawl.py b/examples/pubcrawl/pubcrawl.py
index be8a2b4..c7921de 100644
--- a/examples/pubcrawl/pubcrawl.py
+++ b/examples/pubcrawl/pubcrawl.py
@@ -170,6 +170,6 @@ class Police(FSM):
if __name__ == "__main__":
- from soil import simulation
+ from soil import run_from_config
- simulation.run_from_config("pubcrawl.yml", dry_run=True, dump=None, parallel=False)
+ run_from_config("pubcrawl.yml", dry_run=True, dump=None, parallel=False)
diff --git a/examples/rabbits/basic/rabbit_agents.py b/examples/rabbits/basic/rabbit_agents.py
index 4c0981b..709508f 100644
--- a/examples/rabbits/basic/rabbit_agents.py
+++ b/examples/rabbits/basic/rabbit_agents.py
@@ -5,6 +5,8 @@ import math
class RabbitEnv(Environment):
+ prob_death = 1e-100
+
@property
def num_rabbits(self):
return self.count_agents(agent_class=Rabbit)
@@ -129,7 +131,7 @@ class RandomAccident(BaseAgent):
if not rabbits_alive:
return self.die()
- prob_death = self.model.get("prob_death", 1e-100) * math.floor(
+ prob_death = self.model.prob_death * math.floor(
math.log10(max(1, rabbits_alive))
)
self.debug("Killing some rabbits with prob={}!".format(prob_death))
diff --git a/examples/random_delays/random_delays.py b/examples/random_delays/random_delays.py
index 1bed03e..e155b4e 100644
--- a/examples/random_delays/random_delays.py
+++ b/examples/random_delays/random_delays.py
@@ -31,11 +31,11 @@ class MyAgent(agents.FSM):
s = Simulation(
name="Programmatic",
- network_agents=[{"agent_class": MyAgent, "id": 0}],
- topology={"nodes": [{"id": 0}], "links": []},
+ model_params={
+ 'agents': [{'agent_class': MyAgent}],
+ },
num_trials=1,
max_time=100,
- agent_class=MyAgent,
dry_run=True,
)
diff --git a/examples/terrorism/TerroristNetworkModel.py b/examples/terrorism/TerroristNetworkModel.py
index 2da9d8f..9b7106e 100644
--- a/examples/terrorism/TerroristNetworkModel.py
+++ b/examples/terrorism/TerroristNetworkModel.py
@@ -108,14 +108,14 @@ class TerroristSpreadModel(FSM, Geo):
return
return self.leader
- def ego_search(self, steps=1, center=False, node=None, **kwargs):
+ def ego_search(self, steps=1, center=False, agent=None, **kwargs):
"""Get a list of nodes in the ego network of *node* of radius *steps*"""
- node = as_node(node if node is not None else self)
+ node = agent.node
G = self.subgraph(**kwargs)
return nx.ego_graph(G, node, center=center, radius=steps).nodes()
- def degree(self, node, force=False):
- node = as_node(node)
+ def degree(self, agent, force=False):
+ node = agent.node
if (
force
or (not hasattr(self.model, "_degree"))
@@ -125,8 +125,8 @@ class TerroristSpreadModel(FSM, Geo):
self.model._last_step = self.now
return self.model._degree[node]
- def betweenness(self, node, force=False):
- node = as_node(node)
+ def betweenness(self, agent, force=False):
+ node = agent.node
if (
force
or (not hasattr(self.model, "_betweenness"))
diff --git a/examples/tutorial/soil_tutorial.ipynb b/examples/tutorial/soil_tutorial.ipynb
index 7599ab2..76f8d49 100644
--- a/examples/tutorial/soil_tutorial.ipynb
+++ b/examples/tutorial/soil_tutorial.ipynb
@@ -216,13 +216,13 @@
" @soil.agents.state\n",
" def neutral(self):\n",
" r = random.random()\n",
- " if self['has_tv'] and r < self.env['prob_tv_spread']:\n",
+ " if self['has_tv'] and r < self.model['prob_tv_spread']:\n",
" return self.infected\n",
" return\n",
" \n",
" @soil.agents.state\n",
" def infected(self):\n",
- " prob_infect = self.env['prob_neighbor_spread']\n",
+ " prob_infect = self.model['prob_neighbor_spread']\n",
" for neighbor in self.get_neighboring_agents(state_id=self.neutral.id):\n",
" r = random.random()\n",
" if r < prob_infect:\n",
@@ -271,11 +271,11 @@
"class NewsEnvironmentAgent(soil.agents.NetworkAgent):\n",
" def step(self):\n",
" if self.now == self['event_time']:\n",
- " self.env['prob_tv_spread'] = 1\n",
- " self.env['prob_neighbor_spread'] = 1\n",
+ " self.model['prob_tv_spread'] = 1\n",
+ " self.model['prob_neighbor_spread'] = 1\n",
" elif self.now > self['event_time']:\n",
- " self.env['prob_tv_spread'] = self.env['prob_tv_spread'] * TV_FACTOR\n",
- " self.env['prob_neighbor_spread'] = self.env['prob_neighbor_spread'] * NEIGHBOR_FACTOR"
+ " self.model['prob_tv_spread'] = self.model['prob_tv_spread'] * TV_FACTOR\n",
+ " self.model['prob_neighbor_spread'] = self.model['prob_neighbor_spread'] * NEIGHBOR_FACTOR"
]
},
{
diff --git a/soil/VERSION b/soil/VERSION
index 2a41704..9866e9c 100644
--- a/soil/VERSION
+++ b/soil/VERSION
@@ -1 +1 @@
-0.30.0rc3
\ No newline at end of file
+0.30.0rc4
\ No newline at end of file
diff --git a/soil/__init__.py b/soil/__init__.py
index 3894897..eb9c232 100644
--- a/soil/__init__.py
+++ b/soil/__init__.py
@@ -1,6 +1,7 @@
from __future__ import annotations
import importlib
+from importlib.resources import path
import sys
import os
import logging
@@ -14,10 +15,12 @@ try:
except NameError:
basestring = str
+from pathlib import Path
from .agents import *
from . import agents
from .simulation import *
from .environment import Environment, EventedEnvironment
+from .datacollection import SoilCollector
from . import serialization
from .utils import logger
from .time import *
@@ -35,8 +38,10 @@ def main(
**kwargs,
):
+ sim = None
if isinstance(cfg, Simulation):
sim = cfg
+
import argparse
from . import simulation
diff --git a/soil/agents/BassModel.py b/soil/agents/BassModel.py
index 4410d82..6049bd5 100644
--- a/soil/agents/BassModel.py
+++ b/soil/agents/BassModel.py
@@ -22,10 +22,10 @@ class BassModel(FSM):
else:
aware_neighbors = self.get_neighbors(state_id=self.aware.id)
num_neighbors_aware = len(aware_neighbors)
- if self.prob((self["imitation_prob"] * num_neighbors_aware)):
+ if self.prob((self.imitation_prob * num_neighbors_aware)):
self.sentimentCorrelation = 1
return self.aware
@state
def aware(self):
- self.die()
+ self.die()
\ No newline at end of file
diff --git a/soil/agents/BigMarketModel.py b/soil/agents/BigMarketModel.py
deleted file mode 100644
index e606e0a..0000000
--- a/soil/agents/BigMarketModel.py
+++ /dev/null
@@ -1,118 +0,0 @@
-from . import FSM, state, default_state
-
-
-class BigMarketModel(FSM):
- """
- Settings:
- Names:
- enterprises [Array]
-
- tweet_probability_enterprises [Array]
- Users:
- tweet_probability_users
-
- tweet_relevant_probability
-
- tweet_probability_about [Array]
-
- sentiment_about [Array]
- """
-
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.enterprises = self.env.environment_params["enterprises"]
- self.type = ""
-
- if self.id < len(self.enterprises): # Enterprises
- self._set_state(self.enterprise.id)
- self.type = "Enterprise"
- self.tweet_probability = environment.environment_params[
- "tweet_probability_enterprises"
- ][self.id]
- else: # normal users
- self.type = "User"
- self._set_state(self.user.id)
- self.tweet_probability = environment.environment_params[
- "tweet_probability_users"
- ]
- self.tweet_relevant_probability = environment.environment_params[
- "tweet_relevant_probability"
- ]
- self.tweet_probability_about = environment.environment_params[
- "tweet_probability_about"
- ] # List
- self.sentiment_about = environment.environment_params[
- "sentiment_about"
- ] # List
-
- @state
- def enterprise(self):
-
- if self.random.random() < self.tweet_probability: # Tweets
- aware_neighbors = self.get_neighbors(
- state_id=self.number_of_enterprises
- ) # Nodes neighbour users
- for x in aware_neighbors:
- if self.random.uniform(0, 10) < 5:
- x.sentiment_about[self.id] += 0.1 # Increments for enterprise
- else:
- x.sentiment_about[self.id] -= 0.1 # Decrements for enterprise
-
- # Establecemos limites
- if x.sentiment_about[self.id] > 1:
- x.sentiment_about[self.id] = 1
- if x.sentiment_about[self.id] < -1:
- x.sentiment_about[self.id] = -1
-
- x.attrs[
- "sentiment_enterprise_%s" % self.enterprises[self.id]
- ] = x.sentiment_about[self.id]
-
- @state
- def user(self):
- if self.random.random() < self.tweet_probability: # Tweets
- if (
- self.random.random() < self.tweet_relevant_probability
- ): # Tweets something relevant
- # Tweet probability per enterprise
- for i in range(len(self.enterprises)):
- random_num = self.random.random()
- if random_num < self.tweet_probability_about[i]:
- # The condition is fulfilled, sentiments are evaluated towards that enterprise
- if self.sentiment_about[i] < 0:
- # NEGATIVO
- self.userTweets("negative", i)
- elif self.sentiment_about[i] == 0:
- # NEUTRO
- pass
- else:
- # POSITIVO
- self.userTweets("positive", i)
- for i in range(
- len(self.enterprises)
- ): # So that it never is set to 0 if there are not changes (logs)
- self.attrs[
- "sentiment_enterprise_%s" % self.enterprises[i]
- ] = self.sentiment_about[i]
-
- def userTweets(self, sentiment, enterprise):
- aware_neighbors = self.get_neighbors(
- state_id=self.number_of_enterprises
- ) # Nodes neighbours users
- for x in aware_neighbors:
- if sentiment == "positive":
- x.sentiment_about[enterprise] += 0.003
- elif sentiment == "negative":
- x.sentiment_about[enterprise] -= 0.003
- else:
- pass
-
- # Establecemos limites
- if x.sentiment_about[enterprise] > 1:
- x.sentiment_about[enterprise] = 1
- if x.sentiment_about[enterprise] < -1:
- x.sentiment_about[enterprise] = -1
-
- x.attrs[
- "sentiment_enterprise_%s" % self.enterprises[enterprise]
- ] = x.sentiment_about[enterprise]
diff --git a/soil/agents/Geo.py b/soil/agents/Geo.py
index d61d1ce..bede157 100644
--- a/soil/agents/Geo.py
+++ b/soil/agents/Geo.py
@@ -1,14 +1,14 @@
from scipy.spatial import cKDTree as KDTree
import networkx as nx
-from . import NetworkAgent, as_node
+from . import NetworkAgent
class Geo(NetworkAgent):
"""In this type of network, nodes have a "pos" attribute."""
- def geo_search(self, radius, node=None, center=False, **kwargs):
+ def geo_search(self, radius, agent=None, center=False, **kwargs):
"""Get a list of nodes whose coordinates are closer than *radius* to *node*."""
- node = as_node(node if node is not None else self)
+ node = agent.node
G = self.subgraph(**kwargs)
@@ -18,4 +18,4 @@ class Geo(NetworkAgent):
nodes, coords = list(zip(*pos.items()))
kdtree = KDTree(coords) # Cannot provide generator.
indices = kdtree.query_ball_point(pos[node], radius)
- return [nodes[i] for i in indices if center or (nodes[i] != node)]
+ return [nodes[i] for i in indices if center or (nodes[i] != node)]
\ No newline at end of file
diff --git a/soil/agents/IndependentCascadeModel.py b/soil/agents/IndependentCascadeModel.py
index e332b07..890a54e 100644
--- a/soil/agents/IndependentCascadeModel.py
+++ b/soil/agents/IndependentCascadeModel.py
@@ -1,7 +1,7 @@
-from . import BaseAgent
+from . import Agent, state, default_state
-class IndependentCascadeModel(BaseAgent):
+class IndependentCascadeModel(Agent):
"""
Settings:
innovation_prob
@@ -9,42 +9,22 @@ class IndependentCascadeModel(BaseAgent):
imitation_prob
"""
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.innovation_prob = self.env.environment_params["innovation_prob"]
- self.imitation_prob = self.env.environment_params["imitation_prob"]
- self.state["time_awareness"] = 0
- self.state["sentimentCorrelation"] = 0
+ time_awareness = 0
+ sentimentCorrelation = 0
- def step(self):
- self.behaviour()
+ # Outside effects
+ @default_state
+ @state
+ def outside(self):
+ if self.prob(self.model.innovation_prob):
+ self.sentimentCorrelation = 1
+ self.time_awareness = self.model.now # To know when they have been infected
+ return self.imitate
- def behaviour(self):
- aware_neighbors_1_time_step = []
- # Outside effects
- if self.prob(self.innovation_prob):
- if self.state["id"] == 0:
- self.state["id"] = 1
- self.state["sentimentCorrelation"] = 1
- self.state[
- "time_awareness"
- ] = self.env.now # To know when they have been infected
- else:
- pass
+ @state
+ def imitate(self):
+ aware_neighbors = self.get_neighbors(state_id=1, time_awareness=self.now-1)
- return
-
- # Imitation effects
- if self.state["id"] == 0:
- aware_neighbors = self.get_neighbors(state_id=1)
- for x in aware_neighbors:
- if x.state["time_awareness"] == (self.env.now - 1):
- aware_neighbors_1_time_step.append(x)
- num_neighbors_aware = len(aware_neighbors_1_time_step)
- if self.prob(self.imitation_prob * num_neighbors_aware):
- self.state["id"] = 1
- self.state["sentimentCorrelation"] = 1
- else:
- pass
-
- return
+ if self.prob(self.model.imitation_prob * len(aware_neighbors)):
+ self.sentimentCorrelation = 1
+ return self.outside
\ No newline at end of file
diff --git a/soil/agents/ModelM2.py b/soil/agents/ModelM2.py
deleted file mode 100644
index 4fac2b8..0000000
--- a/soil/agents/ModelM2.py
+++ /dev/null
@@ -1,270 +0,0 @@
-import numpy as np
-from . import BaseAgent
-
-
-class SpreadModelM2(BaseAgent):
- """
- Settings:
- prob_neutral_making_denier
-
- prob_infect
-
- prob_cured_healing_infected
-
- prob_cured_vaccinate_neutral
-
- prob_vaccinated_healing_infected
-
- prob_vaccinated_vaccinate_neutral
-
- prob_generate_anti_rumor
- """
-
- def __init__(self, model=None, unique_id=0, state=()):
- super().__init__(model=environment, unique_id=unique_id, state=state)
-
- # Use a single generator with the same seed as `self.random`
- random = np.random.default_rng(seed=self._seed)
- self.prob_neutral_making_denier = random.normal(
- environment.environment_params["prob_neutral_making_denier"],
- environment.environment_params["standard_variance"],
- )
-
- self.prob_infect = random.normal(
- environment.environment_params["prob_infect"],
- environment.environment_params["standard_variance"],
- )
-
- self.prob_cured_healing_infected = random.normal(
- environment.environment_params["prob_cured_healing_infected"],
- environment.environment_params["standard_variance"],
- )
- self.prob_cured_vaccinate_neutral = random.normal(
- environment.environment_params["prob_cured_vaccinate_neutral"],
- environment.environment_params["standard_variance"],
- )
-
- self.prob_vaccinated_healing_infected = random.normal(
- environment.environment_params["prob_vaccinated_healing_infected"],
- environment.environment_params["standard_variance"],
- )
- self.prob_vaccinated_vaccinate_neutral = random.normal(
- environment.environment_params["prob_vaccinated_vaccinate_neutral"],
- environment.environment_params["standard_variance"],
- )
- self.prob_generate_anti_rumor = random.normal(
- environment.environment_params["prob_generate_anti_rumor"],
- environment.environment_params["standard_variance"],
- )
-
- def step(self):
-
- if self.state["id"] == 0: # Neutral
- self.neutral_behaviour()
- elif self.state["id"] == 1: # Infected
- self.infected_behaviour()
- elif self.state["id"] == 2: # Cured
- self.cured_behaviour()
- elif self.state["id"] == 3: # Vaccinated
- self.vaccinated_behaviour()
-
- def neutral_behaviour(self):
-
- # Infected
- infected_neighbors = self.get_neighbors(state_id=1)
- if len(infected_neighbors) > 0:
- if self.prob(self.prob_neutral_making_denier):
- self.state["id"] = 3 # Vaccinated making denier
-
- def infected_behaviour(self):
-
- # Neutral
- neutral_neighbors = self.get_neighbors(state_id=0)
- for neighbor in neutral_neighbors:
- if self.prob(self.prob_infect):
- neighbor.state["id"] = 1 # Infected
-
- def cured_behaviour(self):
-
- # Vaccinate
- neutral_neighbors = self.get_neighbors(state_id=0)
- for neighbor in neutral_neighbors:
- if self.prob(self.prob_cured_vaccinate_neutral):
- neighbor.state["id"] = 3 # Vaccinated
-
- # Cure
- infected_neighbors = self.get_neighbors(state_id=1)
- for neighbor in infected_neighbors:
- if self.prob(self.prob_cured_healing_infected):
- neighbor.state["id"] = 2 # Cured
-
- def vaccinated_behaviour(self):
-
- # Cure
- infected_neighbors = self.get_neighbors(state_id=1)
- for neighbor in infected_neighbors:
- if self.prob(self.prob_cured_healing_infected):
- neighbor.state["id"] = 2 # Cured
-
- # Vaccinate
- neutral_neighbors = self.get_neighbors(state_id=0)
- for neighbor in neutral_neighbors:
- if self.prob(self.prob_cured_vaccinate_neutral):
- neighbor.state["id"] = 3 # Vaccinated
-
- # Generate anti-rumor
- infected_neighbors_2 = self.get_neighbors(state_id=1)
- for neighbor in infected_neighbors_2:
- if self.prob(self.prob_generate_anti_rumor):
- neighbor.state["id"] = 2 # Cured
-
-
-class ControlModelM2(BaseAgent):
- """
- Settings:
- prob_neutral_making_denier
-
- prob_infect
-
- prob_cured_healing_infected
-
- prob_cured_vaccinate_neutral
-
- prob_vaccinated_healing_infected
-
- prob_vaccinated_vaccinate_neutral
-
- prob_generate_anti_rumor
- """
-
- def __init__(self, model=None, unique_id=0, state=()):
- super().__init__(model=environment, unique_id=unique_id, state=state)
-
- self.prob_neutral_making_denier = np.random.normal(
- environment.environment_params["prob_neutral_making_denier"],
- environment.environment_params["standard_variance"],
- )
-
- self.prob_infect = np.random.normal(
- environment.environment_params["prob_infect"],
- environment.environment_params["standard_variance"],
- )
-
- self.prob_cured_healing_infected = np.random.normal(
- environment.environment_params["prob_cured_healing_infected"],
- environment.environment_params["standard_variance"],
- )
- self.prob_cured_vaccinate_neutral = np.random.normal(
- environment.environment_params["prob_cured_vaccinate_neutral"],
- environment.environment_params["standard_variance"],
- )
-
- self.prob_vaccinated_healing_infected = np.random.normal(
- environment.environment_params["prob_vaccinated_healing_infected"],
- environment.environment_params["standard_variance"],
- )
- self.prob_vaccinated_vaccinate_neutral = np.random.normal(
- environment.environment_params["prob_vaccinated_vaccinate_neutral"],
- environment.environment_params["standard_variance"],
- )
- self.prob_generate_anti_rumor = np.random.normal(
- environment.environment_params["prob_generate_anti_rumor"],
- environment.environment_params["standard_variance"],
- )
-
- def step(self):
-
- if self.state["id"] == 0: # Neutral
- self.neutral_behaviour()
- elif self.state["id"] == 1: # Infected
- self.infected_behaviour()
- elif self.state["id"] == 2: # Cured
- self.cured_behaviour()
- elif self.state["id"] == 3: # Vaccinated
- self.vaccinated_behaviour()
- elif self.state["id"] == 4: # Beacon-off
- self.beacon_off_behaviour()
- elif self.state["id"] == 5: # Beacon-on
- self.beacon_on_behaviour()
-
- def neutral_behaviour(self):
- self.state["visible"] = False
-
- # Infected
- infected_neighbors = self.get_neighbors(state_id=1)
- if len(infected_neighbors) > 0:
- if self.random(self.prob_neutral_making_denier):
- self.state["id"] = 3 # Vaccinated making denier
-
- def infected_behaviour(self):
-
- # Neutral
- neutral_neighbors = self.get_neighbors(state_id=0)
- for neighbor in neutral_neighbors:
- if self.prob(self.prob_infect):
- neighbor.state["id"] = 1 # Infected
- self.state["visible"] = False
-
- def cured_behaviour(self):
-
- self.state["visible"] = True
- # Vaccinate
- neutral_neighbors = self.get_neighbors(state_id=0)
- for neighbor in neutral_neighbors:
- if self.prob(self.prob_cured_vaccinate_neutral):
- neighbor.state["id"] = 3 # Vaccinated
-
- # Cure
- infected_neighbors = self.get_neighbors(state_id=1)
- for neighbor in infected_neighbors:
- if self.prob(self.prob_cured_healing_infected):
- neighbor.state["id"] = 2 # Cured
-
- def vaccinated_behaviour(self):
- self.state["visible"] = True
-
- # Cure
- infected_neighbors = self.get_neighbors(state_id=1)
- for neighbor in infected_neighbors:
- if self.prob(self.prob_cured_healing_infected):
- neighbor.state["id"] = 2 # Cured
-
- # Vaccinate
- neutral_neighbors = self.get_neighbors(state_id=0)
- for neighbor in neutral_neighbors:
- if self.prob(self.prob_cured_vaccinate_neutral):
- neighbor.state["id"] = 3 # Vaccinated
-
- # Generate anti-rumor
- infected_neighbors_2 = self.get_neighbors(state_id=1)
- for neighbor in infected_neighbors_2:
- if self.prob(self.prob_generate_anti_rumor):
- neighbor.state["id"] = 2 # Cured
-
- def beacon_off_behaviour(self):
- self.state["visible"] = False
- infected_neighbors = self.get_neighbors(state_id=1)
- if len(infected_neighbors) > 0:
- self.state["id"] == 5 # Beacon on
-
- def beacon_on_behaviour(self):
- self.state["visible"] = False
- # Cure (M2 feature added)
- infected_neighbors = self.get_neighbors(state_id=1)
- for neighbor in infected_neighbors:
- if self.prob(self.prob_generate_anti_rumor):
- neighbor.state["id"] = 2 # Cured
- neutral_neighbors_infected = neighbor.get_neighbors(state_id=0)
- for neighbor in neutral_neighbors_infected:
- if self.prob(self.prob_generate_anti_rumor):
- neighbor.state["id"] = 3 # Vaccinated
- infected_neighbors_infected = neighbor.get_neighbors(state_id=1)
- for neighbor in infected_neighbors_infected:
- if self.prob(self.prob_generate_anti_rumor):
- neighbor.state["id"] = 2 # Cured
-
- # Vaccinate
- neutral_neighbors = self.get_neighbors(state_id=0)
- for neighbor in neutral_neighbors:
- if self.prob(self.prob_cured_vaccinate_neutral):
- neighbor.state["id"] = 3 # Vaccinated
diff --git a/soil/agents/SISaModel.py b/soil/agents/SISaModel.py
index 45d9328..b5dbbe3 100644
--- a/soil/agents/SISaModel.py
+++ b/soil/agents/SISaModel.py
@@ -1,8 +1,9 @@
import numpy as np
-from . import FSM, state
+from hashlib import sha512
+from . import Agent, state, default_state
-class SISaModel(FSM):
+class SISaModel(Agent):
"""
Settings:
neutral_discontent_spon_prob
@@ -28,38 +29,45 @@ class SISaModel(FSM):
standard_variance
"""
- def __init__(self, environment, unique_id=0, state=()):
- super().__init__(model=environment, unique_id=unique_id, state=state)
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
- random = np.random.default_rng(seed=self._seed)
+ seed = self.model._seed
+ if isinstance(seed, (str, bytes, bytearray)):
+ if isinstance(seed, str):
+ seed = seed.encode()
+ seed = int.from_bytes(seed + sha512(seed).digest(), 'big')
+
+ random = np.random.default_rng(seed=seed)
self.neutral_discontent_spon_prob = random.normal(
- self.env["neutral_discontent_spon_prob"], self.env["standard_variance"]
+ self.model.neutral_discontent_spon_prob, self.model.standard_variance
)
self.neutral_discontent_infected_prob = random.normal(
- self.env["neutral_discontent_infected_prob"], self.env["standard_variance"]
+ self.model.neutral_discontent_infected_prob, self.model.standard_variance
)
self.neutral_content_spon_prob = random.normal(
- self.env["neutral_content_spon_prob"], self.env["standard_variance"]
+ self.model.neutral_content_spon_prob, self.model.standard_variance
)
self.neutral_content_infected_prob = random.normal(
- self.env["neutral_content_infected_prob"], self.env["standard_variance"]
+ self.model.neutral_content_infected_prob, self.model.standard_variance
)
self.discontent_neutral = random.normal(
- self.env["discontent_neutral"], self.env["standard_variance"]
+ self.model.discontent_neutral, self.model.standard_variance
)
self.discontent_content = random.normal(
- self.env["discontent_content"], self.env["variance_d_c"]
+ self.model.discontent_content, self.model.variance_d_c
)
self.content_discontent = random.normal(
- self.env["content_discontent"], self.env["variance_c_d"]
+ self.model.content_discontent, self.model.variance_c_d
)
self.content_neutral = random.normal(
- self.env["content_neutral"], self.env["standard_variance"]
+ self.model.discontent_neutral, self.model.standard_variance
)
+ @default_state
@state
def neutral(self):
# Spontaneous effects
@@ -70,10 +78,10 @@ class SISaModel(FSM):
# Infected
discontent_neighbors = self.count_neighbors(state_id=self.discontent)
- if self.prob(scontent_neighbors * self.neutral_discontent_infected_prob):
+ if self.prob(discontent_neighbors * self.neutral_discontent_infected_prob):
return self.discontent
content_neighbors = self.count_neighbors(state_id=self.content.id)
- if self.prob(s * self.neutral_content_infected_prob):
+ if self.prob(content_neighbors * self.neutral_content_infected_prob):
return self.content
return self.neutral
@@ -85,7 +93,7 @@ class SISaModel(FSM):
# Superinfected
content_neighbors = self.count_neighbors(state_id=self.content.id)
- if self.prob(s * self.discontent_content):
+ if self.prob(content_neighbors * self.discontent_content):
return self.content
return self.discontent
@@ -97,6 +105,6 @@ class SISaModel(FSM):
# Superinfected
discontent_neighbors = self.count_neighbors(state_id=self.discontent.id)
- if self.prob(scontent_neighbors * self.content_discontent):
+ if self.prob(discontent_neighbors * self.content_discontent):
self.discontent
return self.content
diff --git a/soil/agents/SentimentCorrelationModel.py b/soil/agents/SentimentCorrelationModel.py
deleted file mode 100644
index 751a59a..0000000
--- a/soil/agents/SentimentCorrelationModel.py
+++ /dev/null
@@ -1,115 +0,0 @@
-from . import BaseAgent
-
-
-class SentimentCorrelationModel(BaseAgent):
- """
- Settings:
- outside_effects_prob
-
- anger_prob
-
- joy_prob
-
- sadness_prob
-
- disgust_prob
- """
-
- def __init__(self, environment, unique_id=0, state=()):
- super().__init__(model=environment, unique_id=unique_id, state=state)
- self.outside_effects_prob = environment.environment_params[
- "outside_effects_prob"
- ]
- self.anger_prob = environment.environment_params["anger_prob"]
- self.joy_prob = environment.environment_params["joy_prob"]
- self.sadness_prob = environment.environment_params["sadness_prob"]
- self.disgust_prob = environment.environment_params["disgust_prob"]
- self.state["time_awareness"] = []
- for i in range(4): # In this model we have 4 sentiments
- self.state["time_awareness"].append(
- 0
- ) # 0-> Anger, 1-> joy, 2->sadness, 3 -> disgust
- self.state["sentimentCorrelation"] = 0
-
- def step(self):
- self.behaviour()
-
- def behaviour(self):
-
- angry_neighbors_1_time_step = []
- joyful_neighbors_1_time_step = []
- sad_neighbors_1_time_step = []
- disgusted_neighbors_1_time_step = []
-
- angry_neighbors = self.get_neighbors(state_id=1)
- for x in angry_neighbors:
- if x.state["time_awareness"][0] > (self.env.now - 500):
- angry_neighbors_1_time_step.append(x)
- num_neighbors_angry = len(angry_neighbors_1_time_step)
-
- joyful_neighbors = self.get_neighbors(state_id=2)
- for x in joyful_neighbors:
- if x.state["time_awareness"][1] > (self.env.now - 500):
- joyful_neighbors_1_time_step.append(x)
- num_neighbors_joyful = len(joyful_neighbors_1_time_step)
-
- sad_neighbors = self.get_neighbors(state_id=3)
- for x in sad_neighbors:
- if x.state["time_awareness"][2] > (self.env.now - 500):
- sad_neighbors_1_time_step.append(x)
- num_neighbors_sad = len(sad_neighbors_1_time_step)
-
- disgusted_neighbors = self.get_neighbors(state_id=4)
- for x in disgusted_neighbors:
- if x.state["time_awareness"][3] > (self.env.now - 500):
- disgusted_neighbors_1_time_step.append(x)
- num_neighbors_disgusted = len(disgusted_neighbors_1_time_step)
-
- anger_prob = self.anger_prob + (
- len(angry_neighbors_1_time_step) * self.anger_prob
- )
- joy_prob = self.joy_prob + (len(joyful_neighbors_1_time_step) * self.joy_prob)
- sadness_prob = self.sadness_prob + (
- len(sad_neighbors_1_time_step) * self.sadness_prob
- )
- disgust_prob = self.disgust_prob + (
- len(disgusted_neighbors_1_time_step) * self.disgust_prob
- )
- outside_effects_prob = self.outside_effects_prob
-
- num = self.random.random()
-
- if num < outside_effects_prob:
- self.state["id"] = self.random.randint(1, 4)
-
- self.state["sentimentCorrelation"] = self.state[
- "id"
- ] # It is stored when it has been infected for the dynamic network
- self.state["time_awareness"][self.state["id"] - 1] = self.env.now
- self.state["sentiment"] = self.state["id"]
-
- if num < anger_prob:
-
- self.state["id"] = 1
- self.state["sentimentCorrelation"] = 1
- self.state["time_awareness"][self.state["id"] - 1] = self.env.now
- elif num < joy_prob + anger_prob and num > anger_prob:
-
- self.state["id"] = 2
- self.state["sentimentCorrelation"] = 2
- self.state["time_awareness"][self.state["id"] - 1] = self.env.now
- elif num < sadness_prob + anger_prob + joy_prob and num > joy_prob + anger_prob:
-
- self.state["id"] = 3
- self.state["sentimentCorrelation"] = 3
- self.state["time_awareness"][self.state["id"] - 1] = self.env.now
- elif (
- num < disgust_prob + sadness_prob + anger_prob + joy_prob
- and num > sadness_prob + anger_prob + joy_prob
- ):
-
- self.state["id"] = 4
- self.state["sentimentCorrelation"] = 4
- self.state["time_awareness"][self.state["id"] - 1] = self.env.now
-
- self.state["sentiment"] = self.state["id"]
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index 9cf168a..f21ce98 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -555,9 +555,9 @@ def _from_fixed(
def _from_distro(
distro: List[config.AgentDistro],
n: int,
- topology: str,
default: config.SingleAgentConfig,
random,
+ topology: str = None
) -> List[Dict[str, Any]]:
agents = []
@@ -621,19 +621,18 @@ def _from_distro(
from .network_agents import *
from .fsm import *
from .evented import *
+
+
+class Agent(NetworkAgent, FSM, EventedAgent):
+ """Default agent class, has both network and event capabilities"""
+
+
from .BassModel import *
-from .BigMarketModel import *
from .IndependentCascadeModel import *
-from .ModelM2 import *
-from .SentimentCorrelationModel import *
from .SISaModel import *
from .CounterModel import *
-class Agent(NetworkAgent, EventedAgent):
- """Default agent class, has both network and event capabilities"""
-
-
try:
import scipy
from .Geo import Geo
diff --git a/soil/agents/network_agents.py b/soil/agents/network_agents.py
index 090a3a4..507be40 100644
--- a/soil/agents/network_agents.py
+++ b/soil/agents/network_agents.py
@@ -14,8 +14,11 @@ class NetworkAgent(BaseAgent):
def count_neighbors(self, state_id=None, **kwargs):
return len(self.get_neighbors(state_id=state_id, **kwargs))
+ def iter_neighbors(self, **kwargs):
+ return self.iter_agents(limit_neighbors=True, **kwargs)
+
def get_neighbors(self, **kwargs):
- return list(self.iter_agents(limit_neighbors=True, **kwargs))
+ return list(self.iter_neighbors())
@property
def node(self):
diff --git a/soil/config.py b/soil/config.py
index 8dbbffa..a143f6f 100644
--- a/soil/config.py
+++ b/soil/config.py
@@ -37,13 +37,8 @@ class Topology(BaseModel):
links: List[Edge]
-class NetParams(BaseModel, extra=Extra.allow):
- generator: Union[Callable, str]
- n: int
-
-
class NetConfig(BaseModel):
- params: Optional[NetParams]
+ params: Optional[Dict[str, Any]]
fixed: Optional[Union[Topology, nx.Graph]]
path: Optional[str]
@@ -135,9 +130,11 @@ class Config(BaseModel, extra=Extra.allow):
num_trials: int = 1
max_time: float = 100
max_steps: int = -1
+ num_processes: int = 1
interval: float = 1
seed: str = ""
dry_run: bool = False
+ skip_test: bool = False
model_class: Union[Type, str] = environment.Environment
model_params: Optional[Dict[str, Any]] = {}
diff --git a/soil/datacollection.py b/soil/datacollection.py
index dea9f1d..e054640 100644
--- a/soil/datacollection.py
+++ b/soil/datacollection.py
@@ -1,6 +1,17 @@
from mesa import DataCollector as MDC
-class SoilDataCollector(MDC):
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
+class SoilCollector(MDC):
+ def __init__(self, model_reporters=None, agent_reporters=None, tables=None, **kwargs):
+ model_reporters = model_reporters or {}
+ agent_reporters = agent_reporters or {}
+ tables = tables or {}
+ if 'agent_count' not in model_reporters:
+ model_reporters['agent_count'] = lambda m: m.schedule.get_agent_count()
+ if 'state_id' not in agent_reporters:
+ agent_reporters['agent_id'] = lambda agent: agent.get('state_id', None)
+
+ super().__init__(model_reporters=model_reporters,
+ agent_reporters=agent_reporters,
+ tables=tables,
+ **kwargs)
diff --git a/soil/environment.py b/soil/environment.py
index aa61d43..6e622bf 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -6,7 +6,7 @@ import math
import logging
import inspect
-from typing import Any, Dict, Optional, Union
+from typing import Any, Dict, Optional, Union, List
from collections import namedtuple
from time import time as current_time
from copy import deepcopy
@@ -16,9 +16,8 @@ from networkx.readwrite import json_graph
import networkx as nx
from mesa import Model
-from mesa.datacollection import DataCollector
-from . import agents as agentmod, config, serialization, utils, time, network, events
+from . import agents as agentmod, config, datacollection, serialization, utils, time, network, events
class BaseEnvironment(Model):
@@ -42,7 +41,8 @@ class BaseEnvironment(Model):
dir_path=None,
interval=1,
agent_class=None,
- agents: [tuple[type, Dict[str, Any]]] = {},
+ agents: List[tuple[type, Dict[str, Any]]] = {},
+ collector_class: type = datacollection.SoilCollector,
agent_reporters: Optional[Any] = None,
model_reporters: Optional[Any] = None,
tables: Optional[Any] = None,
@@ -50,7 +50,6 @@ class BaseEnvironment(Model):
):
super().__init__(seed=seed)
- self.env_params = env_params or {}
self.current_id = -1
@@ -71,11 +70,14 @@ class BaseEnvironment(Model):
self.logger = utils.logger.getChild(self.id)
- self.datacollector = DataCollector(
+ collector_class = serialization.deserialize(collector_class)
+ self.datacollector = collector_class(
model_reporters=model_reporters,
agent_reporters=agent_reporters,
tables=tables,
)
+ for (k, v) in env_params.items():
+ self[k] = v
def _agent_from_dict(self, agent):
"""
@@ -89,7 +91,7 @@ class BaseEnvironment(Model):
return serialization.deserialize(cls)(unique_id=unique_id, model=self, **agent)
- def init_agents(self, agents: Union[config.AgentConfig, [Dict[str, Any]]] = {}):
+ def init_agents(self, agents: Union[config.AgentConfig, List[Dict[str, Any]]] = {}):
"""
Initialize the agents in the model from either a `soil.config.AgentConfig` or a list of
dictionaries that each describes an agent.
@@ -170,31 +172,41 @@ class BaseEnvironment(Model):
Advance one step in the simulation, and update the data collection and scheduler appropriately
"""
super().step()
- self.logger.info(
- f"--- Step: {self.schedule.steps:^5} - Time: {self.now:^5} ---"
- )
+ # self.logger.info(
+ # "--- Step: {:^5} - Time: {now:^5} ---", steps=self.schedule.steps, now=self.now
+ # )
self.schedule.step()
self.datacollector.collect(self)
- def __contains__(self, key):
- return key in self.env_params
-
- def get(self, key, default=None):
- """
- Get the value of an environment attribute.
- Return `default` if the value is not set.
- """
- return self.env_params.get(key, default)
-
def __getitem__(self, key):
- return self.env_params.get(key)
+ try:
+ return getattr(self, key)
+ except AttributeError:
+ raise KeyError(f"key {key} not found in environment")
+
+ def __delitem__(self, key):
+ return delattr(self, key)
+
+ def __contains__(self, key):
+ return hasattr(self, key)
def __setitem__(self, key, value):
- return self.env_params.__setitem__(key, value)
+ setattr(self, key, value)
def __str__(self):
- return str(self.env_params)
+ return str(dict(self))
+ def __len__(self):
+ return sum(1 for n in self.keys())
+
+ def __iter__(self):
+ return iter(self.agents())
+
+ def get(self, key, default=None):
+ return self[key] if key in self else default
+
+ def keys(self):
+ return (k for k in self.__dict__ if k[0] != "_")
class NetworkEnvironment(BaseEnvironment):
"""
@@ -208,7 +220,12 @@ class NetworkEnvironment(BaseEnvironment):
agents = kwargs.pop("agents", None)
super().__init__(*args, agents=None, **kwargs)
- self._set_topology(topology)
+ if topology is None:
+ topology = nx.Graph()
+ elif not isinstance(topology, nx.Graph):
+ topology = network.from_config(topology, dir_path=self.dir_path)
+
+ self.G = topology
self.init_agents(agents)
@@ -216,14 +233,14 @@ class NetworkEnvironment(BaseEnvironment):
"""Initialize the agents from a"""
super().init_agents(*args, **kwargs)
for agent in self.schedule._agents.values():
- if hasattr(agent, "node_id"):
- self._init_node(agent)
+ self._init_node(agent)
def _init_node(self, agent):
"""
Make sure the node for a given agent has the proper attributes.
"""
- self.G.nodes[agent.node_id]["agent"] = agent
+ if hasattr(agent, "node_id"):
+ self.G.nodes[agent.node_id]["agent"] = agent
def _agent_dict_from_config(self, cfg):
return agentmod.from_config(cfg, topology=self.G, random=self.random)
@@ -244,6 +261,7 @@ class NetworkEnvironment(BaseEnvironment):
agent["unique_id"] = unique_id
agent["topology"] = self.G
node_attrs = self.G.nodes[node_id]
+ node_attrs.pop('agent', None)
node_attrs.update(agent)
agent = node_attrs
@@ -252,17 +270,9 @@ class NetworkEnvironment(BaseEnvironment):
return a
- def _set_topology(self, cfg=None, dir_path=None):
- if cfg is None:
- cfg = nx.Graph()
- elif not isinstance(cfg, nx.Graph):
- cfg = network.from_config(cfg, dir_path=dir_path or self.dir_path)
-
- self.G = cfg
-
@property
def network_agents(self):
- for a in self.schedule._agents:
+ for a in self.schedule._agents.values():
if isinstance(a, agentmod.NetworkAgent):
yield a
@@ -294,7 +304,7 @@ class NetworkEnvironment(BaseEnvironment):
def add_agent(self, *args, **kwargs):
a = super().add_agent(*args, **kwargs)
- if "node_id" in a:
+ if hasattr(a, "node_id"):
assert self.G.nodes[a.node_id]["agent"] == a
return a
@@ -309,7 +319,7 @@ class NetworkEnvironment(BaseEnvironment):
if "agent" in node:
continue
a_class = self.random.choices(agent_class, weights)[0]
- self.add_agent(node_id=node_id, agent_class=a_class, **agent_params)
+ self.add_agent(node_id=node_id, topology=self.G, agent_class=a_class, **agent_params)
class EventedEnvironment(BaseEnvironment):
diff --git a/soil/exporters.py b/soil/exporters.py
index 6efe70a..783d663 100644
--- a/soil/exporters.py
+++ b/soil/exporters.py
@@ -104,17 +104,15 @@ def get_dc_dfs(dc, trial_id=None):
yield from dfs.items()
-class default(Exporter):
- """Default exporter. Writes sqlite results, as well as the simulation YAML"""
+class SQLite(Exporter):
+ """Writes sqlite results"""
def sim_start(self):
if self.dry_run:
logger.info("NOT dumping results")
return
- logger.info("Dumping results to %s", self.outdir)
- with self.output(self.simulation.name + ".dumped.yml") as f:
- f.write(self.simulation.to_yaml())
self.dbpath = os.path.join(self.outdir, f"{self.simulation.name}.sqlite")
+ logger.info("Dumping results to %s", self.dbpath)
try_backup(self.dbpath, remove=True)
def trial_end(self, env):
@@ -131,7 +129,6 @@ class default(Exporter):
for (t, df) in self.get_dfs(env):
df.to_sql(t, con=engine, if_exists="append")
-
class csv(Exporter):
"""Export the state of each environment (and its agents) in a separate CSV file"""
@@ -199,15 +196,61 @@ class summary(Exporter):
"""Print a summary of each trial to sys.stdout"""
def trial_end(self, env):
+ msg = ""
for (t, df) in self.get_dfs(env):
if not len(df):
continue
- msg = indent(str(df.describe()), " ")
- logger.info(
- dedent(
- f"""
+ tabs = "\t" * 2
+ description = indent(str(df.describe()), tabs)
+ last_line = indent(str(df.iloc[-1:]), tabs)
+ # value_counts = indent(str(df.value_counts()), tabs)
+ value_counts = indent(str(df.apply(lambda x: x.value_counts()).T.stack()), tabs)
+
+ msg += dedent("""
Dataframe {t}:
- """
- )
- + msg
- )
+ Last line: :
+ {last_line}
+
+ Description:
+ {description}
+
+ Value counts:
+ {value_counts}
+
+ """).format(**locals())
+ logger.info(msg)
+
+class YAML(Exporter):
+ """Writes the configuration of the simulation to a YAML file"""
+
+ def sim_start(self):
+ if self.dry_run:
+ logger.info("NOT dumping results")
+ return
+ with self.output(self.simulation.name + ".dumped.yml") as f:
+ logger.info(f"Dumping simulation configuration to {self.outdir}")
+ f.write(self.simulation.to_yaml())
+
+class default(Exporter):
+ """Default exporter. Writes sqlite results, as well as the simulation YAML"""
+
+ def __init__(self, *args, exporter_cls=[], **kwargs):
+ exporter_cls = exporter_cls or [YAML, SQLite, summary]
+ self.inner = [cls(*args, **kwargs) for cls in exporter_cls]
+
+ def sim_start(self):
+ for exporter in self.inner:
+ exporter.sim_start()
+
+ def sim_end(self):
+ for exporter in self.inner:
+ exporter.sim_end()
+
+ def trial_start(self, env):
+ for exporter in self.inner:
+ exporter.trial_start(env)
+
+
+ def trial_end(self, env):
+ for exporter in self.inner:
+ exporter.trial_end(env)
\ No newline at end of file
diff --git a/soil/network.py b/soil/network.py
index a717021..c792755 100644
--- a/soil/network.py
+++ b/soil/network.py
@@ -30,7 +30,7 @@ def from_config(cfg: config.NetConfig, dir_path: str = None):
return method(path, **kwargs)
if cfg.params:
- net_args = cfg.params.dict()
+ net_args = dict(cfg.params)
net_gen = net_args.pop("generator")
if dir_path not in sys.path:
diff --git a/soil/serialization.py b/soil/serialization.py
index cd34a02..8010f8b 100644
--- a/soil/serialization.py
+++ b/soil/serialization.py
@@ -146,7 +146,10 @@ def serialize(v, known_modules=KNOWN_MODULES):
def serialize_dict(d, known_modules=KNOWN_MODULES):
- d = dict(d)
+ try:
+ d = dict(d)
+ except (ValueError, TypeError) as ex:
+ return serialize(d)[0]
for (k, v) in d.items():
if isinstance(v, dict):
d[k] = serialize_dict(v, known_modules=known_modules)
diff --git a/soil/simulation.py b/soil/simulation.py
index 75947de..451ec88 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -48,12 +48,17 @@ class Simulation:
max_steps: int = -1
interval: int = 1
num_trials: int = 1
- parallel: Optional[bool] = None
- exporters: Optional[List[str]] = field(default_factory=list)
+ num_processes: Optional[int] = 1
+ parallel: Optional[bool] = False
+ exporters: Optional[List[str]] = field(default_factory=lambda: [exporters.default])
+ model_reporters: Optional[Dict[str, Any]] = field(default_factory=dict)
+ agent_reporters: Optional[Dict[str, Any]] = field(default_factory=dict)
+ tables: Optional[Dict[str, Any]] = field(default_factory=dict)
outdir: Optional[str] = None
exporter_params: Optional[Dict[str, Any]] = field(default_factory=dict)
dry_run: bool = False
extra: Dict[str, Any] = field(default_factory=dict)
+ skip_test: Optional[bool] = False
@classmethod
def from_dict(cls, env, **kwargs):
@@ -89,7 +94,7 @@ class Simulation:
def run_gen(
self,
- parallel=False,
+ num_processes=1,
dry_run=None,
exporters=None,
outdir=None,
@@ -128,7 +133,7 @@ class Simulation:
for env in utils.run_parallel(
func=self.run_trial,
iterable=range(int(self.num_trials)),
- parallel=parallel,
+ num_processes=num_processes,
log_level=log_level,
**kwargs,
):
@@ -158,8 +163,12 @@ class Simulation:
params.update(model_params)
params.update(kwargs)
- agent_reporters = deserialize_reporters(params.pop("agent_reporters", {}))
- model_reporters = deserialize_reporters(params.pop("model_reporters", {}))
+ agent_reporters = self.agent_reporters.copy()
+ agent_reporters.update(deserialize_reporters(params.pop("agent_reporters", {})))
+ model_reporters = self.model_reporters.copy()
+ model_reporters.update(deserialize_reporters(params.pop("model_reporters", {})))
+ tables = self.tables.copy()
+ tables.update(deserialize_reporters(params.pop("tables", {})))
env = serialization.deserialize(self.model_class)
return env(
@@ -168,6 +177,7 @@ class Simulation:
dir_path=self.dir_path,
agent_reporters=agent_reporters,
model_reporters=model_reporters,
+ tables=tables,
**params,
)
@@ -234,12 +244,7 @@ Model stats:
def to_dict(self):
d = asdict(self)
- if not isinstance(d["model_class"], str):
- d["model_class"] = serialization.name(d["model_class"])
- d["model_params"] = serialization.serialize_dict(d["model_params"])
- d["dir_path"] = str(d["dir_path"])
- d["version"] = "2"
- return d
+ return serialization.serialize_dict(d)
def to_yaml(self):
return yaml.dump(self.to_dict())
@@ -261,6 +266,24 @@ def from_config(conf_or_path):
raise AttributeError("Provide only one configuration")
return lst[0]
+def iter_from_py(pyfile, module_name='custom_simulation'):
+ """Try to load every Simulation instance in a given Python file"""
+ import importlib
+ import inspect
+ spec = importlib.util.spec_from_file_location(module_name, pyfile)
+ module = importlib.util.module_from_spec(spec)
+ sys.modules[module_name] = module
+ spec.loader.exec_module(module)
+ # import pdb;pdb.set_trace()
+ for (_name, sim) in inspect.getmembers(module, lambda x: isinstance(x, Simulation)):
+ yield sim
+ del sys.modules[module_name]
+
+
+def from_py(pyfile):
+ return next(iter_from_py(pyfile))
+
+
def run_from_config(*configs, **kwargs):
for sim in iter_from_config(*configs):
diff --git a/soil/time.py b/soil/time.py
index 6dc39af..b3a87f8 100644
--- a/soil/time.py
+++ b/soil/time.py
@@ -133,10 +133,10 @@ class TimedActivation(BaseScheduler):
"""
self.logger.debug(f"Simulation step {self.time}")
- if not self.model.running:
+ if not self.model.running or self.time == INFINITY:
return
- self.logger.debug(f"Queue length: {len(self._queue)}")
+ self.logger.debug("Queue length: {ql}", ql=len(self._queue))
while self._queue:
((when, _id, cond), agent) = self._queue[0]
@@ -156,7 +156,7 @@ class TimedActivation(BaseScheduler):
agent._last_return = None
agent._last_except = None
- self.logger.debug(f"Stepping agent {agent}")
+ self.logger.debug("Stepping agent {agent}", agent=agent)
self._next.pop(agent.unique_id, None)
try:
@@ -187,6 +187,7 @@ class TimedActivation(BaseScheduler):
return self.time
next_time = self._queue[0][0][0]
+
if next_time < self.time:
raise Exception(
f"An agent has been scheduled for a time in the past, there is probably an error ({when} < {self.time})"
diff --git a/soil/utils.py b/soil/utils.py
index e1b3580..e573301 100644
--- a/soil/utils.py
+++ b/soil/utils.py
@@ -5,7 +5,7 @@ import traceback
from functools import partial
from shutil import copyfile, move
-from multiprocessing import Pool
+from multiprocessing import Pool, cpu_count
from contextlib import contextmanager
@@ -24,7 +24,7 @@ consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
logging.basicConfig(
- level=logging.INFO,
+ level=logging.DEBUG,
handlers=[
consoleHandler,
],
@@ -140,9 +140,11 @@ def run_and_return_exceptions(func, *args, **kwargs):
return ex
-def run_parallel(func, iterable, parallel=False, **kwargs):
- if parallel and not os.environ.get("SOIL_DEBUG", None):
- p = Pool()
+def run_parallel(func, iterable, num_processes=1, **kwargs):
+ if num_processes > 1 and not os.environ.get("SOIL_DEBUG", None):
+ if num_processes < 1:
+ num_processes = cpu_count() - num_processes
+ p = Pool(processes=num_processes)
wrapped_func = partial(run_and_return_exceptions, func, **kwargs)
for i in p.imap_unordered(wrapped_func, iterable):
if isinstance(i, Exception):
diff --git a/tests/test_config.py b/tests/test_config.py
index 8d1d471..8fb0a83 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -99,7 +99,7 @@ class TestConfig(TestCase):
with utils.timer("serializing"):
serial = s.to_yaml()
with utils.timer("recovering"):
- recovered = yaml.load(serial, Loader=yaml.SafeLoader)
+ recovered = yaml.load(serial, Loader=yaml.FullLoader)
for (k, v) in config.items():
assert recovered[k] == v
@@ -109,24 +109,23 @@ def make_example_test(path, cfg):
root = os.getcwd()
print(path)
s = simulation.from_config(cfg)
- # for s in simulation.all_from_config(path):
- # iterations = s.config.max_time * s.config.num_trials
- # if iterations > 1000:
- # s.config.max_time = 100
- # s.config.num_trials = 1
- # if config.get('skip_test', False) and not FORCE_TESTS:
- # self.skipTest('Example ignored.')
- # envs = s.run_simulation(dry_run=True)
- # assert envs
- # for env in envs:
- # assert env
- # try:
- # n = config['network_params']['n']
- # assert len(list(env.network_agents)) == n
- # assert env.now > 0 # It has run
- # assert env.now <= config['max_time'] # But not further than allowed
- # except KeyError:
- # pass
+ iterations = s.max_time * s.num_trials
+ if iterations > 1000:
+ s.max_time = 100
+ s.num_trials = 1
+ if cfg.skip_test and not FORCE_TESTS:
+ self.skipTest('Example ignored.')
+ envs = s.run_simulation(dry_run=True)
+ assert envs
+ for env in envs:
+ assert env
+ try:
+ n = cfg.model_params['topology']['params']['n']
+ assert len(list(env.network_agents)) == n
+ assert env.now > 0 # It has run
+ assert env.now <= cfg.max_time # But not further than allowed
+ except KeyError:
+ pass
return wrapped
diff --git a/tests/test_examples.py b/tests/test_examples.py
index f589ecb..2479531 100644
--- a/tests/test_examples.py
+++ b/tests/test_examples.py
@@ -1,8 +1,9 @@
from unittest import TestCase
import os
from os.path import join
+from glob import glob
-from soil import serialization, simulation, config
+from soil import simulation, config
ROOT = os.path.abspath(os.path.dirname(__file__))
EXAMPLES = join(ROOT, "..", "examples")
@@ -14,44 +15,49 @@ class TestExamples(TestCase):
pass
-def make_example_test(path, cfg):
+def get_test_for_sim(sim, path):
+ root = os.getcwd()
+ iterations = sim.max_steps * sim.num_trials
+ if iterations < 0 or iterations > 1000:
+ sim.max_steps = 100
+ sim.num_trials = 1
+
def wrapped(self):
- root = os.getcwd()
- for s in simulation.iter_from_config(cfg):
- iterations = s.max_steps * s.num_trials
- if iterations < 0 or iterations > 1000:
- s.max_steps = 100
- s.num_trials = 1
- assert isinstance(cfg, config.Config)
- if getattr(cfg, "skip_test", False) and not FORCE_TESTS:
- self.skipTest("Example ignored.")
- envs = s.run_simulation(dry_run=True)
- assert envs
- for env in envs:
- assert env
- try:
- n = cfg.model_params["network_params"]["n"]
- assert len(list(env.network_agents)) == n
- except KeyError:
- pass
- assert env.schedule.steps > 0 # It has run
- assert env.schedule.steps <= s.max_steps # But not further than allowed
+ envs = sim.run_simulation(dry_run=True)
+ assert envs
+ for env in envs:
+ assert env
+ try:
+ n = sim.model_params["network_params"]["n"]
+ assert len(list(env.network_agents)) == n
+ except KeyError:
+ pass
+ assert env.schedule.steps > 0 # It has run
+ assert env.schedule.steps <= sim.max_steps # But not further than allowed
return wrapped
def add_example_tests():
- for cfg, path in serialization.load_files(
- join(EXAMPLES, "**", "*.yml"),
- ):
+ sim_paths = []
+ for path in glob(join(EXAMPLES, '**', '*.yml')):
if "soil_output" in path:
continue
- p = make_example_test(path=path, cfg=config.Config.from_raw(cfg))
+ for sim in simulation.iter_from_config(path):
+ sim_paths.append((sim, path))
+ for path in glob(join(EXAMPLES, '**', '*.py')):
+ for sim in simulation.iter_from_py(path):
+ sim_paths.append((sim, path))
+
+ for (sim, path) in sim_paths:
+ if sim.skip_test and not FORCE_TESTS:
+ continue
+ test_case = get_test_for_sim(sim, path)
fname = os.path.basename(path)
- p.__name__ = "test_example_file_%s" % fname
- p.__doc__ = "%s should be a valid configuration" % fname
- setattr(TestExamples, p.__name__, p)
- del p
+ test_case.__name__ = "test_example_file_%s" % fname
+ test_case.__doc__ = "%s should be a valid configuration" % fname
+ setattr(TestExamples, test_case.__name__, test_case)
+ del test_case
add_example_tests()
From 73282530fdf50dd94dd4f0d69f8a2e35a47439b5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Sun, 9 Apr 2023 04:19:24 +0200
Subject: [PATCH 28/39] Big refactor v0.30
All test pass, except for the TestConfig suite, which is not too critical as the
plan for this version onwards is to avoid configuration as much as possible.
---
docs/notes_v0.30.rst | 47 +
examples/NewsSpread.ipynb | 532 -
examples/Untitled.ipynb | 80808 ----------------
examples/complete.yml | 54 -
.../custom_generator/custom_generator.yml | 16 -
.../{mymodule.py => generator_sim.py} | 17 +
...tom_timeouts.py => custom_timeouts_sim.py} | 32 +-
.../{cars.py => cars_sim.py} | 10 +-
examples/mesa/mesa.yml | 19 -
examples/mesa/mesa_sim.py | 7 +
examples/mesa/server.py | 14 +-
examples/newsspread/NewsSpread.yml | 133 -
examples/newsspread/newsspread.py | 87 -
examples/newsspread/newsspread_sim.py | 129 +
.../{programmatic.py => programmatic_sim.py} | 25 +-
examples/pubcrawl/pubcrawl.yml | 26 -
.../pubcrawl/{pubcrawl.py => pubcrawl_sim.py} | 36 +-
examples/rabbits/basic/rabbits.yml | 42 -
examples/rabbits/improved/rabbits.yml | 42 -
...abbit_agents.py => rabbit_improved_sim.py} | 28 +-
.../rabbit_agents.py => rabbits_basic_sim.py} | 21 +-
...{random_delays.py => random_delays_sim.py} | 12 +-
examples/template.yml | 30 -
examples/terrorism/TerroristNetworkModel.yml | 62 -
...kModel.py => TerroristNetworkModel_sim.py} | 103 +-
examples/torvalds.yml | 15 -
examples/torvalds_sim.py | 16 +
requirements.txt | 4 +-
soil/__init__.py | 3 +-
soil/agents/CounterModel.py | 8 +-
soil/agents/__init__.py | 27 +-
soil/agents/network_agents.py | 5 +-
soil/decorators.py | 4 +
soil/environment.py | 206 +-
soil/network.py | 70 +-
soil/parameters.py | 32 +
soil/simulation.py | 69 +-
soil/visualization.py | 6 -
tests/test_agents.py | 2 +-
tests/test_config.py | 13 +-
tests/test_examples.py | 5 +-
tests/test_exporters.py | 22 +-
tests/test_main.py | 93 +-
tests/test_network.py | 51 +-
tests/test_time.py | 3 +-
45 files changed, 721 insertions(+), 82265 deletions(-)
create mode 100644 docs/notes_v0.30.rst
delete mode 100644 examples/NewsSpread.ipynb
delete mode 100644 examples/Untitled.ipynb
delete mode 100644 examples/complete.yml
delete mode 100644 examples/custom_generator/custom_generator.yml
rename examples/custom_generator/{mymodule.py => generator_sim.py} (54%)
rename examples/custom_timeouts/{custom_timeouts.py => custom_timeouts_sim.py} (59%)
rename examples/events_and_messages/{cars.py => cars_sim.py} (97%)
delete mode 100644 examples/mesa/mesa.yml
create mode 100644 examples/mesa/mesa_sim.py
delete mode 100644 examples/newsspread/NewsSpread.yml
delete mode 100644 examples/newsspread/newsspread.py
create mode 100644 examples/newsspread/newsspread_sim.py
rename examples/programmatic/{programmatic.py => programmatic_sim.py} (71%)
delete mode 100644 examples/pubcrawl/pubcrawl.yml
rename examples/pubcrawl/{pubcrawl.py => pubcrawl_sim.py} (86%)
delete mode 100644 examples/rabbits/basic/rabbits.yml
delete mode 100644 examples/rabbits/improved/rabbits.yml
rename examples/rabbits/{improved/rabbit_agents.py => rabbit_improved_sim.py} (90%)
rename examples/rabbits/{basic/rabbit_agents.py => rabbits_basic_sim.py} (91%)
rename examples/random_delays/{random_delays.py => random_delays_sim.py} (82%)
delete mode 100644 examples/template.yml
delete mode 100644 examples/terrorism/TerroristNetworkModel.yml
rename examples/terrorism/{TerroristNetworkModel.py => TerroristNetworkModel_sim.py} (78%)
delete mode 100644 examples/torvalds.yml
create mode 100644 examples/torvalds_sim.py
create mode 100644 soil/decorators.py
create mode 100644 soil/parameters.py
delete mode 100644 soil/visualization.py
diff --git a/docs/notes_v0.30.rst b/docs/notes_v0.30.rst
new file mode 100644
index 0000000..13a2698
--- /dev/null
+++ b/docs/notes_v0.30.rst
@@ -0,0 +1,47 @@
+
+
+What are the main changes between version 0.3 and 0.2?
+######################################################
+
+Version 0.3 is a major rewrite of the Soil system, focused on simplifying the API, aligning it with Mesa, and making it easier to use.
+Unfortunately, this comes at the cost of backwards compatibility.
+
+We drew several lessons from the previous version of Soil, and tried to address them in this version.
+Mainly:
+
+- The split between simulation configuration and simulation code was overly complicated for most use cases. As a result, most users ended up reusing configuration.
+- Storing **all** the simulation data in a database is costly and unnecessary for most use cases. For most use cases, only a handful of variables need to be stored. This fits nicely with Mesa's data collection system.
+- The API was too complex, and it was difficult to understand how to use it.
+- Most parts of the API were not aligned with Mesa, which made it difficult to use Mesa's features or to integrate Soil modules with Mesa code, especially for newcomers.
+- Many parts of the API were tightly coupled, which made it difficult to find bugs, test the system and add new features.
+
+The 0.30 rewrite should provide a middle ground between Soil's opinionated approach and Mesa's flexibility.
+The new Soil is less configuration-centric.
+It aims to provide more modular and convenient functions, most of which can be used in vanilla Mesa.
+
+How are agents assigned to nodes in the network
+###############################################
+
+In principle, the generation of the network topology and the assignment of agents to nodes are two separate processes.
+There is a mechanism to initialize the agents, a mechanism to initialize the topology, and a mechanism to assign agents to nodes.
+
+However, there are a myriad of ways to do this, and it is not clear which is the best way to do it.
+Earlier versions of Soil approached it by providing a fairly complex method of agent and node generation.
+The result was a very complex and difficult to understand system, which is was also prone to bugs and changes between versions.
+
+Starting with version 0.3, the approach is to provide a simplified yet flexible system for generating the network topology and assigning agents to nodes.
+This is based on these methods:
+
+- `create_network`
+- `add_agents` (and `add_agent`)
+- `populate_network`
+
+The default implementation of `soil.Environment` accepts some parameters that will automatically do these steps for the most common case.
+All other cases can be handled by overriding the `init(self)` method and explicitly using these methods.
+
+
+Can Soil environments include more than one network / topology?
+###############################################################
+
+Yes, but each network has to be included manually.
+Somewhere between 0.20 and 0.30 we included the ability to include multiple networks, but it was deemed too complex and was removed.
diff --git a/examples/NewsSpread.ipynb b/examples/NewsSpread.ipynb
deleted file mode 100644
index 87b53f2..0000000
--- a/examples/NewsSpread.ipynb
+++ /dev/null
@@ -1,532 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "ExecuteTime": {
- "start_time": "2017-11-02T09:48:41.843Z"
- },
- "scrolled": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Populating the interactive namespace from numpy and matplotlib\n"
- ]
- }
- ],
- "source": [
- "import soil\n",
- "import networkx as nx\n",
- " \n",
- "%load_ext autoreload\n",
- "%autoreload 2\n",
- "\n",
- "# To display plots in the notebook\n",
- "%pylab inline\n",
- "\n",
- "from soil import *"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# News Spreading example with SOIL"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In this example we three different kinds of models, which we combine in five types of simulation"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "total 288K\r\n",
- "drwxr-xr-x 7 j users 4.0K May 23 12:48 .\r\n",
- "drwxr-xr-x 15 j users 20K May 7 18:59 ..\r\n",
- "-rw-r--r-- 1 j users 451 Oct 17 2017 complete.yml\r\n",
- "drwxr-xr-x 2 j users 4.0K Feb 18 11:22 .ipynb_checkpoints\r\n",
- "drwxr-xr-x 2 j users 4.0K Oct 17 2017 long_running\r\n",
- "-rw-r--r-- 1 j users 1.2K May 23 12:49 .nbgrader.log\r\n",
- "drwxr-xr-x 4 j users 4.0K May 4 11:23 newsspread\r\n",
- "-rw-r--r-- 1 j users 225K May 4 11:23 NewsSpread.ipynb\r\n",
- "drwxr-xr-x 4 j users 4.0K May 4 11:21 rabbits\r\n",
- "-rw-r--r-- 1 j users 42 Jul 3 2017 torvalds.edgelist\r\n",
- "-rw-r--r-- 1 j users 245 Oct 13 2017 torvalds.yml\r\n",
- "drwxr-xr-x 4 j users 4.0K May 4 11:23 tutorial\r\n"
- ]
- }
- ],
- "source": [
- "!ls "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "ExecuteTime": {
- "start_time": "2017-11-02T09:48:43.440Z"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "---\r\n",
- "default_state: {}\r\n",
- "load_module: newsspread\r\n",
- "environment_agents: []\r\n",
- "environment_params:\r\n",
- " prob_neighbor_spread: 0.0\r\n",
- " prob_tv_spread: 0.01\r\n",
- "interval: 1\r\n",
- "max_time: 30\r\n",
- "name: Sim_all_dumb\r\n",
- "network_agents:\r\n",
- "- agent_class: DumbViewer\r\n",
- " state:\r\n",
- " has_tv: false\r\n",
- " weight: 1\r\n",
- "- agent_class: DumbViewer\r\n",
- " state:\r\n",
- " has_tv: true\r\n",
- " weight: 1\r\n",
- "network_params:\r\n",
- " generator: barabasi_albert_graph\r\n",
- " n: 500\r\n",
- " m: 5\r\n",
- "num_trials: 50\r\n",
- "---\r\n",
- "default_state: {}\r\n",
- "load_module: newsspread\r\n",
- "environment_agents: []\r\n",
- "environment_params:\r\n",
- " prob_neighbor_spread: 0.0\r\n",
- " prob_tv_spread: 0.01\r\n",
- "interval: 1\r\n",
- "max_time: 30\r\n",
- "name: Sim_half_herd\r\n",
- "network_agents:\r\n",
- "- agent_class: DumbViewer\r\n",
- " state:\r\n",
- " has_tv: false\r\n",
- " weight: 1\r\n",
- "- agent_class: DumbViewer\r\n",
- " state:\r\n",
- " has_tv: true\r\n",
- " weight: 1\r\n",
- "- agent_class: HerdViewer\r\n",
- " state:\r\n",
- " has_tv: false\r\n",
- " weight: 1\r\n",
- "- agent_class: HerdViewer\r\n",
- " state:\r\n",
- " has_tv: true\r\n",
- " weight: 1\r\n",
- "network_params:\r\n",
- " generator: barabasi_albert_graph\r\n",
- " n: 500\r\n",
- " m: 5\r\n",
- "num_trials: 50\r\n",
- "---\r\n",
- "default_state: {}\r\n",
- "load_module: newsspread\r\n",
- "environment_agents: []\r\n",
- "environment_params:\r\n",
- " prob_neighbor_spread: 0.0\r\n",
- " prob_tv_spread: 0.01\r\n",
- "interval: 1\r\n",
- "max_time: 30\r\n",
- "name: Sim_all_herd\r\n",
- "network_agents:\r\n",
- "- agent_class: HerdViewer\r\n",
- " state:\r\n",
- " has_tv: true\r\n",
- " id: neutral\r\n",
- " weight: 1\r\n",
- "- agent_class: HerdViewer\r\n",
- " state:\r\n",
- " has_tv: true\r\n",
- " id: neutral\r\n",
- " weight: 1\r\n",
- "network_params:\r\n",
- " generator: barabasi_albert_graph\r\n",
- " n: 500\r\n",
- " m: 5\r\n",
- "num_trials: 50\r\n",
- "---\r\n",
- "default_state: {}\r\n",
- "load_module: newsspread\r\n",
- "environment_agents: []\r\n",
- "environment_params:\r\n",
- " prob_neighbor_spread: 0.0\r\n",
- " prob_tv_spread: 0.01\r\n",
- " prob_neighbor_cure: 0.1\r\n",
- "interval: 1\r\n",
- "max_time: 30\r\n",
- "name: Sim_wise_herd\r\n",
- "network_agents:\r\n",
- "- agent_class: HerdViewer\r\n",
- " state:\r\n",
- " has_tv: true\r\n",
- " id: neutral\r\n",
- " weight: 1\r\n",
- "- agent_class: WiseViewer\r\n",
- " state:\r\n",
- " has_tv: true\r\n",
- " weight: 1\r\n",
- "network_params:\r\n",
- " generator: barabasi_albert_graph\r\n",
- " n: 500\r\n",
- " m: 5\r\n",
- "num_trials: 50\r\n",
- "---\r\n",
- "default_state: {}\r\n",
- "load_module: newsspread\r\n",
- "environment_agents: []\r\n",
- "environment_params:\r\n",
- " prob_neighbor_spread: 0.0\r\n",
- " prob_tv_spread: 0.01\r\n",
- " prob_neighbor_cure: 0.1\r\n",
- "interval: 1\r\n",
- "max_time: 30\r\n",
- "name: Sim_all_wise\r\n",
- "network_agents:\r\n",
- "- agent_class: WiseViewer\r\n",
- " state:\r\n",
- " has_tv: true\r\n",
- " id: neutral\r\n",
- " weight: 1\r\n",
- "- agent_class: WiseViewer\r\n",
- " state:\r\n",
- " has_tv: true\r\n",
- " weight: 1\r\n",
- "network_params:\r\n",
- " generator: barabasi_albert_graph\r\n",
- " n: 500\r\n",
- " m: 5\r\n",
- "network_params:\r\n",
- " generator: barabasi_albert_graph\r\n",
- " n: 500\r\n",
- " m: 5\r\n",
- "num_trials: 50\r\n"
- ]
- }
- ],
- "source": [
- "!cat newsspread/NewsSpread.yml"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "ExecuteTime": {
- "start_time": "2017-11-02T09:48:43.879Z"
- }
- },
- "outputs": [
- {
- "ename": "ValueError",
- "evalue": "No objects to concatenate",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m----------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mevodumb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0manalysis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'soil_output/Sim_all_dumb/'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprocess\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0manalysis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_count\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeys\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'id'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m;\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[0;32m~/git/lab.gsi/soil/soil/soil/analysis.py\u001b[0m in \u001b[0;36mread_data\u001b[0;34m(group, *args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0miterable\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_read_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgroup\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mgroup_trials\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterable\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterable\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;32m~/git/lab.gsi/soil/soil/soil/analysis.py\u001b[0m in \u001b[0;36mgroup_trials\u001b[0;34m(trials, aggfunc)\u001b[0m\n\u001b[1;32m 159\u001b[0m \u001b[0mtrials\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrials\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 160\u001b[0m \u001b[0mtrials\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrials\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 161\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrials\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0magg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maggfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreorder_levels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m,\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 162\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;32m~/.local/lib/python3.6/site-packages/pandas/core/reshape/concat.py\u001b[0m in \u001b[0;36mconcat\u001b[0;34m(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, copy)\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[0mkeys\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevels\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlevels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnames\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnames\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 211\u001b[0m \u001b[0mverify_integrity\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mverify_integrity\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 212\u001b[0;31m copy=copy)\n\u001b[0m\u001b[1;32m 213\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 214\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;32m~/.local/lib/python3.6/site-packages/pandas/core/reshape/concat.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, objs, axis, join, join_axes, keys, levels, names, ignore_index, verify_integrity, copy)\u001b[0m\n\u001b[1;32m 243\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 244\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobjs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 245\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'No objects to concatenate'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 246\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 247\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mkeys\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;31mValueError\u001b[0m: No objects to concatenate"
- ]
- }
- ],
- "source": [
- "evodumb = analysis.read_data('soil_output/Sim_all_dumb/', group=True, process=analysis.get_count, keys=['id']);"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "ExecuteTime": {
- "start_time": "2017-11-02T09:48:45.458Z"
- }
- },
- "outputs": [],
- "source": [
- "evodumb['mean'].plot(yerr=evodumb['std'])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-11-01T13:26:19.361423Z",
- "start_time": "2017-11-01T14:25:57.017418+01:00"
- }
- },
- "outputs": [],
- "source": [
- "evodumb = analysis.read_data('soil_output/Sim_all_dumb/', group=True, process=analysis.get_count, keys=['id']);\n",
- "evohalfherd = analysis.read_data('soil_output/Sim_half_herd/', group=True, process=analysis.get_count, keys=['id'])\n",
- "evoherd = analysis.read_data('soil_output/Sim_all_herd/', group=True, process=analysis.get_count, keys=['id'])\n",
- "evoherdwise = analysis.read_data('soil_output/Sim_wise_herd/', group=True, process=analysis.get_count, keys=['id'])\n",
- "evowise = analysis.read_data('soil_output/Sim_all_wise/', group=True, process=analysis.get_count, keys=['id'])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-11-01T13:26:20.461665Z",
- "start_time": "2017-11-01T14:26:19.363815+01:00"
- }
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\nXr2ao48+GoC6ujrGjh3bk/88vabL0HfOrQOOTLD8n3jt+22X1wMX9kjpRGRI+/73v8+UKVOYPXt2\nh+vE91zJyMiIzUcbEJxz/PSnP+Xqq69O6juvuOIKbr31Vg499NB2+0r0vfHfmZKSQlNTE845Zs6c\nya233prUdw4kGoZBRPpNfn4+F110EQsXLowtmzp1Kk8++SQAixcv5sQTT+x0H2eddRaLFi2iutrr\nWf75559TUlICwLRp0/j8889brZ+WlsYPfvAD7r777tiyk08+OdY8s3z5ckaPHk1ubm6H3zlt2jSW\nLFkS+57y8nI++eSTZA+7Xyn0RaRf3Xjjja168dx77738/ve/p6CggMcee4x77rmn0+3PPPNMvvWt\nb3H88cdz+OGHM336dKqqqohEImzatIn8/Px228yZM4empqbY+wULFlBUVERBQQHz58/nkUceabdN\nvEMOOYRf/OIXnHnmmRQUFHDGGWewdevWbh55/7CBcI21sLDQFRUV9XcxRCTOhg0bOPjgRL2zB4f1\n69ezaNEi7rzzzv4uSo9I9HuY2WrnXGF39qOavogMSYcddtiQCfyepNAXEQkQhb6ISIAo9EVEAkSh\nLyISIAp9EZEAUeiLiASIQl9EBqy6ujq+/OUv09zczJYtW5g+fXrC9U455RT68l6fu+++m9ra2m5v\nN2vWrNjooJdccgkbN27s6aJ1SaEvIgPWokWLuOCCC0hJSWGvvfZqNZxyf+os9JMdYnnevHncfvvt\nPVmspCQzyqaIBNwtL77H+1t29ug+D9krl5u/fmin6yxevJjHH38cgM2bN3POOeewfv166urqmD17\nNu+//z4HH3wwdXV1XX7fKaecwrHHHsuyZcuoqKhg4cKFnHTSSTQ3NzN//nyWL19OQ0MD11xzDVdf\nfTXLly/njjvu4KWXXgK8IZ8LCwvZuXMnW7Zs4dRTT2X06NEsW7aM7OxsbrjhBl555RV++9vf8tpr\nr/Hiiy9SV1fH1KlTeeCBB9o98vCkk05i1qxZNDU1kZrad1Gsmr6IDEiNjY3885//ZOLEie0+u//+\n+8nKymLdunXcdNNNrF69Oql9NjU1sXLlSu6++25uueUWABYuXMiIESNYtWoVq1at4qGHHuJf//pX\nh/u4/vrr2WuvvVi2bBnLli0DoKamhsMOO4y33nqLE088kWuvvZZVq1bFTlDRE0e8UCjEgQceyDvv\n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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "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\n02a2CXjYzH4KvAos9JdfCCwxs614Z/iX9UG5RWSIy8vLY/r06dx9991kZWXF57/44os8/vjjAFx5\n5ZV873vfi793wQUXkJaWxqRJk9i1axfghf5zzz3HMcccA0BlZSVbtmzh1FNPbfOZoVCI7373u9xy\nyy2ce+658fmrVq3iscceA+CMM86gtLQ0fjD67Gc/S0ZGBhkZGYwZM4Zdu3bx/PPPs3btWo4//ngA\nampqGDNmTG/+efpMp6HvnNsAHJNk/jt49fut59cCX+yV0onIsPatb32LY489llmzZrW7TGLLlYyM\njPh4rALBOccPfvAD5s6dm9JnXnnlldxyyy0ceeSRbbaV7HMTPzMUCtHQ0IBzjhkzZnDLLbek9JmD\nibphEJEBU1BQwCWXXMLChQvj80466SQefvhhAJYuXcrJJ5/c4TbOOeccFi1aRGWl17L8gw8+YPfu\n3QBMmzaNDz74oMXykUiEb3/729x1113xeaeeemq8embFihUUFhaSl5fX7mdOmzaNZcuWxT+nrKyM\nd999N9XdHlAKfREZUNdff32LVjx33303v/vd7yguLmbJkiX88pe/7HD9s88+my9/+ct88pOf5Oij\nj+biiy+moqKCpqYmtm7dSkFBQZt1rrrqKhoaGuLTCxYsYM2aNRQXFzN//nwWL17cZp1EkyZN4qc/\n/Slnn302xcXFnHXWWezcubOLez4wbDBcY50yZYpbs2bNQBdDRBJs3ryZI45I1jp7aNi4cSOLFi3i\njjvuGOii9Ipk34eZrXXOTenKdnSmLyLD0lFHHTVsAr83KfRFRAJEoS8iEiAKfRGRAFHoi4gEiEJf\nRCRAFPoiIgGi0BeRQaumpobTTjuNxsZGduzYwcUXX5x0ualTp9Kf9/rcddddVFdXd3m9mTNnxnsH\nveyyy9iyZUtvF61TCn0RGbQWLVrERRddRCgU4sADD2zRnfJA6ij0U+1ied68edx22229WayUpNLL\npogE3I1PvcGmHft7dZuTDszjhs8d2eEyS5cu5aGHHgJg27ZtnHfeeWzcuJGamhpmzZrFpk2bOOKI\nI6ipqen086ZOnconPvEJli9fTnl5OQsXLuSUU06hsbGR+fPns2LFCurq6rj66quZO3cuK1as4Pbb\nb+fpp58GvC6fp0yZwv79+9mxYwenn346hYWFLF++nNzcXK677jqeffZZfvGLX/DCCy/w1FNPUVNT\n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\nAElFTkSuQmCC\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "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\nAAAAAElFTkSuQmCC\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "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\n+7d/45FHHonMO/HEEyPNM++99x75+flkZma2+53z58/n5ZdfjnxPZWUlO3fu7OphD6gutemLiFNE\nVgEHgL8BW4FqY0zAXqUEGG2PjwZ2A9jLa4C8OPtcKCIrRGRFWVlZ745CKTVk3XbbbTG9eBYtWsTT\nTz9NcXExzz//PL/+9a873P6MM87g8ssv52tf+xrTp0/nwgsvpK6ujlAoxJYtW8jNzT1km+uvv55A\nIBCZvvvuu1mxYgXFxcXccccdPPvss4dsE23q1Kn87Gc/44wzzqC4uJjTTz+dffv2dfPIB4bEu6xp\nd2WRbODPwJ3A08aYw+35Y4E3jTHTRWQtcKYxpsRethWYZ4ypaG+/c+bMMStWrOjFYSilEm39+vUc\nddRRA12MHluzZg1PPfUUDz300EAXJSHi/R4istIYM6c7++lW7x1jTDXwHnAckC0i4XsCY4C99ngJ\nMNYukAvIAiq78z1KKdVb06ZNGzYBP5G60nunwK7hIyJe4DRgPbAMuNBe7WrgNXv8dXsae/m7pjuX\nE0oppfpMV3rvjAKeFREn1kniRWPMGyKyDlgiIj8DvgDCd2KeBJ4XkS1YNfxL+6DcSimleqDToG+M\nWQ3MjDN/GzAvzvxm4KKElE4ppVRC6RO5SimVRDToK6VUEtGgr5QatJqamjjppJMIBoPs3buXCy+8\nMO56J598Mv3Z7fuRRx6hsbGx29tdc801kURxl156abvpIvqSBn2l1KD11FNPccEFF+B0OjnssMNi\nMmsOpI6Cflezbd5444088MADiSxWl2jQV0oNWosXL+bcc88FYMeOHUybNg2wrgAuvfRSiouLueSS\nS2hqaup0XyeffDK333478+bN44gjjuCDDz4ArCD9wx/+MJKa+fHHHwesdAzf+ta3ItvfcsstPPPM\nMyxatIi9e/dyyimncMoppwCQnp7OnXfeybHHHssnn3zCvffey9y5c5k2bRoLFy6Mm9vnhBNO4O9/\n/3vMk8H9oStdNpVSSe6ev6xl3d7ahO5z6mGZ3PUvR7e7vLW1lW3btlFUVHTIskcffZS0tDRWr17N\n6tWrmTVrVpe+MxAIsHz5ct58803uuece/v73v/Pkk0+SlZXFZ599RktLC8cffzxnnHFGu/u49dZb\neeihh1i2bBn5+fkANDQ0MG3aNO69917r2KZO5c477wSsBG9vvPEG//Iv/xKzH4fDweGHH86XX37J\n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\nAAAAAElFTkSuQmCC\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "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\n9beB0KCvlFJRRIO+UkpFEQ36SikVRTToK6VUFNGgr5RSUUSDvlJKRREN+kopFUU06CulVBTRoK+U\nUlFEg75SSkURDfpKKRVFNOGaUqpHfr+f8vJyvF7vcFcl6nk8HnJycnC7D/5JWhr0lVI9Ki8vJykp\niby8PET6+cQOddCMMdTW1lJeXs7kyZMPens6vKOU6pHX6yUjI0MD/jATETIyMgbsiEuDvlKqVxrw\nR4aB/B006CulVBTRoK+UGnIiwo9//OPw+/vvv58777xzUL8zLy+P73znO+H3L774Itdcc82gfudI\npEFfKTXkYmNjeemll6ipqRnS712xYgXr1q0b0u8caTToK6WGnMvlYuHChTz44IP7fLZt2zYWLFhA\ncXExCxYsYPv27QBcc8013HzzzRx77LHk5+fz4osvhtf53e9+x5FHHklxcTF33HFHr9/7k5/8hN/8\n5jf7LK+rq+O8886juLiYo48+mjVr1gBw55138t3vfpeTTjqJ/Px8Hn744fA6f/nLX5g/fz6zZs3i\n+uuvJxgM9vvfYyhp0FdKDYsbb7yRZ599loaGhm7Lb7rpJq666irWrFnD5Zdfzs033xz+rKKiguXL\nl/Paa69x2223AfDmm2+yefNmPvvsM1avXs3KlSt5//33e/zOiy66iFWrVlFSUtJt+R133MHs2bNZ\ns2YNv/nNb7jqqqvCn23YsIF//etffPbZZ9x11134/X7Wr1/Pc889x4cffsjq1atxOp08++yzA/VP\nM6gOGPRFxCMin4nIlyKyTkTuspdPFpFPRWSziDwnIjH28lj7fYn9ed7g7oJSajRKTk7mqquu6tZ7\nBvj444+57LLLALjyyitZvnx5+LPzzjsPh8PB9OnTqaysBKyg/+abbzJ79mzmzJnDhg0b2Lx5c4/f\n6XQ6+elPf8o999zTbfny5cu58sorATjllFOora0NN0Znn302sbGxZGZmMmbMGCorK1m2bBkrV67k\nyCOPZNasWSxbtozS0tKB+YcZZJHcnNUOnGKMaRYRN7BcRN4AbgEeNMYsFZHHgOuAR+3pHmNMoYhc\nAvwWuHiQ6q+UGsV+9KMfMWfOHK699tpey3S9XDE2NjY8b4wJT3/+859z/fXXR/SdV155Jffccw+H\nH374Ptvq6Xu7fqfT6SQQCGCM4eqrr96n8RgNDtjTN5Zm+63bfhngFKBjUG0xcJ49f679HvvzBaIX\n+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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "for i in [evodumb, evohalfherd, evoherd, evoherdwise, evowise]:\n",
- " i['mean'].plot(yerr=i['std'])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-11-01T13:27:56.226662Z",
- "start_time": "2017-11-01T14:27:55.987887+01:00"
- },
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2IAAAEXCAYAAADP3/fJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8FdX9//HX596sQAKEsG8RxS0aURGVuuCu1f60rmgr\n4F5btFXbSrW1ai0utWqt/dalWK2iKGhbtVo3oIiiCIoIiLIqO2ELCdmT8/vjTJKbm5vcG5aEyPv5\neNzHnTtzZubMzJkz85kzM9ecc4iIiIiIiEjLCbV2BkRERERERPY0CsRERERERERamAIxERERERGR\nFqZATEREREREpIUpEBMREREREWlhCsRERERERERa2Lc6EDOzH5jZWy00rxwzc2aW1BLz2xnM7Ckz\nu6uF5uXMbJ+WmFc8zd1WO7KedtU6bsmy/W1hZlPN7Mqge6evvx0pV2Z2rJl9GTFsPzP71MwKzex6\nM0s3s1fNrMDMJu7MfLdVZrbczE5u7Xw0xsz6mVmRmYVbOy9NMbNhZrayFef/fTNbEayrQ1srHzuT\nmc03s2GtnY8aLXmsbw27+/K1lbqgOcxslJlN34XTb3Pn1NsroUDMzC4xs1lBQVpjZm+Y2TG7OnM7\nyjk33jl36q6Y9q48CWjswBh5IvltEixXaXDSudXMZpvZGDNLbe287a52ZdneE+xu6885955zbr+I\nXr8EpjrnMpxzDwPnA92BLs65C1olk9IszrlvnHMdnHNVrZ2X3dz9wOhgXX3a2pmpsSPHeOdcrnNu\n6k7OUqtr7jmImd1uZs/uyjy1BbuyLgjWcUVwfl7zGRAxfFBwTlUcfA+KGHZJcE6/LPLCgZntbWYf\nfJsCx51lV5yHxw3EzOxG4CFgLP5EoB/wf8DZOzMjO9ueEEUnqo2si9HOuQygJ3ATMBx43cysdbO1\nZ9ldysruko9W1B+YH/X7K+dcZXMnpHXZtFjrp7nrTOvY2871EF3WRaR5XggCvZrPUgAzSwH+DTwL\ndAaeBv5tZinBvnoPcBhwHfBIxPQeBm5sqYtIe3z96Zxr9AN0BIqAC5pIk4oP1FYHn4eA1GDYMGAl\n/uruemANcA7wXeArYBNwS8S0bgcmAS8AhcAnwCERw8cAS4JhC4DvRwwbBbwPPBhM966g3/SINA74\nEbAI2Az8BbBgWBj4I7ABWAaMDtInxVjmZ4BqoCRYP78EcoL0I4FvguncGjFOKCL/G4EXgaxG1ukw\nYGWM/lOBKyN+nwXMAbYAHwB5EcOWAzcDc4EyIAk4NFinhcE6ngDc1Uge9gYmB3ndAIwHOkVN/+fB\n9AuC6aVFDP9FsL1XA5cH62afRuZVb7mCfv2AYuCs4PdTkXmNXkdBfn4R5GcbMA5/4eCNYHnfAToH\naWu21dVB/tYANzVRxp8CHgXeDqb1P6B/xPD9g2GbgC+BC6PG/Qvwn2Dcj4C9I4b/CVgBbAVmA8cG\n/Xvhy1dWRNpDg22RTMOyPRT4ONgWHwNDo9bNyVH72bNR6+IKfLmdBqThK+6N+LL1MdC9qbqiGeXi\nKmBxsK5eAXpF7Z8/we+fyyL6/TjoVwj8Dl82ZwTr7EUgJUjbGXgNyMfv368BfWKVs8j1h99/iyI+\nFcBTEXXguKCMrMLXK+GIOuP+YJssDfIes86I2H4x9z8iyjN+v6sCSoP8PA+UB/kqAq4I0l0OfBEs\n65vUL5Ox1uWOlNPciHHXEdTbNK9eS2T7/A5fjxcCbwHZEcMvBb4O5nMrUeU6al6pwbb5Jsjvo0B6\n5LrG149r8fV5g37bU16j8pATWR7iLV+sYwD+olTNsfOyJo4Fo2h4rEt0v6mZ1y34srwc+MH2rssY\nyxICfh1su/XAP/D7VSq+PDt8nb2kkXURs44MhqXjTy434/eFX1L/uNALeAlf5pYB10fVgy8G+SnE\nB4ODg2GxjvEJ14tElM2m5tPIuE3tp2cCnwbrYgVwe9S4x+DPBbYEw0clsn9HTSPmcgK/p3699EhT\n2wc4nfr11mfx6tQY+Sgh2EeCMlQJZAa/7wIeSrD+2u66L9Z+2cS2HgLMCtbFOuCB7akLgBHU1XW/\noem67naC43mMYacG69gi+n0TbJvuwIyIdV0cdJ8PPN5Y+Yyuc/B1w2b8/nVGxPCmjp2jaHi+3tzj\naVPxQJPn8wnkLeZyEWMfACxYjvX4c565wEHx1l+9ZYmzok/HF/yYKyJIcyfwIdAN6IqvBH4XUWgr\ngdvwJ49X4SvE54AM/MG9FBgQUaAqgoKQjD+hWwYkB8MvwFesIeAifOXdM2LlVeIj+yR8BT2Khgen\n14BO+BP9fOD0YNiPgo3ZB3/C8E6cQrCc+ie3OUH6J4J5H4IPgA4Ihv8sWE998Aegx4DnE93ZI3be\nmhPJw4INfyS+0I0M8pQakb85QN8gPyn4HfuGYN2eH6zrxgKxfYBTgrx2xZ+gPxS1/DOD7ZGFPwj+\nKKLcrAMOAtoH29vRjEAs6D8NuDeisowXiH2Ir1x6B+vmE/zJbyr+5Pa3Udvq+SB/BwdlobGK7in8\nzn5cMK0/UXcS3x5/ELoMX+4Ow+/8uRHjbsJX0En4gHZCxLR/CHQJht2EP5lJC4ZNBq6KSPsH4NHI\nyiLozsJXGJcG07k4+N2lkbJ6Ow0DsX8Ey5IOXAO8CrTDl63DqTv4jQFea6I+aKpcnBism8OC9fhn\nYFrU/vl2MF56RL9XgEx8fVEGvAsMwFemC4CRQdouwHlBvjOAicC/Gtl/atdfVP774oPz7wa//4Xf\nV9vj67iZwDURdcbCYJwsYAqNX7xpcv+jYXmuzWv0Ngt+n4MPEA4ItvmvgQ8aW5fsQDkN1uUafPlM\nC34fuR31WiLbZwmwb5DnqcA9wbAD8Qe+mn3wAXx939g++xC+3GQF83oVuDvquHRvMK30Rvo1u7xG\n5SGHhidfMZevkWNAJf74moy/eFlM3cWk6PIxiobHukT3m5p5PRAs5/H4Y+t+27MuYyzL5fiyOgDo\nALxMRMBGE8eGBOrIe/AXxjrjy+Bc6i5ohPCBwW34/W8A/gTvtIh9qjRYt2HgbuDDqLosst5stF5s\npB48OZH5RI0Xbz8dhj9ehYA8/HH2nGBYP/xx6mJ8mekCDErkOBSVh6bq/6k0vGja1Pa5nagggSbq\n1Bh5mQacF3S/hd9/zogY9v0E6q8dOkbH2C+bCsRmAJcG3R2Ao5pbF1BX1x2DL7f3448VTQViBcEy\nzAeujRh2A/BGVPrXgu0UwjeI9AG+hw+4O+DPG7s0tj9G1TkV+PP6MHAt/thZ07jR1LFzFA3P1xM+\nngbTaCoeaPJ8PoG8NbVcU6lf956Gr2c64YOyA2rykegn3or+AbA2TpolBCctEZlaHlFoS6iLNDOC\nlXFkRPrZ1FUkt1O/IgzhTwCObWTec4CzI1beNzEKSvTB6ZiI3y8CY4LuyURUBsDJcQrBcmIHYpFX\neGcCw4PuL4CTIob1DDZ2rJO2YfircVuiPpXUnUj+lSDgjRjvS+D4iPxdHjHsuMjCFPT7gEYCsRh5\nOgf4NGr5fxjx+z7qgoQniTjBwFc2jR5sowt2RP8JwBNB91PED8Qir+K+BPw14vd1BCd9Edtq/6j8\nj2skf09RP3jqgL8q0hdfAbwXlf4x6oK+p4C/RQz7LrCwifW8maAVGLgSmBx0G/5gclx02cYHYDOj\npjODuquhy4kfiA2IGH45US2siX7ilItxwH1R67ECyInYP0+Mmp4DvhPxezZwc8TvPxJxgSBq3EHA\n5ljljBiBGP5gUDt9fFBfRsTJJf4kZ0rQPZkgyAx+n0rjgViT+x/ND8TeIGgZC36H8Cfq/WOtS3ag\nnAbL/Gn0MgXDEq7XEtw+v474/WPgv0H3bdTfB9vjr7Y3ODnB7yvbqH9F/GjqWgaHBeNGttTG6tfs\n8hqVjxwannzFXL4Y4w7DHzuTIvqtp+7ELrp8jKLhsS6h/Ya6YKp9xPAX8Vfim70uYyzLu8CPI37v\nF1lGiBOIxZheZB1ZG1gFv6+kLhA7kobnBL8C/h6xT70TMexAoCTi93Lq15sJ14s0DMQanU/UeE3u\npzHSPwQ8GLFs/2wk3VMkeBxqajmjy10C2+d26tdbTdapMab1O/xtckn4AO+n+OA7urWs0eWLt06b\nuW6G0XQgNg24g6iWbppRF+DruucjhrWjkbouojz1wgcNQ/HnzBcHw35DVFCJDzRvD7pPwl9I+x++\nPn4Af3fMMHwg9CaNtO7g65zFUfl0QI9425nY5+sJH08byU9kPNDo+XyCeYu5XLH2AfwFu6+Ao4BQ\nInmN/sS7L3MjkG1mSa7xZxN64a/01vg66Fc7DVd3n2lJ8L0uYngJ/gBXY0VNh3OuOnhpRS8AMxsB\n3Igv1ATjZccatwlrI7qLI+bdK2r8RKbVnOn3B/5pZtURw6vwhWJVjOmsds71iexhZlMjfvYHRprZ\ndRH9Uqi/7iOXoRewygUlJxC53eoxs274CvBYfAAdwlewkaKXtWbevfAH/rjziaM3/oCQqOhy1VQ5\ng/rr52v8lcbGRJbLIjPbhF/O/sCRZrYlIm0S/taWGo2VCczsJvzJQy/8zp5JXZmeBPzZzHoBA4Ph\n78XIW/Q+WLM8vZtYnmiR6+IZfJA5wcw64W9TudU5V5HgtJoqF5/UDAjW48Ygn8tj5KNGvO3aA8DM\n2uFvETgdfxUMIMPMwi6xe93HAV865+4NfvfHX1leE/GoYigij9F1RlPlvFn7XwL6A38ysz9G9DP8\nuqyZ7oqo9NtbTvviL7g1lo+E6rUEt09C9bNzbltQdmLpij94zo7YboY/UamR75wrjRovut/2ltem\nNFoXxLAx6rgbL320hPabwGbn3LaI3zXH8e1dl5FinSPUnBDFOvbVE6eObOq43R/oFVXmw9SvQ6O3\nR1oT5zs7Ui8mOp8m91MzOxIfiByEP96n4luWoen9NFYeGitLzVrOONsnWrw6Ndr/8MHBYcDn+Bbo\ncfiT3sXOuQ0JLN8OHaOb6Qp8K/ZCM1sG3OGce62RtInWdcVN1HU45xZE/PzAzP6Ev+PieXzLWmbU\nKJn4llOcc+/iL5RgZnnAYPwjHsvxLXJ9gb/h13eTyxDkk2A5soi/naO3eXOOp/HigXj1Qry8NbZc\nDTjnJpvZI/jbW/uZ2T+BnzvntjaV/0jxXtYxA9+kfk4TaVbjF6xGv6Df9upb02FmIXzT4moz64+/\n7W80vtm0EzAPf1CoEXmS01xrgnk1yEcjmjuvFfgm9U4RnzTnXNwDURPT+33U9No5555vJI9rgN5R\nL7/o18T07w7Gz3POZeJvP0j0xRlrqL/+mppPTGbWF39LRM1Bcxv+hKBGjwYjNV90Hpsqt5Hlsqai\nWY3fDv+L2g4dnHPXxpu5mR2Lf7biQvwtR53wtxgYgHNuC/52jAuBS/BXyWKVu+h9sGZ5aspWIuuu\ndrrOuQrn3B3OuQPxV9jOwt+zvqPq5dPM2uNvaYncB3ZkH74Jf7X9yKDMHlczq3gjmtmYYNwrInqv\nwF85y47YtpnOudxgeHPKeXP3v3hW4K/4RZa7dOdc5IULF5V+u8ppMO7eTQxLtF7b7u1D1LoOgrou\njaTdgA80ciPy1NE5F3kgjVXOovvt6vK6I3Z2fdg5WL4aNfXh9q7LSLHOESqpHxjGFK+OpOnj9gp8\ny11k2cxwzn033nwD9ZZrF9aLkeLtp8/hbxPt65zriH9ezyLGbWw/TVic5ay3ThLYPtFlI16dGu0D\nfJ3xffx6WYAvP2fig7RE7EjdF63efhe8VbBrzW/n3CLn3MX4293uBSZF7VeJqFemzSydxuu6WBx1\n638+kBd13Mkj6uU4wfBHgOvxwUzYOfc1/nbFvGbmHxLbztFlI+HjaQLxQLx6oTllMFqD+s4597Bz\n7nD8beD74oPZhDUZiDnnCvDNpH8xs3PMrJ2ZJZvZGWZ2X5DseeDXZtbVzLKD9DvyutLDzezc4C0q\nP8OvsA/xt6I4/LM8mNll+KtCO8uLwE/NrHdwFejmOOnX4e85T9SjwO+DAkSwvnbkzZNPAD8ysyPN\na29mZ5pZRiPpZ+APftebWZKZnYu/J7oxGfirKVvMrDfNK1gvAqPM7MDghOm3iY4YlLHj8W/6mQm8\nHgyaA3zXzLLMrAe+bOyo3wTzy8XfP/5CE2m/a2bHBG8h+h3wkXNuBf5+633N7NJg30g2syPM7IAE\n5p+B3yb5QJKZ3UbDq1fP4Q+C5wXdsbwe5OGSYNtehL9doeZK3BxgeJC3wfirZY0ysxPM7ODgILMV\nfxvRznh70nPAZeZfp5uKfxPrR8655Tth2uDXZwm+zGaRYLkzszPwB6BznHM1rfY459bgA+E/mlmm\nmYXMv9b3+CDJi/j9qY+ZdcY/P9eY5u5/8TwK/Coou5hZRzNr6rX2O1JOXwN6mNnPzCzVzDKCK/M1\n+Ui0Xtuu7ROYBJwVsQ/eSSPHL+dcNb5+fNB8yz5BvX5aM+YHu7687og5wLlB/bUP9S8gbK87zL9N\n7Vj8yffEnbQunwduMLO9gotYY/FveUvkDaDx6sgX8ftB5+A4NTpi2Exgq5ndbP5/+MJmdpCZHZFg\nvusd43dhvRgp3n6aAWxyzpWa2RD8Bboa44GTzezCoI7pYhGvKk9UnOWMPu+Jt33WATnmL6onUqfW\n45wrxt9d8xPqAq8P8M+xJRqI7UjdF+0rfGvmmWaWjH82t/Zvdszsh2bWNdhvalrgmltGJgHfM7Oh\nQV13B01crDKzs4Pyb0GZuB5//gT+Nroq/HEn1cxq9o/JUZO5En/7+Rz8nXDpZnYgcAL+9t9mae52\nDjTneBovHmj0fH478xYpul44wvx5eDI+UC+lmds87uvrnXMP4Jv/fo1f6BX4yu5fQZK78G+JmYtv\nOv4k6Le9/o2/p7fm5QPnBldoFuDva5+BXxEH49+6srM8gd84c/FvJXodX8E0tkLvxgegW8zs5wlM\n/0/4K1lvmVkhPrg8sulRGuecm4V/mPAR/LpajL+3tbH05cC5QZrN+HX8chOzuAN/O0AB/m1CTaWN\nntcb+HvXJwf5it7pY3kkWC/rgnFfwr9IpeaWp2eAz/BN5m/RdNCUqP8F+XsXuN8519Qf/D6HP3Hc\nhG+p+wGAc64Qfy/zcPyV37XUPbgez5v4Z32+wjfDl9Kwuf4V/G2J65xzn8WaiHNuI/7E6SZ8JfpL\n/Nsma27b+A3+Sulm/HZtLKCr0QN/MNiKfwbofwQXV8zsFjN7I4Fli5XPd4O8vIS/YrU3fr3tLA/h\nn/PagN+//pvgeBfhr2p+YXX/w/JoMGwE/hagBfj1Nwn/HBT4OuNNfLn8hCb2ke3Y/5rknPsnvpxN\nMLOt+KuBZzSRfrvLaTDuKfgHutfi38R3QjC4OfXa9m4fnHPz8Sdjz+HLzmb82/oaczN+3/4wWD/v\n4K+sJ6wFyuuOeBD/3Mg6/FsDx+/g9Nbi1+nqYFo/cs4tDIbt6Lp8El9/T8O/fKsU/8xuIuLVkXfi\ny8GyIF+T8Bdvcf521+/hn31Zhi93f8O/rCQR0cf4RuvFnSWB/fTHwJ3BvnYb/oSzZtxv8M833YQ/\nTs3BvzSsuZpazj8B55vZZjN7mPjbp+a2yY1mVnObb1N1aiz/w99KNjPidwa+PMW1g8fo6GkV4LfB\n3/At49uoXw+dDsw3syL8uhrumr5tN9Y85uP3jwn4eqcQ/3xoWSOjDMfvn4X4l27d65x7OphWOf6O\nthH4wPBy/AXH8pqRzTeg/BRf1xFcIBmNP297lMT31WjN3c7NOZ7Giwfinc83N2+RoveBzGB+m6l7\n0+X9kPj5Us1bQHYLZnY7/qHdH+4GeTkD/5KB6Fu+REREZDdjZtfiT34TvbotslsLWpG3AAOdc8ta\nOz9t0e5+Ph+3RWxPEdy68N2gSb83vvXjn62dLxEREWnIzHqa2XeC24v2w7cG6bgtbZqZfS+47bg9\nvnXlc+peECRxtLXzeQVidQx/29ZmfFPmF/imfxEREdn9pOBfRV6Iv5Xq38D/tWqORHbc2fjbKFfj\nH00Y7nan29d2f23qfH63ujVRRERERERkT6AWMRERERERkRamQExERERERKSFJbV2BkRk95edne1y\ncnJaOxsiIm3K7NmzNzjnusZPKSJ7IgViIhJXTk4Os2bNau1siIi0KWb2dWvnQUR2X7o1UURERERE\npIUpEBMREREREWlhCsRERERERERamJ4RExERaWMqKipYuXIlpaWlrZ0VAdLS0ujTpw/JycmtnRUR\naUMUiImIiLQxK1euJCMjg5ycHMystbOzR3POsXHjRlauXMlee+3V2tkRkTZEtyaKiIi0MaWlpXTp\n0kVB2G7AzOjSpYtaJ0Wk2RSIiYiItEEKwnYf2hYisj0UiImIiEg9ZsZNN91U+/v+++/n9ttv36Xz\nzMnJ4bzzzqv9PWnSJEaNGrVL5yki0poUiImIiEg9qampvPzyy2zYsKFF5ztr1izmz5/fcMCGRf6T\niOak3YUuemxGa2dBRHZzCsRERESknqSkJK6++moefPDBBsO+/vprTjrpJPLy8jjppJP45ptvABg1\nahTXX389Q4cOZcCAAUyaNKl2nD/84Q8cccQR5OXl8dvf/rbR+f785z9n7NixDfpv2ryFc0ZcS15e\nHkcddRRz584F4Pbbb+fyyy9n2LBhDBgwgIcffrh2nGeffZYhQ4YwaNAgrrnmGqqqqrZ7fYiI7AoK\nxETaIDM73cy+NLPFZjYmxvBUM3shGP6RmeUE/YeY2Zzg85mZfb+l8y4ibcNPfvITxo8fT0FBQb3+\no0ePZsSIEcydO5cf/OAHXH/99bXD1qxZw/Tp03nttdcYM8ZXTW+99RaLFi1i5syZzJkzh9mzZzNt\n2rSY87zwwgv55JNPWLx4cb3+v733YQ49+EDmzp3L2LFjGTFiRO2whQsX8uabbzJz5kzuuOMOKioq\n+OKrxbzwwgu8//77zJkzh3A4zPjx43fWqhER2SkUiIm0MWYWBv4CnAEcCFxsZgdGJbsC2Oyc2wd4\nELg36D8PGOycGwScDjxmZvobCxFpIDMzkxEjRtRrZQKYMWMGl1xyCQCXXnop06dPrx12zjnnEAqF\nOPDAA1m3bh3gA7G33nqLQw89lMMOO4yFCxeyaFHsWwfD4TC/+MUvuPvuu+v1n/7RbC694GwATjzx\nRDZu3FgbIJ555pmkpqaSnZ1Nt27dWJe/kXenzWD27NkcccQRDBo0iHfffZelS5fu0PpYkl/Ekvyi\nHZqGiEgknYCJtD1DgMXOuaUAZjYBOBtYEJHmbOD2oHsS8IiZmXOuOCJNGuB2fXZFpK362c9+xmGH\nHcZll13WaJrINwampqbWdjvnar9/9atfcc011yQ0z0svvZS7776b3NzcBtOKNd/IeYbDYSorK3HO\nMXLkyAYBXQM1z5JlD0wobyIiO5NaxETant7AiojfK4N+MdM45yqBAqALgJkdaWbzgc+BHwXDRUQa\nyMrK4sILL2TcuHG1/YYOHcqECRMAGD9+PMccc0yT0zjttNN48sknKSryrUmrVq1i/fr1sGERJx13\nNKtWraqXPjk5mRtuuIGHHnqott9xRx/B+JdeBWDq1KlkZ2eTmZnZ6DxPOm4okyZN8vMBNm3axNdf\nf92MJRcR2fUUiIm0PbH+sCb6cnGjaZxzHznncoEjgF+ZWVrMmZhdbWazzGxWfn7+DmVYRNqum266\nqd7bEx9++GH+/ve/k5eXxzPPPMOf/vSnJsc/9dRTueSSSzj66KM5+OCDOf/88yksLKS6uprFy74h\nKyurwThXXHEFlZV114hu/+V1zJozj7y8PMaMGcPTTz/d5DwP3G8f7rrrLk499VTy8vI45ZRTWLNm\nTYN0JRVVlFToJR4i0josVnO/iOy+zOxo4Hbn3GnB718BOOfujkjzZpBmRvAM2Fqgq4va4c1sCvAL\n59yspuY5ePBgN2tWk0lEpAV98cUXHHDAAa2djYaacavfvPf+w5PPTeKBv/59p063OWlL1iwEIL3n\n/jucNnqbzB97DAfd+v5s59zguBMXkT2SWsRE2p6PgYFmtpeZpQDDgVei0rwCjAy6zwcmO+dcME4S\ngJn1B/YDlrdMtkVE6hx0wL488LtbEkrbnJYrtXKJSFuhl3WItDHOuUozGw28CYSBJ51z883sTmCW\nc+4VYBzwjJktBjbhgzWAY4AxZlYBVAM/ds617D+2ioiIiIgCMZG2yDn3OvB6VL/bIrpLgQtijPcM\n8Mwuz6CIfDvorYIiIruMbk0UERERERFpYWoRExERkZhqnrVK3wXpmzttEZFvG7WIiYiIiIiItDAF\nYiIiIiIiIi1MgZiIiMiO+PuZ/rOz0+7mSkpKOP7446mqqmL16tWcf/75MdMNGzaMlvwfwkeeeJri\n4pJmjzdq1CgmTZoEwPDhw1m0aNHOzpqISD0KxERERHZHzQnaNiyqe8PhzkzbhCeffJJzzz2XcDhM\nr169aoOY1vbIE/+guKQ05rCqqsT+X+zaa6/lvvvu25nZEhFpQC/rEBERacPueHU+C75e538kJ/C3\ngBUlcdMe2CuT334vt8nJjB8/nueeew6A5cuXc9ZZZ/Hx25MoKSnlsuHDWbBgAQcccAAlJfFbp4YN\nG8aRRx7JlClT2LJlC+PGjePYY4+lqqqKMWPGMPnt/1JeXs7on97INddcw9SpU7n//vt57bXXABg9\nejSDBw9m69atrFmXzxkXjKRrj95MmTKFDh06cOONN/Lmm2/yxz/+kcmTJ/Pqq69SUlLCkEEH8sh9\ndzTIz7HHHsuoUaOorKwkKUmnSiKya6hFTEREJNq36BbCXaG8vJylS5eSk5PTYNgT/5hAu3btmDt3\nLrfeeiuzZ89OaJqVlZXMnDmThx56iDvu8MHRuHHj6NixI9PfmMh7r0/kiSeeYNmyZY1O4/rrr6dn\n9668MfFppkyZAsC2bds46KCD+OijjzjmmGMYPXo0H3/8MfPmzaO0tJTX357aYDqhUIh99tmHzz77\nLKG8i4hsD13mERERacN++71c2JDifyTwx8slaxYCkN5z/+2e54YNG+jUqVPMYdM/nMUNv7wFgLy8\nPPLy8hJ8DLCIAAAgAElEQVSa5rnnngvA4YcfzvLlywF46623mDt3Li8+Px6AwuJSFi1aREpKSsJ5\nDYfDnHfeebW/p0yZwn333UdxcTEbN6zngH1jr7Nu3bqxevVqDj/88ITnJSLSHArERETk26+mdeuy\n/+z0Sc9fUwBA0zfy7drptvR/cqWnp1NaGvs5LAAza/Y0U1NTAR84VVZWAuCc489//jPH5fX38w2C\nx+nTp1NdXV07blN5SUtLIxwO16b78Y9/zKxZs+jbty+33jSa0rKymOOVlpaSnq5/ORORXUe3JoqI\niLSQ+WsKagOstqxz585UVVXFDICOOWow48f7Fqx58+Yxd+7c2mEjRoxg5syZCc/ntNNO469//SsV\nFRUAfPXVV2zbto3+/fuzYMECysrKKCgo4N13360dJ6NDe4q2bYs5vZr8ZmdnU1RUxL/+82aj8/7q\nq6/Izd3Z4bWISB21iImIiEiznXrqqUyfPp2TTz65Xv+rRgznx7fcQ15eHoMGDWLIkCG1w+bOnUvP\nnj0TnseVV17J8uXLGXraeTjn6NazD//617/o27cvF154IXl5eQwcOJBDDz20dpzLf3Ah5/zganr1\n7V/7nFiNTp06cdVVV3HwwQeTk5PDYYccHHO+69atIz09vVl5FRFpLgViIiLyrdfc2wd31e2G3yaj\nR4/mgQce4OSTTyYnJ4d58+ZRsmYh6elpTJgwoUH6rVu3MnDgQPr27dtg2NSpU2u7s7Oza58RC4VC\njB07lt9cNwKo/1zbfffdF/MV89de8UOuveKHtWmLiorqDb/rrru46667gLrn5QCeeuqp2u7nnnuO\na665Js4aEBHZMbo1UURE2ia92bBVHXrooZxwwgkJ/zdXZmYmEydO3MW52jk6derEyJEjWzsbIvIt\npxYxERFpk9Rq1fouv/zy1s7CLnHZZZe1dhZEZA+gFjEREREREZEWpkBMRER2H7rdUERE9hAKxERE\nZJe66LEZXPTYjNbOhoiIyG5Fz4iJiMguddvGXwRd0+Om1XNfIiKyp1CLmIiIiDRbSUkJxx9/PFVV\nVaxevZrzzz8/Zrphw4Yxa9asJqd122238c477zSZpqysnJNPPplBgwbxwgsvNCuvy5cv57nnnmvW\n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\nIiLSwhSIiYiIiIiItDA9IyYie7T5Y48BIHcnP4Cv57NERESkKWoRE5Fvlfljj6kNrkRERER2VwrE\nREREREREWpgCMRERERERkRamZ8RERBKk575ERERkZ1GLmIjs/v5+Zt2fKYuIiIh8CygQExERERER\naWEKxERERERERFqYnhETkd2ens0SERGRbxu1iImIiIiIiLQwBWIiIiIiIiItTIGYiIiIiIhIC1Mg\nJiIiIiIi0sIUiIlI69B/g4mIiMgeTG9NFJFWoTchioiIyJ5MLWIibZCZnW5mX5rZYjMbE2N4qpm9\nEAz/yMxygv5dzGyKmRWZ2SMtnW8RERER8RSIibQxZhYG/gKcARwIXGxmB0YluwLY7JzbB3gQuDfo\nXwr8Bvh5C2VXRERERGJQICbS9gwBFjvnljrnyoEJwNlRac4Gng66JwEnmZk557Y556bjAzIRERER\naSUKxETant7AiojfK4N+MdM45yqBAqBLi+ROREREROJSICbS9liMfm470jQ9E7OrzWyWmc3Kz89v\nzqgiIiIiEocCMZG2ZyXQN+J3H2B1Y2nMLAnoCGxqzkycc4875wY75wZ37dp1B7IrIiIiItEUiIm0\nPR8DA81sLzNLAYYDr0SleQUYGXSfD0x2zjWrRUxEREREdh39j5hIG+OcqzSz0cCbQBh40jk338zu\nBGY5514BxgHPmNlifEvY8JrxzWw5kAmkmNk5wKnOuQUtvRwiIiIiezIFYiJtkHPudeD1qH63RXSX\nAhc0Mm7OLs2ciIiIiMSlWxNFRERERERamAIxERERERGRFqZATER2mosem8FFj81o7WyIiIiI7PYU\niImIiIiIiLQwBWIiIiIiIiItTG9NFJGd5raNvwi6prdqPkRERER2d2oRExERERERaWEKxERERERE\nRFqYAjEREREREZEWpkBMRERERESkhSkQExERERERaWEKxERERERERFqYAjEREREREZEWpkBMRERE\nRESkhSkQExERERERaWEKxERERERERFqYAjEREREREZEWpkBMRERERESkhSkQExERERERaWEKxERE\nRERERFpYUmtnQESkrQi7CsJUw6alYGGwEITCvjsU/A76mavGcFC8Caoroao8+ER0B/3bVxdRRdgP\nC6talj2Yc1BRAhXFUF4E5cVQUUz76iLAwdKpwX4Wjtj3QvX2wVRXSqVOb0SkDVBNJSLSlMJ1sODf\nMO8l9q9Y6Ps9fGjc0Q6s6bhvr7hpc2o67ukHfQ6HfkdD3yOhzxGQlpl4XquDIHHNHFj9KTkVS0lx\nZfDwYX46qRmQGv2dUfu7Q/VWKkiGki2Q3inx+Yo0paIUClZCwTewZQUUrIAtK8ipWEqYKvjTIbUB\nF+XbANdgEjk1Hf84O+7s9qnp+MtRsNexsNdx0P870C5r5yxPI4rLK1mav40l+UUszd/Gp8VnA+/v\n0nmKSNumQEykDTKz04E/AWHgb865e6KGpwL/AA4HNgIXOeeWB8N+BVwBVAHXO+febMGstw3Fm+CL\nV2DeS7B8Orhq6JbLunB3Kkimz//7DVRXgauq+3auXr91k/+CA3qc8jMIJ0MoGcIpvjscdId897Ln\nfkaSq6DvoWfANx/CtD/4eVoIuuf6wKzfUdD3qLo8VlfDpiWwek4QeM2BtXOhbKsfHk7FCLEt1IFO\nPQ+BskL/2bYs6C7w3666dpL9azru7Q+pHaFTX+jYN+q7n/92DsxaaovsfFWVsC0fitZCYcQn+L1X\nxWIcIXj2fEhp7z/J7SClHaR0qNedUV2AOQefPOMDiYptPrCI0b1XxWKqCcHEy6BDN2jfte67fTfo\nEHwnp7X2GkpcWWFtgNW5aiMprhwmjqoLuorW1U9vIcjsDTjKSSGtzxC/LpOD9Ryje9mLv8RhDLj0\nL1H7nqu/H1ZXseLlX5NCBd0ze8Gnz8LMxwGDHgdBznE+OOs/FNI6NntRnYO1BaUsyS+qDbiW5Bex\nZH0RqwtK6xbRoBs9d2i1isi3nwIxkTbGzMLAX4BTgJXAx2b2inNuQUSyK4DNzrl9zGw4cC9wkZkd\nCAwHcoFewDtmtq9zrmpH8rStrJI1BSV8WplDElV03lJC98w0wqHtPFEvL4atq2HrKti6muyq9YRc\nNXz0OHTqVxcYNKe1KJ7SrfDl6z74WjLZ3zaYtTcc+3M46FzodgAbxh4DQJ9Dhsed3Ib/vQhAj6Ou\njZu2ONTed3z3D3V5WTXLB2XffAifjg9OJmEgyVRYsm89Ky/06cOp/iTz4Aug1yDoOQi6HcCye08A\noNMFf489Y+d8K0RZIZRuZeljF5FMJX1PuAq2fBO0XHwDX79fF+AFDsAoszR49WcR8zwQklLiLu8u\nVVUJ29Y3CKx6Vq4k2VXCY8f5/tvy6wWhnkH7bMjoQTXh4NbSDX4dRAZVVWX1xupX0/HK6IhJhaIC\ntvaQ3D6YbrUPnovy67ZhtJQM9ikvo9pC8OixcRd7QMUi35FwWvOtS2mdfOtnI9/JrhyH+UC/tkys\nqCsbW76B0i210+4FVGOw5jO/jw481e+zkQF9Zi8IJ7M82J9yz3sibp6LQ3f6jv5D46bd+u/7Aeh+\n6ctQWQ6rP4Fl78HyafDx3+DDv/jt03MQ3SvXUBTq4G+HTE5vMC3nHMs2bGPaV/n8p/gC5lX2peTu\nd2uHt08Js3e3DgzZK4u9u3Zg724dGNC1PTld2rPkD8dzUNzcisieTIGYSNszBFjsnFsKYGYTgLOB\nyEDsbOD2oHsS8IiZWdB/gnOuDFhmZouD6c1oaoZlFVW8tyifNVtKWVNQypqCEtYUlLK2oJTVBSUU\nllYGKS/2X/dMJiUcok/ndPpktaNfVjr9strRL6sdfTul0j+5gHbVRSS7Ct/6U7AqIvBaBSWb682/\nO8HJ3Ru/qJ+xtI7BSV5dcJZRXUAlybByVnCVvDrqinnw21VDdRUdqzaTWb0V/rCPP8Hu2BeO/gkc\ndB70yGudVp+0TNj7RP8BH1ys+xy++YiSt8aS5CrgkIt88NNrEHTd37eyNZdZXWtPRg9KQu0pAfjO\n9Q3TlmyJOPlewea37iPVlcK8l2F2EOiFU3wwFgRmFd0P4SvXh7fK83AY6xeup2uHFHqklJBVvYlQ\n0VrfWlK4xt8CWriGvSqW+EDliRNrWwwba0nsWbnKB0vjL6gLvLbl0/DWNiODMJWWBB16QM9D/HdG\nxKdDD98yFazHr2uChKunNlwXVZX1WrqWPHoRzox9fvJyXfCVlBqz7NRO9/rpvkdFSdAyl++/t62H\novWwLZ/Sj5/HXDXpmb3jbsqKdcsAEk5ruLoLHiVbfDBVVd4g7b41HY8fX9czpUNdYNXnCP8d7Idf\n/mM0lSSRe/1uckteUopvTe53FBz/C3+b5MqPYfl7sOw9sqo3kl29Ae7p74O8fU6iqM9xTC/oxrTF\nG5j2VT4rN5cA0CuUxbDk+Qz97qXs3bUDA7p2oHtmKtaWW4ZFpFUpEBNpe3oDKyJ+rwSObCyNc67S\nzAqALkH/D6PGjXvmlpr/OQOfPYIMl0WGy6JrUjf2Te9OZYeehAb2IbVLXzK79qXkP7+ikjApJ95C\n0drFVG78kqQNX9P+m5X0qFpLX1tPH8snxaroUDPxyXexLakTxWk9/PT6HkJql36079qP5M7+6vmC\nRy/FYeRe/zIUrKB68zcUrltCaf5y3JYVJK9YSPtFU0irLq5rnfjbSQmtzD5AgWvHuv0vptvRl2B9\nh+x+t9yFk6DXodDrUFZOfhaA3DP/2LJ5SA9aSnocDMDamnzcPA02L6Ny5adsXjKTqlVz6DhnEumz\nnyIZGOjCVLu+VJBEt+ePpitbSLXKBpMvCXWgJDWbQpdJNSHSy9OhugKr3oZVbcGqKwhVV/hvV0mo\nuoLkqhKqMfLXfENV++7Q8wBSOvUkvUsf0jr3wjJ6+iCrfTe+uneYz+8PXtzxdRFOgnDH2lvbSkNB\nS0qnfk2M1Ijk9KCVt+G4Kz/1wUzuJRPiTmZFTYDXnLRXvl3Xs+YlGaVb6gKzki18PfFmqp2Rc/5d\nWE0+0zs3uo9U2nZcEGhJyWnBc2PHwgmw8PdDSasupsP+JxJeNoUuS39NB2CQ60wJh5DT/Tt0PPo0\njs4dSOFjpwKQe/RvWncZRORbQ4GYSNsT6wyoYRNA7DSJjOsnYHY1cDXAwF6dCQ88hf3L1pJXspbQ\n1i+guAiKgfXAIj/LiuB2rqR3Xq0/sbROVHbsz7Z2h7MiuRcrrRtzFnzFl9V9+KbLMXy9tYrCDZWw\nof5o2R3K6NlxDe1LLiDdyil+bimrtpSwtiCNyuoDiXglBtntk9k3q4qc9e/QP7SBjH2PpQqjyoWo\nJESVM6qcUelCVBGiEqOyOsTaJXP5b9XhlH2aQu9l2zjrkIV8L68Xub0yd7sr3fmFZbxfsS+bXQe2\nLdtEbq9M2qe2bDXunGPjtnK+rOrJ0qruPPuv+cxbVcCXa9tTXnU8cDwZaWFO7FbMsIxVHBxaRq9F\nL2HmYMBJrApnsTGUxdqqjqyozGRZaSaLStqzohA2bo5okVnRaBZIDhvJ4RCh8iIqCVNaltKg7KQl\nh+ieWUC3jFK6Za4lqfRksqyQLz9ZSffMNLplpNItM43MtKTdajsXl1eyobCc/KIyPq0YSBnJLJ6z\nKu54Kyv8vpBo2ioXYub7yygoqaj9bI3o9h+jtMI/fpryXIjenbbQu1MZfTqn07tTOr0jvntkppEU\nbhv/iOOcY0l+ER8s2cibJecxt6o/hbPTMTuJE3qUc2HnRRxR9SnnrPsAWz8VJo+FhYeSX7nW38ZY\nvGmXv/hDRPYMCsRE2p6VQN+I332A1Y2kWWlmSUBHYFOC4wLgnHsceBxg8ODBrusPn4gc6J8Z2ro6\nuK3Qf4reexyHkXXiT6FzTvDpD+mdqclER2BvIHvsMZzMQnJvvB2AorJK1ga3PK4pKGXNllLWbvW/\nl63pRLFLpX+1Y3D/zsEJYDt6d06vPSlMSw4DMH/s7wHI/eHTCa3M+WMf5ofuA1ac8Q9e/Ww1495b\nxmP/W8qA7PacldeT7x3Si4HdMxKa1s5Uc7I4a/lmPl6+mdlfb2L5xmLgPAD++tgMzGBAdnsO7t2R\ng3p35ODeHcnt3ZEOOxCcVTlj9ZYSVm0pYdVm/71yc83vYlZtKaG0ohoYBUDm3NUc1Lsjl30npzYP\n/bu0qxfczB87E4DcS/9OFjCgkXmXV1bzwT1nUuqSyf3JBJKCgMt/fHdSyGqnPT9o2el/01TWby1l\n3dYy1heWsn5rGeu2lrK+0H9/sXora8rzKCEVXvys3jxTk0K1gVn3zDS6Bt+l5XlUEuaDaUspLq+i\nuLwy+K7rLimvYlt5JQVFV/tnI//vfdqnJJGeEqZdSph2KUnBd1335vKDKSWF/771JRuKythQVB58\nl7GxqJzi8sjHNc/3XxPmJLDlzm5+2lf93cwZqUlkpifTMfgMyO7gu9slU/rRk6RSSejIq1m5uYSV\nW0p454v1bCiq/5xcOGT0yEyj87Yf0C1UQO5bX9K7Uzp9Ovv9tFenNFKTwgnkbedzzrF8YzEzlmxk\nxtKNfLh0I/mFPv9drSdDkhbx/84bwTH7ZNOlQ2rdiNVVsPpTWPwuLHmX7Op8ulbn+zehtsuG7IHB\nZ1/oEnR36q+/oBCRhKm2EGl7PgYGmtlewCr8yzcuiUrzCjAS/+zX+cBk55wzs1eA58zsAfxz9QOB\nmc3OgZm/LSutI3Q7oLb36hmvA5B1zM+aPckOqUns0y2Dfbo1DHrmj70RgNxrpzd7uoloZ+Wce1gf\nzj2sD5u3lfPf+Wt59bPVPDJlMQ9PXsz+PTL43iG92K+6E92sgIqqaqqqHdXO+e9qfLdzVFf77/XV\nmYRw5BeWkRIORQQVFrMFpsKFmbV8E7O+3sys5ZuY/fVmNhdXAJDVPoXD+3fmkiP7kTX1FrJDW6k6\n7yk+X1XAvFUFzFi6kX/N8fG0GewVBGddy46gb3gjq+avpbC0kqIy/yksraSwtML/Lq2kMPjeUHgt\nG10GVfdMrpe3rPYp9O6UzsBuGQzbrxu9O6VT/e6d5ITzOenWV3dai1JKUoiuIf/yir5Z7RIer0Nq\nEh2CZ3YaM3/sMRS7FLpc/UptgJZfWBewrd9axhdrtzLtqzIKyyqBM/2Ir38B+IAtOrhKTwnTIzON\nrPXrqCRMUmoS28oq2VBURklFFdvKqigpr6S4ogpX2+58FgChKYvJap9CdodUsjuk0q9fu9ru7A6+\nf8HEH5NOOfv86Lm462Dxo74KSDRtyByDb3iJjLSkJluy5s/xj4/mfvfBev1LK6pYXS9I999fzTU+\nr+zH1CmLqY5qa++akVrbgtanczqh8sPIsBLWfrEuCF6TaB+s15r1nJoU2q7yta66I/NnreDDJRv5\nYMlG1m71bzTslpHK0L27MHTvLhw9IJutj56KGeQO+lXDiYTC0Gew/wy7mYW/P5p2bhv9T7wKNnwF\nGxbBwteh+B9144RTIGsAZA+kW+XaZudbRPYsCsRE2pjgma/RwJv419c/6Zybb2Z3ArOcc68A44Bn\ngpdxbMIHawTpXsS/2KMS+MmOvjHx26Zz+xQuHtKPi4f0Y31hKW987oOyP7z5JRC8AfHWNxKY0k/8\n1+/faTAkKRS07oSNlHAIikez1aVT8ag/6R2Q3Z6TD+jOETlZHJ7TmQHZ7etagab7W89yD+jOSQd0\nr53m+sJS5q0q4POVW/l8VQEfLd3E2rKT/cBnZtebf0o4REZaEh3SknwQk5pEr05pdN+wkmzbyiHf\nvdq/aKVzOr06pdMupeGhYv40/5a+3em2vnjaWTkD4gRs4G8P/PC+s0mmkkE/f412KUlNvgF0/tgb\nAMi94saYw51zlFZUU1xeyWcPnUsqFRx1y5tx3yo6P+xP5PeOk1+A0vCmZqft3H7733CZlhyOuS7n\nL/Fvjtz35mmsLSitDdJ8wOZbVOevKuDt+esorzrNj/T0rEbnEzJol5JESvlowlQTGvsOVTUXPqrr\nLnzUuzDigqBq0ly6tE/hqAFdOHpv/4nclwDmN6P4VluYIsuEodfVH1C8yQdlGxfVBWjrF5JdnZ/4\nxEVkj6RATKQNcs69Drwe1e+2iO5S4IJGxv098PtdmsFviW4ZaYwcmsPIoTms2lLCPx78FUWk0vP4\nKwmFjJAZYTNCISNs/vYsMyMcMta+fg8Oo+tpv6CiylFRVR18GnbnfzKTDlbKaRf9hMP7dyY78vao\nZuT1xP3TOHH/uuBs+l2nsro6iwOveMwHXqk++GrsFrHagOKoPbt4tEtJonuoAICMtB1/+YSZkR60\n9NRMd7v/2qGNSA6H6JvVrtGWzepqx/tjT6fIpdFr1NP+Vs+KyqAV0d/+ua28pruKVTNnUY3RZb+D\ngiiSPKAAAA70SURBVH2MiH3P73N+n4SN7z9Np1Ax3//RXezbvcOuv1jQLgv6Hek/Eb74/VDivJBW\nRPZwCsRERBLQu1M6/y/VX7nPPfHeuOnnvzPXpz06J37aL3xLW27u77Y/gzF0DhXTOVRMbu/m/3Gt\nyK4UChlZoW1ksY3cvp3ipp//+dUA5J53S/y0s98DYL8eLf9sZyRnbePlJSLSelRLiIiIiIiItDAF\nYiIiIiIiIi1MgZiIiIiIiEgLUyAmIiIiIiLSwhSIiYiIiIiItDAFYiIiIiIiIi1MgZiIiIiIiEgL\nUyAmIiIiIiLSwhSIiYiIiIiItDAFYiIiIiIiIi1MgZiIiIiIiEgLUyAmIiIiIiLSwhSIiYiIiIiI\ntDAFYiIiIiIiIi1MgZiIiIiIiEgLS2rtDIjIt0duz46tnQURERGRNkEtYiIiIiIiIi1MLWIisvNc\n9p/WzoGIiIhIm6AWMRERERERkRamQExERERERKSFKRATERERERFpYQrERNoQM8sys7fNbFHw3bmR\ndCODNIvMbGRE/9+b2QozK2q5XIuIiIhINAViIm3LGOBd59xA4N3gdz1mlgX8FjgSGAL8NiJgezXo\nJyIiIiKtSIGYSNtyNvB00P00cE6MNKcBbzvnNjnnNgNvA6cDOOc+dM6taZGcioiIiEijFIiJtC3d\nawKp4LtbjDS9gRURv1cG/URERERkN6H/ERPZzZjZO0CPGINuTXQSMfq57cjH1cDVAP369Wvu6CIi\nIiLSBAViIrsZ59zJjQ0zs3Vm1tM5t8bMegLrYyRbCQyL+N0HmLod+XgceBxg8ODBzQ7kRERE/n97\n9x9r913Xcfz5st1kv7K10s5mpQ4Xglg0A69Dg5KGrd0gMUUzpiixkiwjERKMBqiTuNmBaQYY9A+Z\nZTQpOLchTFYlWEqzZc5E6Fa7UZyzSKYrNG1cwa0aYbK3f5xv4VrOaXt37/l+z/fc5yM5Oef7+X7O\nue9PPsnteffz/nyupNEsTZT6ZSdw4hTETcC9Q/rsAjYkWdYc0rGhaZMkSdKEMBGT+mUrsD7JQWB9\nc02SmSS3A1TVMeAWYG/z2NK0keTWJIeAc5McSnJzB2OQJEla9CxNlHqkqp4CrhzS/hBw/azr7cD2\nIf3eBbxrnDFKkiTp9EzEJHVi7Y0Pdh2CJElSZyxNlCRJkqSWmYhJkiRJUstMxCRJkiSpZSZikiRJ\nktQyD+uQNPG2/ND7Abi74zgkSZIWiitikiRJktQyEzFJkiRJapmliZIm3t1v/dmuQ5AkSVpQrohJ\nkiRJUstcEZOkM+ShIZIkaaG4IiZJkiRJLXNFTNJUWXvjg12HIEmSdFomYpIWtXGVG1rGKEmSTsVE\nTNKi5omMkiSpC+4RkyRJkqSWmYhJkiRJUstMxCRJkiSpZe4Rk6QzNK79ZB4YIknS4mMiJkk9YnIl\nSdJ0sDRRkiRJklrmipgkjYHH4kuSpFMxEZN6JMlyBlVplwJPANdV1TeG9NsEvKe5fG9V7UhyLvCX\nwGXAd4C/rqrNbcSthTPOBM+yR0mS2mNpotQvm4E9VfUSYE9z/f80ydpNwKuAK4Cbkixrbn+gqn4M\neAXw6iSvaydsSZIkzWYiJvXLRmBH83oH8IYhfa4GdlfVsWa1bDdwTVX9d1XdB1BV3wb2AatbiFmS\nJEknsTRR6peLq+owQFUdTrJySJ9LgCdnXR9q2r4ryUXALwB/POoHJbkBuAFgzZo18wxbXXCfmiRJ\nk8tETJowST4P/PCQW793ph8xpK1mff5S4E7gT6rqq6M+pKq2AdsAZmZmalQ/zV8fEyb3k0mSND8m\nYtKEqaqrRt1LciTJqmY1bBVwdEi3Q8C6WdergftnXW8DDlbVhxYgXEmSJD0PJmJSv+wENgFbm+d7\nh/TZBfzhrAM6NgC/C5DkvcCFwPXjD1V908eVOUmS+srDOqR+2QqsT3IQWN9ck2Qmye0AVXUMuAXY\n2zy2VNWxJKsZlDf+OLAvyf4kJmSSJEkdcEVM6pGqegq4ckj7Q8xa5aqq7cD2k/ocYvj+MWnOXD2T\nJGl+XBGTJEmSpJaZiEmSJElSyyxNlCSN1dpVF55xX4/FlyQtFiZikqTxestnuo5AkqSJYyImSZoY\nHgIiSVos3CMmSZIkSS0zEZMkSZKkllmaKEnqJQ/2kCT1mYmYJKmX5rKfbK5Jm0meJGncLE2UJEmS\npJaZiEmSJElSyyxNlCRNvUk5Ft+SR0nSCSZikiTNw7iSq7l87rj6SpLGx9JESZIkSWqZK2KSJJ1k\nUkoZJUnTy0RMkqQJNJdk0MRRkvrHREySpHnoW8I0CTFIktwjJkmSJEmtMxGTJEmSpJZZmihJkoYa\n51H3HqMvabEzEZMkSQvC5EqSzpyJmCRJGsqDPSRpfNwjJvVMkuVJdic52DwvG9FvU9PnYJJNs9r/\nNskjSb6c5LYkS9qLXpIkSeCKmNRHm4E9VbU1yebm+t2zOyRZDtwEzAAFPJxkZ1V9A7iuqp5OEuCT\nwBuBu1odgSTNwVxKHi2PlNQXJmJS/2wE1jWvdwD3c1IiBlwN7K6qYwBJdgPXAHdW1dNNn6XA2QwS\nNUmaN0sZv2ftqgu7DkHShDMRk/rn4qo6DFBVh5OsHNLnEuDJWdeHmjYAkuwCrgA+y2BV7PskuQG4\nAWDNmjULE7kkTZC5rJ6ZWElaaO4RkyZQks8nOTDksfFMP2JI23dXvqrqamAV8IPAa4d9QFVtq6qZ\nqppZsWLFnMcgSZKk0VwRkyZQVV016l6SI0lWNathq4CjQ7od4nvliwCrGZQwzv4Z/5NkJ4NSx93z\nDlqS5mASyhgnIQZJi5crYlL/7AROnIK4Cbh3SJ9dwIYky5pTFTcAu5Kc3yRvJFkKvB745xZilqR+\ne8tnBg9JWiAmYlL/bAXWJzkIrG+uSTKT5HaA5pCOW4C9zWNL03YesDPJo8AjDFbTbmt/CJIkSYub\npYlSz1TVU8CVQ9ofAq6fdb0d2H5SnyPAT487RkmSJJ2aiZgkSZpoc9nL5b4vSX1haaIkSdJCcz+Z\npNMwEZMkSZKklpmISZIkSVLLTMQkSZIkqWUmYpIkSZLUMhMxSZIkSWqZiZgkSZIktcxETJIkSZJa\nZiImSZIkSS1LVXUdg6QJl+QZ4PGu4xijFwL/0XUQYzLNYwPH13fTPr6XVtUFXQchaTIt7ToASb3w\neFXNdB3EuCR5aFrHN81jA8fXd4thfF3HIGlyWZooSZIkSS0zEZMkSZKklpmISToT27oOYMymeXzT\nPDZwfH3n+CQtWh7WIUmSJEktc0VMkiRJklpmIiZJkiRJLTMRkzRSkmuSPJ7kK0k2dx3PQkvyRJIv\nJdk/DcdMJ9me5GiSA7PalifZneRg87ysyxjnY8T4bk7ytWYO9yd5fZcxPl9JXpTkviSPJflyknc0\n7VMxf6cY37TM3wuSfDHJI834/qBpf3GSLzTzd3eSs7uOVdLkcI+YpKGSLAH+BVgPHAL2Am+qqn/q\nNLAFlOQJYKaqpuIPyiZ5DXAc+FhVvbxpuxU4VlVbm2R6WVW9u8s4n68R47sZOF5VH+gytvlKsgpY\nVVX7klwAPAy8AfgNpmD+TjG+65iO+QtwXlUdT3IW8CDwDuC3gXuq6q4ktwGPVNWHu4xV0uRwRUzS\nKFcAX6mqr1bVt4G7gI0dx6RTqKoHgGMnNW8EdjSvdzD48ttLI8Y3FarqcFXta14/AzwGXMKUzN8p\nxjcVauB4c3lW8yjgtcAnm/bezp+k8TARkzTKJcCTs64PMUVfnBoFfC7Jw0lu6DqYMbm4qg7D4Msw\nsLLjeMbh7UkebUoXe1m6N1uSS4FXAF9gCufvpPHBlMxfkiVJ9gNHgd3AvwLfrKr/bbpM4+9QSfNg\nIiZplAxpm7Za5ldX1SuB1wFva0rf1C8fBi4DLgcOAx/sNpz5SXI+8Cngt6rq6a7jWWhDxjc181dV\n36mqy4HVDCoKXjasW7tRSZpkJmKSRjkEvGjW9Wrg6x3FMhZV9fXm+SjwVwy+PE2bI83+nBP7dI52\nHM+CqqojzRfg54CP0OM5bPYWfQq4o6ruaZqnZv6GjW+a5u+EqvomcD/wM8BFSZY2t6bud6ik+TER\nkzTKXuAlzalfZwO/AuzsOKYFk+S85tAAkpwHbAAOnPpdvbQT2NS83gTc22EsC+5EktL4RXo6h81h\nDx8FHquqP5p1ayrmb9T4pmj+ViS5qHl9DnAVg31w9wHXNt16O3+SxsNTEyWN1Bwl/SFgCbC9qt7X\ncUgLJsmPMlgFA1gK/EXfx5fkTmAd8ELgCHAT8GngE8Aa4N+BN1ZVLw+8GDG+dQzK2gp4AnjriT1V\nfZLk54C/A74EPNc038hgH1Xv5+8U43sT0zF/P8ngMI4lDP6T+xNVtaX5PXMXsBz4R+DNVfWt7iKV\nNElMxCRJkiSpZZYmSpIkSVLLTMQkSZIkqWUmYpIkSZLUMhMxSZIkSWqZiZgkqVNJLkrym8/jfTeO\nIx5JktrgqYmSpE4luRT4m6p6+Rzfd7yqzh9LUJIkjZkrYpKkrm0FLkuyP8n7T76ZZFWSB5r7B5L8\nfJKtwDlN2x1Nvzcn+WLT9mdJljTtx5N8MMm+JHuSrGh3eJIkfT9XxCRJnTrdiliS3wFeUFXva5Kr\nc6vqmdkrYkleBtwK/FJVPZvkT4F/qKqPJSkGf0j3jiS/D6ysqre3MTZJkkZZ2nUAkiSdxl5ge5Kz\ngE9X1f4hfa4EfgrYmwTgHOBoc+854O7m9Z8D94w3XEmSTs/SREnSRKuqB4DXAF8DPp7k14d0C7Cj\nqi5vHi+tqptHfeSYQpUk6YyZiEmSuvYMcMGom0l+BDhaVR8BPgq8srn1bLNKBrAHuDbJyuY9y5v3\nweDfumub178KPLjA8UuSNGeWJkqSOlVVTyX5+yQHgM9W1TtP6rIOeGeSZ4HjwIkVsW3Ao0n2VdWv\nJXkP8LkkPwA8C7wN+Dfgv4C1SR4G/hP45fGPSpKkU/OwDknSVPOYe0nSJLI0UZIkSZJa5oqYJGki\nJPkJ4OMnNX+rql7VRTySJI2TiZgkSZIktczSREmSJElqmYmYJEmSJLXMREySJEmSWmYiJkmSJEkt\nMxGTJEmSpJaZiEmSJElSy/4PDTIOHCj38kMAAAAASUVORK5CYII=\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "diff = evodumb['mean']-evohalfherd['mean']\n",
- "m = evodumb['max'].loc[0].sum()\n",
- "diff = diff / m\n",
- "diff.plot(yerr=(evodumb['std']+evoherd['std'])/m,\n",
- " title='Comparing the Herd and Dumb behaviours: normalized difference and error in number of agents in each state when using 50% herd agents.');"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-11-01T13:28:05.554284Z",
- "start_time": "2017-11-01T14:28:05.324360+01:00"
- }
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "diff = evodumb['mean']-evoherd['mean']\n",
- "m = evodumb['max'].loc[0].sum()\n",
- "diff = diff / m\n",
- "diff.plot(yerr=(evodumb['std']+evoherd['std'])/m,\n",
- " title='Comparing the Herd and Dumb behaviours: normalized difference and error in number of agents in each state when using 100% herd agents.');"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2017-11-01T13:32:12.118102Z",
- "start_time": "2017-11-01T14:32:11.479970+01:00"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 13,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "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\n3FfboBuaOXPm8NOf/hRvb2/atWtXaVJwhRdeeIG777670sRQXFzs1CqrkydPZubMmbzxxhv1EaJp\nJEqKi0lc8ndiNv2V/prD2ta30+OupxnS/PwvdlZUWJBP9slj5JzMIPfUcfKzMynMPk7R6Uz0zAnk\nzAl88k/iW5hFQOEpQnIO46f5bAz7Ma2ufYDuPeyCcm3VmBgc1wymAssAb2COqiaJyJNAoqouAWYD\n80QkhdIzhTFn24vIXiAY8BORW4ARwCngcWAHsN6x3s/LqvrmxQzmj58msS391MV0cZ7YdsH84SfV\nPxdh/vz5vPfeewDs3buXm266ia1bt3LmzBnGjx/Ptm3b6N69O2fOVP+XD5SeVQwaNIgVK1Zw8uRJ\nZs+ezZVXXklxcTHTp0/n22+/JT8/nylTpnD//ffz7bffMmvWLD777DOgdNXX+Ph4Tp06RXp6Otdc\ncw1hYWGsWLGCZs2a8cgjj7Bs2TKeffZZli9fzqeffsqZM2cYOnQor7322nmP57zyyiu59957KSoq\nwsfmYs0F2L1lNYVLfsnAwm3s8I0l8+bnGdxrsNPtff38admqPS1bta/VfhvPAhZ1z6nfdFVdCiyt\nUPZEmdd5wP9U0Taqim494gHBBQUF7Nmzh6ioqPO2vfrqqzRp0oTNmzezefNm+vVzbqGtoqIi1q5d\ny9KlS/njH//I119/zezZs2nevDkJCQnk5+dz+eWXM2LEiCr7mDZtGs899xwrVqw495Ch06dP07Nn\nT5588kmgdMmMJ54oPYz33HMPn332GT/5yU/K9ePl5UXnzp3ZtGkT/fv3dyp+YwCyszJJmv8oA458\nyCkJYm3vPxF/85RGt7yEO/KoPwFr+su+Phw7doyQkJBKt3333XfnHpgTFxdHXFycU33+9Kc/BaB/\n//7s3bsXKF22e/PmzeemqbKysti1axd+fpVfeKuMt7c3t91227n3K1asYObMmeTm5pKZmUmPHj3O\nSwwArVq1Ij093RKDcYqWlLBu6ZtEJf6FgZpFQtjNdLvzrwxsRIvQuTuPSgyuEBgYSF5eXpXbK07N\nOOPsEtpnl8+G0iW3X3rpJW644YZydVeuXElJScm599XFEhAQcO66Ql5eHg888ACJiYlERkYyY8aM\nKtvm5eWVexaFuXBHD6aStnUlfa670yP/ct6/cyPZC6cRX7CJXd6dyfzxOwzqd5WrwzK1ZKurXqQW\n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\n8/8U7UznepyQDQAAAABJRU5ErkJggg==\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEKCAYAAADuEgmxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXdcVfX/x58f9hKUpQgC7o0iOHCPXGmOMnPP0kwzKysb\npvVrWGmZ2tfKnTu11DRTU9TcgAPFSQoyRBkKsi/3fn5/nCsigl6JK8PzfDzu497zOZ/xPhfueZ/P\ner2FlBIVFRUVFRVDMClpA1RUVFRUyg6q01BRUVFRMRjVaaioqKioGIzqNFRUVFRUDEZ1GioqKioq\nBqM6DRUVFRUVg1GdhoqKioqKwahOQ0VFRUXFYFSnoaKioqJiMGYlbUBx4OzsLL29vUvaDBUVFZUy\nRUhISIKU0uVxypQLp+Ht7U1wcHBJm6GioqJSphBCRD5uGXV4SkVFRUXFYFSnoaKioqJiMKrTUFFR\nUVExmHIxp1EQGo2G6OhoMjMzS9qUpx4rKys8PDwwNzcvaVNUVFT+I+XWaURHR1OhQgW8vb0RQpS0\nOU8tUkoSExOJjo6mevXqJW2OiorKf6TcDk9lZmbi5OSkOowSRgiBk5OT2uNTUSknlFunAagOo5Sg\n/h1UVMoPBjkNIUQPIcRFIUS4EGJaAecthRDr9eePCSG89eldhRAhQogz+vfOecr46dPDhRDzhP7O\nIoRwFELsFkJc1r9XKp5LVVFRedJIKTl18xQzDs+gz+Y+fH/ie+LS4krMnoycDDQ6TYm1Xx54pNMQ\nQpgCPwA9gQbAYCFEg3zZxgK3pJS1gO+Ar/TpCcBzUsrGwEhgZZ4yC4FxQG39q4c+fRqwR0pZG9ij\nPy51CCF4++23c49nz57NzJkzjdqmt7c3L7zwQu7xxo0bGTVqlFHbVFEpCokZiSw/u5x+W/oxfMdw\ndlzdQSXLSiw9u5Qem3owdf9UTt48iZTyidm0M2In3TZ2o9/mfpy4ceKJtVveMKSn0QIIl1JekVJm\nA+uAvvny9AVW6D9vBLoIIYSU8qSUMlafHgZY6XslboC9lPKIVP5rfgH6FVDXijzppQpLS0t+++03\nEhISnmi7wcHBhIWFPdE2VVQMIUeXw4HoA0wJnMIzG55hTsgcKlhUYGbATAIHBrKi5wq299/O8AbD\nORx7mBE7RvDStpfYEr6FLG2W0ey6nXmbd/a/w9T9U6lqVxWt1DLqr1F8HfQ1GTkZRmu3vGKI03AH\novIcR+vTCswjpcwBkgGnfHleAE5KKbP0+aMLqbOylPK6vq7rgGtBRgkhxgkhgoUQwfHx8QZcRvFi\nZmbGuHHj+O677x44FxkZSZcuXfDx8aFLly5cu3YNgFGjRjF58mRat25NjRo12LhxY26Zb775hubN\nm+Pj48OMGTMKbXfq1Kl88cUXD6QnJSXRr18/fHx8aNWqFaGhoQDMnDmTMWPG0LFjR2rUqMG8efNy\ny6xatYoWLVrQtGlTxo8fj1arLfL3ofL0EpUSxbwT8+i+sTsT90zk5M2TDK0/lM19N7Pq2VW8UOcF\nbM1tAfCo4MHb/m/z94C/md5qOtnabD469BHdNnZj/sn53Ey/Way2BV4LpN+Wfvx97W9e932d1c+u\n5rc+vzGw7kBWnlvJi3+8yKmbp4pcv5SSwzGHGf3XaNqsbcP7/7zPvqh9ZGuzi/EqSheGLLktaBYz\nf5/yoXmEEA1Rhqy6PUadD0VK+TPwM4C/v/+T6+PmYeLEifj4+PDuu+/elz5p0iRGjBjByJEjWbp0\nKZMnT2bz5s0AXL9+nYMHD3LhwgX69OnDgAED2LVrF5cvX+b48eNIKenTpw8HDhygffv2D7Q5cOBA\n/ve//xEeHn5f+owZM/D19WXz5s3s3buXESNGcOqU8mO4cOECgYGB3Llzh7p16zJhwgTCw8NZv349\nhw4dwtzcnNdee43Vq1czYsQII31bKqWdsMQw5p2Yx+n401iaWmJhanHv3UR5tzKzyk23NLUkNjWW\n4BvBmAgT2lRtw/u136eDRwfMTR++J8fG3IaBdQfyYp0XOXr9KGvOr2FR6CKWnllKV6+uDKk/hCYu\nTYq8iCIlO4Wvjn/F1n+3UqdSHX7q+hN1HesCYGZixketPqKrV1c+PvQxI3aMYESDEUzynYSVmZVB\n9eukjsCoQBaFLiIsMQxXG1faurflQPQBtl3Zhp25HZ09O9PduzsBbgGP/D7KEoY4jWigWp5jDyC2\nkDzRQggzwAFIAhBCeAC/AyOklP/mye9RSJ03hBBuUsrr+mGs4n30KEbs7e0ZMWIE8+bNw9raOjf9\nyJEj/PbbbwAMHz78PqfSr18/TExMaNCgATdu3ABg165d7Nq1C19fXwBSU1O5fPlygU7D1NSUd955\nhy+//JKePXvmph88eJBNmzYB0LlzZxITE0lOTgagV69eWFpaYmlpiaurKzdu3GDPnj2EhITQvHlz\nADIyMnB1LbBTp1LOiUyJZP7J+eyM2Ekly0o8V+M5JJIsbRZZ2iyytdm5n1M1qWRnZuemW5tZ87rv\n6/St2ZfKtpUfu20hBAFVAwioGkBUShRrL67l98u/syNiBx52HnTx7EIXry40cWmCiTBssefhmMN8\nfPhjEjISGOczjld9Xi3wpt3SrSW/9f2Nb4O/ZcW5FeyP3s//tfk/mro2LbTuHF0OOyN2svjMYsJv\nh+Nh58GMgBn0qdkHC1MLNDoNx64fY2fETvZc28PWf7dSwbxCrgNp5dbKKA4kR5fDpVuXOBN/hhyZ\ng42ZDTbmNoW+W5tZG/x95scQpxEE1BZCVAdigEHAkHx5tqJMdB8BBgB7pZRSCFER2A68L6U8dDez\n3iHcEUK0Ao4BI4D5+eqapX/fUqQre0JMmTKFZs2aMXr06ELz5H1asrS0zP18dxJQSsn777/P+PHj\nDWpz+PDhfPnllzRs2PCBugpqN2+bpqam5OTkIKVk5MiRfPnllwa1qVL+SMhI4MfTP7Lp0ibMTc0Z\n7zOeUQ1HYWdhVyL2VLOvxrvN32VS00nsuLqDv6/9zeoLq1lxbgVOVk508uxEF88utKzSssAbb5om\njTnBc9hwaQM1HGowt9NcGjk3emibtua2TA+YzjNezzDj8AxG/jWSkQ1GMtF3Ipam9343Gq2Grf9u\nZcnZJUTdiaKmQ02+bPclPbx7YGZy7zZqbmJOW/e2tHVvy8etPubI9SPsjNjJ3mt72fLvFipYVFAc\noWcXajjUwM3WrUhOJF2TTmhCKCdvnOTEzROExoeSnpP+WHVYm1k/OlMBPNJpSClzhBCTgJ2AKbBU\nShkmhPgUCJZSbgWWACuFEOEoPYxB+uKTgFrAdCHEdH1aNynlTWACsBywBnboX6A4i1+FEGOBa8CL\nRbqyJ4SjoyMDBw5kyZIljBkzBoDWrVuzbt06hg8fzurVq2nbtu1D6+jevTvTp09n6NCh2NnZERMT\ng7m5Oa6urnTp0oVffvkFd/d700jm5ua8+eabzJo1i86dlVXM7du3Z/Xq1UyfPp19+/bh7OyMvb19\noW126dKFvn378uabb+Lq6kpSUhJ37tzBy8urGL4VldLMnew7LDu7jFXnV6HRahhQZwDjm4zH2dq5\npE0DlKGrF+q8wAt1XiA1O5V/Yv7h78i/2X5lOxsvbaSCeQXaebSji2cX2rq3xcbchqC4IKYfmk5s\n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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "(evohalfherd['std']/m).plot()\n",
- "(evodumb['std']/m).plot()\n",
- "(evowise['std']/m).plot()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.5"
- },
- "toc": {
- "colors": {
- "hover_highlight": "#DAA520",
- "navigate_num": "#000000",
- "navigate_text": "#333333",
- "running_highlight": "#FF0000",
- "selected_highlight": "#FFD700",
- "sidebar_border": "#EEEEEE",
- "wrapper_background": "#FFFFFF"
- },
- "moveMenuLeft": true,
- "nav_menu": {
- "height": "30px",
- "width": "252px"
- },
- "navigate_menu": true,
- "number_sections": true,
- "sideBar": true,
- "threshold": 4,
- "toc_cell": false,
- "toc_section_display": "block",
- "toc_window_display": false,
- "widenNotebook": false
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/examples/Untitled.ipynb b/examples/Untitled.ipynb
deleted file mode 100644
index 29e00b1..0000000
--- a/examples/Untitled.ipynb
+++ /dev/null
@@ -1,80808 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "The autoreload extension is already loaded. To reload it, use:\n",
- " %reload_ext autoreload\n",
- "Populating the interactive namespace from numpy and matplotlib\n"
- ]
- }
- ],
- "source": [
- "import soil\n",
- "import networkx as nx\n",
- " \n",
- "%load_ext autoreload\n",
- "%autoreload 2\n",
- "\n",
- "# To display plots in the notebook\n",
- "%pylab inline\n",
- "\n",
- "from soil import *"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "evodumb = analysis.read_data('newsspread/soil_output/Sim_all_dumb/')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 103 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_0 True True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 104 105 ... 91 92 93 94 95 96 97 98 \n",
- " t_step ... \n",
- " 0 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 99 env \n",
- " t_step \n",
- " 0 0.1 0.01 \n",
- " 1 0.1 0.01 \n",
- " 2 0.1 0.01 \n",
- " 3 0.1 0.01 \n",
- " 4 0.1 0.01 \n",
- " 6 0.1 0.01 \n",
- " 7 0.1 0.01 \n",
- " 8 0.1 0.01 \n",
- " 10 0.1 0.01 \n",
- " 11 0.1 0.01 \n",
- " 12 0.1 0.01 \n",
- " 14 0.1 0.01 \n",
- " 15 0.1 0.01 \n",
- " 16 0.1 0.01 \n",
- " 18 0.1 0.01 \n",
- " 19 0.1 0.01 \n",
- " 20 0.1 0.01 \n",
- " 22 0.1 0.01 \n",
- " 23 0.1 0.01 \n",
- " 24 0.1 0.01 \n",
- " 25 0.1 0.01 \n",
- " 26 0.1 0.01 \n",
- " 27 0.1 0.01 \n",
- " 29 0.1 0.01 \n",
- " \n",
- " [24 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 103 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_1 True True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 104 105 ... 91 92 93 94 95 96 97 98 \n",
- " t_step ... \n",
- " 0 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 99 env \n",
- " t_step \n",
- " 0 0.1 0.01 \n",
- " 1 0.1 0.01 \n",
- " 2 0.1 0.01 \n",
- " 3 0.1 0.01 \n",
- " 4 0.1 0.01 \n",
- " 5 0.1 0.01 \n",
- " 7 0.1 0.01 \n",
- " 8 0.1 0.01 \n",
- " 9 0.1 0.01 \n",
- " 10 0.1 0.01 \n",
- " 11 0.1 0.01 \n",
- " 12 0.1 0.01 \n",
- " 13 0.1 0.01 \n",
- " 14 0.1 0.01 \n",
- " 15 0.1 0.01 \n",
- " 16 0.1 0.01 \n",
- " 17 0.1 0.01 \n",
- " 18 0.1 0.01 \n",
- " 19 0.1 0.01 \n",
- " 20 0.1 0.01 \n",
- " 21 0.1 0.01 \n",
- " 22 0.1 0.01 \n",
- " 23 0.1 0.01 \n",
- " 24 0.1 0.01 \n",
- " 26 0.1 0.01 \n",
- " 27 0.1 0.01 \n",
- " 29 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_10 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " \n",
- " [23 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_11 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [26 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_12 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [26 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_13 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [28 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_14 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_15 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [28 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_16 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [26 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_17 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_18 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_19 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [28 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 103 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_2 True True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 104 105 ... 91 92 93 94 95 96 97 98 \n",
- " t_step ... \n",
- " 0 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 99 env \n",
- " t_step \n",
- " 0 0.1 0.01 \n",
- " 1 0.1 0.01 \n",
- " 2 0.1 0.01 \n",
- " 4 0.1 0.01 \n",
- " 5 0.1 0.01 \n",
- " 6 0.1 0.01 \n",
- " 7 0.1 0.01 \n",
- " 8 0.1 0.01 \n",
- " 9 0.1 0.01 \n",
- " 10 0.1 0.01 \n",
- " 12 0.1 0.01 \n",
- " 14 0.1 0.01 \n",
- " 16 0.1 0.01 \n",
- " 17 0.1 0.01 \n",
- " 18 0.1 0.01 \n",
- " 19 0.1 0.01 \n",
- " 21 0.1 0.01 \n",
- " 22 0.1 0.01 \n",
- " 23 0.1 0.01 \n",
- " 25 0.1 0.01 \n",
- " 26 0.1 0.01 \n",
- " 27 0.1 0.01 \n",
- " 28 0.1 0.01 \n",
- " \n",
- " [23 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_20 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " \n",
- " [29 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_21 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [29 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_22 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [24 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_23 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_24 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [25 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_25 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_26 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [21 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_27 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [28 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_28 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_29 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [28 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 103 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_3 True True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 104 105 ... 91 92 93 94 95 96 97 98 \n",
- " t_step ... \n",
- " 0 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 99 env \n",
- " t_step \n",
- " 0 0.1 0.01 \n",
- " 1 0.1 0.01 \n",
- " 2 0.1 0.01 \n",
- " 3 0.1 0.01 \n",
- " 4 0.1 0.01 \n",
- " 5 0.1 0.01 \n",
- " 6 0.1 0.01 \n",
- " 7 0.1 0.01 \n",
- " 8 0.1 0.01 \n",
- " 9 0.1 0.01 \n",
- " 10 0.1 0.01 \n",
- " 11 0.1 0.01 \n",
- " 12 0.1 0.01 \n",
- " 13 0.1 0.01 \n",
- " 14 0.1 0.01 \n",
- " 15 0.1 0.01 \n",
- " 16 0.1 0.01 \n",
- " 17 0.1 0.01 \n",
- " 18 0.1 0.01 \n",
- " 19 0.1 0.01 \n",
- " 20 0.1 0.01 \n",
- " 21 0.1 0.01 \n",
- " 22 0.1 0.01 \n",
- " 23 0.1 0.01 \n",
- " 25 0.1 0.01 \n",
- " 27 0.1 0.01 \n",
- " 28 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_30 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " \n",
- " [28 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_31 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [23 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_32 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " \n",
- " [25 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_33 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_34 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [25 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_35 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_36 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [26 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_37 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [26 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_38 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_39 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 103 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_4 True True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 104 105 ... 91 92 93 94 95 96 97 98 \n",
- " t_step ... \n",
- " 0 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 99 env \n",
- " t_step \n",
- " 0 0.1 0.01 \n",
- " 1 0.1 0.01 \n",
- " 3 0.1 0.01 \n",
- " 4 0.1 0.01 \n",
- " 5 0.1 0.01 \n",
- " 7 0.1 0.01 \n",
- " 8 0.1 0.01 \n",
- " 9 0.1 0.01 \n",
- " 12 0.1 0.01 \n",
- " 13 0.1 0.01 \n",
- " 14 0.1 0.01 \n",
- " 15 0.1 0.01 \n",
- " 16 0.1 0.01 \n",
- " 17 0.1 0.01 \n",
- " 18 0.1 0.01 \n",
- " 19 0.1 0.01 \n",
- " 21 0.1 0.01 \n",
- " 22 0.1 0.01 \n",
- " 23 0.1 0.01 \n",
- " 25 0.1 0.01 \n",
- " 27 0.1 0.01 \n",
- " 28 0.1 0.01 \n",
- " 29 0.1 0.01 \n",
- " \n",
- " [23 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_40 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " \n",
- " [26 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_41 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " \n",
- " [22 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_42 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [28 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_43 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_44 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [26 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_45 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [23 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_46 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_47 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_48 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 10 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 18 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 24 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [26 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_49 True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 103 104 105 ... 91 92 93 94 95 96 97 \n",
- " t_step ... \n",
- " 0 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 98 99 env \n",
- " t_step \n",
- " 0 0.1 0.1 0.01 \n",
- " 1 0.1 0.1 0.01 \n",
- " 2 0.1 0.1 0.01 \n",
- " 3 0.1 0.1 0.01 \n",
- " 4 0.1 0.1 0.01 \n",
- " 5 0.1 0.1 0.01 \n",
- " 6 0.1 0.1 0.01 \n",
- " 7 0.1 0.1 0.01 \n",
- " 8 0.1 0.1 0.01 \n",
- " 9 0.1 0.1 0.01 \n",
- " 11 0.1 0.1 0.01 \n",
- " 12 0.1 0.1 0.01 \n",
- " 13 0.1 0.1 0.01 \n",
- " 14 0.1 0.1 0.01 \n",
- " 15 0.1 0.1 0.01 \n",
- " 16 0.1 0.1 0.01 \n",
- " 17 0.1 0.1 0.01 \n",
- " 19 0.1 0.1 0.01 \n",
- " 20 0.1 0.1 0.01 \n",
- " 21 0.1 0.1 0.01 \n",
- " 22 0.1 0.1 0.01 \n",
- " 23 0.1 0.1 0.01 \n",
- " 25 0.1 0.1 0.01 \n",
- " 26 0.1 0.1 0.01 \n",
- " 27 0.1 0.1 0.01 \n",
- " 28 0.1 0.1 0.01 \n",
- " 29 0.1 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 103 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_5 True True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 104 105 ... 91 92 93 94 95 96 97 98 \n",
- " t_step ... \n",
- " 0 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 99 env \n",
- " t_step \n",
- " 0 0.1 0.01 \n",
- " 1 0.1 0.01 \n",
- " 2 0.1 0.01 \n",
- " 3 0.1 0.01 \n",
- " 4 0.1 0.01 \n",
- " 5 0.1 0.01 \n",
- " 6 0.1 0.01 \n",
- " 7 0.1 0.01 \n",
- " 8 0.1 0.01 \n",
- " 9 0.1 0.01 \n",
- " 10 0.1 0.01 \n",
- " 11 0.1 0.01 \n",
- " 12 0.1 0.01 \n",
- " 13 0.1 0.01 \n",
- " 14 0.1 0.01 \n",
- " 15 0.1 0.01 \n",
- " 16 0.1 0.01 \n",
- " 17 0.1 0.01 \n",
- " 19 0.1 0.01 \n",
- " 20 0.1 0.01 \n",
- " 21 0.1 0.01 \n",
- " 22 0.1 0.01 \n",
- " 23 0.1 0.01 \n",
- " 24 0.1 0.01 \n",
- " 25 0.1 0.01 \n",
- " 26 0.1 0.01 \n",
- " 27 0.1 0.01 \n",
- " 28 0.1 0.01 \n",
- " 29 0.1 0.01 \n",
- " \n",
- " [29 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 103 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_6 True True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 104 105 ... 91 92 93 94 95 96 97 98 \n",
- " t_step ... \n",
- " 0 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 99 env \n",
- " t_step \n",
- " 0 0.1 0.01 \n",
- " 1 0.1 0.01 \n",
- " 2 0.1 0.01 \n",
- " 3 0.1 0.01 \n",
- " 4 0.1 0.01 \n",
- " 5 0.1 0.01 \n",
- " 6 0.1 0.01 \n",
- " 7 0.1 0.01 \n",
- " 8 0.1 0.01 \n",
- " 9 0.1 0.01 \n",
- " 10 0.1 0.01 \n",
- " 11 0.1 0.01 \n",
- " 12 0.1 0.01 \n",
- " 13 0.1 0.01 \n",
- " 14 0.1 0.01 \n",
- " 15 0.1 0.01 \n",
- " 16 0.1 0.01 \n",
- " 18 0.1 0.01 \n",
- " 19 0.1 0.01 \n",
- " 20 0.1 0.01 \n",
- " 22 0.1 0.01 \n",
- " 23 0.1 0.01 \n",
- " 24 0.1 0.01 \n",
- " 25 0.1 0.01 \n",
- " 26 0.1 0.01 \n",
- " 28 0.1 0.01 \n",
- " 29 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 103 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_7 True True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 104 105 ... 91 92 93 94 95 96 97 98 \n",
- " t_step ... \n",
- " 0 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 99 env \n",
- " t_step \n",
- " 0 0.1 0.01 \n",
- " 1 0.1 0.01 \n",
- " 2 0.1 0.01 \n",
- " 3 0.1 0.01 \n",
- " 4 0.1 0.01 \n",
- " 5 0.1 0.01 \n",
- " 6 0.1 0.01 \n",
- " 7 0.1 0.01 \n",
- " 8 0.1 0.01 \n",
- " 9 0.1 0.01 \n",
- " 11 0.1 0.01 \n",
- " 12 0.1 0.01 \n",
- " 13 0.1 0.01 \n",
- " 15 0.1 0.01 \n",
- " 16 0.1 0.01 \n",
- " 17 0.1 0.01 \n",
- " 18 0.1 0.01 \n",
- " 19 0.1 0.01 \n",
- " 20 0.1 0.01 \n",
- " 21 0.1 0.01 \n",
- " 22 0.1 0.01 \n",
- " 23 0.1 0.01 \n",
- " 25 0.1 0.01 \n",
- " 26 0.1 0.01 \n",
- " 27 0.1 0.01 \n",
- " 28 0.1 0.01 \n",
- " 29 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 103 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 16 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 23 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 27 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_8 True True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 104 105 ... 91 92 93 94 95 96 97 98 \n",
- " t_step ... \n",
- " 0 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 16 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 23 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 27 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 99 env \n",
- " t_step \n",
- " 0 0.1 0.01 \n",
- " 1 0.1 0.01 \n",
- " 2 0.1 0.01 \n",
- " 3 0.1 0.01 \n",
- " 4 0.1 0.01 \n",
- " 5 0.1 0.01 \n",
- " 7 0.1 0.01 \n",
- " 9 0.1 0.01 \n",
- " 11 0.1 0.01 \n",
- " 12 0.1 0.01 \n",
- " 14 0.1 0.01 \n",
- " 15 0.1 0.01 \n",
- " 16 0.1 0.01 \n",
- " 17 0.1 0.01 \n",
- " 18 0.1 0.01 \n",
- " 19 0.1 0.01 \n",
- " 20 0.1 0.01 \n",
- " 21 0.1 0.01 \n",
- " 22 0.1 0.01 \n",
- " 23 0.1 0.01 \n",
- " 24 0.1 0.01 \n",
- " 26 0.1 0.01 \n",
- " 27 0.1 0.01 \n",
- " 28 0.1 0.01 \n",
- " \n",
- " [24 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}}),\n",
- " ('newsspread/soil_output/Sim_all_dumb/Sim_all_dumb.dumped.yml',\n",
- " key SEED has_tv \\\n",
- " agent_id env 0 1 10 100 101 102 103 \n",
- " t_step \n",
- " 0 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 1 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 2 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 3 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 4 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 5 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 6 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 7 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 8 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 9 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 10 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 11 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 12 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 13 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 14 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 15 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 17 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 18 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 19 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 20 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 21 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 22 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 24 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 25 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 26 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 28 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " 29 NoneSim_all_dumb_trial_9 True True True True True True True \n",
- " \n",
- " key ... prob_tv_spread \\\n",
- " agent_id 104 105 ... 91 92 93 94 95 96 97 98 \n",
- " t_step ... \n",
- " 0 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 1 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 2 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 3 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 4 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 5 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 6 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 7 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 8 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 9 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 10 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 11 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 12 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 13 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 14 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 15 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 17 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 18 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 19 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 20 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 21 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 22 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 24 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 25 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 26 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 28 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " 29 True True ... 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 \n",
- " \n",
- " key \n",
- " agent_id 99 env \n",
- " t_step \n",
- " 0 0.1 0.01 \n",
- " 1 0.1 0.01 \n",
- " 2 0.1 0.01 \n",
- " 3 0.1 0.01 \n",
- " 4 0.1 0.01 \n",
- " 5 0.1 0.01 \n",
- " 6 0.1 0.01 \n",
- " 7 0.1 0.01 \n",
- " 8 0.1 0.01 \n",
- " 9 0.1 0.01 \n",
- " 10 0.1 0.01 \n",
- " 11 0.1 0.01 \n",
- " 12 0.1 0.01 \n",
- " 13 0.1 0.01 \n",
- " 14 0.1 0.01 \n",
- " 15 0.1 0.01 \n",
- " 17 0.1 0.01 \n",
- " 18 0.1 0.01 \n",
- " 19 0.1 0.01 \n",
- " 20 0.1 0.01 \n",
- " 21 0.1 0.01 \n",
- " 22 0.1 0.01 \n",
- " 24 0.1 0.01 \n",
- " 25 0.1 0.01 \n",
- " 26 0.1 0.01 \n",
- " 28 0.1 0.01 \n",
- " 29 0.1 0.01 \n",
- " \n",
- " [27 rows x 2003 columns],\n",
- " {'default_state': {},\n",
- " 'dir_path': 'soil_output/Sim_all_dumb',\n",
- " 'dry_run': False,\n",
- " 'dump': [],\n",
- " 'environment_agents': [],\n",
- " 'environment_params': {'prob_neighbor_spread': 0.0, 'prob_tv_spread': 0.01},\n",
- " 'interval': 1,\n",
- " 'load_module': 'newsspread',\n",
- " 'max_time': 30,\n",
- " 'name': 'Sim_all_dumb',\n",
- " 'network_agents': [{'agent_class': 'DumbViewer',\n",
- " 'state': {'has_tv': False},\n",
- " 'weight': 1},\n",
- " {'agent_class': 'DumbViewer', 'state': {'has_tv': True}, 'weight': 1}],\n",
- " 'network_params': {'generator': 'barabasi_albert_graph', 'm': 5, 'n': 500},\n",
- " 'num_trials': 50,\n",
- " 'seed': 'None',\n",
- " 'states': [],\n",
- " 'topology': {'directed': False,\n",
- " 'graph': {},\n",
- " 'links': [{'source': 0, 'target': 5},\n",
- " {'source': 0, 'target': 22},\n",
- " {'source': 0, 'target': 39},\n",
- " {'source': 0, 'target': 64},\n",
- " {'source': 0, 'target': 103},\n",
- " {'source': 1, 'target': 5},\n",
- " {'source': 1, 'target': 6},\n",
- " {'source': 1, 'target': 7},\n",
- " {'source': 1, 'target': 10},\n",
- " {'source': 1, 'target': 11},\n",
- " {'source': 1, 'target': 12},\n",
- " {'source': 1, 'target': 13},\n",
- " {'source': 1, 'target': 14},\n",
- " {'source': 1, 'target': 17},\n",
- " {'source': 1, 'target': 21},\n",
- " {'source': 1, 'target': 22},\n",
- " {'source': 1, 'target': 29},\n",
- " {'source': 1, 'target': 37},\n",
- " {'source': 1, 'target': 44},\n",
- " {'source': 1, 'target': 49},\n",
- " {'source': 1, 'target': 68},\n",
- " {'source': 1, 'target': 71},\n",
- " {'source': 1, 'target': 72},\n",
- " {'source': 1, 'target': 82},\n",
- " {'source': 1, 'target': 86},\n",
- " {'source': 1, 'target': 93},\n",
- " {'source': 1, 'target': 104},\n",
- " {'source': 1, 'target': 105},\n",
- " {'source': 1, 'target': 116},\n",
- " {'source': 1, 'target': 131},\n",
- " {'source': 1, 'target': 164},\n",
- " {'source': 1, 'target': 177},\n",
- " {'source': 1, 'target': 181},\n",
- " {'source': 1, 'target': 182},\n",
- " {'source': 1, 'target': 219},\n",
- " {'source': 1, 'target': 239},\n",
- " {'source': 1, 'target': 258},\n",
- " {'source': 1, 'target': 299},\n",
- " {'source': 1, 'target': 309},\n",
- " {'source': 1, 'target': 394},\n",
- " {'source': 1, 'target': 395},\n",
- " {'source': 1, 'target': 402},\n",
- " {'source': 1, 'target': 419},\n",
- " {'source': 1, 'target': 486},\n",
- " {'source': 1, 'target': 487},\n",
- " {'source': 2, 'target': 5},\n",
- " {'source': 2, 'target': 6},\n",
- " {'source': 2, 'target': 7},\n",
- " {'source': 2, 'target': 18},\n",
- " {'source': 2, 'target': 27},\n",
- " {'source': 2, 'target': 28},\n",
- " {'source': 2, 'target': 31},\n",
- " {'source': 2, 'target': 33},\n",
- " {'source': 2, 'target': 34},\n",
- " {'source': 2, 'target': 35},\n",
- " {'source': 2, 'target': 41},\n",
- " {'source': 2, 'target': 48},\n",
- " {'source': 2, 'target': 53},\n",
- " {'source': 2, 'target': 55},\n",
- " {'source': 2, 'target': 63},\n",
- " {'source': 2, 'target': 67},\n",
- " {'source': 2, 'target': 95},\n",
- " {'source': 2, 'target': 113},\n",
- " {'source': 2, 'target': 114},\n",
- " {'source': 2, 'target': 144},\n",
- " {'source': 2, 'target': 151},\n",
- " {'source': 2, 'target': 167},\n",
- " {'source': 2, 'target': 177},\n",
- " {'source': 2, 'target': 184},\n",
- " {'source': 2, 'target': 193},\n",
- " {'source': 2, 'target': 216},\n",
- " {'source': 2, 'target': 258},\n",
- " {'source': 2, 'target': 259},\n",
- " {'source': 2, 'target': 321},\n",
- " {'source': 2, 'target': 344},\n",
- " {'source': 2, 'target': 352},\n",
- " {'source': 2, 'target': 354},\n",
- " {'source': 2, 'target': 389},\n",
- " {'source': 2, 'target': 391},\n",
- " {'source': 2, 'target': 396},\n",
- " {'source': 2, 'target': 403},\n",
- " {'source': 2, 'target': 408},\n",
- " {'source': 2, 'target': 424},\n",
- " {'source': 3, 'target': 5},\n",
- " {'source': 3, 'target': 6},\n",
- " {'source': 3, 'target': 8},\n",
- " {'source': 3, 'target': 18},\n",
- " {'source': 3, 'target': 22},\n",
- " {'source': 3, 'target': 28},\n",
- " {'source': 3, 'target': 29},\n",
- " {'source': 3, 'target': 30},\n",
- " {'source': 3, 'target': 44},\n",
- " {'source': 3, 'target': 52},\n",
- " {'source': 3, 'target': 54},\n",
- " {'source': 3, 'target': 57},\n",
- " {'source': 3, 'target': 63},\n",
- " {'source': 3, 'target': 103},\n",
- " {'source': 3, 'target': 109},\n",
- " {'source': 3, 'target': 111},\n",
- " {'source': 3, 'target': 135},\n",
- " {'source': 3, 'target': 139},\n",
- " {'source': 3, 'target': 143},\n",
- " {'source': 3, 'target': 148},\n",
- " {'source': 3, 'target': 150},\n",
- " {'source': 3, 'target': 189},\n",
- " {'source': 3, 'target': 193},\n",
- " {'source': 3, 'target': 204},\n",
- " {'source': 3, 'target': 373},\n",
- " {'source': 3, 'target': 456},\n",
- " {'source': 3, 'target': 481},\n",
- " {'source': 3, 'target': 499},\n",
- " {'source': 4, 'target': 5},\n",
- " {'source': 4, 'target': 6},\n",
- " {'source': 4, 'target': 7},\n",
- " {'source': 4, 'target': 8},\n",
- " {'source': 4, 'target': 9},\n",
- " {'source': 4, 'target': 11},\n",
- " {'source': 4, 'target': 15},\n",
- " {'source': 4, 'target': 17},\n",
- " {'source': 4, 'target': 19},\n",
- " {'source': 4, 'target': 28},\n",
- " {'source': 4, 'target': 29},\n",
- " {'source': 4, 'target': 30},\n",
- " {'source': 4, 'target': 35},\n",
- " {'source': 4, 'target': 36},\n",
- " {'source': 4, 'target': 38},\n",
- " {'source': 4, 'target': 49},\n",
- " {'source': 4, 'target': 57},\n",
- " {'source': 4, 'target': 60},\n",
- " {'source': 4, 'target': 62},\n",
- " {'source': 4, 'target': 67},\n",
- " {'source': 4, 'target': 68},\n",
- " {'source': 4, 'target': 79},\n",
- " {'source': 4, 'target': 83},\n",
- " {'source': 4, 'target': 90},\n",
- " {'source': 4, 'target': 91},\n",
- " {'source': 4, 'target': 92},\n",
- " {'source': 4, 'target': 94},\n",
- " {'source': 4, 'target': 107},\n",
- " {'source': 4, 'target': 114},\n",
- " {'source': 4, 'target': 118},\n",
- " {'source': 4, 'target': 128},\n",
- " {'source': 4, 'target': 141},\n",
- " {'source': 4, 'target': 150},\n",
- " {'source': 4, 'target': 151},\n",
- " {'source': 4, 'target': 165},\n",
- " {'source': 4, 'target': 204},\n",
- " {'source': 4, 'target': 223},\n",
- " {'source': 4, 'target': 232},\n",
- " {'source': 4, 'target': 235},\n",
- " {'source': 4, 'target': 243},\n",
- " {'source': 4, 'target': 244},\n",
- " {'source': 4, 'target': 245},\n",
- " {'source': 4, 'target': 253},\n",
- " {'source': 4, 'target': 258},\n",
- " {'source': 4, 'target': 259},\n",
- " {'source': 4, 'target': 279},\n",
- " {'source': 4, 'target': 310},\n",
- " {'source': 4, 'target': 313},\n",
- " {'source': 4, 'target': 334},\n",
- " {'source': 4, 'target': 351},\n",
- " {'source': 4, 'target': 362},\n",
- " {'source': 4, 'target': 376},\n",
- " {'source': 4, 'target': 385},\n",
- " {'source': 4, 'target': 397},\n",
- " {'source': 4, 'target': 413},\n",
- " {'source': 4, 'target': 417},\n",
- " {'source': 4, 'target': 442},\n",
- " {'source': 4, 'target': 477},\n",
- " {'source': 4, 'target': 498},\n",
- " {'source': 5, 'target': 6},\n",
- " {'source': 5, 'target': 7},\n",
- " {'source': 5, 'target': 8},\n",
- " {'source': 5, 'target': 9},\n",
- " {'source': 5, 'target': 10},\n",
- " {'source': 5, 'target': 13},\n",
- " {'source': 5, 'target': 15},\n",
- " {'source': 5, 'target': 20},\n",
- " {'source': 5, 'target': 24},\n",
- " {'source': 5, 'target': 25},\n",
- " {'source': 5, 'target': 29},\n",
- " {'source': 5, 'target': 32},\n",
- " {'source': 5, 'target': 34},\n",
- " {'source': 5, 'target': 36},\n",
- " {'source': 5, 'target': 48},\n",
- " {'source': 5, 'target': 51},\n",
- " {'source': 5, 'target': 52},\n",
- " {'source': 5, 'target': 59},\n",
- " {'source': 5, 'target': 68},\n",
- " {'source': 5, 'target': 70},\n",
- " {'source': 5, 'target': 72},\n",
- " {'source': 5, 'target': 81},\n",
- " {'source': 5, 'target': 85},\n",
- " {'source': 5, 'target': 95},\n",
- " {'source': 5, 'target': 102},\n",
- " {'source': 5, 'target': 117},\n",
- " {'source': 5, 'target': 121},\n",
- " {'source': 5, 'target': 123},\n",
- " {'source': 5, 'target': 129},\n",
- " {'source': 5, 'target': 133},\n",
- " {'source': 5, 'target': 138},\n",
- " {'source': 5, 'target': 143},\n",
- " {'source': 5, 'target': 147},\n",
- " {'source': 5, 'target': 150},\n",
- " {'source': 5, 'target': 152},\n",
- " {'source': 5, 'target': 153},\n",
- " {'source': 5, 'target': 159},\n",
- " {'source': 5, 'target': 161},\n",
- " {'source': 5, 'target': 171},\n",
- " {'source': 5, 'target': 199},\n",
- " {'source': 5, 'target': 203},\n",
- " {'source': 5, 'target': 215},\n",
- " {'source': 5, 'target': 226},\n",
- " {'source': 5, 'target': 233},\n",
- " {'source': 5, 'target': 239},\n",
- " {'source': 5, 'target': 246},\n",
- " {'source': 5, 'target': 268},\n",
- " {'source': 5, 'target': 269},\n",
- " {'source': 5, 'target': 280},\n",
- " {'source': 5, 'target': 286},\n",
- " {'source': 5, 'target': 288},\n",
- " {'source': 5, 'target': 300},\n",
- " {'source': 5, 'target': 311},\n",
- " {'source': 5, 'target': 312},\n",
- " {'source': 5, 'target': 315},\n",
- " {'source': 5, 'target': 322},\n",
- " {'source': 5, 'target': 326},\n",
- " {'source': 5, 'target': 328},\n",
- " {'source': 5, 'target': 335},\n",
- " {'source': 5, 'target': 343},\n",
- " {'source': 5, 'target': 365},\n",
- " {'source': 5, 'target': 385},\n",
- " {'source': 5, 'target': 389},\n",
- " {'source': 5, 'target': 394},\n",
- " {'source': 5, 'target': 400},\n",
- " {'source': 5, 'target': 402},\n",
- " {'source': 5, 'target': 404},\n",
- " {'source': 5, 'target': 407},\n",
- " {'source': 5, 'target': 408},\n",
- " {'source': 5, 'target': 415},\n",
- " {'source': 5, 'target': 416},\n",
- " {'source': 5, 'target': 424},\n",
- " {'source': 5, 'target': 429},\n",
- " {'source': 5, 'target': 440},\n",
- " {'source': 5, 'target': 454},\n",
- " {'source': 6, 'target': 7},\n",
- " {'source': 6, 'target': 8},\n",
- " {'source': 6, 'target': 9},\n",
- " {'source': 6, 'target': 11},\n",
- " {'source': 6, 'target': 12},\n",
- " {'source': 6, 'target': 13},\n",
- " {'source': 6, 'target': 14},\n",
- " {'source': 6, 'target': 16},\n",
- " {'source': 6, 'target': 17},\n",
- " {'source': 6, 'target': 18},\n",
- " {'source': 6, 'target': 19},\n",
- " {'source': 6, 'target': 21},\n",
- " {'source': 6, 'target': 31},\n",
- " {'source': 6, 'target': 36},\n",
- " {'source': 6, 'target': 38},\n",
- " {'source': 6, 'target': 39},\n",
- " {'source': 6, 'target': 40},\n",
- " {'source': 6, 'target': 51},\n",
- " {'source': 6, 'target': 62},\n",
- " {'source': 6, 'target': 67},\n",
- " {'source': 6, 'target': 71},\n",
- " {'source': 6, 'target': 76},\n",
- " {'source': 6, 'target': 83},\n",
- " {'source': 6, 'target': 92},\n",
- " {'source': 6, 'target': 127},\n",
- " {'source': 6, 'target': 129},\n",
- " {'source': 6, 'target': 131},\n",
- " {'source': 6, 'target': 133},\n",
- " {'source': 6, 'target': 137},\n",
- " {'source': 6, 'target': 139},\n",
- " {'source': 6, 'target': 147},\n",
- " {'source': 6, 'target': 168},\n",
- " {'source': 6, 'target': 173},\n",
- " {'source': 6, 'target': 187},\n",
- " {'source': 6, 'target': 210},\n",
- " {'source': 6, 'target': 212},\n",
- " {'source': 6, 'target': 236},\n",
- " {'source': 6, 'target': 260},\n",
- " {'source': 6, 'target': 276},\n",
- " {'source': 6, 'target': 309},\n",
- " {'source': 6, 'target': 315},\n",
- " {'source': 6, 'target': 325},\n",
- " {'source': 6, 'target': 330},\n",
- " {'source': 6, 'target': 333},\n",
- " {'source': 6, 'target': 345},\n",
- " {'source': 6, 'target': 349},\n",
- " {'source': 6, 'target': 373},\n",
- " {'source': 6, 'target': 377},\n",
- " {'source': 6, 'target': 379},\n",
- " {'source': 6, 'target': 383},\n",
- " {'source': 6, 'target': 392},\n",
- " {'source': 6, 'target': 443},\n",
- " {'source': 6, 'target': 444},\n",
- " {'source': 6, 'target': 458},\n",
- " {'source': 6, 'target': 466},\n",
- " {'source': 7, 'target': 8},\n",
- " {'source': 7, 'target': 9},\n",
- " {'source': 7, 'target': 10},\n",
- " {'source': 7, 'target': 11},\n",
- " {'source': 7, 'target': 12},\n",
- " {'source': 7, 'target': 16},\n",
- " {'source': 7, 'target': 17},\n",
- " {'source': 7, 'target': 19},\n",
- " {'source': 7, 'target': 22},\n",
- " {'source': 7, 'target': 23},\n",
- " {'source': 7, 'target': 33},\n",
- " {'source': 7, 'target': 34},\n",
- " {'source': 7, 'target': 35},\n",
- " {'source': 7, 'target': 36},\n",
- " {'source': 7, 'target': 38},\n",
- " {'source': 7, 'target': 43},\n",
- " {'source': 7, 'target': 46},\n",
- " {'source': 7, 'target': 47},\n",
- " {'source': 7, 'target': 50},\n",
- " {'source': 7, 'target': 58},\n",
- " {'source': 7, 'target': 61},\n",
- " {'source': 7, 'target': 65},\n",
- " {'source': 7, 'target': 76},\n",
- " {'source': 7, 'target': 84},\n",
- " {'source': 7, 'target': 88},\n",
- " {'source': 7, 'target': 99},\n",
- " {'source': 7, 'target': 100},\n",
- " {'source': 7, 'target': 104},\n",
- " {'source': 7, 'target': 105},\n",
- " {'source': 7, 'target': 108},\n",
- " {'source': 7, 'target': 111},\n",
- " {'source': 7, 'target': 118},\n",
- " {'source': 7, 'target': 122},\n",
- " {'source': 7, 'target': 130},\n",
- " {'source': 7, 'target': 142},\n",
- " {'source': 7, 'target': 154},\n",
- " {'source': 7, 'target': 168},\n",
- " {'source': 7, 'target': 173},\n",
- " {'source': 7, 'target': 179},\n",
- " {'source': 7, 'target': 186},\n",
- " {'source': 7, 'target': 187},\n",
- " {'source': 7, 'target': 199},\n",
- " {'source': 7, 'target': 201},\n",
- " {'source': 7, 'target': 215},\n",
- " {'source': 7, 'target': 226},\n",
- " {'source': 7, 'target': 244},\n",
- " {'source': 7, 'target': 246},\n",
- " {'source': 7, 'target': 274},\n",
- " {'source': 7, 'target': 275},\n",
- " {'source': 7, 'target': 299},\n",
- " {'source': 7, 'target': 312},\n",
- " {'source': 7, 'target': 329},\n",
- " {'source': 7, 'target': 334},\n",
- " {'source': 7, 'target': 338},\n",
- " {'source': 7, 'target': 343},\n",
- " {'source': 7, 'target': 347},\n",
- " {'source': 7, 'target': 355},\n",
- " {'source': 7, 'target': 361},\n",
- " {'source': 7, 'target': 362},\n",
- " {'source': 7, 'target': 375},\n",
- " {'source': 7, 'target': 401},\n",
- " {'source': 7, 'target': 406},\n",
- " {'source': 7, 'target': 416},\n",
- " {'source': 7, 'target': 424},\n",
- " {'source': 7, 'target': 426},\n",
- " {'source': 7, 'target': 435},\n",
- " {'source': 7, 'target': 436},\n",
- " {'source': 7, 'target': 446},\n",
- " {'source': 7, 'target': 447},\n",
- " {'source': 7, 'target': 453},\n",
- " {'source': 7, 'target': 456},\n",
- " {'source': 7, 'target': 469},\n",
- " {'source': 7, 'target': 478},\n",
- " {'source': 7, 'target': 496},\n",
- " {'source': 8, 'target': 9},\n",
- " {'source': 8, 'target': 10},\n",
- " {'source': 8, 'target': 11},\n",
- " {'source': 8, 'target': 12},\n",
- " {'source': 8, 'target': 13},\n",
- " {'source': 8, 'target': 15},\n",
- " {'source': 8, 'target': 16},\n",
- " {'source': 8, 'target': 27},\n",
- " {'source': 8, 'target': 29},\n",
- " {'source': 8, 'target': 35},\n",
- " {'source': 8, 'target': 45},\n",
- " {'source': 8, 'target': 48},\n",
- " {'source': 8, 'target': 49},\n",
- " {'source': 8, 'target': 50},\n",
- " {'source': 8, 'target': 52},\n",
- " {'source': 8, 'target': 54},\n",
- " {'source': 8, 'target': 56},\n",
- " {'source': 8, 'target': 57},\n",
- " {'source': 8, 'target': 65},\n",
- " {'source': 8, 'target': 70},\n",
- " {'source': 8, 'target': 74},\n",
- " {'source': 8, 'target': 79},\n",
- " {'source': 8, 'target': 84},\n",
- " {'source': 8, 'target': 87},\n",
- " {'source': 8, 'target': 93},\n",
- " {'source': 8, 'target': 97},\n",
- " {'source': 8, 'target': 109},\n",
- " {'source': 8, 'target': 111},\n",
- " {'source': 8, 'target': 119},\n",
- " {'source': 8, 'target': 122},\n",
- " {'source': 8, 'target': 127},\n",
- " {'source': 8, 'target': 130},\n",
- " {'source': 8, 'target': 134},\n",
- " {'source': 8, 'target': 138},\n",
- " {'source': 8, 'target': 188},\n",
- " {'source': 8, 'target': 199},\n",
- " {'source': 8, 'target': 205},\n",
- " {'source': 8, 'target': 234},\n",
- " {'source': 8, 'target': 258},\n",
- " {'source': 8, 'target': 261},\n",
- " {'source': 8, 'target': 263},\n",
- " {'source': 8, 'target': 266},\n",
- " {'source': 8, 'target': 270},\n",
- " {'source': 8, 'target': 273},\n",
- " {'source': 8, 'target': 282},\n",
- " {'source': 8, 'target': 289},\n",
- " {'source': 8, 'target': 300},\n",
- " {'source': 8, 'target': 301},\n",
- " {'source': 8, 'target': 304},\n",
- " {'source': 8, 'target': 321},\n",
- " {'source': 8, 'target': 338},\n",
- " {'source': 8, 'target': 362},\n",
- " {'source': 8, 'target': 366},\n",
- " {'source': 8, 'target': 403},\n",
- " {'source': 8, 'target': 407},\n",
- " {'source': 8, 'target': 417},\n",
- " {'source': 8, 'target': 438},\n",
- " {'source': 8, 'target': 464},\n",
- " {'source': 8, 'target': 465},\n",
- " {'source': 8, 'target': 468},\n",
- " {'source': 9, 'target': 10},\n",
- " {'source': 9, 'target': 14},\n",
- " {'source': 9, 'target': 15},\n",
- " {'source': 9, 'target': 17},\n",
- " {'source': 9, 'target': 18},\n",
- " {'source': 9, 'target': 27},\n",
- " {'source': 9, 'target': 32},\n",
- " {'source': 9, 'target': 44},\n",
- " {'source': 9, 'target': 50},\n",
- " {'source': 9, 'target': 66},\n",
- " {'source': 9, 'target': 73},\n",
- " {'source': 9, 'target': 81},\n",
- " {'source': 9, 'target': 82},\n",
- " {'source': 9, 'target': 94},\n",
- " {'source': 9, 'target': 104},\n",
- " {'source': 9, 'target': 109},\n",
- " {'source': 9, 'target': 118},\n",
- " {'source': 9, 'target': 122},\n",
- " {'source': 9, 'target': 132},\n",
- " {'source': 9, 'target': 137},\n",
- " {'source': 9, 'target': 154},\n",
- " {'source': 9, 'target': 155},\n",
- " {'source': 9, 'target': 160},\n",
- " {'source': 9, 'target': 167},\n",
- " {'source': 9, 'target': 175},\n",
- " {'source': 9, 'target': 176},\n",
- " {'source': 9, 'target': 185},\n",
- " {'source': 9, 'target': 192},\n",
- " {'source': 9, 'target': 215},\n",
- " {'source': 9, 'target': 217},\n",
- " {'source': 9, 'target': 231},\n",
- " {'source': 9, 'target': 241},\n",
- " {'source': 9, 'target': 251},\n",
- " {'source': 9, 'target': 285},\n",
- " {'source': 9, 'target': 288},\n",
- " {'source': 9, 'target': 293},\n",
- " {'source': 9, 'target': 308},\n",
- " {'source': 9, 'target': 331},\n",
- " {'source': 9, 'target': 332},\n",
- " {'source': 9, 'target': 354},\n",
- " {'source': 9, 'target': 359},\n",
- " {'source': 9, 'target': 381},\n",
- " {'source': 9, 'target': 384},\n",
- " {'source': 9, 'target': 402},\n",
- " {'source': 9, 'target': 427},\n",
- " {'source': 9, 'target': 470},\n",
- " {'source': 10, 'target': 14},\n",
- " {'source': 10, 'target': 18},\n",
- " {'source': 10, 'target': 20},\n",
- " {'source': 10, 'target': 23},\n",
- " {'source': 10, 'target': 30},\n",
- " {'source': 10, 'target': 40},\n",
- " {'source': 10, 'target': 46},\n",
- " {'source': 10, 'target': 55},\n",
- " {'source': 10, 'target': 64},\n",
- " {'source': 10, 'target': 75},\n",
- " {'source': 10, 'target': 86},\n",
- " {'source': 10, 'target': 93},\n",
- " {'source': 10, 'target': 119},\n",
- " {'source': 10, 'target': 123},\n",
- " {'source': 10, 'target': 127},\n",
- " {'source': 10, 'target': 144},\n",
- " {'source': 10, 'target': 145},\n",
- " {'source': 10, 'target': 156},\n",
- " {'source': 10, 'target': 192},\n",
- " {'source': 10, 'target': 198},\n",
- " {'source': 10, 'target': 221},\n",
- " {'source': 10, 'target': 222},\n",
- " {'source': 10, 'target': 223},\n",
- " {'source': 10, 'target': 229},\n",
- " {'source': 10, 'target': 240},\n",
- " {'source': 10, 'target': 277},\n",
- " {'source': 10, 'target': 278},\n",
- " {'source': 10, 'target': 300},\n",
- " {'source': 10, 'target': 374},\n",
- " {'source': 10, 'target': 383},\n",
- " {'source': 10, 'target': 384},\n",
- " {'source': 10, 'target': 441},\n",
- " {'source': 10, 'target': 491},\n",
- " {'source': 11, 'target': 12},\n",
- " {'source': 11, 'target': 13},\n",
- " {'source': 11, 'target': 15},\n",
- " {'source': 11, 'target': 16},\n",
- " {'source': 11, 'target': 21},\n",
- " {'source': 11, 'target': 23},\n",
- " {'source': 11, 'target': 27},\n",
- " {'source': 11, 'target': 32},\n",
- " {'source': 11, 'target': 39},\n",
- " {'source': 11, 'target': 56},\n",
- " {'source': 11, 'target': 69},\n",
- " {'source': 11, 'target': 72},\n",
- " {'source': 11, 'target': 75},\n",
- " {'source': 11, 'target': 77},\n",
- " {'source': 11, 'target': 83},\n",
- " {'source': 11, 'target': 86},\n",
- " {'source': 11, 'target': 88},\n",
- " {'source': 11, 'target': 94},\n",
- " {'source': 11, 'target': 112},\n",
- " {'source': 11, 'target': 129},\n",
- " {'source': 11, 'target': 132},\n",
- " {'source': 11, 'target': 156},\n",
- " {'source': 11, 'target': 162},\n",
- " {'source': 11, 'target': 173},\n",
- " {'source': 11, 'target': 174},\n",
- " {'source': 11, 'target': 201},\n",
- " {'source': 11, 'target': 264},\n",
- " {'source': 11, 'target': 274},\n",
- " {'source': 11, 'target': 279},\n",
- " {'source': 11, 'target': 292},\n",
- " {'source': 11, 'target': 295},\n",
- " {'source': 11, 'target': 307},\n",
- " {'source': 11, 'target': 315},\n",
- " {'source': 11, 'target': 355},\n",
- " {'source': 11, 'target': 357},\n",
- " {'source': 11, 'target': 392},\n",
- " {'source': 11, 'target': 442},\n",
- " {'source': 11, 'target': 473},\n",
- " {'source': 11, 'target': 498},\n",
- " {'source': 12, 'target': 14},\n",
- " {'source': 12, 'target': 19},\n",
- " {'source': 12, 'target': 20},\n",
- " {'source': 12, 'target': 22},\n",
- " {'source': 12, 'target': 24},\n",
- " {'source': 12, 'target': 25},\n",
- " {'source': 12, 'target': 31},\n",
- " {'source': 12, 'target': 33},\n",
- " {'source': 12, 'target': 37},\n",
- " {'source': 12, 'target': 46},\n",
- " {'source': 12, 'target': 52},\n",
- " {'source': 12, 'target': 53},\n",
- " {'source': 12, 'target': 67},\n",
- " {'source': 12, 'target': 70},\n",
- " {'source': 12, 'target': 74},\n",
- " {'source': 12, 'target': 76},\n",
- " {'source': 12, 'target': 85},\n",
- " {'source': 12, 'target': 93},\n",
- " {'source': 12, 'target': 96},\n",
- " {'source': 12, 'target': 108},\n",
- " {'source': 12, 'target': 114},\n",
- " {'source': 12, 'target': 126},\n",
- " {'source': 12, 'target': 134},\n",
- " {'source': 12, 'target': 149},\n",
- " {'source': 12, 'target': 152},\n",
- " {'source': 12, 'target': 169},\n",
- " {'source': 12, 'target': 171},\n",
- " {'source': 12, 'target': 172},\n",
- " {'source': 12, 'target': 178},\n",
- " {'source': 12, 'target': 185},\n",
- " {'source': 12, 'target': 186},\n",
- " {'source': 12, 'target': 197},\n",
- " {'source': 12, 'target': 199},\n",
- " {'source': 12, 'target': 211},\n",
- " {'source': 12, 'target': 234},\n",
- " {'source': 12, 'target': 241},\n",
- " {'source': 12, 'target': 248},\n",
- " {'source': 12, 'target': 249},\n",
- " {'source': 12, 'target': 253},\n",
- " {'source': 12, 'target': 260},\n",
- " {'source': 12, 'target': 283},\n",
- " {'source': 12, 'target': 284},\n",
- " {'source': 12, 'target': 303},\n",
- " {'source': 12, 'target': 307},\n",
- " {'source': 12, 'target': 324},\n",
- " {'source': 12, 'target': 335},\n",
- " {'source': 12, 'target': 343},\n",
- " {'source': 12, 'target': 349},\n",
- " {'source': 12, 'target': 396},\n",
- " {'source': 12, 'target': 398},\n",
- " {'source': 12, 'target': 438},\n",
- " {'source': 12, 'target': 488},\n",
- " {'source': 12, 'target': 495},\n",
- " {'source': 13, 'target': 23},\n",
- " {'source': 13, 'target': 35},\n",
- " {'source': 13, 'target': 43},\n",
- " {'source': 13, 'target': 56},\n",
- " {'source': 13, 'target': 63},\n",
- " {'source': 13, 'target': 79},\n",
- " {'source': 13, 'target': 81},\n",
- " {'source': 13, 'target': 87},\n",
- " {'source': 13, 'target': 161},\n",
- " {'source': 13, 'target': 198},\n",
- " {'source': 13, 'target': 200},\n",
- " {'source': 13, 'target': 232},\n",
- " {'source': 13, 'target': 250},\n",
- " {'source': 13, 'target': 294},\n",
- " {'source': 13, 'target': 373},\n",
- " {'source': 13, 'target': 389},\n",
- " {'source': 13, 'target': 427},\n",
- " {'source': 13, 'target': 431},\n",
- " {'source': 13, 'target': 452},\n",
- " {'source': 13, 'target': 491},\n",
- " {'source': 14, 'target': 21},\n",
- " {'source': 14, 'target': 24},\n",
- " {'source': 14, 'target': 34},\n",
- " {'source': 14, 'target': 36},\n",
- " {'source': 14, 'target': 37},\n",
- " {'source': 14, 'target': 40},\n",
- " {'source': 14, 'target': 55},\n",
- " {'source': 14, 'target': 58},\n",
- " {'source': 14, 'target': 61},\n",
- " {'source': 14, 'target': 68},\n",
- " {'source': 14, 'target': 82},\n",
- " {'source': 14, 'target': 83},\n",
- " {'source': 14, 'target': 91},\n",
- " {'source': 14, 'target': 101},\n",
- " {'source': 14, 'target': 102},\n",
- " {'source': 14, 'target': 113},\n",
- " {'source': 14, 'target': 118},\n",
- " {'source': 14, 'target': 125},\n",
- " {'source': 14, 'target': 142},\n",
- " {'source': 14, 'target': 185},\n",
- " {'source': 14, 'target': 200},\n",
- " {'source': 14, 'target': 221},\n",
- " {'source': 14, 'target': 229},\n",
- " {'source': 14, 'target': 234},\n",
- " {'source': 14, 'target': 238},\n",
- " {'source': 14, 'target': 266},\n",
- " {'source': 14, 'target': 276},\n",
- " {'source': 14, 'target': 313},\n",
- " {'source': 14, 'target': 336},\n",
- " {'source': 14, 'target': 339},\n",
- " {'source': 14, 'target': 358},\n",
- " {'source': 14, 'target': 366},\n",
- " {'source': 14, 'target': 375},\n",
- " {'source': 14, 'target': 382},\n",
- " {'source': 14, 'target': 456},\n",
- " {'source': 14, 'target': 483},\n",
- " {'source': 14, 'target': 490},\n",
- " {'source': 15, 'target': 16},\n",
- " {'source': 15, 'target': 24},\n",
- " {'source': 15, 'target': 28},\n",
- " {'source': 15, 'target': 39},\n",
- " {'source': 15, 'target': 58},\n",
- " {'source': 15, 'target': 60},\n",
- " {'source': 15, 'target': 72},\n",
- " {'source': 15, 'target': 99},\n",
- " {'source': 15, 'target': 103},\n",
- " {'source': 15, 'target': 107},\n",
- " {'source': 15, 'target': 110},\n",
- " {'source': 15, 'target': 125},\n",
- " {'source': 15, 'target': 153},\n",
- " {'source': 15, 'target': 165},\n",
- " {'source': 15, 'target': 177},\n",
- " {'source': 15, 'target': 180},\n",
- " {'source': 15, 'target': 182},\n",
- " {'source': 15, 'target': 219},\n",
- " {'source': 15, 'target': 235},\n",
- " {'source': 15, 'target': 238},\n",
- " {'source': 15, 'target': 252},\n",
- " {'source': 15, 'target': 341},\n",
- " {'source': 15, 'target': 370},\n",
- " {'source': 15, 'target': 428},\n",
- " {'source': 15, 'target': 433},\n",
- " {'source': 15, 'target': 475},\n",
- " {'source': 15, 'target': 481},\n",
- " {'source': 15, 'target': 489},\n",
- " {'source': 16, 'target': 21},\n",
- " {'source': 16, 'target': 42},\n",
- " {'source': 16, 'target': 45},\n",
- " {'source': 16, 'target': 46},\n",
- " {'source': 16, 'target': 50},\n",
- " {'source': 16, 'target': 56},\n",
- " {'source': 16, 'target': 78},\n",
- " {'source': 16, 'target': 88},\n",
- " {'source': 16, 'target': 90},\n",
- " {'source': 16, 'target': 143},\n",
- " {'source': 16, 'target': 145},\n",
- " {'source': 16, 'target': 207},\n",
- " {'source': 16, 'target': 243},\n",
- " {'source': 16, 'target': 253},\n",
- " {'source': 16, 'target': 256},\n",
- " {'source': 16, 'target': 295},\n",
- " {'source': 16, 'target': 357},\n",
- " {'source': 16, 'target': 393},\n",
- " {'source': 16, 'target': 439},\n",
- " {'source': 16, 'target': 462},\n",
- " {'source': 17, 'target': 20},\n",
- " {'source': 17, 'target': 26},\n",
- " {'source': 17, 'target': 37},\n",
- " {'source': 17, 'target': 45},\n",
- " {'source': 17, 'target': 53},\n",
- " {'source': 17, 'target': 54},\n",
- " {'source': 17, 'target': 65},\n",
- " {'source': 17, 'target': 71},\n",
- " {'source': 17, 'target': 92},\n",
- " {'source': 17, 'target': 119},\n",
- " {'source': 17, 'target': 141},\n",
- " {'source': 17, 'target': 143},\n",
- " {'source': 17, 'target': 180},\n",
- " {'source': 17, 'target': 190},\n",
- " {'source': 17, 'target': 195},\n",
- " {'source': 17, 'target': 213},\n",
- " {'source': 17, 'target': 227},\n",
- " {'source': 17, 'target': 228},\n",
- " {'source': 17, 'target': 233},\n",
- " {'source': 17, 'target': 261},\n",
- " {'source': 17, 'target': 273},\n",
- " {'source': 17, 'target': 278},\n",
- " {'source': 17, 'target': 297},\n",
- " {'source': 17, 'target': 299},\n",
- " {'source': 17, 'target': 336},\n",
- " {'source': 17, 'target': 356},\n",
- " {'source': 17, 'target': 368},\n",
- " {'source': 17, 'target': 390},\n",
- " {'source': 17, 'target': 499},\n",
- " {'source': 18, 'target': 19},\n",
- " {'source': 18, 'target': 20},\n",
- " {'source': 18, 'target': 23},\n",
- " {'source': 18, 'target': 69},\n",
- " {'source': 18, 'target': 74},\n",
- " {'source': 18, 'target': 88},\n",
- " {'source': 18, 'target': 118},\n",
- " {'source': 18, 'target': 153},\n",
- " {'source': 18, 'target': 154},\n",
- " {'source': 18, 'target': 163},\n",
- " {'source': 18, 'target': 207},\n",
- " {'source': 18, 'target': 210},\n",
- " {'source': 18, 'target': 225},\n",
- " {'source': 18, 'target': 255},\n",
- " {'source': 18, 'target': 287},\n",
- " {'source': 18, 'target': 371},\n",
- " {'source': 18, 'target': 379},\n",
- " {'source': 18, 'target': 408},\n",
- " {'source': 18, 'target': 417},\n",
- " {'source': 18, 'target': 488},\n",
- " {'source': 18, 'target': 495},\n",
- " {'source': 19, 'target': 26},\n",
- " {'source': 19, 'target': 42},\n",
- " {'source': 19, 'target': 43},\n",
- " {'source': 19, 'target': 45},\n",
- " {'source': 19, 'target': 60},\n",
- " {'source': 19, 'target': 70},\n",
- " {'source': 19, 'target': 73},\n",
- " {'source': 19, 'target': 77},\n",
- " {'source': 19, 'target': 90},\n",
- " {'source': 19, 'target': 116},\n",
- " {'source': 19, 'target': 131},\n",
- " {'source': 19, 'target': 148},\n",
- " {'source': 19, 'target': 184},\n",
- " {'source': 19, 'target': 186},\n",
- " {'source': 19, 'target': 204},\n",
- " {'source': 19, 'target': 249},\n",
- " {'source': 19, 'target': 253},\n",
- " {'source': 19, 'target': 352},\n",
- " {'source': 19, 'target': 355},\n",
- " {'source': 19, 'target': 372},\n",
- " {'source': 19, 'target': 374},\n",
- " {'source': 19, 'target': 388},\n",
- " {'source': 19, 'target': 437},\n",
- " {'source': 19, 'target': 445},\n",
- " {'source': 20, 'target': 38},\n",
- " {'source': 20, 'target': 71},\n",
- " {'source': 20, 'target': 101},\n",
- " {'source': 20, 'target': 108},\n",
- " {'source': 20, 'target': 109},\n",
- " {'source': 20, 'target': 122},\n",
- " {'source': 20, 'target': 124},\n",
- " {'source': 20, 'target': 139},\n",
- " {'source': 20, 'target': 140},\n",
- " {'source': 20, 'target': 146},\n",
- " {'source': 20, 'target': 164},\n",
- " {'source': 20, 'target': 173},\n",
- " {'source': 20, 'target': 187},\n",
- " {'source': 20, 'target': 202},\n",
- " {'source': 20, 'target': 203},\n",
- " {'source': 20, 'target': 219},\n",
- " {'source': 20, 'target': 224},\n",
- " {'source': 20, 'target': 278},\n",
- " {'source': 20, 'target': 295},\n",
- " {'source': 20, 'target': 337},\n",
- " {'source': 20, 'target': 352},\n",
- " {'source': 20, 'target': 380},\n",
- " {'source': 20, 'target': 398},\n",
- " {'source': 20, 'target': 444},\n",
- " {'source': 20, 'target': 471},\n",
- " {'source': 20, 'target': 481},\n",
- " {'source': 21, 'target': 45},\n",
- " {'source': 21, 'target': 47},\n",
- " {'source': 21, 'target': 51},\n",
- " {'source': 21, 'target': 54},\n",
- " {'source': 21, 'target': 59},\n",
- " {'source': 21, 'target': 76},\n",
- " {'source': 21, 'target': 85},\n",
- " {'source': 21, 'target': 98},\n",
- " {'source': 21, 'target': 131},\n",
- " {'source': 21, 'target': 167},\n",
- " {'source': 21, 'target': 174},\n",
- " {'source': 21, 'target': 236},\n",
- " {'source': 21, 'target': 252},\n",
- " {'source': 21, 'target': 292},\n",
- " {'source': 21, 'target': 314},\n",
- " {'source': 21, 'target': 365},\n",
- " {'source': 21, 'target': 403},\n",
- " {'source': 21, 'target': 435},\n",
- " {'source': 21, 'target': 459},\n",
- " {'source': 21, 'target': 474},\n",
- " {'source': 22, 'target': 25},\n",
- " {'source': 22, 'target': 26},\n",
- " {'source': 22, 'target': 31},\n",
- " {'source': 22, 'target': 77},\n",
- " {'source': 22, 'target': 100},\n",
- " {'source': 22, 'target': 133},\n",
- " {'source': 22, 'target': 191},\n",
- " {'source': 22, 'target': 196},\n",
- " {'source': 22, 'target': 202},\n",
- " {'source': 22, 'target': 220},\n",
- " {'source': 22, 'target': 222},\n",
- " {'source': 22, 'target': 266},\n",
- " {'source': 22, 'target': 296},\n",
- " {'source': 22, 'target': 309},\n",
- " {'source': 22, 'target': 316},\n",
- " {'source': 22, 'target': 325},\n",
- " {'source': 22, 'target': 358},\n",
- " {'source': 22, 'target': 475},\n",
- " {'source': 23, 'target': 24},\n",
- " {'source': 23, 'target': 25},\n",
- " {'source': 23, 'target': 31},\n",
- " {'source': 23, 'target': 53},\n",
- " {'source': 23, 'target': 73},\n",
- " {'source': 23, 'target': 110},\n",
- " {'source': 23, 'target': 169},\n",
- " {'source': 23, 'target': 202},\n",
- " {'source': 23, 'target': 222},\n",
- " {'source': 23, 'target': 224},\n",
- " {'source': 23, 'target': 291},\n",
- " {'source': 23, 'target': 296},\n",
- " {'source': 23, 'target': 298},\n",
- " {'source': 23, 'target': 409},\n",
- " {'source': 24, 'target': 25},\n",
- " {'source': 24, 'target': 26},\n",
- " {'source': 24, 'target': 28},\n",
- " {'source': 24, 'target': 30},\n",
- " {'source': 24, 'target': 34},\n",
- " {'source': 24, 'target': 41},\n",
- " {'source': 24, 'target': 42},\n",
- " {'source': 24, 'target': 43},\n",
- " {'source': 24, 'target': 48},\n",
- " {'source': 24, 'target': 73},\n",
- " {'source': 24, 'target': 92},\n",
- " {'source': 24, 'target': 140},\n",
- " {'source': 24, 'target': 144},\n",
- " {'source': 24, 'target': 146},\n",
- " {'source': 24, 'target': 149},\n",
- " {'source': 24, 'target': 186},\n",
- " {'source': 24, 'target': 201},\n",
- " {'source': 24, 'target': 206},\n",
- " {'source': 24, 'target': 302},\n",
- " {'source': 24, 'target': 378},\n",
- " {'source': 24, 'target': 405},\n",
- " {'source': 24, 'target': 425},\n",
- " {'source': 25, 'target': 26},\n",
- " {'source': 25, 'target': 32},\n",
- " {'source': 25, 'target': 33},\n",
- " {'source': 25, 'target': 49},\n",
- " {'source': 25, 'target': 58},\n",
- " {'source': 25, 'target': 60},\n",
- " {'source': 25, 'target': 83},\n",
- " {'source': 25, 'target': 99},\n",
- " {'source': 25, 'target': 100},\n",
- " {'source': 25, 'target': 102},\n",
- " {'source': 25, 'target': 106},\n",
- " {'source': 25, 'target': 112},\n",
- " {'source': 25, 'target': 113},\n",
- " {'source': 25, 'target': 136},\n",
- " {'source': 25, 'target': 147},\n",
- " {'source': 25, 'target': 162},\n",
- " {'source': 25, 'target': 197},\n",
- " {'source': 25, 'target': 221},\n",
- " {'source': 25, 'target': 242},\n",
- " {'source': 25, 'target': 257},\n",
- " {'source': 25, 'target': 275},\n",
- " {'source': 25, 'target': 285},\n",
- " {'source': 25, 'target': 302},\n",
- " {'source': 25, 'target': 305},\n",
- " {'source': 25, 'target': 354},\n",
- " {'source': 25, 'target': 366},\n",
- " {'source': 25, 'target': 368},\n",
- " {'source': 25, 'target': 381},\n",
- " {'source': 25, 'target': 400},\n",
- " {'source': 25, 'target': 429},\n",
- " {'source': 25, 'target': 435},\n",
- " {'source': 25, 'target': 442},\n",
- " {'source': 25, 'target': 490},\n",
- " {'source': 26, 'target': 27},\n",
- " {'source': 26, 'target': 30},\n",
- " {'source': 26, 'target': 38},\n",
- " {'source': 26, 'target': 102},\n",
- " {'source': 26, 'target': 105},\n",
- " {'source': 26, 'target': 109},\n",
- " {'source': 26, 'target': 122},\n",
- " {'source': 26, 'target': 127},\n",
- " {'source': 26, 'target': 150},\n",
- " {'source': 26, 'target': 159},\n",
- " {'source': 26, 'target': 172},\n",
- " {'source': 26, 'target': 184},\n",
- " {'source': 26, 'target': 214},\n",
- " {'source': 26, 'target': 220},\n",
- " {'source': 26, 'target': 284},\n",
- " {'source': 26, 'target': 288},\n",
- " {'source': 26, 'target': 301},\n",
- " {'source': 26, 'target': 316},\n",
- " {'source': 26, 'target': 348},\n",
- " {'source': 26, 'target': 375},\n",
- " {'source': 26, 'target': 387},\n",
- " {'source': 26, 'target': 390},\n",
- " {'source': 26, 'target': 410},\n",
- " {'source': 26, 'target': 425},\n",
- " {'source': 26, 'target': 433},\n",
- " {'source': 26, 'target': 461},\n",
- " {'source': 26, 'target': 463},\n",
- " {'source': 26, 'target': 469},\n",
- " {'source': 26, 'target': 484},\n",
- " {'source': 27, 'target': 65},\n",
- " {'source': 27, 'target': 117},\n",
- " {'source': 27, 'target': 157},\n",
- " {'source': 27, 'target': 181},\n",
- " {'source': 27, 'target': 184},\n",
- " {'source': 27, 'target': 197},\n",
- " {'source': 27, 'target': 438},\n",
- " {'source': 27, 'target': 448},\n",
- " {'source': 28, 'target': 87},\n",
- " {'source': 28, 'target': 93},\n",
- " {'source': 28, 'target': 112},\n",
- " {'source': 28, 'target': 154},\n",
- " {'source': 29, 'target': 39},\n",
- " {'source': 29, 'target': 55},\n",
- " {'source': 29, 'target': 80},\n",
- " {'source': 29, 'target': 82},\n",
- " {'source': 29, 'target': 87},\n",
- " {'source': 29, 'target': 165},\n",
- " {'source': 29, 'target': 328},\n",
- " {'source': 29, 'target': 356},\n",
- " {'source': 29, 'target': 370},\n",
- " {'source': 29, 'target': 463},\n",
- " {'source': 30, 'target': 32},\n",
- " {'source': 30, 'target': 62},\n",
- " {'source': 30, 'target': 77},\n",
- " {'source': 30, 'target': 245},\n",
- " {'source': 30, 'target': 344},\n",
- " {'source': 30, 'target': 371},\n",
- " {'source': 30, 'target': 452},\n",
- " {'source': 31, 'target': 33},\n",
- " {'source': 31, 'target': 40},\n",
- " {'source': 31, 'target': 47},\n",
- " {'source': 31, 'target': 48},\n",
- " {'source': 31, 'target': 51},\n",
- " {'source': 31, 'target': 55},\n",
- " {'source': 31, 'target': 57},\n",
- " {'source': 31, 'target': 61},\n",
- " {'source': 31, 'target': 66},\n",
- " {'source': 31, 'target': 71},\n",
- " {'source': 31, 'target': 74},\n",
- " {'source': 31, 'target': 80},\n",
- " {'source': 31, 'target': 81},\n",
- " {'source': 31, 'target': 89},\n",
- " {'source': 31, 'target': 95},\n",
- " {'source': 31, 'target': 96},\n",
- " {'source': 31, 'target': 112},\n",
- " {'source': 31, 'target': 130},\n",
- " {'source': 31, 'target': 141},\n",
- " {'source': 31, 'target': 163},\n",
- " {'source': 31, 'target': 165},\n",
- " {'source': 31, 'target': 166},\n",
- " {'source': 31, 'target': 168},\n",
- " {'source': 31, 'target': 175},\n",
- " {'source': 31, 'target': 228},\n",
- " ...],\n",
- " 'multigraph': False,\n",
- " 'nodes': [{'id': 0},\n",
- " {'id': 1},\n",
- " {'id': 2},\n",
- " {'id': 3},\n",
- " {'id': 4},\n",
- " {'id': 5},\n",
- " {'id': 6},\n",
- " {'id': 7},\n",
- " {'id': 8},\n",
- " {'id': 9},\n",
- " {'id': 10},\n",
- " {'id': 11},\n",
- " {'id': 12},\n",
- " {'id': 13},\n",
- " {'id': 14},\n",
- " {'id': 15},\n",
- " {'id': 16},\n",
- " {'id': 17},\n",
- " {'id': 18},\n",
- " {'id': 19},\n",
- " {'id': 20},\n",
- " {'id': 21},\n",
- " {'id': 22},\n",
- " {'id': 23},\n",
- " {'id': 24},\n",
- " {'id': 25},\n",
- " {'id': 26},\n",
- " {'id': 27},\n",
- " {'id': 28},\n",
- " {'id': 29},\n",
- " {'id': 30},\n",
- " {'id': 31},\n",
- " {'id': 32},\n",
- " {'id': 33},\n",
- " {'id': 34},\n",
- " {'id': 35},\n",
- " {'id': 36},\n",
- " {'id': 37},\n",
- " {'id': 38},\n",
- " {'id': 39},\n",
- " {'id': 40},\n",
- " {'id': 41},\n",
- " {'id': 42},\n",
- " {'id': 43},\n",
- " {'id': 44},\n",
- " {'id': 45},\n",
- " {'id': 46},\n",
- " {'id': 47},\n",
- " {'id': 48},\n",
- " {'id': 49},\n",
- " {'id': 50},\n",
- " {'id': 51},\n",
- " {'id': 52},\n",
- " {'id': 53},\n",
- " {'id': 54},\n",
- " {'id': 55},\n",
- " {'id': 56},\n",
- " {'id': 57},\n",
- " {'id': 58},\n",
- " {'id': 59},\n",
- " {'id': 60},\n",
- " {'id': 61},\n",
- " {'id': 62},\n",
- " {'id': 63},\n",
- " {'id': 64},\n",
- " {'id': 65},\n",
- " {'id': 66},\n",
- " {'id': 67},\n",
- " {'id': 68},\n",
- " {'id': 69},\n",
- " {'id': 70},\n",
- " {'id': 71},\n",
- " {'id': 72},\n",
- " {'id': 73},\n",
- " {'id': 74},\n",
- " {'id': 75},\n",
- " {'id': 76},\n",
- " {'id': 77},\n",
- " {'id': 78},\n",
- " {'id': 79},\n",
- " {'id': 80},\n",
- " {'id': 81},\n",
- " {'id': 82},\n",
- " {'id': 83},\n",
- " {'id': 84},\n",
- " {'id': 85},\n",
- " {'id': 86},\n",
- " {'id': 87},\n",
- " {'id': 88},\n",
- " {'id': 89},\n",
- " {'id': 90},\n",
- " {'id': 91},\n",
- " {'id': 92},\n",
- " {'id': 93},\n",
- " {'id': 94},\n",
- " {'id': 95},\n",
- " {'id': 96},\n",
- " {'id': 97},\n",
- " {'id': 98},\n",
- " {'id': 99},\n",
- " {'id': 100},\n",
- " {'id': 101},\n",
- " {'id': 102},\n",
- " {'id': 103},\n",
- " {'id': 104},\n",
- " {'id': 105},\n",
- " {'id': 106},\n",
- " {'id': 107},\n",
- " {'id': 108},\n",
- " {'id': 109},\n",
- " {'id': 110},\n",
- " {'id': 111},\n",
- " {'id': 112},\n",
- " {'id': 113},\n",
- " {'id': 114},\n",
- " {'id': 115},\n",
- " {'id': 116},\n",
- " {'id': 117},\n",
- " {'id': 118},\n",
- " {'id': 119},\n",
- " {'id': 120},\n",
- " {'id': 121},\n",
- " {'id': 122},\n",
- " {'id': 123},\n",
- " {'id': 124},\n",
- " {'id': 125},\n",
- " {'id': 126},\n",
- " {'id': 127},\n",
- " {'id': 128},\n",
- " {'id': 129},\n",
- " {'id': 130},\n",
- " {'id': 131},\n",
- " {'id': 132},\n",
- " {'id': 133},\n",
- " {'id': 134},\n",
- " {'id': 135},\n",
- " {'id': 136},\n",
- " {'id': 137},\n",
- " {'id': 138},\n",
- " {'id': 139},\n",
- " {'id': 140},\n",
- " {'id': 141},\n",
- " {'id': 142},\n",
- " {'id': 143},\n",
- " {'id': 144},\n",
- " {'id': 145},\n",
- " {'id': 146},\n",
- " {'id': 147},\n",
- " {'id': 148},\n",
- " {'id': 149},\n",
- " {'id': 150},\n",
- " {'id': 151},\n",
- " {'id': 152},\n",
- " {'id': 153},\n",
- " {'id': 154},\n",
- " {'id': 155},\n",
- " {'id': 156},\n",
- " {'id': 157},\n",
- " {'id': 158},\n",
- " {'id': 159},\n",
- " {'id': 160},\n",
- " {'id': 161},\n",
- " {'id': 162},\n",
- " {'id': 163},\n",
- " {'id': 164},\n",
- " {'id': 165},\n",
- " {'id': 166},\n",
- " {'id': 167},\n",
- " {'id': 168},\n",
- " {'id': 169},\n",
- " {'id': 170},\n",
- " {'id': 171},\n",
- " {'id': 172},\n",
- " {'id': 173},\n",
- " {'id': 174},\n",
- " {'id': 175},\n",
- " {'id': 176},\n",
- " {'id': 177},\n",
- " {'id': 178},\n",
- " {'id': 179},\n",
- " {'id': 180},\n",
- " {'id': 181},\n",
- " {'id': 182},\n",
- " {'id': 183},\n",
- " {'id': 184},\n",
- " {'id': 185},\n",
- " {'id': 186},\n",
- " {'id': 187},\n",
- " {'id': 188},\n",
- " {'id': 189},\n",
- " {'id': 190},\n",
- " {'id': 191},\n",
- " {'id': 192},\n",
- " {'id': 193},\n",
- " {'id': 194},\n",
- " {'id': 195},\n",
- " {'id': 196},\n",
- " {'id': 197},\n",
- " {'id': 198},\n",
- " {'id': 199},\n",
- " {'id': 200},\n",
- " {'id': 201},\n",
- " {'id': 202},\n",
- " {'id': 203},\n",
- " {'id': 204},\n",
- " {'id': 205},\n",
- " {'id': 206},\n",
- " {'id': 207},\n",
- " {'id': 208},\n",
- " {'id': 209},\n",
- " {'id': 210},\n",
- " {'id': 211},\n",
- " {'id': 212},\n",
- " {'id': 213},\n",
- " {'id': 214},\n",
- " {'id': 215},\n",
- " {'id': 216},\n",
- " {'id': 217},\n",
- " {'id': 218},\n",
- " {'id': 219},\n",
- " {'id': 220},\n",
- " {'id': 221},\n",
- " {'id': 222},\n",
- " {'id': 223},\n",
- " {'id': 224},\n",
- " {'id': 225},\n",
- " {'id': 226},\n",
- " {'id': 227},\n",
- " {'id': 228},\n",
- " {'id': 229},\n",
- " {'id': 230},\n",
- " {'id': 231},\n",
- " {'id': 232},\n",
- " {'id': 233},\n",
- " {'id': 234},\n",
- " {'id': 235},\n",
- " {'id': 236},\n",
- " {'id': 237},\n",
- " {'id': 238},\n",
- " {'id': 239},\n",
- " {'id': 240},\n",
- " {'id': 241},\n",
- " {'id': 242},\n",
- " {'id': 243},\n",
- " {'id': 244},\n",
- " {'id': 245},\n",
- " {'id': 246},\n",
- " {'id': 247},\n",
- " {'id': 248},\n",
- " {'id': 249},\n",
- " {'id': 250},\n",
- " {'id': 251},\n",
- " {'id': 252},\n",
- " {'id': 253},\n",
- " {'id': 254},\n",
- " {'id': 255},\n",
- " {'id': 256},\n",
- " {'id': 257},\n",
- " {'id': 258},\n",
- " {'id': 259},\n",
- " {'id': 260},\n",
- " {'id': 261},\n",
- " {'id': 262},\n",
- " {'id': 263},\n",
- " {'id': 264},\n",
- " {'id': 265},\n",
- " {'id': 266},\n",
- " {'id': 267},\n",
- " {'id': 268},\n",
- " {'id': 269},\n",
- " {'id': 270},\n",
- " {'id': 271},\n",
- " {'id': 272},\n",
- " {'id': 273},\n",
- " {'id': 274},\n",
- " {'id': 275},\n",
- " {'id': 276},\n",
- " {'id': 277},\n",
- " {'id': 278},\n",
- " {'id': 279},\n",
- " {'id': 280},\n",
- " {'id': 281},\n",
- " {'id': 282},\n",
- " {'id': 283},\n",
- " {'id': 284},\n",
- " {'id': 285},\n",
- " {'id': 286},\n",
- " {'id': 287},\n",
- " {'id': 288},\n",
- " {'id': 289},\n",
- " {'id': 290},\n",
- " {'id': 291},\n",
- " {'id': 292},\n",
- " {'id': 293},\n",
- " {'id': 294},\n",
- " {'id': 295},\n",
- " {'id': 296},\n",
- " {'id': 297},\n",
- " {'id': 298},\n",
- " {'id': 299},\n",
- " {'id': 300},\n",
- " {'id': 301},\n",
- " {'id': 302},\n",
- " {'id': 303},\n",
- " {'id': 304},\n",
- " {'id': 305},\n",
- " {'id': 306},\n",
- " {'id': 307},\n",
- " {'id': 308},\n",
- " {'id': 309},\n",
- " {'id': 310},\n",
- " {'id': 311},\n",
- " {'id': 312},\n",
- " {'id': 313},\n",
- " {'id': 314},\n",
- " {'id': 315},\n",
- " {'id': 316},\n",
- " {'id': 317},\n",
- " {'id': 318},\n",
- " {'id': 319},\n",
- " {'id': 320},\n",
- " {'id': 321},\n",
- " {'id': 322},\n",
- " {'id': 323},\n",
- " {'id': 324},\n",
- " {'id': 325},\n",
- " {'id': 326},\n",
- " {'id': 327},\n",
- " {'id': 328},\n",
- " {'id': 329},\n",
- " {'id': 330},\n",
- " {'id': 331},\n",
- " {'id': 332},\n",
- " {'id': 333},\n",
- " {'id': 334},\n",
- " {'id': 335},\n",
- " {'id': 336},\n",
- " {'id': 337},\n",
- " {'id': 338},\n",
- " {'id': 339},\n",
- " {'id': 340},\n",
- " {'id': 341},\n",
- " {'id': 342},\n",
- " {'id': 343},\n",
- " {'id': 344},\n",
- " {'id': 345},\n",
- " {'id': 346},\n",
- " {'id': 347},\n",
- " {'id': 348},\n",
- " {'id': 349},\n",
- " {'id': 350},\n",
- " {'id': 351},\n",
- " {'id': 352},\n",
- " {'id': 353},\n",
- " {'id': 354},\n",
- " {'id': 355},\n",
- " {'id': 356},\n",
- " {'id': 357},\n",
- " {'id': 358},\n",
- " {'id': 359},\n",
- " {'id': 360},\n",
- " {'id': 361},\n",
- " {'id': 362},\n",
- " {'id': 363},\n",
- " {'id': 364},\n",
- " {'id': 365},\n",
- " {'id': 366},\n",
- " {'id': 367},\n",
- " {'id': 368},\n",
- " {'id': 369},\n",
- " {'id': 370},\n",
- " {'id': 371},\n",
- " {'id': 372},\n",
- " {'id': 373},\n",
- " {'id': 374},\n",
- " {'id': 375},\n",
- " {'id': 376},\n",
- " {'id': 377},\n",
- " {'id': 378},\n",
- " {'id': 379},\n",
- " {'id': 380},\n",
- " {'id': 381},\n",
- " {'id': 382},\n",
- " {'id': 383},\n",
- " {'id': 384},\n",
- " {'id': 385},\n",
- " {'id': 386},\n",
- " {'id': 387},\n",
- " {'id': 388},\n",
- " {'id': 389},\n",
- " {'id': 390},\n",
- " {'id': 391},\n",
- " {'id': 392},\n",
- " {'id': 393},\n",
- " {'id': 394},\n",
- " {'id': 395},\n",
- " {'id': 396},\n",
- " {'id': 397},\n",
- " {'id': 398},\n",
- " {'id': 399},\n",
- " {'id': 400},\n",
- " {'id': 401},\n",
- " {'id': 402},\n",
- " {'id': 403},\n",
- " {'id': 404},\n",
- " {'id': 405},\n",
- " {'id': 406},\n",
- " {'id': 407},\n",
- " {'id': 408},\n",
- " {'id': 409},\n",
- " {'id': 410},\n",
- " {'id': 411},\n",
- " {'id': 412},\n",
- " {'id': 413},\n",
- " {'id': 414},\n",
- " {'id': 415},\n",
- " {'id': 416},\n",
- " {'id': 417},\n",
- " {'id': 418},\n",
- " {'id': 419},\n",
- " {'id': 420},\n",
- " {'id': 421},\n",
- " {'id': 422},\n",
- " {'id': 423},\n",
- " {'id': 424},\n",
- " {'id': 425},\n",
- " {'id': 426},\n",
- " {'id': 427},\n",
- " {'id': 428},\n",
- " {'id': 429},\n",
- " {'id': 430},\n",
- " {'id': 431},\n",
- " {'id': 432},\n",
- " {'id': 433},\n",
- " {'id': 434},\n",
- " {'id': 435},\n",
- " {'id': 436},\n",
- " {'id': 437},\n",
- " {'id': 438},\n",
- " {'id': 439},\n",
- " {'id': 440},\n",
- " {'id': 441},\n",
- " {'id': 442},\n",
- " {'id': 443},\n",
- " {'id': 444},\n",
- " {'id': 445},\n",
- " {'id': 446},\n",
- " {'id': 447},\n",
- " {'id': 448},\n",
- " {'id': 449},\n",
- " {'id': 450},\n",
- " {'id': 451},\n",
- " {'id': 452},\n",
- " {'id': 453},\n",
- " {'id': 454},\n",
- " {'id': 455},\n",
- " {'id': 456},\n",
- " {'id': 457},\n",
- " {'id': 458},\n",
- " {'id': 459},\n",
- " {'id': 460},\n",
- " {'id': 461},\n",
- " {'id': 462},\n",
- " {'id': 463},\n",
- " {'id': 464},\n",
- " {'id': 465},\n",
- " {'id': 466},\n",
- " {'id': 467},\n",
- " {'id': 468},\n",
- " {'id': 469},\n",
- " {'id': 470},\n",
- " {'id': 471},\n",
- " {'id': 472},\n",
- " {'id': 473},\n",
- " {'id': 474},\n",
- " {'id': 475},\n",
- " {'id': 476},\n",
- " {'id': 477},\n",
- " {'id': 478},\n",
- " {'id': 479},\n",
- " {'id': 480},\n",
- " {'id': 481},\n",
- " {'id': 482},\n",
- " {'id': 483},\n",
- " {'id': 484},\n",
- " {'id': 485},\n",
- " {'id': 486},\n",
- " {'id': 487},\n",
- " {'id': 488},\n",
- " {'id': 489},\n",
- " {'id': 490},\n",
- " {'id': 491},\n",
- " {'id': 492},\n",
- " {'id': 493},\n",
- " {'id': 494},\n",
- " {'id': 495},\n",
- " {'id': 496},\n",
- " {'id': 497},\n",
- " {'id': 498},\n",
- " {'id': 499}]}})]"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "evodumb"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.6"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/examples/complete.yml b/examples/complete.yml
deleted file mode 100644
index 130b1e7..0000000
--- a/examples/complete.yml
+++ /dev/null
@@ -1,54 +0,0 @@
----
-version: '2'
-name: simple
-group: tests
-dir_path: "/tmp/"
-num_trials: 3
-max_steps: 100
-interval: 1
-seed: "CompleteSeed!"
-model_class: Environment
-model_params:
- am_i_complete: true
- topology:
- params:
- generator: complete_graph
- n: 12
- environment:
- agents:
- agent_class: CounterModel
- topology: true
- state:
- times: 1
- # In this group we are not specifying any topology
- fixed:
- - name: 'Environment Agent 1'
- agent_class: BaseAgent
- group: environment
- topology: false
- hidden: true
- state:
- times: 10
- - agent_class: CounterModel
- id: 0
- group: fixed_counters
- state:
- times: 1
- total: 0
- - agent_class: CounterModel
- group: fixed_counters
- id: 1
- distribution:
- - agent_class: CounterModel
- weight: 1
- group: distro_counters
- state:
- times: 3
- - agent_class: AggregatedCounter
- weight: 0.2
- override:
- - filter:
- agent_class: AggregatedCounter
- n: 2
- state:
- times: 5
diff --git a/examples/custom_generator/custom_generator.yml b/examples/custom_generator/custom_generator.yml
deleted file mode 100644
index 81f0314..0000000
--- a/examples/custom_generator/custom_generator.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-name: custom-generator
-description: Using a custom generator for the network
-num_trials: 3
-max_steps: 100
-interval: 1
-network_params:
- generator: mymodule.mygenerator
-# These are custom parameters
- n: 10
- n_edges: 5
-network_agents:
- - agent_class: CounterModel
- weight: 1
- state:
- state_id: 0
diff --git a/examples/custom_generator/mymodule.py b/examples/custom_generator/generator_sim.py
similarity index 54%
rename from examples/custom_generator/mymodule.py
rename to examples/custom_generator/generator_sim.py
index 241ddcb..0950457 100644
--- a/examples/custom_generator/mymodule.py
+++ b/examples/custom_generator/generator_sim.py
@@ -1,6 +1,7 @@
from networkx import Graph
import random
import networkx as nx
+from soil import Simulation, Environment, CounterModel, parameters
def mygenerator(n=5, n_edges=5):
@@ -20,3 +21,19 @@ def mygenerator(n=5, n_edges=5):
n_out = random.choice(nodes)
G.add_edge(n_in, n_out)
return G
+
+
+class GeneratorEnv(Environment):
+ """Using a custom generator for the network"""
+
+ generator: parameters.function = mygenerator
+
+ def init(self):
+ self.create_network(network_generator=self.generator, n=10, n_edges=5)
+ self.init_agents(CounterModel)
+
+
+sim = Simulation(model=GeneratorEnv, max_steps=10, interval=1)
+
+if __name__ == '__main__':
+ sim.run(dry_run=True)
\ No newline at end of file
diff --git a/examples/custom_timeouts/custom_timeouts.py b/examples/custom_timeouts/custom_timeouts_sim.py
similarity index 59%
rename from examples/custom_timeouts/custom_timeouts.py
rename to examples/custom_timeouts/custom_timeouts_sim.py
index 4124fa6..e5ff26d 100644
--- a/examples/custom_timeouts/custom_timeouts.py
+++ b/examples/custom_timeouts/custom_timeouts_sim.py
@@ -4,8 +4,7 @@ from soil.time import Delta
class Fibonacci(FSM):
"""Agent that only executes in t_steps that are Fibonacci numbers"""
-
- defaults = {"prev": 1}
+ prev = 1
@default_state
@state
@@ -25,23 +24,18 @@ class Odds(FSM):
return None, Delta(1 + self.now % 2)
-from soil import Simulation
+from soil import Environment, Simulation
+from networkx import complete_graph
-simulation = Simulation(
- model_params={
- 'agents':[
- {'agent_class': Fibonacci, 'node_id': 0},
- {'agent_class': Odds, 'node_id': 1}
- ],
- 'topology': {
- 'params': {
- 'generator': 'complete_graph',
- 'n': 2
- }
- },
- },
- max_time=100,
-)
+
+class TimeoutsEnv(Environment):
+ def init(self):
+ self.init_network(generator=complete_graph, n=2)
+ self.add_agent(agent_class=Fibonacci, node_id=0)
+ self.add_agent(agent_class=Odds, node_id=1)
+
+
+sim = Simulation(model=TimeoutsEnv, max_steps=10, interval=1)
if __name__ == "__main__":
- simulation.run(dry_run=True)
+ sim.run(dry_run=True)
\ No newline at end of file
diff --git a/examples/events_and_messages/cars.py b/examples/events_and_messages/cars_sim.py
similarity index 97%
rename from examples/events_and_messages/cars.py
rename to examples/events_and_messages/cars_sim.py
index f37b88f..c785650 100644
--- a/examples/events_and_messages/cars.py
+++ b/examples/events_and_messages/cars_sim.py
@@ -232,12 +232,10 @@ class Passenger(Evented, FSM):
self.die()
-simulation = Simulation(
- name="RideHailing",
- model_class=City,
- model_params={"n_passengers": 2},
- seed="carsSeed",
-)
+simulation = Simulation(name="RideHailing",
+ model=City,
+ seed="carsSeed",
+ model_params=dict(n_passengers=2))
if __name__ == "__main__":
simulation.run()
\ No newline at end of file
diff --git a/examples/mesa/mesa.yml b/examples/mesa/mesa.yml
deleted file mode 100644
index eb10b8d..0000000
--- a/examples/mesa/mesa.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-name: mesa_sim
-group: tests
-dir_path: "/tmp"
-num_trials: 3
-max_steps: 100
-interval: 1
-seed: '1'
-model_class: social_wealth.MoneyEnv
-model_params:
- generator: social_wealth.graph_generator
- agents:
- topology: true
- distribution:
- - agent_class: social_wealth.SocialMoneyAgent
- weight: 1
- N: 10
- width: 50
- height: 50
diff --git a/examples/mesa/mesa_sim.py b/examples/mesa/mesa_sim.py
new file mode 100644
index 0000000..1f2da70
--- /dev/null
+++ b/examples/mesa/mesa_sim.py
@@ -0,0 +1,7 @@
+from soil import Simulation
+from social_wealth import MoneyEnv, graph_generator
+
+sim = Simulation(name="mesa_sim", dry_run=True, max_steps=10, interval=2, model=MoneyEnv, model_params=dict(generator=graph_generator, N=10, width=50, height=50))
+
+if __name__ == "__main__":
+ sim.run()
diff --git a/examples/mesa/server.py b/examples/mesa/server.py
index 851f06d..64873ce 100644
--- a/examples/mesa/server.py
+++ b/examples/mesa/server.py
@@ -1,5 +1,5 @@
from mesa.visualization.ModularVisualization import ModularServer
-from soil.visualization import UserSettableParameter
+from mesa.visualization.UserParam import Slider, Choice
from mesa.visualization.modules import ChartModule, NetworkModule, CanvasGrid
from social_wealth import MoneyEnv, graph_generator, SocialMoneyAgent
import networkx as nx
@@ -64,8 +64,7 @@ chart = ChartModule(
)
model_params = {
- "N": UserSettableParameter(
- "slider",
+ "N": Slider(
"N",
5,
1,
@@ -73,8 +72,7 @@ model_params = {
1,
description="Choose how many agents to include in the model",
),
- "height": UserSettableParameter(
- "slider",
+ "height": Slider(
"height",
5,
5,
@@ -82,8 +80,7 @@ model_params = {
1,
description="Grid height",
),
- "width": UserSettableParameter(
- "slider",
+ "width": Slider(
"width",
5,
5,
@@ -91,8 +88,7 @@ model_params = {
1,
description="Grid width",
),
- "agent_class": UserSettableParameter(
- "choice",
+ "agent_class": Choice(
"Agent class",
value="MoneyAgent",
choices=["MoneyAgent", "SocialMoneyAgent"],
diff --git a/examples/newsspread/NewsSpread.yml b/examples/newsspread/NewsSpread.yml
deleted file mode 100644
index d80a5d5..0000000
--- a/examples/newsspread/NewsSpread.yml
+++ /dev/null
@@ -1,133 +0,0 @@
----
-default_state: {}
-environment_agents: []
-environment_params:
- prob_neighbor_spread: 0.0
- prob_tv_spread: 0.01
-interval: 1
-max_steps: 300
-name: Sim_all_dumb
-network_agents:
-- agent_class: newsspread.DumbViewer
- state:
- has_tv: false
- weight: 1
-- agent_class: newsspread.DumbViewer
- state:
- has_tv: true
- weight: 1
-network_params:
- generator: barabasi_albert_graph
- n: 500
- m: 5
-num_trials: 50
----
-default_state: {}
-environment_agents: []
-environment_params:
- prob_neighbor_spread: 0.0
- prob_tv_spread: 0.01
-interval: 1
-max_steps: 300
-name: Sim_half_herd
-network_agents:
-- agent_class: newsspread.DumbViewer
- state:
- has_tv: false
- weight: 1
-- agent_class: newsspread.DumbViewer
- state:
- has_tv: true
- weight: 1
-- agent_class: newsspread.HerdViewer
- state:
- has_tv: false
- weight: 1
-- agent_class: newsspread.HerdViewer
- state:
- has_tv: true
- weight: 1
-network_params:
- generator: barabasi_albert_graph
- n: 500
- m: 5
-num_trials: 50
----
-default_state: {}
-environment_agents: []
-environment_params:
- prob_neighbor_spread: 0.0
- prob_tv_spread: 0.01
-interval: 1
-max_steps: 300
-name: Sim_all_herd
-network_agents:
-- agent_class: newsspread.HerdViewer
- state:
- has_tv: true
- state_id: neutral
- weight: 1
-- agent_class: newsspread.HerdViewer
- state:
- has_tv: true
- state_id: neutral
- weight: 1
-network_params:
- generator: barabasi_albert_graph
- n: 500
- m: 5
-num_trials: 50
----
-default_state: {}
-environment_agents: []
-environment_params:
- prob_neighbor_spread: 0.0
- prob_tv_spread: 0.01
- prob_neighbor_cure: 0.1
-interval: 1
-max_steps: 300
-name: Sim_wise_herd
-network_agents:
-- agent_class: newsspread.HerdViewer
- state:
- has_tv: true
- state_id: neutral
- weight: 1
-- agent_class: newsspread.WiseViewer
- state:
- has_tv: true
- weight: 1
-network_params:
- generator: barabasi_albert_graph
- n: 500
- m: 5
-num_trials: 50
----
-default_state: {}
-environment_agents: []
-environment_params:
- prob_neighbor_spread: 0.0
- prob_tv_spread: 0.01
- prob_neighbor_cure: 0.1
-interval: 1
-max_steps: 300
-name: Sim_all_wise
-network_agents:
-- agent_class: newsspread.WiseViewer
- state:
- has_tv: true
- state_id: neutral
- weight: 1
-- agent_class: newsspread.WiseViewer
- state:
- has_tv: true
- weight: 1
-network_params:
- generator: barabasi_albert_graph
- n: 500
- m: 5
-network_params:
- generator: barabasi_albert_graph
- n: 500
- m: 5
-num_trials: 50
diff --git a/examples/newsspread/newsspread.py b/examples/newsspread/newsspread.py
deleted file mode 100644
index bfcdbc9..0000000
--- a/examples/newsspread/newsspread.py
+++ /dev/null
@@ -1,87 +0,0 @@
-from soil.agents import FSM, NetworkAgent, state, default_state, prob
-import logging
-
-
-class DumbViewer(FSM, NetworkAgent):
- """
- A viewer that gets infected via TV (if it has one) and tries to infect
- its neighbors once it's infected.
- """
-
- prob_neighbor_spread = 0.5
- prob_tv_spread = 0.1
- has_been_infected = False
-
- @default_state
- @state
- def neutral(self):
- if self["has_tv"]:
- if self.prob(self.model["prob_tv_spread"]):
- return self.infected
- if self.has_been_infected:
- return self.infected
-
- @state
- def infected(self):
- for neighbor in self.get_neighbors(state_id=self.neutral.id):
- if self.prob(self.model["prob_neighbor_spread"]):
- neighbor.infect()
-
- def infect(self):
- """
- This is not a state. It is a function that other agents can use to try to
- infect this agent. DumbViewer always gets infected, but other agents like
- HerdViewer might not become infected right away
- """
-
- self.has_been_infected = True
-
-
-class HerdViewer(DumbViewer):
- """
- A viewer whose probability of infection depends on the state of its neighbors.
- """
-
- def infect(self):
- """Notice again that this is NOT a state. See DumbViewer.infect for reference"""
- infected = self.count_neighbors(state_id=self.infected.id)
- total = self.count_neighbors()
- prob_infect = self.model["prob_neighbor_spread"] * infected / total
- self.debug("prob_infect", prob_infect)
- if self.prob(prob_infect):
- self.has_been_infected = True
-
-
-class WiseViewer(HerdViewer):
- """
- A viewer that can change its mind.
- """
-
- defaults = {
- "prob_neighbor_spread": 0.5,
- "prob_neighbor_cure": 0.25,
- "prob_tv_spread": 0.1,
- }
-
- @state
- def cured(self):
- prob_cure = self.model["prob_neighbor_cure"]
- for neighbor in self.get_neighbors(state_id=self.infected.id):
- if self.prob(prob_cure):
- try:
- neighbor.cure()
- except AttributeError:
- self.debug("Viewer {} cannot be cured".format(neighbor.id))
-
- def cure(self):
- self.has_been_cured = True
-
- @state
- def infected(self):
- if self.has_been_cured:
- return self.cured
- cured = max(self.count_neighbors(self.cured.id), 1.0)
- infected = max(self.count_neighbors(self.infected.id), 1.0)
- prob_cure = self.model["prob_neighbor_cure"] * (cured / infected)
- if self.prob(prob_cure):
- return self.cured
diff --git a/examples/newsspread/newsspread_sim.py b/examples/newsspread/newsspread_sim.py
new file mode 100644
index 0000000..c85d5fc
--- /dev/null
+++ b/examples/newsspread/newsspread_sim.py
@@ -0,0 +1,129 @@
+from soil.agents import FSM, NetworkAgent, state, default_state, prob
+from soil.parameters import *
+import logging
+
+from soil.environment import Environment
+
+
+class DumbViewer(FSM, NetworkAgent):
+ """
+ A viewer that gets infected via TV (if it has one) and tries to infect
+ its neighbors once it's infected.
+ """
+
+ has_been_infected: bool = False
+ has_tv: bool = False
+
+ @default_state
+ @state
+ def neutral(self):
+ if self.has_tv:
+ if self.prob(self.get("prob_tv_spread")):
+ return self.infected
+ if self.has_been_infected:
+ return self.infected
+
+ @state
+ def infected(self):
+ for neighbor in self.get_neighbors(state_id=self.neutral.id):
+ if self.prob(self.get("prob_neighbor_spread")):
+ neighbor.infect()
+
+ def infect(self):
+ """
+ This is not a state. It is a function that other agents can use to try to
+ infect this agent. DumbViewer always gets infected, but other agents like
+ HerdViewer might not become infected right away
+ """
+ self.has_been_infected = True
+
+
+class HerdViewer(DumbViewer):
+ """
+ A viewer whose probability of infection depends on the state of its neighbors.
+ """
+
+ def infect(self):
+ """Notice again that this is NOT a state. See DumbViewer.infect for reference"""
+ infected = self.count_neighbors(state_id=self.infected.id)
+ total = self.count_neighbors()
+ prob_infect = self.get("prob_neighbor_spread") * infected / total
+ self.debug("prob_infect", prob_infect)
+ if self.prob(prob_infect):
+ self.has_been_infected = True
+
+
+class WiseViewer(HerdViewer):
+ """
+ A viewer that can change its mind.
+ """
+
+ @state
+ def cured(self):
+ prob_cure = self.get("prob_neighbor_cure")
+ for neighbor in self.get_neighbors(state_id=self.infected.id):
+ if self.prob(prob_cure):
+ try:
+ neighbor.cure()
+ except AttributeError:
+ self.debug("Viewer {} cannot be cured".format(neighbor.id))
+
+ def cure(self):
+ self.has_been_cured = True
+
+ @state
+ def infected(self):
+ if self.has_been_cured:
+ return self.cured
+ cured = max(self.count_neighbors(self.cured.id), 1.0)
+ infected = max(self.count_neighbors(self.infected.id), 1.0)
+ prob_cure = self.get("prob_neighbor_cure") * (cured / infected)
+ if self.prob(prob_cure):
+ return self.cured
+
+
+class NewsSpread(Environment):
+ ratio_dumb: probability = 1,
+ ratio_herd: probability = 0,
+ ratio_wise: probability = 0,
+ prob_tv_spread: probability = 0.1,
+ prob_neighbor_spread: probability = 0.1,
+ prob_neighbor_cure: probability = 0.05,
+
+ def init(self):
+ self.populate_network([DumbViewer, HerdViewer, WiseViewer], [self.ratio_dumb, self.ratio_herd, self.ratio_wise])
+
+
+from itertools import permutations
+from soil import Simulation
+
+
+# We want to investigate the effect of different agent distributions on the spread of news.
+# To do that, we will run different simulations, with a varying ratio of DumbViewers, HerdViewers, and WiseViewers
+# Because the effect of these agents might also depend on the network structure, we will run our simulations on two different networks:
+# one with a small-world structure and one with a connected structure.
+
+for [r1, r2, r3] in permutations([0, 0.5, 1.0], 3):
+ for (generator, netparams) in {
+ "barabasi_albert_graph": {"m": 5},
+ "erdos_renyi_graph": {"p": 0.1},
+ }.items():
+ print(r1, r2, r3, generator)
+ # Create new simulation
+ netparams["n"] = 500
+ sim = Simulation(
+ model=NewsSpread,
+ model_params={
+ "ratio_dumb": r1,
+ "ratio_herd": r2,
+ "ratio_wise": r3,
+ "network_generator": generator,
+ "network_params": netparams,
+ "prob_neighbor_spread": 0,
+ },
+ num_trials=50,
+ max_steps=300,
+ dry_run=True,
+ )
+ # Run all the necessary instances
+ sim.run()
diff --git a/examples/programmatic/programmatic.py b/examples/programmatic/programmatic_sim.py
similarity index 71%
rename from examples/programmatic/programmatic.py
rename to examples/programmatic/programmatic_sim.py
index 9949117..d708e9b 100644
--- a/examples/programmatic/programmatic.py
+++ b/examples/programmatic/programmatic_sim.py
@@ -1,7 +1,7 @@
"""
Example of a fully programmatic simulation, without definition files.
"""
-from soil import Simulation, agents
+from soil import Simulation, Environment, agents
from networkx import Graph
import logging
@@ -25,23 +25,18 @@ class MyAgent(agents.FSM):
self.info("This runs 2/10 times on average")
+class ProgrammaticEnv(Environment):
+
+ def init(self):
+ self.create_network(generator=mygenerator)
+ self.populate_network(agent_class=MyAgent)
+ self.add_agent_reporter('times_run')
+
+
simulation = Simulation(
name="Programmatic",
- model_params={
- 'topology': {
- 'params': {
- 'generator': mygenerator
- },
- },
- 'agents': {
- 'distribution': [{
- 'agent_class': MyAgent,
- 'topology': True,
- }]
- }
- },
+ model=ProgrammaticEnv,
seed='Program',
- agent_reporters={'times_run': 'times_run'},
num_trials=1,
max_time=100,
dry_run=True,
diff --git a/examples/pubcrawl/pubcrawl.yml b/examples/pubcrawl/pubcrawl.yml
deleted file mode 100644
index 220b705..0000000
--- a/examples/pubcrawl/pubcrawl.yml
+++ /dev/null
@@ -1,26 +0,0 @@
----
-name: pubcrawl
-num_trials: 3
-max_steps: 10
-dump: false
-network_params:
- # Generate 100 empty nodes. They will be assigned a network agent
- generator: empty_graph
- n: 30
-network_agents:
- - agent_class: pubcrawl.Patron
- description: Extroverted patron
- state:
- openness: 1.0
- weight: 9
- - agent_class: pubcrawl.Patron
- description: Introverted patron
- state:
- openness: 0.1
- weight: 1
-environment_agents:
- - agent_class: pubcrawl.Police
-environment_class: pubcrawl.CityPubs
-environment_params:
- altercations: 0
- number_of_pubs: 3
diff --git a/examples/pubcrawl/pubcrawl.py b/examples/pubcrawl/pubcrawl_sim.py
similarity index 86%
rename from examples/pubcrawl/pubcrawl.py
rename to examples/pubcrawl/pubcrawl_sim.py
index c7921de..9e600e7 100644
--- a/examples/pubcrawl/pubcrawl.py
+++ b/examples/pubcrawl/pubcrawl_sim.py
@@ -1,6 +1,7 @@
from soil.agents import FSM, NetworkAgent, state, default_state
-from soil import Environment
+from soil import Environment, Simulation, parameters
from itertools import islice
+import networkx as nx
import logging
@@ -8,19 +9,23 @@ class CityPubs(Environment):
"""Environment with Pubs"""
level = logging.INFO
-
- def __init__(self, *args, number_of_pubs=3, pub_capacity=10, **kwargs):
- super(CityPubs, self).__init__(*args, **kwargs)
+ number_of_pubs: parameters.Integer = 3
+ ratio_extroverted: parameters.probability = 0.1
+ pub_capacity: parameters.Integer = 10
+
+ def init(self):
pubs = {}
- for i in range(number_of_pubs):
+ for i in range(self.number_of_pubs):
newpub = {
"name": "The awesome pub #{}".format(i),
"open": True,
- "capacity": pub_capacity,
+ "capacity": self.pub_capacity,
"occupancy": 0,
}
pubs[newpub["name"]] = newpub
+ self.add_agent(agent_class=Police, node_id=0)
self["pubs"] = pubs
+ self.populate_network([{"openness": 0.1}, {"openness": 1}], [self.ratio_extroverted, 1-self.ratio_extroverted], agent_class=Patron)
def enter(self, pub_id, *nodes):
"""Agents will try to enter. The pub checks if it is possible"""
@@ -169,7 +174,20 @@ class Police(FSM):
self.info("No trash to take out. Too bad.")
-if __name__ == "__main__":
- from soil import run_from_config
+sim = Simulation(
+ name="pubcrawl",
+ num_trials=3,
+ max_steps=10,
+ dry_run=True,
+ model_params=dict(
+ generator=nx.empty_graph,
+ network_params={"n": 30},
+ model=CityPubs,
+ altercations=0,
+ number_of_pubs=3,
+ )
+)
- run_from_config("pubcrawl.yml", dry_run=True, dump=None, parallel=False)
+
+if __name__ == "__main__":
+ sim.run(parallel=False)
\ No newline at end of file
diff --git a/examples/rabbits/basic/rabbits.yml b/examples/rabbits/basic/rabbits.yml
deleted file mode 100644
index a137844..0000000
--- a/examples/rabbits/basic/rabbits.yml
+++ /dev/null
@@ -1,42 +0,0 @@
----
-version: '2'
-name: rabbits_basic
-num_trials: 1
-seed: MySeed
-description: null
-group: null
-interval: 1.0
-max_time: 100
-model_class: rabbit_agents.RabbitEnv
-model_params:
- agents:
- topology: true
- distribution:
- - agent_class: rabbit_agents.Male
- weight: 1
- - agent_class: rabbit_agents.Female
- weight: 1
- fixed:
- - agent_class: rabbit_agents.RandomAccident
- topology: false
- hidden: true
- state:
- group: environment
- state:
- group: network
- mating_prob: 0.1
- prob_death: 0.001
- topology:
- fixed:
- directed: true
- links: []
- nodes:
- - id: 1
- - id: 0
- model_reporters:
- num_males: 'num_males'
- num_females: 'num_females'
- num_rabbits: |
- py:lambda env: env.num_males + env.num_females
-extra:
- visualization_params: {}
diff --git a/examples/rabbits/improved/rabbits.yml b/examples/rabbits/improved/rabbits.yml
deleted file mode 100644
index 204270c..0000000
--- a/examples/rabbits/improved/rabbits.yml
+++ /dev/null
@@ -1,42 +0,0 @@
----
-version: '2'
-name: rabbits_improved
-num_trials: 1
-seed: MySeed
-description: null
-group: null
-interval: 1.0
-max_time: 100
-model_class: rabbit_agents.RabbitEnv
-model_params:
- agents:
- topology: true
- distribution:
- - agent_class: rabbit_agents.Male
- weight: 1
- - agent_class: rabbit_agents.Female
- weight: 1
- fixed:
- - agent_class: rabbit_agents.RandomAccident
- topology: false
- hidden: true
- state:
- group: environment
- state:
- group: network
- mating_prob: 0.1
- prob_death: 0.001
- topology:
- fixed:
- directed: true
- links: []
- nodes:
- - id: 1
- - id: 0
- model_reporters:
- num_males: 'num_males'
- num_females: 'num_females'
- num_rabbits: |
- py:lambda env: env.num_males + env.num_females
-extra:
- visualization_params: {}
diff --git a/examples/rabbits/improved/rabbit_agents.py b/examples/rabbits/rabbit_improved_sim.py
similarity index 90%
rename from examples/rabbits/improved/rabbit_agents.py
rename to examples/rabbits/rabbit_improved_sim.py
index 0f45d9a..e47f616 100644
--- a/examples/rabbits/improved/rabbit_agents.py
+++ b/examples/rabbits/rabbit_improved_sim.py
@@ -1,23 +1,20 @@
-from soil import FSM, state, default_state, BaseAgent, NetworkAgent, Environment
+from soil import FSM, state, default_state, BaseAgent, NetworkAgent, Environment, Simulation
from soil.time import Delta
from enum import Enum
from collections import Counter
import logging
import math
+from rabbits_basic_sim import RabbitEnv
-class RabbitEnv(Environment):
- @property
- def num_rabbits(self):
- return self.count_agents(agent_class=Rabbit)
- @property
- def num_males(self):
- return self.count_agents(agent_class=Male)
-
- @property
- def num_females(self):
- return self.count_agents(agent_class=Female)
+class RabbitsImprovedEnv(RabbitEnv):
+ def init(self):
+ """Initialize the environment with the new versions of the agents"""
+ a1 = self.add_node(Male)
+ a2 = self.add_node(Female)
+ a1.add_edge(a2)
+ self.add_agent(RandomAccident)
class Rabbit(FSM, NetworkAgent):
@@ -150,8 +147,7 @@ class RandomAccident(BaseAgent):
self.debug("Rabbits alive: {}".format(rabbits_alive))
-if __name__ == "__main__":
- from soil import easy
+sim = Simulation(model=RabbitsImprovedEnv, max_time=100, seed="MySeed", num_trials=1)
- with easy("rabbits.yml") as sim:
- sim.run()
+if __name__ == "__main__":
+ sim.run()
diff --git a/examples/rabbits/basic/rabbit_agents.py b/examples/rabbits/rabbits_basic_sim.py
similarity index 91%
rename from examples/rabbits/basic/rabbit_agents.py
rename to examples/rabbits/rabbits_basic_sim.py
index 709508f..695a9ef 100644
--- a/examples/rabbits/basic/rabbit_agents.py
+++ b/examples/rabbits/rabbits_basic_sim.py
@@ -1,20 +1,29 @@
-from soil import FSM, state, default_state, BaseAgent, NetworkAgent, Environment
+from soil import FSM, state, default_state, BaseAgent, NetworkAgent, Environment, Simulation, report, parameters as params
from collections import Counter
import logging
import math
class RabbitEnv(Environment):
- prob_death = 1e-100
+ prob_death: params.probability = 1e-100
+ def init(self):
+ a1 = self.add_node(Male)
+ a2 = self.add_node(Female)
+ a1.add_edge(a2)
+ self.add_agent(RandomAccident)
+
+ @report
@property
def num_rabbits(self):
return self.count_agents(agent_class=Rabbit)
+ @report
@property
def num_males(self):
return self.count_agents(agent_class=Male)
+ @report
@property
def num_females(self):
return self.count_agents(agent_class=Female)
@@ -145,8 +154,8 @@ class RandomAccident(BaseAgent):
self.debug("Rabbits alive: {}".format(rabbits_alive))
-if __name__ == "__main__":
- from soil import easy
- with easy("rabbits.yml") as sim:
- sim.run()
+sim = Simulation(model=RabbitEnv, max_time=100, seed="MySeed", num_trials=1)
+
+if __name__ == "__main__":
+ sim.run()
\ No newline at end of file
diff --git a/examples/random_delays/random_delays.py b/examples/random_delays/random_delays_sim.py
similarity index 82%
rename from examples/random_delays/random_delays.py
rename to examples/random_delays/random_delays_sim.py
index e155b4e..d7b0382 100644
--- a/examples/random_delays/random_delays.py
+++ b/examples/random_delays/random_delays_sim.py
@@ -2,7 +2,7 @@
Example of setting a
Example of a fully programmatic simulation, without definition files.
"""
-from soil import Simulation, agents
+from soil import Simulation, agents, Environment
from soil.time import Delta
@@ -29,11 +29,15 @@ class MyAgent(agents.FSM):
return None, Delta(self.random.expovariate(1 / 16))
+class RandomEnv(Environment):
+
+ def init(self):
+ self.add_agent(agent_class=MyAgent)
+
+
s = Simulation(
name="Programmatic",
- model_params={
- 'agents': [{'agent_class': MyAgent}],
- },
+ model=RandomEnv,
num_trials=1,
max_time=100,
dry_run=True,
diff --git a/examples/template.yml b/examples/template.yml
deleted file mode 100644
index 2b1f2b7..0000000
--- a/examples/template.yml
+++ /dev/null
@@ -1,30 +0,0 @@
----
-sampler:
- method: "SALib.sample.morris.sample"
- N: 10
-template:
- group: simple
- num_trials: 1
- interval: 1
- max_steps: 2
- seed: "CompleteSeed!"
- dump: false
- model_params:
- network_params:
- generator: complete_graph
- n: 10
- network_agents:
- - agent_class: CounterModel
- weight: "{{ x1 }}"
- state:
- state_id: 0
- - agent_class: AggregatedCounter
- weight: "{{ 1 - x1 }}"
- name: "{{ x3 }}"
- skip_test: true
-vars:
- bounds:
- x1: [0, 1]
- x2: [1, 2]
- fixed:
- x3: ["a", "b", "c"]
diff --git a/examples/terrorism/TerroristNetworkModel.yml b/examples/terrorism/TerroristNetworkModel.yml
deleted file mode 100644
index f709766..0000000
--- a/examples/terrorism/TerroristNetworkModel.yml
+++ /dev/null
@@ -1,62 +0,0 @@
-name: TerroristNetworkModel_sim
-max_steps: 150
-num_trials: 1
-model_params:
- network_params:
- generator: random_geometric_graph
- radius: 0.2
- # generator: geographical_threshold_graph
- # theta: 20
- n: 100
- network_agents:
- - agent_class: TerroristNetworkModel.TerroristNetworkModel
- weight: 0.8
- state:
- id: civilian # Civilians
- - agent_class: TerroristNetworkModel.TerroristNetworkModel
- weight: 0.1
- state:
- id: leader # Leaders
- - agent_class: TerroristNetworkModel.TrainingAreaModel
- weight: 0.05
- state:
- id: terrorist # Terrorism
- - agent_class: TerroristNetworkModel.HavenModel
- weight: 0.05
- state:
- id: civilian # Civilian
-
- # TerroristSpreadModel
- information_spread_intensity: 0.7
- terrorist_additional_influence: 0.035
- max_vulnerability: 0.7
- prob_interaction: 0.5
-
- # TrainingAreaModel and HavenModel
- training_influence: 0.20
- haven_influence: 0.20
-
- # TerroristNetworkModel
- vision_range: 0.30
- sphere_influence: 2
- weight_social_distance: 0.035
- weight_link_distance: 0.035
-
-visualization_params:
- # Icons downloaded from https://www.iconfinder.com/
- shape_property: agent
- shapes:
- TrainingAreaModel: target
- HavenModel: home
- TerroristNetworkModel: person
- colors:
- - attr_id: civilian
- color: '#40de40'
- - attr_id: terrorist
- color: red
- - attr_id: leader
- color: '#c16a6a'
- background_image: 'map_4800x2860.jpg'
- background_opacity: '0.9'
- background_filter_color: 'blue'
-skip_test: true # This simulation takes too long for automated tests.
diff --git a/examples/terrorism/TerroristNetworkModel.py b/examples/terrorism/TerroristNetworkModel_sim.py
similarity index 78%
rename from examples/terrorism/TerroristNetworkModel.py
rename to examples/terrorism/TerroristNetworkModel_sim.py
index 9b7106e..149128a 100644
--- a/examples/terrorism/TerroristNetworkModel.py
+++ b/examples/terrorism/TerroristNetworkModel_sim.py
@@ -1,6 +1,43 @@
import networkx as nx
-from soil.agents import Geo, NetworkAgent, FSM, state, default_state
-from soil import Environment
+from soil.agents import Geo, NetworkAgent, FSM, custom, state, default_state
+from soil import Environment, Simulation
+from soil.parameters import *
+
+
+class TerroristEnvironment(Environment):
+ generator: function = nx.random_geometric_graph
+ n: Integer = 100
+ radius: Float = 0.2
+
+ information_spread_intensity: probability = 0.7
+ terrorist_additional_influence: probability = 0.03
+ terrorist_additional_influence: probability = 0.035
+ max_vulnerability: probability = 0.7
+ prob_interaction: probability = 0.5
+
+ # TrainingAreaModel and HavenModel
+ training_influence: probability = 0.20
+ haven_influence: probability = 0.20
+
+ # TerroristNetworkModel
+ vision_range: Float = 0.30
+ sphere_influence: Integer = 2
+ weight_social_distance: Float = 0.035
+ weight_link_distance: Float = 0.035
+
+ ratio_civil: probability = 0.8
+ ratio_leader: probability = 0.1
+ ratio_training: probability = 0.05
+ ratio_haven: probability = 0.05
+
+ def init(self):
+ self.create_network(generator=self.generator, n=self.n, radius=self.radius)
+ self.populate_network([
+ TerroristNetworkModel.w(state_id='civilian'),
+ TerroristNetworkModel.w(state_id='leader'),
+ TrainingAreaModel,
+ HavenModel
+ ], [self.ratio_civil, self.ratio_leader, self.ratio_trainig, self.ratio_heaven])
class TerroristSpreadModel(FSM, Geo):
@@ -17,36 +54,21 @@ class TerroristSpreadModel(FSM, Geo):
prob_interaction
"""
- def __init__(self, model=None, unique_id=0, state=()):
- super().__init__(model=model, unique_id=unique_id, state=state)
-
- self.information_spread_intensity = model.environment_params[
- "information_spread_intensity"
- ]
- self.terrorist_additional_influence = model.environment_params[
- "terrorist_additional_influence"
- ]
- self.prob_interaction = model.environment_params["prob_interaction"]
-
- if self["id"] == self.civilian.id: # Civilian
- self.mean_belief = self.random.uniform(0.00, 0.5)
- elif self["id"] == self.terrorist.id: # Terrorist
+ def init(self):
+ if self.state_id == self.civilian.id: # Civilian
+ self.mean_belief = self.model.random.uniform(0.00, 0.5)
+ elif self.state_id == self.terrorist.id: # Terrorist
self.mean_belief = self.random.uniform(0.8, 1.00)
- elif self["id"] == self.leader.id: # Leader
+ elif self.state_id == self.leader.id: # Leader
self.mean_belief = 1.00
else:
raise Exception("Invalid state id: {}".format(self["id"]))
- if "min_vulnerability" in model.environment_params:
- self.vulnerability = self.random.uniform(
- model.environment_params["min_vulnerability"],
- model.environment_params["max_vulnerability"],
- )
- else:
- self.vulnerability = self.random.uniform(
- 0, model.environment_params["max_vulnerability"]
- )
+ self.vulnerability = self.random.uniform(
+ self.get("min_vulnerability", 0), self.get("max_vulnerability", 1)
+ )
+ @default_state
@state
def civilian(self):
neighbours = list(self.get_neighbors(agent_class=TerroristSpreadModel))
@@ -287,3 +309,32 @@ class TerroristNetworkModel(TerroristSpreadModel):
return nx.shortest_path_length(self.G, self.id, target)
except nx.NetworkXNoPath:
return float("inf")
+
+
+sim = Simulation(
+ model=TerroristEnvironment,
+ num_trials=1,
+ name="TerroristNetworkModel_sim",
+ max_steps=150,
+ skip_test=True,
+ dry_run=True,
+)
+
+# TODO: integrate visualization
+# visualization_params:
+# # Icons downloaded from https://www.iconfinder.com/
+# shape_property: agent
+# shapes:
+# TrainingAreaModel: target
+# HavenModel: home
+# TerroristNetworkModel: person
+# colors:
+# - attr_id: civilian
+# color: '#40de40'
+# - attr_id: terrorist
+# color: red
+# - attr_id: leader
+# color: '#c16a6a'
+# background_image: 'map_4800x2860.jpg'
+# background_opacity: '0.9'
+# background_filter_color: 'blue'
\ No newline at end of file
diff --git a/examples/torvalds.yml b/examples/torvalds.yml
deleted file mode 100644
index 3073d8c..0000000
--- a/examples/torvalds.yml
+++ /dev/null
@@ -1,15 +0,0 @@
----
-name: torvalds_example
-max_steps: 10
-interval: 2
-model_params:
- agent_class: CounterModel
- default_state:
- skill_level: 'beginner'
- network_params:
- path: 'torvalds.edgelist'
- states:
- Torvalds:
- skill_level: 'God'
- balkian:
- skill_level: 'developer'
diff --git a/examples/torvalds_sim.py b/examples/torvalds_sim.py
new file mode 100644
index 0000000..90e001c
--- /dev/null
+++ b/examples/torvalds_sim.py
@@ -0,0 +1,16 @@
+from soil import Environment, Simulation, CounterModel
+
+class TorvaldsEnv(Environment):
+
+ def init(self):
+ self.create_network(path='torvalds.edgelist')
+ self.populate_network(CounterModel, skill_level='beginner')
+ print("Agentes: ", list(self.network_agents))
+ self.find_one(node_id="Torvalds").skill_level = 'God'
+ self.find_one(node_id="balkian").skill_level = 'developer'
+
+
+sim = Simulation(name='torvalds_example',
+ max_steps=10,
+ interval=2,
+ model=TorvaldsEnv)
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 834b156..1791f18 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,6 +5,8 @@ pyyaml>=5.1
pandas>=1
SALib>=1.3
Jinja2
-Mesa>=1.1
+Mesa>=1.2
pydantic>=1.9
sqlalchemy>=1.4
+typing-extensions>=4.4
+annotated-types>=0.4
\ No newline at end of file
diff --git a/soil/__init__.py b/soil/__init__.py
index eb9c232..a04582a 100644
--- a/soil/__init__.py
+++ b/soil/__init__.py
@@ -24,6 +24,7 @@ from .datacollection import SoilCollector
from . import serialization
from .utils import logger
from .time import *
+from .decorators import *
def main(
@@ -184,7 +185,7 @@ def main(
return
sims = list(
- simulation.iter_from_config(
+ simulation.iter_from_file(
args.file,
dry_run=args.dry_run,
exporters=exporters,
diff --git a/soil/agents/CounterModel.py b/soil/agents/CounterModel.py
index 6cd41fb..96bbfd3 100644
--- a/soil/agents/CounterModel.py
+++ b/soil/agents/CounterModel.py
@@ -1,6 +1,12 @@
-from . import NetworkAgent
+from . import BaseAgent, NetworkAgent
+class Ticker(BaseAgent):
+ times = 0
+
+ def step(self):
+ self.times += 1
+
class CounterModel(NetworkAgent):
"""
Dummy behaviour. It counts the number of nodes in the network and neighbors
diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py
index f21ce98..1904f3c 100644
--- a/soil/agents/__init__.py
+++ b/soil/agents/__init__.py
@@ -14,10 +14,10 @@ import networkx as nx
from typing import Any
-from mesa import Agent as MesaAgent
+from mesa import Agent as MesaAgent, Model
from typing import Dict, List
-from .. import serialization, utils, time, config
+from .. import serialization, network, utils, time, config
IGNORED_FIELDS = ("model", "logger")
@@ -123,10 +123,18 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
def prob(self, probability):
return prob(probability, self.model.random)
+ @classmethod
+ def w(cls, **kwargs):
+ return custom(cls, **kwargs)
+
# TODO: refactor to clean up mesa compatibility
@property
def id(self):
return self.unique_id
+
+ @id.setter
+ def id(self, value):
+ self.unique_id = value
@classmethod
def from_dict(cls, model, attrs, warn_extra=True):
@@ -175,7 +183,11 @@ class BaseAgent(MesaAgent, MutableMapping, metaclass=MetaAgent):
return it
def get(self, key, default=None):
- return self[key] if key in self else default
+ if key in self:
+ return self[key]
+ elif key in self.model:
+ return self.model[key]
+ return default
@property
def now(self):
@@ -621,12 +633,16 @@ def _from_distro(
from .network_agents import *
from .fsm import *
from .evented import *
+from typing import Optional
class Agent(NetworkAgent, FSM, EventedAgent):
"""Default agent class, has both network and event capabilities"""
+from ..environment import NetworkEnvironment
+
+
from .BassModel import *
from .IndependentCascadeModel import *
from .SISaModel import *
@@ -640,3 +656,8 @@ except ImportError:
import sys
print("Could not load the Geo Agent, scipy is not installed", file=sys.stderr)
+
+
+def custom(cls, **kwargs):
+ """Create a new class from a template class and keyword arguments"""
+ return type(cls.__name__, (cls,), kwargs)
\ No newline at end of file
diff --git a/soil/agents/network_agents.py b/soil/agents/network_agents.py
index 507be40..fb0e58c 100644
--- a/soil/agents/network_agents.py
+++ b/soil/agents/network_agents.py
@@ -38,8 +38,9 @@ class NetworkAgent(BaseAgent):
if limit_neighbors:
neighbor_ids = set()
for node_id in self.G.neighbors(self.node_id):
- if self.G.nodes[node_id].get("agent") is not None:
- neighbor_ids.add(node_id)
+ agent = self.G.nodes[node_id].get("agent")
+ if agent is not None:
+ neighbor_ids.add(agent.id)
if unique_ids:
unique_ids = unique_ids & neighbor_ids
else:
diff --git a/soil/decorators.py b/soil/decorators.py
new file mode 100644
index 0000000..28811c4
--- /dev/null
+++ b/soil/decorators.py
@@ -0,0 +1,4 @@
+def report(f: property):
+ print(f.fget)
+ setattr(f.fget, "add_to_report", True)
+ return f
\ No newline at end of file
diff --git a/soil/environment.py b/soil/environment.py
index 6e622bf..0dd9f2a 100644
--- a/soil/environment.py
+++ b/soil/environment.py
@@ -6,20 +6,22 @@ import math
import logging
import inspect
-from typing import Any, Dict, Optional, Union, List
+from typing import Any, Callable, Dict, Optional, Union, List, Type
from collections import namedtuple
from time import time as current_time
from copy import deepcopy
-from networkx.readwrite import json_graph
import networkx as nx
-from mesa import Model
+from mesa import Model, Agent
-from . import agents as agentmod, config, datacollection, serialization, utils, time, network, events
+from . import agents as agentmod, datacollection, serialization, utils, time, network, events
+# TODO: add metaclass to read attributes of a model
+# TODO: read "report" attributes from the model
+
class BaseEnvironment(Model):
"""
The environment is key in a simulation. It controls how agents interact,
@@ -33,29 +35,35 @@ class BaseEnvironment(Model):
:meth:`soil.environment.Environment.get` method.
"""
+ def __new__(cls, *args: Any, seed="default", dir_path=None, **kwargs: Any) -> Any:
+ """Create a new model with a default seed value"""
+ self = super().__new__(cls, *args, seed=seed, **kwargs)
+ self.dir_path = dir_path or os.getcwd()
+ return self
+
def __init__(
self,
+ *,
id="unnamed_env",
seed="default",
- schedule_class=time.TimedActivation,
dir_path=None,
+ schedule_class=time.TimedActivation,
interval=1,
- agent_class=None,
- agents: List[tuple[type, Dict[str, Any]]] = {},
+ agents: Optional[Dict] = None,
collector_class: type = datacollection.SoilCollector,
agent_reporters: Optional[Any] = None,
model_reporters: Optional[Any] = None,
tables: Optional[Any] = None,
+ init: bool = True,
**env_params,
):
- super().__init__(seed=seed)
+ super().__init__()
self.current_id = -1
self.id = id
- self.dir_path = dir_path or os.getcwd()
if schedule_class is None:
schedule_class = time.TimedActivation
@@ -63,10 +71,7 @@ class BaseEnvironment(Model):
schedule_class = serialization.deserialize(schedule_class)
self.schedule = schedule_class(self)
- self.agent_class = agent_class or agentmod.BaseAgent
-
self.interval = interval
- self.init_agents(agents)
self.logger = utils.logger.getChild(self.id)
@@ -79,53 +84,13 @@ class BaseEnvironment(Model):
for (k, v) in env_params.items():
self[k] = v
- def _agent_from_dict(self, agent):
- """
- Translate an agent dictionary into an agent
- """
- agent = dict(**agent)
- cls = agent.pop("agent_class", None) or self.agent_class
- unique_id = agent.pop("unique_id", None)
- if unique_id is None:
- unique_id = self.next_id()
+ if agents:
+ self.add_agents(**agents)
+ if init:
+ self.init()
- return serialization.deserialize(cls)(unique_id=unique_id, model=self, **agent)
-
- def init_agents(self, agents: Union[config.AgentConfig, List[Dict[str, Any]]] = {}):
- """
- Initialize the agents in the model from either a `soil.config.AgentConfig` or a list of
- dictionaries that each describes an agent.
-
- If given a list of dictionaries, an agent will be created for each dictionary. The agent
- class can be specified through the `agent_class` key. The rest of the items will be used
- as parameters to the agent.
- """
- if not agents:
- return
-
- lst = agents
- override = []
- if not isinstance(lst, list):
- if not isinstance(agents, config.AgentConfig):
- lst = config.AgentConfig(**agents)
- if lst.override:
- override = lst.override
- lst = self._agent_dict_from_config(lst)
-
- # TODO: check override is working again. It cannot (easily) be part of agents.from_config anymore,
- # because it needs attribute such as unique_id, which are only present after init
- new_agents = [self._agent_from_dict(agent) for agent in lst]
-
- for a in new_agents:
- self.schedule.add(a)
-
- for rule in override:
- for agent in agentmod.filter_agents(self.schedule._agents, **rule.filter):
- for attr, value in rule.state.items():
- setattr(agent, attr, value)
-
- def _agent_dict_from_config(self, cfg):
- return agentmod.from_config(cfg, random=self.random)
+ def init(self):
+ pass
@property
def agents(self):
@@ -145,16 +110,29 @@ class BaseEnvironment(Model):
"The environment has not been scheduled, so it has no sense of time"
)
- def add_agent(self, unique_id=None, **kwargs):
+ def add_agent(self, agent_class, unique_id=None, **agent):
if unique_id is None:
unique_id = self.next_id()
- kwargs["unique_id"] = unique_id
- a = self._agent_from_dict(kwargs)
+ agent["unique_id"] = unique_id
+
+ agent = dict(**agent)
+ unique_id = agent.pop("unique_id", None)
+ if unique_id is None:
+ unique_id = self.next_id()
+
+ a = serialization.deserialize(agent_class)(unique_id=unique_id, model=self, **agent)
self.schedule.add(a)
return a
+ def add_agents(self, agent_classes: List[type], k, weights: Optional[List[float]] = None, **kwargs):
+ if weights is None:
+ weights = [1] * len(agent_classes)
+
+ for cls in self.random.choices(agent_classes, weights=weights, k=k):
+ self.add_agent(agent_class=cls, **kwargs)
+
def log(self, message, *args, level=logging.INFO, **kwargs):
if not self.logger.isEnabledFor(level):
return
@@ -215,61 +193,58 @@ class NetworkEnvironment(BaseEnvironment):
"""
def __init__(
- self, *args, topology: Union[config.NetConfig, nx.Graph] = None, **kwargs
+ self, *args,
+ topology: Optional[Union[nx.Graph, str]] = None,
+ agent_class: Optional[Type[agentmod.Agent]] = None,
+ network_generator: Optional[Callable] = None,
+ network_params: Optional[Dict] = None, **kwargs
):
- agents = kwargs.pop("agents", None)
- super().__init__(*args, agents=None, **kwargs)
+ self.topology = topology
+ self.network_generator = network_generator
+ self.network_params = network_params
+ if topology or network_params or network_generator:
+ self.create_network(topology, network_params=network_params, network_generator=network_generator)
+ else:
+ self.G = nx.Graph()
+ super().__init__(*args, **kwargs, init=False)
- if topology is None:
- topology = nx.Graph()
- elif not isinstance(topology, nx.Graph):
- topology = network.from_config(topology, dir_path=self.dir_path)
+ self.agent_class = agent_class
+ if agent_class:
+ self.agent_class = serialization.deserialize(agent_class)
+ self.init()
+ if self.agent_class:
+ self.populate_network(self.agent_class)
+
+ def add_agents(self, *args, k=None, **kwargs):
+ if not k and not self.G:
+ raise ValueError("Cannot add agents to an empty network")
+ super().add_agents(*args, k=k or len(self.G), **kwargs)
+
+ def create_network(self, topology=None, network_generator=None, path=None, network_params=None):
+ if topology is not None:
+ topology = network.from_topology(topology, dir_path=self.dir_path)
+ elif path is not None:
+ topology = network.from_topology(path, dir_path=self.dir_path)
+ elif network_generator is not None:
+ topology = network.from_params(network_generator, dir_path=self.dir_path, **network_params)
+ else:
+ raise ValueError("topology must be a networkx.Graph or a string, or network_generator must be provided")
self.G = topology
- self.init_agents(agents)
-
def init_agents(self, *args, **kwargs):
"""Initialize the agents from a"""
super().init_agents(*args, **kwargs)
for agent in self.schedule._agents.values():
- self._init_node(agent)
+ self._assign_node(agent)
- def _init_node(self, agent):
+ def _assign_node(self, agent):
"""
Make sure the node for a given agent has the proper attributes.
"""
if hasattr(agent, "node_id"):
self.G.nodes[agent.node_id]["agent"] = agent
- def _agent_dict_from_config(self, cfg):
- return agentmod.from_config(cfg, topology=self.G, random=self.random)
-
- def _agent_from_dict(self, agent, unique_id=None):
- agent = dict(agent)
-
- if not agent.get("topology", False):
- return super()._agent_from_dict(agent)
-
- if unique_id is None:
- unique_id = self.next_id()
- node_id = agent.get("node_id", None)
- if node_id is None:
- node_id = network.find_unassigned(self.G, random=self.random)
- self.G.nodes[node_id]["agent"] = None
- agent["node_id"] = node_id
- agent["unique_id"] = unique_id
- agent["topology"] = self.G
- node_attrs = self.G.nodes[node_id]
- node_attrs.pop('agent', None)
- node_attrs.update(agent)
- agent = node_attrs
-
- a = super()._agent_from_dict(agent)
- self._init_node(a)
-
- return a
-
@property
def network_agents(self):
for a in self.schedule._agents.values():
@@ -302,24 +277,37 @@ class NetworkEnvironment(BaseEnvironment):
a["visible"] = True
return a
- def add_agent(self, *args, **kwargs):
- a = super().add_agent(*args, **kwargs)
+ def add_agent(self, agent_class, *args, **kwargs):
+ if issubclass(agent_class, agentmod.NetworkAgent) and "node_id" not in kwargs:
+ return self.add_node(agent_class, *args, **kwargs)
+ a = super().add_agent(agent_class, *args, **kwargs)
if hasattr(a, "node_id"):
- assert self.G.nodes[a.node_id]["agent"] == a
+ assigned = self.G.nodes[a.node_id].get("agent")
+ if not assigned:
+ self.G.nodes[a.node_id]["agent"] = a
+ elif assigned != a:
+ raise ValueError(f"Node {a.node_id} already has an agent assigned: {assigned}")
return a
def agent_for_node_id(self, node_id):
return self.G.nodes[node_id].get("agent")
- def populate_network(self, agent_class, weights=None, **agent_params):
- if not hasattr(agent_class, "len"):
+ def populate_network(self, agent_class: List[Model], weights: List[float] = None, **agent_params):
+ if isinstance(agent_class, type):
agent_class = [agent_class]
- weights = None
- for (node_id, node) in self.G.nodes(data=True):
+ else:
+ agent_class = list(agent_class)
+ if not weights:
+ weights = [1] * len(agent_class)
+ assert len(self.G)
+ classes = self.random.choices(agent_class, weights, k=len(self.G))
+ for (cls, (node_id, node)) in zip(classes, self.G.nodes(data=True)):
if "agent" in node:
continue
- a_class = self.random.choices(agent_class, weights)[0]
- self.add_agent(node_id=node_id, topology=self.G, agent_class=a_class, **agent_params)
+ a = self.add_agent(node_id=node_id, topology=self.G, agent_class=cls, **agent_params)
+ node["agent"] = a
+ assert all("agent" in node for (_, node) in self.G.nodes(data=True))
+ assert len(list(self.network_agents))
class EventedEnvironment(BaseEnvironment):
diff --git a/soil/network.py b/soil/network.py
index c792755..6fac221 100644
--- a/soil/network.py
+++ b/soil/network.py
@@ -10,47 +10,47 @@ import networkx as nx
from . import config, serialization, basestring
-def from_config(cfg: config.NetConfig, dir_path: str = None):
- if not isinstance(cfg, config.NetConfig):
- cfg = config.NetConfig(**cfg)
+def from_topology(topology, dir_path: str = None):
+ if topology is None:
+ return nx.Graph()
+ if isinstance(topology, nx.Graph):
+ return topology
- if cfg.path:
- path = cfg.path
- if dir_path and not os.path.isabs(path):
- path = os.path.join(dir_path, path)
- extension = os.path.splitext(path)[1][1:]
- kwargs = {}
- if extension == "gexf":
- kwargs["version"] = "1.2draft"
- kwargs["node_type"] = int
+ # If it's a dict, assume it's a node-link graph
+ if isinstance(topology, dict):
try:
- method = getattr(nx.readwrite, "read_" + extension)
- except AttributeError:
- raise AttributeError("Unknown format")
- return method(path, **kwargs)
+ return nx.json_graph.node_link_graph(topology)
+ except Exception as ex:
+ raise ValueError("Unknown topology format")
+
+ # Otherwise, treat like a path
+ path = topology
+ if dir_path and not os.path.isabs(path):
+ path = os.path.join(dir_path, path)
+ extension = os.path.splitext(path)[1][1:]
+ kwargs = {}
+ if extension == "gexf":
+ kwargs["version"] = "1.2draft"
+ kwargs["node_type"] = int
+ try:
+ method = getattr(nx.readwrite, "read_" + extension)
+ except AttributeError:
+ raise AttributeError("Unknown format")
+ return method(path, **kwargs)
- if cfg.params:
- net_args = dict(cfg.params)
- net_gen = net_args.pop("generator")
- if dir_path not in sys.path:
- sys.path.append(dir_path)
+def from_params(generator, dir_path: str = None, **params):
- method = serialization.deserializer(
- net_gen,
- known_modules=[
- "networkx.generators",
- ],
- )
- return method(**net_args)
+ if dir_path not in sys.path:
+ sys.path.append(dir_path)
- if isinstance(cfg.fixed, config.Topology):
- cfg = cfg.fixed.dict()
-
- if isinstance(cfg, str) or isinstance(cfg, dict):
- return nx.json_graph.node_link_graph(cfg)
-
- return nx.Graph()
+ method = serialization.deserializer(
+ generator,
+ known_modules=[
+ "networkx.generators",
+ ],
+ )
+ return method(**params)
def find_unassigned(G, shuffle=False, random=random):
diff --git a/soil/parameters.py b/soil/parameters.py
new file mode 100644
index 0000000..fddbb17
--- /dev/null
+++ b/soil/parameters.py
@@ -0,0 +1,32 @@
+from __future__ import annotations
+
+from typing_extensions import Annotated
+import annotated_types
+from typing import *
+
+from dataclasses import dataclass
+
+class Parameter:
+ pass
+
+
+def floatrange(
+ *,
+ gt: Optional[float] = None,
+ ge: Optional[float] = None,
+ lt: Optional[float] = None,
+ le: Optional[float] = None,
+ multiple_of: Optional[float] = None,
+) -> type[float]:
+ return Annotated[
+ float,
+ annotated_types.Interval(gt=gt, ge=ge, lt=lt, le=le),
+ annotated_types.MultipleOf(multiple_of) if multiple_of is not None else None,
+ ]
+
+function = Annotated[Callable, Parameter]
+Integer = Annotated[int, Parameter]
+Float = Annotated[float, Parameter]
+
+
+probability = floatrange(ge=0, le=1)
\ No newline at end of file
diff --git a/soil/simulation.py b/soil/simulation.py
index 451ec88..06fc92c 100644
--- a/soil/simulation.py
+++ b/soil/simulation.py
@@ -16,6 +16,7 @@ from typing import Any, Dict, Union, Optional, List
from networkx.readwrite import json_graph
from functools import partial
+from contextlib import contextmanager
import pickle
from . import serialization, exporters, utils, basestring, agents
@@ -23,6 +24,16 @@ from .environment import Environment
from .utils import logger, run_and_return_exceptions
from .config import Config, convert_old
+_AVOID_RUNNING = False
+_QUEUED = []
+
+@contextmanager
+def do_not_run():
+ global _AVOID_RUNNING
+ _AVOID_RUNNING = True
+ yield
+ _AVOID_RUNNING = False
+
# TODO: change documentation for simulation
@dataclass
@@ -40,7 +51,7 @@ class Simulation:
name: str = "Unnamed simulation"
description: Optional[str] = ""
group: str = None
- model_class: Union[str, type] = "soil.Environment"
+ model: Union[str, type] = "soil.Environment"
model_params: dict = field(default_factory=dict)
seed: str = field(default_factory=lambda: current_time())
dir_path: str = field(default_factory=lambda: os.getcwd())
@@ -49,7 +60,6 @@ class Simulation:
interval: int = 1
num_trials: int = 1
num_processes: Optional[int] = 1
- parallel: Optional[bool] = False
exporters: Optional[List[str]] = field(default_factory=lambda: [exporters.default])
model_reporters: Optional[Dict[str, Any]] = field(default_factory=dict)
agent_reporters: Optional[Dict[str, Any]] = field(default_factory=dict)
@@ -90,6 +100,9 @@ class Simulation:
)
+ self.to_yaml()
)
+ if _AVOID_RUNNING:
+ _QUEUED.append((self, args, kwargs))
+ return list()
return list(self.run_gen(*args, **kwargs))
def run_gen(
@@ -170,7 +183,7 @@ class Simulation:
tables = self.tables.copy()
tables.update(deserialize_reporters(params.pop("tables", {})))
- env = serialization.deserialize(self.model_class)
+ env = serialization.deserialize(self.model)
return env(
id=f"{self.name}_trial_{trial_id}",
seed=f"{self.seed}_trial_{trial_id}",
@@ -250,6 +263,14 @@ Model stats:
return yaml.dump(self.to_dict())
+def iter_from_file(*files, **kwargs):
+ for f in files:
+ try:
+ yield from iter_from_py(f, **kwargs)
+ except ValueError as ex:
+ yield from iter_from_config(f, **kwargs)
+
+
def iter_from_config(*cfgs, **kwargs):
for config in cfgs:
configs = list(serialization.load_config(config))
@@ -266,18 +287,38 @@ def from_config(conf_or_path):
raise AttributeError("Provide only one configuration")
return lst[0]
-def iter_from_py(pyfile, module_name='custom_simulation'):
+
+def iter_from_py(pyfile, module_name='custom_simulation', **kwargs):
"""Try to load every Simulation instance in a given Python file"""
import importlib
import inspect
- spec = importlib.util.spec_from_file_location(module_name, pyfile)
- module = importlib.util.module_from_spec(spec)
- sys.modules[module_name] = module
- spec.loader.exec_module(module)
- # import pdb;pdb.set_trace()
- for (_name, sim) in inspect.getmembers(module, lambda x: isinstance(x, Simulation)):
- yield sim
- del sys.modules[module_name]
+ added = False
+ with do_not_run():
+ spec = importlib.util.spec_from_file_location(module_name, pyfile)
+ folder = os.path.dirname(pyfile)
+ if folder not in sys.path:
+ added = True
+ sys.path.append(folder)
+ if not spec:
+ raise ValueError(f"{pyfile} does not seem to be a Python module")
+ module = importlib.util.module_from_spec(spec)
+ sys.modules[module_name] = module
+ spec.loader.exec_module(module)
+ # import pdb;pdb.set_trace()
+ loaded = False
+ sims = []
+ for (_name, sim) in inspect.getmembers(module, lambda x: isinstance(x, Simulation)):
+ loaded = True
+ sims.append(sim)
+ for (_name, sim) in inspect.getmembers(module, lambda x: inspect.isclass(x) and issubclass(x, Simulation)):
+ loaded = True
+ sims.append(sim(**kwargs))
+ if not loaded:
+ raise AttributeError(f"No valid configurations found in {pyfile}")
+ del sys.modules[module_name]
+ if added:
+ sys.path.remove(folder)
+ yield from sims
def from_py(pyfile):
@@ -285,7 +326,7 @@ def from_py(pyfile):
-def run_from_config(*configs, **kwargs):
- for sim in iter_from_config(*configs):
+def run_from_file(*files, **kwargs):
+ for sim in iter_from_file(*files):
logger.info(f"Using config(s): {sim.name}")
sim.run_simulation(**kwargs)
diff --git a/soil/visualization.py b/soil/visualization.py
deleted file mode 100644
index a1cb7b8..0000000
--- a/soil/visualization.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from mesa.visualization.UserParam import UserSettableParameter
-
-
-class UserSettableParameter(UserSettableParameter):
- def __str__(self):
- return self.value
diff --git a/tests/test_agents.py b/tests/test_agents.py
index 76606cf..36b01ed 100644
--- a/tests/test_agents.py
+++ b/tests/test_agents.py
@@ -106,7 +106,7 @@ class TestAgents(TestCase):
"""
# There are two agents, they try to send pings
- # This is arguably a very contrived example. In practice, the or
+ # This is arguably a very contrived example.
# There should be a delay of one step between agent 0 and 1
# On the first step:
# Agent 0 sends a PING, but blocks before a PONG
diff --git a/tests/test_config.py b/tests/test_config.py
index 8fb0a83..413b737 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -1,4 +1,4 @@
-from unittest import TestCase
+from unittest import TestCase, skip
import os
import yaml
import copy
@@ -23,6 +23,7 @@ def isequal(a, b):
assert a == b
+@skip("new versions of soil do not rely on configuration files")
class TestConfig(TestCase):
def test_conversion(self):
expected = serialization.load_file(join(ROOT, "complete_converted.yml"))[0]
@@ -59,16 +60,16 @@ class TestConfig(TestCase):
"""
cfg = {
"name": "CounterAgent",
- "network_params": {"path": join(ROOT, "test.gexf")},
- "agent_class": "CounterModel",
+ "model_params": {
+ "topology": join(ROOT, "test.gexf"),
+ "agent_class": "CounterModel",
+ },
# 'states': [{'times': 10}, {'times': 20}],
"max_time": 2,
"dry_run": True,
"num_trials": 1,
- "environment_params": {},
}
- conf = config.convert_old(cfg)
- s = simulation.from_config(conf)
+ s = simulation.from_config(cfg)
env = s.get_env()
assert len(env.G.nodes) == 2
diff --git a/tests/test_examples.py b/tests/test_examples.py
index 2479531..8998b95 100644
--- a/tests/test_examples.py
+++ b/tests/test_examples.py
@@ -3,7 +3,7 @@ import os
from os.path import join
from glob import glob
-from soil import simulation, config
+from soil import simulation, config, do_not_run
ROOT = os.path.abspath(os.path.dirname(__file__))
EXAMPLES = join(ROOT, "..", "examples")
@@ -12,6 +12,7 @@ FORCE_TESTS = os.environ.get("FORCE_TESTS", "")
class TestExamples(TestCase):
+ """Empty class that will be populated with auto-discovery tests for every example"""
pass
@@ -45,7 +46,7 @@ def add_example_tests():
continue
for sim in simulation.iter_from_config(path):
sim_paths.append((sim, path))
- for path in glob(join(EXAMPLES, '**', '*.py')):
+ for path in glob(join(EXAMPLES, '**', '*_sim.py')):
for sim in simulation.iter_from_py(path):
sim_paths.append((sim, path))
diff --git a/tests/test_exporters.py b/tests/test_exporters.py
index 1b1b072..3e7975b 100644
--- a/tests/test_exporters.py
+++ b/tests/test_exporters.py
@@ -6,6 +6,7 @@ import sqlite3
from unittest import TestCase
from soil import exporters
+from soil import environment
from soil import simulation
from soil import agents
@@ -38,15 +39,14 @@ class Exporters(TestCase):
def test_basic(self):
# We need to add at least one agent to make sure the scheduler
# ticks every step
+ class SimpleEnv(environment.Environment):
+ def init(self):
+ self.add_agent(agent_class=agents.BaseAgent)
+
+
num_trials = 5
max_time = 2
- config = {
- "name": "exporter_sim",
- "model_params": {"agents": [{"agent_class": agents.BaseAgent}]},
- "max_time": max_time,
- "num_trials": num_trials,
- }
- s = simulation.from_config(config)
+ s = simulation.Simulation(num_trials=num_trials, max_time=max_time, name="exporter_sim", dry_run=True, model=SimpleEnv)
for env in s.run_simulation(exporters=[Dummy], dry_run=True):
assert len(env.agents) == 1
@@ -64,12 +64,14 @@ class Exporters(TestCase):
n_trials = 5
config = {
"name": "exporter_sim",
- "network_params": {"generator": "complete_graph", "n": 4},
- "agent_class": "CounterModel",
+ "model_params": {
+ "network_generator": "complete_graph",
+ "network_params": {"n": 4},
+ "agent_class": "CounterModel",
+ },
"max_time": 2,
"num_trials": n_trials,
"dry_run": False,
- "environment_params": {},
}
output = io.StringIO()
s = simulation.from_config(config)
diff --git a/tests/test_main.py b/tests/test_main.py
index 677421a..5174dbd 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -29,8 +29,8 @@ class TestMain(TestCase):
"""A simulation with a base behaviour should do nothing"""
config = {
"model_params": {
- "network_params": {"path": join(ROOT, "test.gexf")},
- "agent_class": "BaseAgent",
+ "topology": join(ROOT, "test.gexf"),
+ "agent_class": "NetworkAgent",
}
}
s = simulation.from_config(config)
@@ -62,27 +62,13 @@ class TestMain(TestCase):
"""
The initial states should be applied to the agent and the
agent should be able to update its state."""
- config = {
- "version": "2",
- "name": "CounterAgent",
- "dry_run": True,
- "num_trials": 1,
- "max_time": 2,
- "model_params": {
- "topology": {"path": join(ROOT, "test.gexf")},
- "agents": {
- "agent_class": "CounterModel",
- "topology": True,
- "fixed": [{"state": {"times": 10}}, {"state": {"times": 20}}],
- },
- },
- }
- s = simulation.from_config(config)
- env = s.get_env()
- assert isinstance(env.agents[0], agents.CounterModel)
- assert env.agents[0].G == env.G
- assert env.agents[0]["times"] == 10
+ env = Environment()
+ env.add_agent(agents.Ticker, times=10)
+ env.add_agent(agents.Ticker, times=20)
+
+ assert isinstance(env.agents[0], agents.Ticker)
assert env.agents[0]["times"] == 10
+ assert env.agents[1]["times"] == 20
env.step()
assert env.agents[0]["times"] == 11
assert env.agents[1]["times"] == 21
@@ -90,18 +76,8 @@ class TestMain(TestCase):
def test_init_and_count_agents(self):
"""Agents should be properly initialized and counting should filter them properly"""
# TODO: separate this test into two or more test cases
- config = {
- "max_time": 10,
- "model_params": {
- "agents": [
- {"agent_class": CustomAgent, "weight": 1, "topology": True},
- {"agent_class": CustomAgent, "weight": 3, "topology": True},
- ],
- "topology": {"path": join(ROOT, "test.gexf")},
- },
- }
- s = simulation.from_config(config)
- env = s.run_simulation(dry_run=True)[0]
+ env = Environment(topology=join(ROOT, "test.gexf"))
+ env.populate_network([CustomAgent.w(weight=1), CustomAgent.w(weight=3)])
assert env.agents[0].weight == 1
assert env.count_agents() == 2
assert env.count_agents(weight=1) == 1
@@ -110,26 +86,28 @@ class TestMain(TestCase):
def test_torvalds_example(self):
"""A complete example from a documentation should work."""
- config = serialization.load_file(join(EXAMPLES, "torvalds.yml"))[0]
- config["model_params"]["network_params"]["path"] = join(
- EXAMPLES, config["model_params"]["network_params"]["path"]
- )
- s = simulation.from_config(config)
- env = s.run_simulation(dry_run=True)[0]
- for a in env.network_agents:
- skill_level = a.state["skill_level"]
- if a.id == "Torvalds":
- assert skill_level == "God"
- assert a.state["total"] == 3
- assert a.state["neighbors"] == 2
- elif a.id == "balkian":
- assert skill_level == "developer"
- assert a.state["total"] == 3
- assert a.state["neighbors"] == 1
- else:
- assert skill_level == "beginner"
- assert a.state["total"] == 3
- assert a.state["neighbors"] == 1
+ owd = os.getcwd()
+ pyfile = join(EXAMPLES, "torvalds_sim.py")
+ try:
+ os.chdir(os.path.dirname(pyfile))
+ s = simulation.from_py(pyfile)
+ env = s.run_simulation(dry_run=True)[0]
+ for a in env.network_agents:
+ skill_level = a["skill_level"]
+ if a.node_id == "Torvalds":
+ assert skill_level == "God"
+ assert a["total"] == 3
+ assert a["neighbors"] == 2
+ elif a.node_id == "balkian":
+ assert skill_level == "developer"
+ assert a["total"] == 3
+ assert a["neighbors"] == 1
+ else:
+ assert skill_level == "beginner"
+ assert a["total"] == 3
+ assert a["neighbors"] == 1
+ finally:
+ os.chdir(owd)
def test_serialize_class(self):
ser, name = serialization.serialize(agents.BaseAgent, known_modules=[])
@@ -166,11 +144,6 @@ class TestMain(TestCase):
assert ser == "BaseAgent"
pickle.dumps(ser)
- def test_templates(self):
- """Loading a template should result in several configs"""
- configs = serialization.load_file(join(EXAMPLES, "template.yml"))
- assert len(configs) > 0
-
def test_until(self):
n_runs = 0
@@ -183,7 +156,7 @@ class TestMain(TestCase):
n_trials = 50
max_time = 2
s = simulation.Simulation(
- model_params={"agents": [{"agent_class": CheckRun}]},
+ model_params=dict(agents=dict(agent_classes=[CheckRun], k=1)),
num_trials=n_trials,
max_time=max_time,
)
diff --git a/tests/test_network.py b/tests/test_network.py
index 89ff4a0..8fc6644 100644
--- a/tests/test_network.py
+++ b/tests/test_network.py
@@ -19,13 +19,11 @@ class TestNetwork(TestCase):
Load a graph from file if the extension is known.
Raise an exception otherwise.
"""
- config = {"network_params": {"path": join(ROOT, "test.gexf")}}
- G = network.from_config(config["network_params"])
+ G = network.from_topology(join(ROOT, "test.gexf"))
assert G
assert len(G) == 2
with self.assertRaises(AttributeError):
- config = {"network_params": {"path": join(ROOT, "unknown.extension")}}
- G = network.from_config(config["network_params"])
+ G = network.from_topology(join(ROOT, "unknown.extension"))
print(G)
def test_generate_barabasi(self):
@@ -33,12 +31,12 @@ class TestNetwork(TestCase):
If no path is given, a generator and network parameters
should be used to generate a network
"""
- cfg = {"params": {"generator": "barabasi_albert_graph"}}
+ cfg = {"generator": "barabasi_albert_graph"}
with self.assertRaises(Exception):
- G = network.from_config(cfg)
- cfg["params"]["n"] = 100
- cfg["params"]["m"] = 10
- G = network.from_config(cfg)
+ G = network.from_params(**cfg)
+ cfg["n"] = 100
+ cfg["m"] = 10
+ G = network.from_params(**cfg)
assert len(G) == 100
def test_save_geometric(self):
@@ -54,18 +52,8 @@ class TestNetwork(TestCase):
def test_networkenvironment_creation(self):
"""Networkenvironment should accept netconfig as parameters"""
- model_params = {
- "topology": {"path": join(ROOT, "test.gexf")},
- "agents": {
- "topology": True,
- "distribution": [
- {
- "agent_class": CustomAgent,
- }
- ],
- },
- }
- env = environment.Environment(**model_params)
+ env = environment.Environment(topology=join(ROOT, "test.gexf"))
+ env.populate_network(CustomAgent)
assert env.G
env.step()
assert len(env.G) == 2
@@ -76,18 +64,9 @@ class TestNetwork(TestCase):
def test_custom_agent_neighbors(self):
"""Allow for search of neighbors with a certain state_id"""
- config = {
- "model_params": {
- "topology": {"path": join(ROOT, "test.gexf")},
- "agents": {
- "topology": True,
- "distribution": [{"weight": 1, "agent_class": CustomAgent}],
- },
- },
- "max_time": 10,
- }
- s = simulation.from_config(config)
- env = s.run_simulation(dry_run=True)[0]
+ env = environment.Environment()
+ env.create_network(join(ROOT, "test.gexf"))
+ env.populate_network(CustomAgent)
assert env.agents[1].count_agents(state_id="normal") == 2
assert env.agents[1].count_agents(state_id="normal", limit_neighbors=True) == 1
assert env.agents[0].count_neighbors() == 1
@@ -97,10 +76,8 @@ class TestNetwork(TestCase):
G = nx.Graph()
G.add_node(3)
G.add_edge(1, 2)
- distro = agents.calculate_distribution(agent_class=agents.NetworkAgent)
- aconfig = config.AgentConfig(distribution=distro, topology=True)
- env = environment.Environment(name="Test", topology=G, agents=aconfig)
- lst = list(env.network_agents)
+ env = environment.Environment(name="Test", topology=G)
+ env.populate_network(agents.NetworkAgent)
a2 = env.find_one(node_id=2)
a3 = env.find_one(node_id=3)
diff --git a/tests/test_time.py b/tests/test_time.py
index 7fdab0b..27d1765 100644
--- a/tests/test_time.py
+++ b/tests/test_time.py
@@ -46,7 +46,8 @@ class TestMain(TestCase):
break
done.append(self.now)
- env = environment.Environment(agents=[{"agent_class": CondAgent}])
+ env = environment.Environment()
+ env.add_agent(CondAgent)
while env.schedule.time < 11:
times.append(env.now)
From feab0ba79e5f1b0424052bff6f412b30f6393856 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?=
Date: Fri, 14 Apr 2023 19:41:24 +0200
Subject: [PATCH 29/39] Large set of changes for v0.30
The examples weren't being properly tested in the last commit. When we fixed
that a lot of bugs in the new implementation of environment and agent were
found, which accounts for most of these changes.
The main difference is the mechanism to load simulations from a configuration
file. For that to work, we had to rework our module loading code in
`serialization` and add a `source_file` attribute to configurations (and
simulations, for that matter).
---
CHANGELOG.md | 7 +-
docs/notes_v0.30.rst | 24 +-
examples/custom_generator/generator_sim.py | 8 +-
.../custom_timeouts/custom_timeouts_sim.py | 4 +-
examples/events_and_messages/cars_sim.py | 49 ++--
examples/mesa/mesa_sim.py | 2 +-
examples/mesa/social_wealth.py | 2 +-
examples/newsspread/newsspread_sim.py | 39 +--
examples/programmatic/programmatic_sim.py | 5 +-
examples/pubcrawl/pubcrawl_sim.py | 22 +-
examples/random_delays/random_delays_sim.py | 2 +-
.../terrorism/TerroristNetworkModel_sim.py | 72 ++---
examples/torvalds_sim.py | 19 +-
examples/tutorial/soil_tutorial.ipynb | 113 ++++----
soil/__init__.py | 67 +++--
soil/agents/__init__.py | 35 ++-
soil/agents/fsm.py | 16 +-
soil/agents/network_agents.py | 28 +-
soil/config.py | 269 +-----------------
soil/datacollection.py | 2 +-
soil/debugging.py | 59 +++-
soil/decorators.py | 6 +-
soil/environment.py | 162 +++++++----
soil/exporters.py | 28 +-
soil/serialization.py | 61 +++-
soil/simulation.py | 183 +++++++-----
soil/time.py | 3 +-
tests/complete_converted.yml | 49 ----
tests/old_complete.yml | 37 ---
tests/test_agents.py | 14 +
tests/test_config.py | 90 +-----
tests/test_config.yml | 5 +
tests/test_examples.py | 61 ++--
tests/test_exporters.py | 32 ++-
tests/test_main.py | 35 ++-
tests/test_network.py | 4 +-
36 files changed, 739 insertions(+), 875 deletions(-)
delete mode 100644 tests/complete_converted.yml
delete mode 100644 tests/old_complete.yml
create mode 100644 tests/test_config.yml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1d17271..2bff290 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,15 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
## [0.30 UNRELEASED]
### Added
* Simple debugging capabilities in `soil.debugging`, with a custom `pdb.Debugger` subclass that exposes commands to list agents and their status and set breakpoints on states (for FSM agents). Try it with `soil --debug `
-* Ability to run
-* Ability to
+* Ability to run mesa simulations
* The `soil.exporters` module to export the results of datacollectors (model.datacollector) into files at the end of trials/simulations
* A modular set of classes for environments/models. Now the ability to configure the agents through an agent definition and a topology through a network configuration is split into two classes (`soil.agents.BaseEnvironment` for agents, `soil.agents.NetworkEnvironment` to add topology).
* FSM agents can now have generators as states. They work similar to normal states, with one caveat. Only `time` values can be yielded, not a state. This is because the state will not change, it will be resumed after the yield, at the appropriate time. The return value *can* be a state, or a `(state, time)` tuple, just like in normal states.
### Changed
-* Configuration schema is very different now. Check `soil.config` for more information. We are also using Pydantic for (de)serialization.
-* There may be more than one topology/network in the simulation
-* Ability
+* Configuration schema is very simplified
### Removed
* Any `tsih` and `History` integration in the main classes. To record the state of environments/agents, just use a datacollector. In some cases this may be slower or consume more memory than the previous system. However, few cases actually used the full potential of the history, and it came at the cost of unnecessary complexity and worse performance for the majority of cases.
diff --git a/docs/notes_v0.30.rst b/docs/notes_v0.30.rst
index 13a2698..7367f66 100644
--- a/docs/notes_v0.30.rst
+++ b/docs/notes_v0.30.rst
@@ -1,5 +1,3 @@
-
-
What are the main changes between version 0.3 and 0.2?
######################################################
@@ -22,22 +20,12 @@ It aims to provide more modular and convenient functions, most of which can be u
How are agents assigned to nodes in the network
###############################################
-In principle, the generation of the network topology and the assignment of agents to nodes are two separate processes.
-There is a mechanism to initialize the agents, a mechanism to initialize the topology, and a mechanism to assign agents to nodes.
-
-However, there are a myriad of ways to do this, and it is not clear which is the best way to do it.
-Earlier versions of Soil approached it by providing a fairly complex method of agent and node generation.
-The result was a very complex and difficult to understand system, which is was also prone to bugs and changes between versions.
-
-Starting with version 0.3, the approach is to provide a simplified yet flexible system for generating the network topology and assigning agents to nodes.
-This is based on these methods:
-
-- `create_network`
-- `add_agents` (and `add_agent`)
-- `populate_network`
-
-The default implementation of `soil.Environment` accepts some parameters that will automatically do these steps for the most common case.
-All other cases can be handled by overriding the `init(self)` method and explicitly using these methods.
+The constructor of the `NetworkAgent` class has two arguments: `node_id` and `topology`.
+If `topology` is not provided, it will default to `self.model.topology`.
+This assignment might err if the model does not have a `topology` attribute, but most Soil environments derive from `NetworkEnvironment`, so they include a topology by default.
+If `node_id` is not provided, a random node will be selected from the topology, until a node with no agent is found.
+Then, the `node_id` of that node is assigned to the agent.
+If no node with no agent is found, a new node is automatically added to the topology.
Can Soil environments include more than one network / topology?
diff --git a/examples/custom_generator/generator_sim.py b/examples/custom_generator/generator_sim.py
index 0950457..c3701e7 100644
--- a/examples/custom_generator/generator_sim.py
+++ b/examples/custom_generator/generator_sim.py
@@ -26,14 +26,14 @@ def mygenerator(n=5, n_edges=5):
class GeneratorEnv(Environment):
"""Using a custom generator for the network"""
- generator: parameters.function = mygenerator
+ generator: parameters.function = staticmethod(mygenerator)
def init(self):
- self.create_network(network_generator=self.generator, n=10, n_edges=5)
- self.init_agents(CounterModel)
+ self.create_network(generator=self.generator, n=10, n_edges=5)
+ self.add_agents(CounterModel)
sim = Simulation(model=GeneratorEnv, max_steps=10, interval=1)
if __name__ == '__main__':
- sim.run(dry_run=True)
\ No newline at end of file
+ sim.run(dump=False)
\ No newline at end of file
diff --git a/examples/custom_timeouts/custom_timeouts_sim.py b/examples/custom_timeouts/custom_timeouts_sim.py
index e5ff26d..7a80242 100644
--- a/examples/custom_timeouts/custom_timeouts_sim.py
+++ b/examples/custom_timeouts/custom_timeouts_sim.py
@@ -30,7 +30,7 @@ from networkx import complete_graph
class TimeoutsEnv(Environment):
def init(self):
- self.init_network(generator=complete_graph, n=2)
+ self.create_network(generator=complete_graph, n=2)
self.add_agent(agent_class=Fibonacci, node_id=0)
self.add_agent(agent_class=Odds, node_id=1)
@@ -38,4 +38,4 @@ class TimeoutsEnv(Environment):
sim = Simulation(model=TimeoutsEnv, max_steps=10, interval=1)
if __name__ == "__main__":
- sim.run(dry_run=True)
\ No newline at end of file
+ sim.run(dump=False)
\ No newline at end of file
diff --git a/examples/events_and_messages/cars_sim.py b/examples/events_and_messages/cars_sim.py
index c785650..5e93138 100644
--- a/examples/events_and_messages/cars_sim.py
+++ b/examples/events_and_messages/cars_sim.py
@@ -56,41 +56,25 @@ class City(EventedEnvironment):
:param int height: Height of the internal grid
:param int width: Width of the internal grid
"""
+ n_cars = 1
+ n_passengers = 10
+ height = 100
+ width = 100
+
+ def init(self):
+ self.grid = MultiGrid(width=self.width, height=self.height, torus=False)
+ if not self.agents:
+ self.add_agents(Driver, k=self.n_cars)
+ self.add_agents(Passenger, k=self.n_passengers)
- def __init__(
- self,
- *args,
- n_cars=1,
- n_passengers=10,
- height=100,
- width=100,
- agents=None,
- model_reporters=None,
- **kwargs,
- ):
- self.grid = MultiGrid(width=width, height=height, torus=False)
- if agents is None:
- agents = []
- for i in range(n_cars):
- agents.append({"agent_class": Driver})
- for i in range(n_passengers):
- agents.append({"agent_class": Passenger})
- model_reporters = model_reporters or {
- "earnings": "total_earnings",
- "n_passengers": "number_passengers",
- }
- print("REPORTERS", model_reporters)
- super().__init__(
- *args, agents=agents, model_reporters=model_reporters, **kwargs
- )
for agent in self.agents:
self.grid.place_agent(agent, (0, 0))
self.grid.move_to_empty(agent)
+
+ self.total_earnings = 0
+ self.add_model_reporter("total_earnings")
- @property
- def total_earnings(self):
- return sum(d.earnings for d in self.agents(agent_class=Driver))
-
+ @report
@property
def number_passengers(self):
return self.count_agents(agent_class=Passenger)
@@ -150,6 +134,7 @@ class Driver(Evented, FSM):
while self.move_towards(self.journey.destination, with_passenger=True):
yield
self.earnings += self.journey.tip
+ self.model.total_earnings += self.journey.tip
self.check_passengers()
return self.wandering
@@ -228,13 +213,13 @@ class Passenger(Evented, FSM):
except events.TimedOut:
pass
- self.info("Got home safe!")
- self.die()
+ self.die("Got home safe!")
simulation = Simulation(name="RideHailing",
model=City,
seed="carsSeed",
+ max_time=1000,
model_params=dict(n_passengers=2))
if __name__ == "__main__":
diff --git a/examples/mesa/mesa_sim.py b/examples/mesa/mesa_sim.py
index 1f2da70..6ece2d6 100644
--- a/examples/mesa/mesa_sim.py
+++ b/examples/mesa/mesa_sim.py
@@ -1,7 +1,7 @@
from soil import Simulation
from social_wealth import MoneyEnv, graph_generator
-sim = Simulation(name="mesa_sim", dry_run=True, max_steps=10, interval=2, model=MoneyEnv, model_params=dict(generator=graph_generator, N=10, width=50, height=50))
+sim = Simulation(name="mesa_sim", dump=False, max_steps=10, interval=2, model=MoneyEnv, model_params=dict(generator=graph_generator, N=10, width=50, height=50))
if __name__ == "__main__":
sim.run()
diff --git a/examples/mesa/social_wealth.py b/examples/mesa/social_wealth.py
index de8a198..d5b8dbb 100644
--- a/examples/mesa/social_wealth.py
+++ b/examples/mesa/social_wealth.py
@@ -53,7 +53,7 @@ class MoneyAgent(MesaAgent):
self.give_money()
-class SocialMoneyAgent(NetworkAgent, MoneyAgent):
+class SocialMoneyAgent(MoneyAgent, NetworkAgent):
wealth = 1
def give_money(self):
diff --git a/examples/newsspread/newsspread_sim.py b/examples/newsspread/newsspread_sim.py
index c85d5fc..2197e15 100644
--- a/examples/newsspread/newsspread_sim.py
+++ b/examples/newsspread/newsspread_sim.py
@@ -91,10 +91,11 @@ class NewsSpread(Environment):
prob_neighbor_cure: probability = 0.05,
def init(self):
- self.populate_network([DumbViewer, HerdViewer, WiseViewer], [self.ratio_dumb, self.ratio_herd, self.ratio_wise])
+ self.populate_network([DumbViewer, HerdViewer, WiseViewer],
+ [self.ratio_dumb, self.ratio_herd, self.ratio_wise])
-from itertools import permutations
+from itertools import product
from soil import Simulation
@@ -103,27 +104,31 @@ from soil import Simulation
# Because the effect of these agents might also depend on the network structure, we will run our simulations on two different networks:
# one with a small-world structure and one with a connected structure.
-for [r1, r2, r3] in permutations([0, 0.5, 1.0], 3):
+counter = 0
+for [r1, r2] in product([0, 0.5, 1.0], repeat=2):
for (generator, netparams) in {
"barabasi_albert_graph": {"m": 5},
"erdos_renyi_graph": {"p": 0.1},
}.items():
- print(r1, r2, r3, generator)
+ print(r1, r2, 1-r1-r2, generator)
# Create new simulation
netparams["n"] = 500
- sim = Simulation(
+ Simulation(
+ name='newspread_sim',
model=NewsSpread,
- model_params={
- "ratio_dumb": r1,
- "ratio_herd": r2,
- "ratio_wise": r3,
- "network_generator": generator,
- "network_params": netparams,
- "prob_neighbor_spread": 0,
- },
- num_trials=50,
+ model_params=dict(
+ ratio_dumb=r1,
+ ratio_herd=r2,
+ ratio_wise=1-r1-r2,
+ network_generator=generator,
+ network_params=netparams,
+ prob_neighbor_spread=0,
+ ),
+ num_trials=5,
max_steps=300,
- dry_run=True,
- )
+ dump=False,
+ ).run()
+ counter += 1
# Run all the necessary instances
- sim.run()
+
+print(f"A total of {counter} simulations were run.")
\ No newline at end of file
diff --git a/examples/programmatic/programmatic_sim.py b/examples/programmatic/programmatic_sim.py
index d708e9b..86ae9ab 100644
--- a/examples/programmatic/programmatic_sim.py
+++ b/examples/programmatic/programmatic_sim.py
@@ -14,7 +14,7 @@ def mygenerator():
return G
-class MyAgent(agents.FSM):
+class MyAgent(agents.NetworkAgent, agents.FSM):
times_run = 0
@agents.default_state
@agents.state
@@ -29,6 +29,7 @@ class ProgrammaticEnv(Environment):
def init(self):
self.create_network(generator=mygenerator)
+ assert len(self.G)
self.populate_network(agent_class=MyAgent)
self.add_agent_reporter('times_run')
@@ -39,7 +40,7 @@ simulation = Simulation(
seed='Program',
num_trials=1,
max_time=100,
- dry_run=True,
+ dump=False,
)
if __name__ == "__main__":
diff --git a/examples/pubcrawl/pubcrawl_sim.py b/examples/pubcrawl/pubcrawl_sim.py
index 9e600e7..47dbb1f 100644
--- a/examples/pubcrawl/pubcrawl_sim.py
+++ b/examples/pubcrawl/pubcrawl_sim.py
@@ -14,7 +14,7 @@ class CityPubs(Environment):
pub_capacity: parameters.Integer = 10
def init(self):
- pubs = {}
+ self.pubs = {}
for i in range(self.number_of_pubs):
newpub = {
"name": "The awesome pub #{}".format(i),
@@ -22,10 +22,11 @@ class CityPubs(Environment):
"capacity": self.pub_capacity,
"occupancy": 0,
}
- pubs[newpub["name"]] = newpub
- self.add_agent(agent_class=Police, node_id=0)
- self["pubs"] = pubs
- self.populate_network([{"openness": 0.1}, {"openness": 1}], [self.ratio_extroverted, 1-self.ratio_extroverted], agent_class=Patron)
+ self.pubs[newpub["name"]] = newpub
+ self.add_agent(agent_class=Police)
+ self.populate_network([Patron.w(openness=0.1), Patron.w(openness=1)],
+ [self.ratio_extroverted, 1-self.ratio_extroverted])
+ assert all(["agent" in node and isinstance(node["agent"], Patron) for (_, node) in self.G.nodes(data=True)])
def enter(self, pub_id, *nodes):
"""Agents will try to enter. The pub checks if it is possible"""
@@ -151,10 +152,10 @@ class Patron(FSM, NetworkAgent):
continue
if friend.befriend(self):
self.befriend(friend, force=True)
- self.debug("Hooray! new friend: {}".format(friend.id))
+ self.debug("Hooray! new friend: {}".format(friend.unique_id))
befriended = True
else:
- self.debug("{} does not want to be friends".format(friend.id))
+ self.debug("{} does not want to be friends".format(friend.unique_id))
return befriended
@@ -168,19 +169,20 @@ class Police(FSM):
def patrol(self):
drunksters = list(self.get_agents(drunk=True, state_id=Patron.drunk_in_pub.id))
for drunk in drunksters:
- self.info("Kicking out the trash: {}".format(drunk.id))
+ self.info("Kicking out the trash: {}".format(drunk.unique_id))
drunk.kick_out()
else:
self.info("No trash to take out. Too bad.")
sim = Simulation(
+ model=CityPubs,
name="pubcrawl",
num_trials=3,
max_steps=10,
- dry_run=True,
+ dump=False,
model_params=dict(
- generator=nx.empty_graph,
+ network_generator=nx.empty_graph,
network_params={"n": 30},
model=CityPubs,
altercations=0,
diff --git a/examples/random_delays/random_delays_sim.py b/examples/random_delays/random_delays_sim.py
index d7b0382..b60bc5d 100644
--- a/examples/random_delays/random_delays_sim.py
+++ b/examples/random_delays/random_delays_sim.py
@@ -40,7 +40,7 @@ s = Simulation(
model=RandomEnv,
num_trials=1,
max_time=100,
- dry_run=True,
+ dump=False,
)
diff --git a/examples/terrorism/TerroristNetworkModel_sim.py b/examples/terrorism/TerroristNetworkModel_sim.py
index 149128a..835412c 100644
--- a/examples/terrorism/TerroristNetworkModel_sim.py
+++ b/examples/terrorism/TerroristNetworkModel_sim.py
@@ -5,7 +5,6 @@ from soil.parameters import *
class TerroristEnvironment(Environment):
- generator: function = nx.random_geometric_graph
n: Integer = 100
radius: Float = 0.2
@@ -37,8 +36,11 @@ class TerroristEnvironment(Environment):
TerroristNetworkModel.w(state_id='leader'),
TrainingAreaModel,
HavenModel
- ], [self.ratio_civil, self.ratio_leader, self.ratio_trainig, self.ratio_heaven])
+ ], [self.ratio_civil, self.ratio_leader, self.ratio_training, self.ratio_haven])
+ @staticmethod
+ def generator(*args, **kwargs):
+ return nx.random_geometric_graph(*args, **kwargs)
class TerroristSpreadModel(FSM, Geo):
"""
@@ -50,10 +52,13 @@ class TerroristSpreadModel(FSM, Geo):
min_vulnerability (optional else zero)
max_vulnerability
-
- prob_interaction
"""
+ information_spread_intensity = 0.1
+ terrorist_additional_influence = 0.1
+ min_vulnerability = 0
+ max_vulnerability = 1
+
def init(self):
if self.state_id == self.civilian.id: # Civilian
self.mean_belief = self.model.random.uniform(0.00, 0.5)
@@ -75,7 +80,7 @@ class TerroristSpreadModel(FSM, Geo):
if len(neighbours) > 0:
# Only interact with some of the neighbors
interactions = list(
- n for n in neighbours if self.random.random() <= self.prob_interaction
+ n for n in neighbours if self.random.random() <= self.model.prob_interaction
)
influence = sum(self.degree(i) for i in interactions)
mean_belief = sum(
@@ -121,7 +126,7 @@ class TerroristSpreadModel(FSM, Geo):
)
# Check if there are any leaders in the group
- leaders = list(filter(lambda x: x.state.id == self.leader.id, neighbours))
+ leaders = list(filter(lambda x: x.state_id == self.leader.id, neighbours))
if not leaders:
# Check if this is the potential leader
# Stop once it's found. Otherwise, set self as leader
@@ -132,12 +137,11 @@ class TerroristSpreadModel(FSM, Geo):
def ego_search(self, steps=1, center=False, agent=None, **kwargs):
"""Get a list of nodes in the ego network of *node* of radius *steps*"""
- node = agent.node
+ node = agent.node_id
G = self.subgraph(**kwargs)
return nx.ego_graph(G, node, center=center, radius=steps).nodes()
def degree(self, agent, force=False):
- node = agent.node
if (
force
or (not hasattr(self.model, "_degree"))
@@ -145,10 +149,9 @@ class TerroristSpreadModel(FSM, Geo):
):
self.model._degree = nx.degree_centrality(self.G)
self.model._last_step = self.now
- return self.model._degree[node]
+ return self.model._degree[agent.node_id]
def betweenness(self, agent, force=False):
- node = agent.node
if (
force
or (not hasattr(self.model, "_betweenness"))
@@ -156,7 +159,7 @@ class TerroristSpreadModel(FSM, Geo):
):
self.model._betweenness = nx.betweenness_centrality(self.G)
self.model._last_step = self.now
- return self.model._betweenness[node]
+ return self.model._betweenness[agent.node_id]
class TrainingAreaModel(FSM, Geo):
@@ -169,13 +172,12 @@ class TrainingAreaModel(FSM, Geo):
Requires TerroristSpreadModel.
"""
- def __init__(self, model=None, unique_id=0, state=()):
- super().__init__(model=model, unique_id=unique_id, state=state)
- self.training_influence = model.environment_params["training_influence"]
- if "min_vulnerability" in model.environment_params:
- self.min_vulnerability = model.environment_params["min_vulnerability"]
- else:
- self.min_vulnerability = 0
+ training_influence = 0.1
+ min_vulnerability = 0
+
+ def init(self):
+ self.mean_believe = 1
+ self.vulnerability = 0
@default_state
@state
@@ -199,18 +201,19 @@ class HavenModel(FSM, Geo):
Requires TerroristSpreadModel.
"""
- def __init__(self, model=None, unique_id=0, state=()):
- super().__init__(model=model, unique_id=unique_id, state=state)
- self.haven_influence = model.environment_params["haven_influence"]
- if "min_vulnerability" in model.environment_params:
- self.min_vulnerability = model.environment_params["min_vulnerability"]
- else:
- self.min_vulnerability = 0
- self.max_vulnerability = model.environment_params["max_vulnerability"]
+ min_vulnerability = 0
+ haven_influence = 0.1
+ max_vulnerability = 0.5
+
+ def init(self):
+ self.mean_believe = 0
+ self.vulnerability = 0
def get_occupants(self, **kwargs):
- return self.get_neighbors(agent_class=TerroristSpreadModel, **kwargs)
+ return self.get_neighbors(agent_class=TerroristSpreadModel,
+ **kwargs)
+ @default_state
@state
def civilian(self):
civilians = self.get_occupants(state_id=self.civilian.id)
@@ -246,13 +249,10 @@ class TerroristNetworkModel(TerroristSpreadModel):
weight_link_distance
"""
- def __init__(self, model=None, unique_id=0, state=()):
- super().__init__(model=model, unique_id=unique_id, state=state)
-
- self.vision_range = model.environment_params["vision_range"]
- self.sphere_influence = model.environment_params["sphere_influence"]
- self.weight_social_distance = model.environment_params["weight_social_distance"]
- self.weight_link_distance = model.environment_params["weight_link_distance"]
+ sphere_influence: float
+ vision_range: float
+ weight_social_distance: float
+ weight_link_distance: float
@state
def terrorist(self):
@@ -316,8 +316,8 @@ sim = Simulation(
num_trials=1,
name="TerroristNetworkModel_sim",
max_steps=150,
- skip_test=True,
- dry_run=True,
+ skip_test=False,
+ dump=False,
)
# TODO: integrate visualization
diff --git a/examples/torvalds_sim.py b/examples/torvalds_sim.py
index 90e001c..2ee4f22 100644
--- a/examples/torvalds_sim.py
+++ b/examples/torvalds_sim.py
@@ -1,14 +1,23 @@
-from soil import Environment, Simulation, CounterModel
+from soil import Environment, Simulation, CounterModel, report
+
+
+# Get directory path for current file
+import os, sys, inspect
+currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
class TorvaldsEnv(Environment):
def init(self):
- self.create_network(path='torvalds.edgelist')
+ self.create_network(path=os.path.join(currentdir, 'torvalds.edgelist'))
self.populate_network(CounterModel, skill_level='beginner')
- print("Agentes: ", list(self.network_agents))
- self.find_one(node_id="Torvalds").skill_level = 'God'
- self.find_one(node_id="balkian").skill_level = 'developer'
+ self.agent(node_id="Torvalds").skill_level = 'God'
+ self.agent(node_id="balkian").skill_level = 'developer'
+ self.add_agent_reporter("times")
+ @report
+ def god_developers(self):
+ return self.count_agents(skill_level='God')
+
sim = Simulation(name='torvalds_example',
max_steps=10,
diff --git a/examples/tutorial/soil_tutorial.ipynb b/examples/tutorial/soil_tutorial.ipynb
index 76f8d49..2807ac6 100644
--- a/examples/tutorial/soil_tutorial.ipynb
+++ b/examples/tutorial/soil_tutorial.ipynb
@@ -369,7 +369,7 @@
"outputs": [
{
"data": {
- "image/png": "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\n",
+ "image/png": "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",
"text/plain": [
"