diff --git a/__pycache__/controller_db.cpython-38.pyc b/__pycache__/controller_db.cpython-38.pyc index 7c1cb97..84efc08 100644 Binary files a/__pycache__/controller_db.cpython-38.pyc and b/__pycache__/controller_db.cpython-38.pyc differ diff --git a/__pycache__/firm.cpython-38.pyc b/__pycache__/firm.cpython-38.pyc index b909410..c41df15 100644 Binary files a/__pycache__/firm.cpython-38.pyc and b/__pycache__/firm.cpython-38.pyc differ diff --git a/__pycache__/model.cpython-38.pyc b/__pycache__/model.cpython-38.pyc index c6eb21f..d3844ca 100644 Binary files a/__pycache__/model.cpython-38.pyc and b/__pycache__/model.cpython-38.pyc differ diff --git a/__pycache__/orm.cpython-38.pyc b/__pycache__/orm.cpython-38.pyc index e9f3b53..03a1404 100644 Binary files a/__pycache__/orm.cpython-38.pyc and b/__pycache__/orm.cpython-38.pyc differ diff --git a/firm.py b/firm.py index 9ba553f..5428e4a 100644 --- a/firm.py +++ b/firm.py @@ -29,14 +29,14 @@ class FirmAgent(ap.Agent): self.flt_crit_supplier = float(self.p.crit_supplier) # init size_stat (self para) - # (size, time step), ts -1 denotes initialization - self.size_stat.append((revenue_log, -1)) + # (size, time step) + self.size_stat.append((revenue_log, 0)) # init dct_prod_up_prod_stat (self para) for prod in a_lst_product: self.dct_prod_up_prod_stat[prod] = { # (Normal / Disrupted / Removed, time step) - 'status': [('N', -1)], # ts -1 denotes initialization + 'status': [('N', 0)], # have or have no supply 'supply': dict.fromkeys(prod.a_predecessors(), True) } @@ -294,6 +294,11 @@ class FirmAgent(ap.Agent): def clean_before_trial(self): self.dct_request_prod_from_firm = {} + for prod in self.dct_prod_up_prod_stat.keys(): + status, ts = self.dct_prod_up_prod_stat[prod]['status'][-1] + if ts != self.model.t: + self.dct_prod_up_prod_stat[prod]['status'].append( + (status, self.model.t)) def clean_before_time_step(self): self.dct_n_trial_up_prod_disrupted = \ diff --git a/model.py b/model.py index 352e8d2..8ae7b8c 100644 --- a/model.py +++ b/model.py @@ -17,7 +17,8 @@ class Model(ap.Model): self.product_network = None # agentpy network self.firm_network = None # agentpy network self.firm_prod_network = None # networkx - self.dct_lst_disrupt_firm_prod = self.p.dct_lst_init_disrupt_firm_prod + self.dct_lst_init_disrupt_firm_prod = \ + self.p.dct_lst_init_disrupt_firm_prod # external variable self.int_n_max_trial = int(self.p.n_max_trial) @@ -209,19 +210,20 @@ class Model(ap.Model): self.firm_network.add_agents([firm_agent], [ag_node]) self.a_lst_total_firms = ap.AgentList(self, self.firm_network.agents) - # init dct_lst_disrupt_firm_prod (from string to agent) + # init dct_lst_init_disrupt_firm_prod (from string to agent) t_dct = {} - for firm_code, lst_product in self.dct_lst_disrupt_firm_prod.items(): + for firm_code, lst_product in \ + self.dct_lst_init_disrupt_firm_prod.items(): firm = self.a_lst_total_firms.select( self.a_lst_total_firms.code == firm_code)[0] t_dct[firm] = self.a_lst_total_products.select([ code in lst_product for code in self.a_lst_total_products.code ]) - self.dct_lst_disrupt_firm_prod = t_dct + self.dct_lst_init_disrupt_firm_prod = t_dct # set the initial firm product that are disrupted print('\n', '=' * 20, 'step', self.t, '=' * 20) - for firm, a_lst_product in self.dct_lst_disrupt_firm_prod.items(): + for firm, a_lst_product in self.dct_lst_init_disrupt_firm_prod.items(): for product in a_lst_product: assert product in firm.dct_prod_up_prod_stat.keys(), \ f"product {product.code} not in firm {firm.code}" @@ -231,7 +233,7 @@ class Model(ap.Model): # proactive strategy # get all the firm prod affected - for firm, a_lst_product in self.dct_lst_disrupt_firm_prod.items(): + for firm, a_lst_product in self.dct_lst_init_disrupt_firm_prod.items(): for product in a_lst_product: init_node = \ [n for n, v in @@ -349,8 +351,13 @@ class Model(ap.Model): firm.size_stat.append((size, self.t)) print(f'in ts {self.t}, reduce {firm.name} size ' f'to {firm.size_stat[-1][0]} due to {prod.code}') - if self.t - ts + 1 == self.remove_t: + lst_is_disrupt = \ + [stat == 'D' for stat, _ in + firm.dct_prod_up_prod_stat[prod]['status'] + [-1 * self.remove_t:]] + if all(lst_is_disrupt): # turn disrupted firm into removed firm + # when last self.remove_t times status is all disrupted firm.dct_prod_up_prod_stat[ prod]['status'].append(('R', self.t)) @@ -358,8 +365,11 @@ class Model(ap.Model): if self.t > 0: for firm in self.a_lst_total_firms: for prod in firm.dct_prod_up_prod_stat.keys(): - status, ts = firm.dct_prod_up_prod_stat[prod]['status'][-1] - if status == 'D' and ts != 0: + status, _ = firm.dct_prod_up_prod_stat[prod]['status'][-1] + is_init = \ + firm in self.dct_lst_init_disrupt_firm_prod.keys() \ + and prod in self.dct_lst_init_disrupt_firm_prod[firm] + if status == 'D' and not is_init: print("not stop because", firm.name, prod.code) break else: @@ -422,45 +432,30 @@ class Model(ap.Model): def end(self): print('/' * 20, 'output', '/' * 20) - for firm in self.a_lst_total_firms: - is_size = False - for prod, dct_status_supply in firm.dct_prod_up_prod_stat.items(): - if len(dct_status_supply['status']) > 1: - is_size = True - print(f"{firm.name} {prod.code}:") - print(dct_status_supply['status']) - if is_size: - print(firm.size_stat) - - # qry_result = db_session.query(Result).filter_by(s_id=self.sample.id) - # if qry_result.count() == 0: - # lst_result_info = [] - # for t, dct in self.lst_dct_lst_disrupt_firm_prod: - # for firm, a_lst_product in dct.items(): - # for product in a_lst_product: - # db_r = Result(s_id=self.sample.id, - # id_firm=firm.code, - # id_product=product.code, - # ts=t, - # is_disrupted=True) - # lst_result_info.append(db_r) - # db_session.bulk_save_objects(lst_result_info) - # db_session.commit() - # for t, dct in self.lst_dct_lst_disrupt_firm_prod: - # for firm, a_lst_product in dct.items(): - # for product in a_lst_product: - # # only firm disrupted can be removed theoretically - # qry_f_p = db_session.query(Result).filter( - # Result.s_id == self.sample.id, - # Result.id_firm == firm.code, - # Result.id_product == product.code) - # if qry_f_p.count() == 1: - # qry_f_p.update({"is_removed": True}) - # db_session.commit() - # self.sample.is_done_flag = 1 - # self.sample.computer_name = platform.node() - # self.sample.stop_t = self.int_stop_ts - # db_session.commit() + qry_result = db_session.query(Result).filter_by(s_id=self.sample.id) + if qry_result.count() == 0: + lst_result_info = [] + for firm in self.a_lst_total_firms: + for prod, dct_status_supply in \ + firm.dct_prod_up_prod_stat.items(): + lst_is_normal = [stat == 'N' for stat, _ + in dct_status_supply['status']] + if not all(lst_is_normal): + print(f"{firm.name} {prod.code}:") + print(dct_status_supply['status']) + for status, ts in dct_status_supply['status']: + db_r = Result(s_id=self.sample.id, + id_firm=firm.code, + id_product=prod.code, + ts=ts, + status=status) + lst_result_info.append(db_r) + db_session.bulk_save_objects(lst_result_info) + db_session.commit() + self.sample.is_done_flag = 1 + self.sample.computer_name = platform.node() + self.sample.stop_t = self.int_stop_ts + db_session.commit() def draw_network(self): import matplotlib.pyplot as plt diff --git a/orm.py b/orm.py index a955bf1..649bff0 100644 --- a/orm.py +++ b/orm.py @@ -105,8 +105,7 @@ class Result(Base): id_firm = Column(String(10), nullable=False) id_product = Column(String(10), nullable=False) ts = Column(Integer, nullable=False) - is_disrupted = Column(Boolean, nullable=True) - is_removed = Column(Boolean, nullable=True) + status = Column(String(5), nullable=False) sample = relationship('Sample', back_populates='result', uselist=False) diff --git a/test.ipynb b/test.ipynb index 83d5656..e52427d 100644 --- a/test.ipynb +++ b/test.ipynb @@ -317,6 +317,46 @@ "print(27 / (4 * 3))\n", "print(27 / 4 / 3)" ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(1,1):\n", + " print(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n" + ] + }, + { + "data": { + "text/plain": [ + "[6, 7, 8, 9, 10]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lst = list(range(1,11))\n", + "print(lst)\n", + "\n", + "lst[-5:]" + ] } ], "metadata": {