drop firm attr a_lst_product/_disrupted

This commit is contained in:
2023-06-18 22:12:47 +08:00
parent 3e87cffa63
commit 11abfa5ce8
4 changed files with 19 additions and 18 deletions

View File

@@ -224,9 +224,8 @@ class Model(ap.Model):
print('\n', '=' * 20, 'step', self.t, '=' * 20)
for firm, a_lst_product in self.dct_lst_disrupt_firm_prod.items():
for product in a_lst_product:
assert product in firm.a_lst_product, \
assert product in firm.dct_prod_up_prod_stat.keys(), \
f"product {product.code} not in firm {firm.code}"
firm.a_lst_product_disrupted.append(product)
firm.dct_prod_up_prod_stat[
product]['status'].append(('D', self.t))
@@ -289,8 +288,7 @@ class Model(ap.Model):
[firm.code == di_supp_node['Firm_Code']
for firm in self.a_lst_total_firms])[0]
lst_cand = self.model.a_lst_total_firms.select([
di_supp_prod in firm.a_lst_product and
di_supp_prod not in firm.a_lst_product_disrupted
firm.is_prod_in_current_normal(di_supp_prod)
for firm in self.model.a_lst_total_firms
])
n2n_betweenness = \
@@ -311,8 +309,7 @@ class Model(ap.Model):
for product in self.a_lst_total_products])[0]
# find a dfferent firm can produce the same product
lst_cand = self.model.a_lst_total_firms.select([
di_supp_prod in firm.a_lst_product and
di_supp_prod not in firm.a_lst_product_disrupted
firm.is_prod_in_current_normal(di_supp_prod)
and firm.code != di_supp_node['Firm_Code']
for firm in self.model.a_lst_total_firms
])
@@ -345,7 +342,9 @@ class Model(ap.Model):
status, ts = firm.dct_prod_up_prod_stat[prod]['status'][-1]
if status == 'D':
firm.size -= \
firm.ori_size / len(firm.a_lst_product) / self.remove_t
firm.ori_size \
/ len(firm.dct_prod_up_prod_stat.keys()) \
/ self.remove_t
print(self.t, firm.name, prod.code, firm.size)
if self.t - ts + 1 == self.remove_t:
# turn disrupted firm into removed firm
@@ -432,10 +431,7 @@ class Model(ap.Model):
lst_size = self.a_lst_total_firms.size
lst_size = [firm.size for firm
in self.a_lst_total_firms
if product in firm.a_lst_product
and product
not in firm.a_lst_product_disrupted
]
if firm.is_prod_in_current_normal(product)]
std_size = (firm.size - min(lst_size) +
1) / (max(lst_size) - min(lst_size) + 1)
prob_disrupt = 1 - std_size * (1 - lost_percent)
@@ -449,7 +445,6 @@ class Model(ap.Model):
if self.nprandom.choice([True, False],
p=[prob_disrupt,
1 - prob_disrupt]):
firm.a_lst_product_disrupted.append(product)
firm.dct_prod_up_prod_stat[
product]['status'].append(('D', self.t))
print(firm.name, 'disrupted product:',