diff --git a/__pycache__/model.cpython-38.pyc b/__pycache__/model.cpython-38.pyc index da5cc09..26ebd3f 100644 Binary files a/__pycache__/model.cpython-38.pyc and b/__pycache__/model.cpython-38.pyc differ diff --git a/model.py b/model.py index dd600ea..296a2d2 100644 --- a/model.py +++ b/model.py @@ -19,7 +19,7 @@ class Model(ap.Model): self.dct_lst_remove_firm_prod = self.p.dct_lst_init_remove_firm_prod self.int_n_max_trial = int(self.p.n_max_trial) - self.int_netw_sply_prf_size = int(self.p.netw_sply_prf_n) + self.int_netw_sply_prf_n = int(self.p.netw_sply_prf_n) self.flt_netw_sply_prf_size = float(self.p.netw_sply_prf_size) self.str_cap_limit_prob_type = str(self.p.cap_limit_prob_type) self.flt_cap_limit_level = float(self.p.cap_limit_level) @@ -65,58 +65,111 @@ class Model(ap.Model): firm_prod_labels_dict[code] = firm_prod.loc[code].to_dict() nx.set_node_attributes(G_FirmProd, firm_prod_labels_dict) - # add edge to G_firm according to G_bom - for node in nx.nodes(G_Firm): - lst_pred_product_code = [] - for product_code in G_Firm.nodes[node]['Product_Code']: - lst_pred_product_code += list(G_bom.predecessors(product_code)) - lst_pred_product_code = list(set(lst_pred_product_code)) - # to generate consistant graph - lst_pred_product_code = list(sorted(lst_pred_product_code)) - for pred_product_code in lst_pred_product_code: - # for each product predecessor (component) the firm need - # get a list of firm producing this component - lst_pred_firm = \ - Firm['Code'][Firm[pred_product_code] == 1].to_list() - lst_pred_firm_size_damp = \ - [G_Firm.nodes[pred_firm]['Revenue_Log'] ** - self.flt_netw_sply_prf_size - for pred_firm in lst_pred_firm] - lst_prob = \ - [size_damp / sum(lst_pred_firm_size_damp) - for size_damp in lst_pred_firm_size_damp] - # select multiple supplier (multi-sourcing) - n_pred_firm = self.int_netw_sply_prf_size - lst_choose_firm = self.nprandom.choice(lst_pred_firm, - n_pred_firm, - replace=False, - p=lst_prob) - lst_add_edge = [(pred_firm, node, - {'Product': pred_product_code}) - for pred_firm in lst_choose_firm] - G_Firm.add_edges_from(lst_add_edge) + # # add edge to G_firm according to G_bom + # for node in nx.nodes(G_Firm): + # lst_pred_product_code = [] + # for product_code in G_Firm.nodes[node]['Product_Code']: + # lst_pred_product_code += list(G_bom.predecessors(product_code)) + # lst_pred_product_code = list(set(lst_pred_product_code)) + # # to generate consistant graph + # lst_pred_product_code = list(sorted(lst_pred_product_code)) + # for pred_product_code in lst_pred_product_code: + # # for each product predecessor (component) the firm need + # # get a list of firm producing this component + # lst_pred_firm = \ + # Firm['Code'][Firm[pred_product_code] == 1].to_list() + # lst_pred_firm_size_damp = \ + # [G_Firm.nodes[pred_firm]['Revenue_Log'] ** + # self.flt_netw_sply_prf_size + # for pred_firm in lst_pred_firm] + # lst_prob = \ + # [size_damp / sum(lst_pred_firm_size_damp) + # for size_damp in lst_pred_firm_size_damp] + # # select multiple supplier (multi-sourcing) + # n_pred_firm = self.int_netw_sply_prf_n + # if n_pred_firm > len(lst_pred_firm): + # n_pred_firm = len(lst_pred_firm) + # lst_choose_firm = self.nprandom.choice(lst_pred_firm, + # n_pred_firm, + # replace=False, + # p=lst_prob) + # lst_add_edge = [(pred_firm, node, + # {'Product': pred_product_code}) + # for pred_firm in lst_choose_firm] + # G_Firm.add_edges_from(lst_add_edge) - # graph firm prod - set_node_prod_code = set(G_Firm.nodes[node]['Product_Code']) - set_pred_succ_code = set(G_bom.successors(pred_product_code)) - lst_use_pred_prod_code = list( - set_node_prod_code & set_pred_succ_code) - for pred_firm in lst_choose_firm: - pred_node = [n for n, v in G_FirmProd.nodes(data=True) - if v['Firm_Code'] == pred_firm and - v['Product_Code'] == pred_product_code][0] - for use_pred_prod_code in lst_use_pred_prod_code: - current_node = \ - [n for n, v in G_FirmProd.nodes(data=True) - if v['Firm_Code'] == node and - v['Product_Code'] == use_pred_prod_code][0] - G_FirmProd.add_edge(pred_node, current_node) + # # graph firm prod + # set_node_prod_code = set(G_Firm.nodes[node]['Product_Code']) + # set_pred_succ_code = set(G_bom.successors(pred_product_code)) + # lst_use_pred_prod_code = list( + # set_node_prod_code & set_pred_succ_code) + # for pred_firm in lst_choose_firm: + # pred_node = [n for n, v in G_FirmProd.nodes(data=True) + # if v['Firm_Code'] == pred_firm and + # v['Product_Code'] == pred_product_code][0] + # for use_pred_prod_code in lst_use_pred_prod_code: + # current_node = \ + # [n for n, v in G_FirmProd.nodes(data=True) + # if v['Firm_Code'] == node and + # v['Product_Code'] == use_pred_prod_code][0] + # G_FirmProd.add_edge(pred_node, current_node) # nx.to_pandas_adjacency(G_Firm).to_csv('adj_g_firm.csv') # nx.to_pandas_adjacency(G_FirmProd).to_csv('adj_g_firm_prod.csv') # unconnected node - # for node in nx.nodes(G_Firm): - # if node. + for node in nx.nodes(G_Firm): + if G_Firm.degree(node) == 0: + for product_code in G_Firm.nodes[node]['Product_Code']: + # unconnect node does not have possible suppliers + lst_succ_product_code = list( + G_bom.successors(product_code)) + # different from for different types of product, + # finding a common supplier (the logic above), + # for different types of product, + # finding a custormer for each product + for succ_product_code in lst_succ_product_code: + # for each product successor (finished product) + # the firm sells to, + # get a list of firm producing this finished product + lst_succ_firm = \ + Firm['Code'][Firm[succ_product_code] == 1].to_list() + lst_succ_firm_size_damp = \ + [G_Firm.nodes[succ_firm]['Revenue_Log'] ** + self.flt_netw_cust_prf_size + for succ_firm in lst_succ_firm] + lst_prob = \ + [size_damp / sum(lst_succ_firm_size_damp) + for size_damp in lst_succ_firm_size_damp] + # select multiple customer (multi-selling) + n_succ_firm = self.int_netw_cust_prf_n + if n_succ_firm > len(lst_succ_firm): + n_succ_firm = len(lst_succ_firm) + lst_choose_firm = self.nprandom.choice(lst_succ_firm, + n_succ_firm, + replace=False, + p=lst_prob) + lst_add_edge = [(node, succ_firm, + {'Product': pred_product_code}) + for succ_firm in lst_choose_firm] + G_Firm.add_edges_from(lst_add_edge) + + # graph firm prod + set_node_prod_code = set( + G_Firm.nodes[node]['Product_Code']) + set_pred_succ_code = set( + G_bom.successors(pred_product_code)) + lst_use_pred_prod_code = list( + set_node_prod_code & set_pred_succ_code) + for pred_firm in lst_choose_firm: + pred_node = [n for n, v in G_FirmProd.nodes(data=True) + if v['Firm_Code'] == pred_firm and + v['Product_Code'] == pred_product_code][0] + for use_pred_prod_code in lst_use_pred_prod_code: + current_node = \ + [n for n, v in G_FirmProd.nodes(data=True) + if v['Firm_Code'] == node and + v['Product_Code'] == use_pred_prod_code][0] + G_FirmProd.add_edge(pred_node, current_node) self.sample.g_firm = json.dumps(nx.adjacency_data(G_Firm)) self.firm_network = ap.Network(self, G_Firm) diff --git a/test.ipynb b/test.ipynb index 6a6de56..04fe93a 100644 --- a/test.ipynb +++ b/test.ipynb @@ -239,6 +239,33 @@ " )\n", "print(lst_choose_firm)" ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Cannot take a larger sample than population when replace is False", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[9], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m nprandom \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mrandom\u001b[39m.\u001b[39mdefault_rng(\u001b[39m0\u001b[39m)\n\u001b[1;32m----> 2\u001b[0m lst_choose_firm \u001b[39m=\u001b[39m nprandom\u001b[39m.\u001b[39;49mchoice([\u001b[39m1\u001b[39;49m,\u001b[39m2\u001b[39;49m],\n\u001b[0;32m 3\u001b[0m \u001b[39m3\u001b[39;49m,\n\u001b[0;32m 4\u001b[0m replace\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m\n\u001b[0;32m 5\u001b[0m )\n\u001b[0;32m 6\u001b[0m lst_choose_firm\n", + "File \u001b[1;32m_generator.pyx:753\u001b[0m, in \u001b[0;36mnumpy.random._generator.Generator.choice\u001b[1;34m()\u001b[0m\n", + "\u001b[1;31mValueError\u001b[0m: Cannot take a larger sample than population when replace is False" + ] + } + ], + "source": [ + "nprandom = np.random.default_rng(0)\n", + "lst_choose_firm = nprandom.choice([1,2],\n", + " 3,\n", + " replace=False\n", + " )\n", + "lst_choose_firm" + ] } ], "metadata": {