before graph firm prod
This commit is contained in:
parent
af0d1dd2c3
commit
907d6cb179
|
@ -13,7 +13,8 @@
|
||||||
"justMyCode": true,
|
"justMyCode": true,
|
||||||
"args": [
|
"args": [
|
||||||
"--exp", "test",
|
"--exp", "test",
|
||||||
"--reset_db", "True"
|
"--reset_db", "True",
|
||||||
|
"--job", "1"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -93,7 +93,7 @@ class ControllerDB:
|
||||||
# insert exp
|
# insert exp
|
||||||
df_xv = pd.read_csv("xv.csv", index_col=None)
|
df_xv = pd.read_csv("xv.csv", index_col=None)
|
||||||
# read the OA table
|
# read the OA table
|
||||||
df_oa = pd.read_csv("oa_with_exp.csv", index_col=None)
|
df_oa = pd.read_csv("oa_without_exp.csv", index_col=None)
|
||||||
df_oa = df_oa.iloc[:, 0:9]
|
df_oa = df_oa.iloc[:, 0:9]
|
||||||
for idx_scenario, row in df_oa.iterrows():
|
for idx_scenario, row in df_oa.iterrows():
|
||||||
dct_exp_para = {}
|
dct_exp_para = {}
|
||||||
|
|
3
firm.py
3
firm.py
|
@ -196,3 +196,6 @@ class FirmAgent(ap.Agent):
|
||||||
def clean_before_time_step(self):
|
def clean_before_time_step(self):
|
||||||
self.dct_n_trial_up_prod_removed = {}
|
self.dct_n_trial_up_prod_removed = {}
|
||||||
self.a_lst_up_product_removed = ap.AgentList(self.model, [])
|
self.a_lst_up_product_removed = ap.AgentList(self.model, [])
|
||||||
|
|
||||||
|
def get_firm_network_node(self):
|
||||||
|
return self.firm_network.positions[self]
|
||||||
|
|
104
model.py
104
model.py
|
@ -146,7 +146,27 @@ class Model(ap.Model):
|
||||||
firm.a_lst_product_removed.append(product)
|
firm.a_lst_product_removed.append(product)
|
||||||
|
|
||||||
# draw network
|
# draw network
|
||||||
# self.draw_network()
|
self.draw_network()
|
||||||
|
|
||||||
|
print(self.a_lst_total_firms)
|
||||||
|
print(self.a_lst_total_firms[133])
|
||||||
|
print(self.a_lst_total_firms[133].code)
|
||||||
|
print(self.firm_network.positions[self.a_lst_total_firms[133]])
|
||||||
|
print(
|
||||||
|
self.firm_network.graph[self.firm_network.positions[self.a_lst_total_firms[133]]])
|
||||||
|
iter_g = iter(
|
||||||
|
self.firm_network.graph[self.firm_network.positions[self.a_lst_total_firms[133]]])
|
||||||
|
f_t = next(iter_g)
|
||||||
|
print(f_t)
|
||||||
|
iter_g = iter(self.firm_network.graph[f_t])
|
||||||
|
print(next(iter_g))
|
||||||
|
|
||||||
|
print(self.a_lst_total_firms[133].get_firm_network_node())
|
||||||
|
print(list(self.dfs_edges_prod(self.firm_network.graph,
|
||||||
|
self.a_lst_total_firms[133],
|
||||||
|
self.a_lst_total_firms[133].a_lst_product[0])))
|
||||||
|
print(self.betweenness_centrality_firm_prod(self.firm_network.graph))
|
||||||
|
print()
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
self.a_lst_total_firms.clean_before_time_step()
|
self.a_lst_total_firms.clean_before_time_step()
|
||||||
|
@ -312,7 +332,7 @@ class Model(ap.Model):
|
||||||
node_label = nx.get_node_attributes(self.firm_network.graph, 'Name')
|
node_label = nx.get_node_attributes(self.firm_network.graph, 'Name')
|
||||||
node_degree = dict(self.firm_network.graph.out_degree())
|
node_degree = dict(self.firm_network.graph.out_degree())
|
||||||
node_label = {
|
node_label = {
|
||||||
key: f"{node_label[key]} {node_degree[key]}"
|
key: f"{key} {node_label[key]} {node_degree[key]}"
|
||||||
for key in node_label.keys()
|
for key in node_label.keys()
|
||||||
}
|
}
|
||||||
node_size = list(
|
node_size = list(
|
||||||
|
@ -334,3 +354,83 @@ class Model(ap.Model):
|
||||||
edge_label,
|
edge_label,
|
||||||
font_size=4)
|
font_size=4)
|
||||||
plt.savefig("network.png")
|
plt.savefig("network.png")
|
||||||
|
|
||||||
|
@ staticmethod
|
||||||
|
def dfs_edges_prod(G, start_firm, start_prod, depth_limit=None):
|
||||||
|
assert start_prod in start_firm.a_lst_product, \
|
||||||
|
f"product {start_prod.code} not in firm {start_firm.code}"
|
||||||
|
|
||||||
|
visited = set()
|
||||||
|
if depth_limit is None:
|
||||||
|
depth_limit = len(G)
|
||||||
|
|
||||||
|
start_node = start_firm.get_firm_network_node()
|
||||||
|
visited.add(start_firm)
|
||||||
|
stack = [(start_firm, start_prod, depth_limit, iter(G[start_node]))]
|
||||||
|
while stack:
|
||||||
|
parent_firm, parent_prod, depth_now, children_node = stack[-1]
|
||||||
|
try:
|
||||||
|
child_node = next(children_node)
|
||||||
|
child_firm = \
|
||||||
|
ap.AgentIter(start_firm.model, child_node).to_list()[0]
|
||||||
|
if child_firm not in visited:
|
||||||
|
for child_prod in child_firm.a_lst_product:
|
||||||
|
if child_prod not in parent_prod.a_successors():
|
||||||
|
continue
|
||||||
|
yield parent_firm.code, parent_prod.code, child_firm.code, child_prod.code
|
||||||
|
visited.add(child_firm)
|
||||||
|
if depth_now > 1:
|
||||||
|
stack.append((child_firm,
|
||||||
|
child_prod,
|
||||||
|
depth_now - 1,
|
||||||
|
iter(G[child_node])))
|
||||||
|
except StopIteration:
|
||||||
|
stack.pop()
|
||||||
|
|
||||||
|
@ staticmethod
|
||||||
|
def betweenness_centrality_firm_prod(G):
|
||||||
|
def _single_source_shortest_path_basic(G, s):
|
||||||
|
S = []
|
||||||
|
P = {}
|
||||||
|
for v in G:
|
||||||
|
P[v] = []
|
||||||
|
sigma = dict.fromkeys(G, 0.0) # sigma[v]=0 for v in G
|
||||||
|
D = {}
|
||||||
|
sigma[s] = 1.0
|
||||||
|
D[s] = 0
|
||||||
|
Q = [s]
|
||||||
|
while Q: # use BFS to find shortest paths
|
||||||
|
v = Q.pop(0)
|
||||||
|
S.append(v)
|
||||||
|
Dv = D[v]
|
||||||
|
sigmav = sigma[v]
|
||||||
|
for w in G[v]:
|
||||||
|
if w not in D:
|
||||||
|
Q.append(w)
|
||||||
|
D[w] = Dv + 1
|
||||||
|
if D[w] == Dv + 1: # this is a shortest path, count paths
|
||||||
|
sigma[w] += sigmav
|
||||||
|
P[w].append(v) # predecessors
|
||||||
|
return S, P, sigma
|
||||||
|
|
||||||
|
def _accumulate_basic(betweenness, S, P, sigma, s):
|
||||||
|
delta = dict.fromkeys(S, 0)
|
||||||
|
while S:
|
||||||
|
w = S.pop()
|
||||||
|
coeff = (1 + delta[w]) / sigma[w]
|
||||||
|
for v in P[w]:
|
||||||
|
delta[v] += sigma[v] * coeff
|
||||||
|
if w != s:
|
||||||
|
betweenness[w] += delta[w]
|
||||||
|
return betweenness
|
||||||
|
|
||||||
|
betweenness = dict.fromkeys(G, 0.0) # b[v]=0 for v in G
|
||||||
|
nodes = G
|
||||||
|
for s in nodes:
|
||||||
|
# single source shortest paths
|
||||||
|
# use BFS for unweighted g
|
||||||
|
S, P, sigma = _single_source_shortest_path_basic(G, s)
|
||||||
|
# accumulation without endpoint
|
||||||
|
betweenness = _accumulate_basic(betweenness, S, P, sigma, s)
|
||||||
|
|
||||||
|
return betweenness
|
||||||
|
|
BIN
network.png
BIN
network.png
Binary file not shown.
Before Width: | Height: | Size: 3.0 MiB After Width: | Height: | Size: 3.5 MiB |
Loading…
Reference in New Issue