From 45469830565dcc0ee337f23c01c740f9166fdf0b Mon Sep 17 00:00:00 2001 From: AEL-H Date: Fri, 24 Aug 2018 15:39:41 +0100 Subject: [PATCH 1/4] include agent.operational data --- insurancesimulation.py | 4 ++-- visualisation.py | 14 ++++++-------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/insurancesimulation.py b/insurancesimulation.py index f025830..413ae43 100644 --- a/insurancesimulation.py +++ b/insurancesimulation.py @@ -347,8 +347,8 @@ def save_data(self): # agent-level data - insurance_firms = [(insurancefirm.cash,insurancefirm.id) for insurancefirm in self.insurancefirms] - reinsurance_firms = [(reinsurancefirm.cash,reinsurancefirm.id) for reinsurancefirm in self.reinsurancefirms] + insurance_firms = [(insurancefirm.cash,insurancefirm.id,insurancefirm.operational) for insurancefirm in self.insurancefirms] + reinsurance_firms = [(reinsurancefirm.cash,reinsurancefirm.id,reinsurancefirm.operational) for reinsurancefirm in self.reinsurancefirms] self.history_logs['total_cash'].append(total_cash_no) diff --git a/visualisation.py b/visualisation.py index cf98cbf..3d3a4f8 100644 --- a/visualisation.py +++ b/visualisation.py @@ -1,14 +1,15 @@ # file to visualise agent-level data per timestep + import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation -# read in data for each agent for each timestep -# read in insurancefirm data +# read in data for each agent for each timestep + # read in insurancefirm data rfile = open("data/two_insurance_firms_cash.dat","r") insurance_firms_cash = [eval(k) for k in rfile] rfile.close() -# read in reinsurancefirm data + # read in reinsurancefirm data rfile = open("data/two_reinsurance_firms_cash.dat","r") reinsurance_firms_cash = [eval(k) for k in rfile] rfile.close() @@ -17,14 +18,13 @@ reinsurance_firms_cash = np.array(reinsurance_firms_cash) # shape (runs, steps) -print(insurance_firms_cash.shape) -print(reinsurance_firms_cash.shape) # let's look at only the first run first_run_insurance = insurance_firms_cash[0][:] first_run_reinsurance = reinsurance_firms_cash[0][:] class InsuranceFirmAnimation(object): + '''class takes in a run of insurance data and produces animations ''' def __init__(self, data): self.data = data self.fig, self.ax = plt.subplots() @@ -33,11 +33,9 @@ def __init__(self, data): init_func=self.setup_plot) def setup_plot(self): - """Initial drawing of the scatter plot.""" + """Initial drawing of the plots.""" casharr,idarr = next(self.stream) - self.pie = self.ax.pie(casharr, labels=idarr) - return self.pie, def data_stream(self): From b1443b16976ed06704dc14cee4dacfb8f66e4171 Mon Sep 17 00:00:00 2001 From: AEL-H Date: Fri, 24 Aug 2018 15:55:08 +0100 Subject: [PATCH 2/4] get operational value from agents --- catbond.py | 23 ++++++++------ insurancefirm.py | 10 ++++-- insurancesimulation.py | 55 +++++++++++++------------------- isleconfig.py | 1 + metainsuranceorg.py | 11 ++++--- riskmodel.py | 16 ++++++---- start.py | 72 +++++++++++++++++++----------------------- starter_four.sh | 0 starter_one.sh | 0 starter_three.sh | 0 starter_two.sh | 2 +- 11 files changed, 93 insertions(+), 97 deletions(-) mode change 100644 => 100755 starter_four.sh mode change 100644 => 100755 starter_one.sh mode change 100644 => 100755 starter_three.sh diff --git a/catbond.py b/catbond.py index b4a4827..e833e36 100644 --- a/catbond.py +++ b/catbond.py @@ -82,10 +82,11 @@ def iterate(self, time): """realize due payments""" self.effect_payments(time) - print(time, ":", self.id, len(self.underwritten_contracts), self.cash, self.operational) - - """mature contracts""" - print("Number of underwritten contracts ", len(self.underwritten_contracts)) + if isleconfig.verbose: + print(time, ":", self.id, len(self.underwritten_contracts), self.cash, self.operational) + + """mature contracts""" + print("Number of underwritten contracts ", len(self.underwritten_contracts)) maturing = [contract for contract in self.underwritten_contracts if contract.expiration <= time] for contract in maturing: self.underwritten_contracts.remove(contract) @@ -111,12 +112,14 @@ def parent_iterate(self, time): # TODO: split function so that only the s """realize due payments""" self.effect_payments(time) - print(time, ":", self.id, len(self.underwritten_contracts), self.cash, self.operational) + if isleconfig.verbose: + print(time, ":", self.id, len(self.underwritten_contracts), self.cash, self.operational) self.make_reinsurance_claims(time) """mature contracts""" - print("Number of underwritten contracts ", len(self.underwritten_contracts)) + if isleconfig.verbose: + print("Number of underwritten contracts ", len(self.underwritten_contracts)) maturing = [contract for contract in self.underwritten_contracts if contract.expiration <= time] for contract in maturing: self.underwritten_contracts.remove(contract) @@ -138,7 +141,7 @@ def parent_iterate(self, time): # TODO: split function so that only the s try: assert contracts_offered > 2 * contracts_dissolved except: - print("Something wrong; agent {0:d} receives too few new contracts {1:d} <= {2:d}".format(self.id, contracts_offered, 2*contracts_dissolved)) + print("Something wrong; agent {0:d} receives too few new contracts {1:d} <= {2:d}".format(self.id, contracts_offered, 2*contracts_dissolved), file=sys.stderr) #print(self.id, " has ", len(self.underwritten_contracts), " & receives ", contracts_offered, " & lost ", contracts_dissolved) new_nonproportional_risks = [risk for risk in new_risks if risk.get("insurancetype")=='excess-of-loss' and risk["owner"] is not self] @@ -183,7 +186,8 @@ def parent_iterate(self, time): # TODO: split function so that only the s new_risks = [risk for risk in new_risks if risk["category"] != categ_id] categ_risks = sorted(categ_risks, key = lambda risk: risk["risk_factor"]) i = 0 - print("InsuranceFirm underwrote: ", len(self.underwritten_contracts), " will accept: ", acceptable_by_category[categ_id], " out of ", len(categ_risks), "acceptance threshold: ", self.acceptance_threshold) + if isleconfig.verbose: + print("InsuranceFirm underwrote: ", len(self.underwritten_contracts), " will accept: ", acceptable_by_category[categ_id], " out of ", len(categ_risks), "acceptance threshold: ", self.acceptance_threshold) while (acceptable_by_category[categ_id] > 0 and len(categ_risks) > i): #\ #and categ_risks[i]["risk_factor"] < self.acceptance_threshold): if categ_risks[i].get("contract") is not None: #categ_risks[i]["reinsurance"]: @@ -231,7 +235,8 @@ def parent_iterate(self, time): # TODO: split function so that only the s def set_owner(self, owner): self.owner = owner - print("SOLD") + if isleconfig.verbose: + print("SOLD") #pdb.set_trace() def set_contract(self, contract): diff --git a/insurancefirm.py b/insurancefirm.py index 6874487..19c572d 100644 --- a/insurancefirm.py +++ b/insurancefirm.py @@ -3,6 +3,7 @@ import numba as nb import numpy as np from reinsurancecontract import ReinsuranceContract +import isleconfig class InsuranceFirm(MetaInsuranceOrg): """ReinsuranceFirm class. @@ -79,7 +80,8 @@ def increase_capacity(self, time, max_var): return capacity def increase_capacity_by_category(self, time, categ_id, reinsurance_price, cat_bond_price, force=False): - print("IF {0:d} increasing capacity in period {1:d}, cat bond price: {2:f}, reinsurance premium {3:f}".format(self.id, time, cat_bond_price, reinsurance_price)) + if isleconfig.verbose: + print("IF {0:d} increasing capacity in period {1:d}, cat bond price: {2:f}, reinsurance premium {3:f}".format(self.id, time, cat_bond_price, reinsurance_price)) if not force: actual_premium = self.get_average_premium(categ_id) possible_premium = self.simulation.get_market_premium() @@ -87,10 +89,12 @@ def increase_capacity_by_category(self, time, categ_id, reinsurance_price, cat_b return False '''on the basis of prices decide for obtaining reinsurance or for issuing cat bond''' if reinsurance_price > cat_bond_price: - print("IF {0:d} issuing Cat bond in period {1:d}".format(self.id, time)) + if isleconfig.verbose: + print("IF {0:d} issuing Cat bond in period {1:d}".format(self.id, time)) self.issue_cat_bond(time, categ_id) else: - print("IF {0:d} getting reinsurance in period {1:d}".format(self.id, time)) + if isleconfig.verbose: + print("IF {0:d} getting reinsurance in period {1:d}".format(self.id, time)) self.ask_reinsurance_non_proportional_by_category(time, categ_id) return True diff --git a/insurancesimulation.py b/insurancesimulation.py index 413ae43..265712d 100644 --- a/insurancesimulation.py +++ b/insurancesimulation.py @@ -182,7 +182,7 @@ def __init__(self, override_no_riskmodels, replic_ID, simulation_parameters): # lists for logging history - # TODO: Make history logging abstact; use a dict of variables instead + # DONE: Make history logging abstact; use a dict of variables instead # sum insurance firms @@ -269,8 +269,9 @@ def delete_agents(self, agent_class_string, agents): assert False, "Trying to remove unremovable agent, type: {0:s}".format(agent_class_string) def iterate(self, t): - print() - print(t, ": ", len(self.risks)) + if isleconfig.verbose: + print() + print(t, ": ", len(self.risks)) # adjust market premiums sum_capital = sum([agent.get_cash() for agent in self.insurancefirms]) #TODO: include reinsurancefirms @@ -286,13 +287,14 @@ def iterate(self, t): if len(self.rc_event_schedule[categ_id]) > 0: assert self.rc_event_schedule[categ_id][0] >= t except: - print("Something wrong; past events not deleted") + print("Something wrong; past events not deleted", file=sys.stderr) if len(self.rc_event_schedule[categ_id]) > 0 and self.rc_event_schedule[categ_id][0] == t: self.rc_event_schedule[categ_id] = self.rc_event_schedule[categ_id][1:] self.inflict_peril(categ_id=categ_id, t=t)# TODO: consider splitting the following lines from this method and running it with nb.jit else: - print("Next peril ", self.rc_event_schedule[categ_id]) + if isleconfig.verbose: + print("Next peril ", self.rc_event_schedule[categ_id]) # shuffle risks (insurance and reinsurance risks) self.shuffle_risks() @@ -390,7 +392,8 @@ def inflict_peril(self, categ_id, t): affected_contracts = [contract for insurer in self.insurancefirms for contract in insurer.underwritten_contracts if contract.category == categ_id] no_affected = len(affected_contracts) damage = self.damage_distribution.rvs() - print("**** PERIL ", damage) + if isleconfig.verbose: + print("**** PERIL ", damage) damagevalues = np.random.beta(1, 1./damage -1, size=no_affected) uniformvalues = np.random.uniform(0, 1, size=no_affected) [contract.explode(t, uniformvalues[i], damagevalues[i]) for i, contract in enumerate(affected_contracts)] @@ -412,7 +415,7 @@ def pay(self, amount, recipient): try: assert self.money_supply > amount except: - print("Something wrong: economy out of money") + print("Something wrong: economy out of money", file=sys.stderr) self.money_supply -= amount recipient.receive(amount) @@ -444,7 +447,8 @@ def reset_insurance_weights(self): self.insurancefirm_weights = np.int64(np.floor(self.insurancefirm_weights)) #self.insurancefirm_new_weights = [0 for i in self.insurancefirms] self.insurancefirm_new_weights = list(np.zeros(len(self.insurancefirms))) - print('@', self.insurancefirm_weights) + if isleconfig.verbose: + print('@', self.insurancefirm_weights) @nb.jit def shuffle_risks(self): @@ -496,14 +500,16 @@ def solicit_insurance_requests(self, id, cash): self.insurancefirm_new_weights[id] = cash risks_to_be_sent = self.risks[:int(self.insurancefirm_weights[id])] self.risks = self.risks[int(self.insurancefirm_weights[id]):] - print("Number of risks", len(risks_to_be_sent)) + if isleconfig.verbose: + print("Number of risks", len(risks_to_be_sent)) return risks_to_be_sent def solicit_reinsurance_requests(self, id, cash): self.reinsurancefirm_new_weights[id] = cash reinrisks_to_be_sent = self.reinrisks[:self.reinsurancefirm_weights[id]] self.reinrisks = self.reinrisks[self.reinsurancefirm_weights[id]:] - print("Number of risks",len(reinrisks_to_be_sent)) + if isleconfig.verbose: + print("Number of risks",len(reinrisks_to_be_sent)) return reinrisks_to_be_sent def return_risks(self, not_accepted_risks): @@ -596,17 +602,15 @@ def record_unrecovered_claims(self, loss): def log(self): if self.background_run: - if isleconfig.oneriskmodel: - to_log = self.replication_log_prepare_oneriskmodel() - else: - to_log = self.replication_log_prepare() + to_log = self.replication_log_prepare() else: to_log = self.single_log_prepare() + #TODO: use with file_handle as open structure for filename, data, operation_character in to_log: - wfile = open(filename, operation_character) - wfile.write(str(data) + "\n") - wfile.close() + with open(filename, operation_character) as wfile: + wfile.write(str(data) + "\n") + wfile.close() def replication_log_prepare(self): filename_prefix = {1: "one", 2: "two", 3: "three", 4: "four"} @@ -632,12 +636,7 @@ def replication_log_prepare(self): to_log.append(("data/" + fpf + "_insurance_firms_cash.dat", self.history_logs['insurance_firms_cash'], "a")) to_log.append(("data/" + fpf + "_reinsurance_firms_cash.dat", self.history_logs['reinsurance_firms_cash'], "a")) return to_log - - def replication_log_prepare_oneriskmodel(self): - return self.replication_log_prepare() - assert False, "Error: script should never reach this point" - return to_log - + def single_log_prepare(self): to_log = [] to_log.append(("data/operational.dat", self.history_logs['total_operational'], "w")) @@ -715,13 +714,3 @@ def get_unique_reinsurer_id(self): current_id = self.reinsurer_id_counter self.reinsurer_id_counter += 1 return current_id - - - - -#if __name__ == "__main__": -# arg = None -# if len(sys.argv) > 1: -# arg = int(sys.argv[1]) -# S = InsuranceSimulation(replic_ID = arg) -# S.run() diff --git a/isleconfig.py b/isleconfig.py index 44f8a37..fa89ca7 100644 --- a/isleconfig.py +++ b/isleconfig.py @@ -2,6 +2,7 @@ oneriskmodel = False replicating = False force_foreground = False +verbose = False simulation_parameters={"no_categories": 4, "no_insurancefirms": 20, diff --git a/metainsuranceorg.py b/metainsuranceorg.py index 259a54e..cb8b576 100644 --- a/metainsuranceorg.py +++ b/metainsuranceorg.py @@ -87,12 +87,14 @@ def iterate(self, time): # TODO: split function so that only the sequence """realize due payments""" self.effect_payments(time) - print(time, ":", self.id, len(self.underwritten_contracts), self.cash, self.operational) + if isleconfig.verbose: + print(time, ":", self.id, len(self.underwritten_contracts), self.cash, self.operational) self.make_reinsurance_claims(time) """mature contracts""" - print("Number of underwritten contracts ", len(self.underwritten_contracts)) + if isleconfig.verbose: + print("Number of underwritten contracts ", len(self.underwritten_contracts)) maturing = [contract for contract in self.underwritten_contracts if contract.expiration <= time] for contract in maturing: self.underwritten_contracts.remove(contract) @@ -114,7 +116,7 @@ def iterate(self, time): # TODO: split function so that only the sequence try: assert contracts_offered > 2 * contracts_dissolved except: - print("Something wrong; agent {0:d} receives too few new contracts {1:d} <= {2:d}".format(self.id, contracts_offered, 2*contracts_dissolved)) + print("Something wrong; agent {0:d} receives too few new contracts {1:d} <= {2:d}".format(self.id, contracts_offered, 2*contracts_dissolved),file=sys.stderr) #print(self.id, " has ", len(self.underwritten_contracts), " & receives ", contracts_offered, " & lost ", contracts_dissolved) new_nonproportional_risks = [risk for risk in new_risks if risk.get("insurancetype")=='excess-of-loss' and risk["owner"] is not self] @@ -177,7 +179,8 @@ def iterate(self, time): # TODO: split function so that only the sequence new_risks = [risk for risk in new_risks if risk["category"] != categ_id] categ_risks = sorted(categ_risks, key = lambda risk: risk["risk_factor"]) i = 0 - print("InsuranceFirm underwrote: ", len(self.underwritten_contracts), " will accept: ", acceptable_by_category[categ_id], " out of ", len(categ_risks), "acceptance threshold: ", self.acceptance_threshold) + if isleconfig.verbose: + print("InsuranceFirm underwrote: ", len(self.underwritten_contracts), " will accept: ", acceptable_by_category[categ_id], " out of ", len(categ_risks), "acceptance threshold: ", self.acceptance_threshold) while (acceptable_by_category[categ_id] > 0 and len(categ_risks) > i): #\ #and categ_risks[i]["risk_factor"] < self.acceptance_threshold): if categ_risks[i].get("contract") is not None: #categ_risks[i]["reinsurance"]: diff --git a/riskmodel.py b/riskmodel.py index c416ac4..8e937a1 100644 --- a/riskmodel.py +++ b/riskmodel.py @@ -4,7 +4,7 @@ import sys, pdb import scipy.stats import numba as nb - +import isleconfig from distributionreinsurance import ReinsuranceDistWrapper @@ -122,8 +122,9 @@ def evaluate_proportional(self, risks, cash): # record liquidity requirement and apply margin of safety for liquidity requirement necessary_liquidity += var_per_risk * self.margin_of_safety * len(categ_risks) #print("RISKMODEL: ", self.getPPF(categ_id=categ_id, tailSize=0.01) * average_risk_factor * average_exposure, " = PPF(0.01) * ", average_risk_factor, " * ", average_exposure, " vs. cash: ", cash[categ_id], "TOTAL_RISK_IN_CATEG: ", self.getPPF(categ_id=categ_id, tailSize=0.01) * average_risk_factor * average_exposure * len(categ_risks)) - print(self.inaccuracy) - print("RISKMODEL: ", var_per_risk, " = PPF(0.02) * ", average_risk_factor, " * ", average_exposure, " vs. cash: ", cash[categ_id], "TOTAL_RISK_IN_CATEG: ", var_per_risk * len(categ_risks)) + if isleconfig.verbose: + print(self.inaccuracy) + print("RISKMODEL: ", var_per_risk, " = PPF(0.02) * ", average_risk_factor, " * ", average_exposure, " vs. cash: ", cash[categ_id], "TOTAL_RISK_IN_CATEG: ", var_per_risk * len(categ_risks)) #print("RISKMODEL: ", self.getPPF(categ_id=categ_id, tailSize=0.05) * average_risk_factor * average_exposure, " = PPF(0.05) * ", average_risk_factor, " * ", average_exposure, " vs. cash: ", cash[categ_id], "TOTAL_RISK_IN_CATEG: ", self.getPPF(categ_id=categ_id, tailSize=0.05) * average_risk_factor * average_exposure * len(categ_risks)) #print("RISKMODEL: ", self.getPPF(categ_id=categ_id, tailSize=0.1) * average_risk_factor * average_exposure, " = PPF(0.1) * ", average_risk_factor, " * ", average_exposure, " vs. cash: ", cash[categ_id], "TOTAL_RISK_IN_CATEG: ", self.getPPF(categ_id=categ_id, tailSize=0.1) * average_risk_factor * average_exposure * len(categ_risks)) #print("RISKMODEL: ", self.getPPF(categ_id=categ_id, tailSize=0.25) * average_risk_factor * average_exposure, " = PPF(0.25) * ", average_risk_factor, " * ", average_exposure, " vs. cash: ", cash[categ_id], "TOTAL_RISK_IN_CATEG: ", self.getPPF(categ_id=categ_id, tailSize=0.25) * average_risk_factor * average_exposure * len(categ_risks)) @@ -151,13 +152,13 @@ def evaluate_proportional(self, risks, cash): expected_profits = self.init_profit_estimate * cash[0] else: expected_profits /= necessary_liquidity - + max_category = max(cash_left_by_category) remaining_acceptable_by_category[categ_id] = math.floor( remaining_acceptable_by_category[categ_id] * pow( cash_left_by_category[categ_id] / max_category, 5)) - - print("RISKMODEL returns: ", expected_profits, remaining_acceptable_by_category) + if isleconfig.verbose: + print("RISKMODEL returns: ", expected_profits, remaining_acceptable_by_category) return expected_profits, remaining_acceptable_by_category, cash_left_by_category, var_per_risk_per_categ def evaluate_excess_of_loss(self, risks, cash, offered_risk = None): @@ -229,7 +230,8 @@ def evaluate(self, risks, cash, offered_risk = None): return expected_profits_proportional, remaining_acceptable_by_categ, var_per_risk_per_categ, min(cash_left_by_categ) else: # return boolean value whether the offered excess_of_loss risk can be accepted - print ("REINSURANCE RISKMODEL", cash, cash_left_by_categ, (cash_left_by_categ - additional_required > 0).all()) + if isleconfig.verbose: + print ("REINSURANCE RISKMODEL", cash, cash_left_by_categ, (cash_left_by_categ - additional_required > 0).all()) #if not (cash_left_by_categ - additional_required > 0).all(): # pdb.set_trace() return (cash_left_by_categ - additional_required > 0).all(), var_this_risk, min(cash_left_by_categ) diff --git a/start.py b/start.py index dcc4de0..7e46fe5 100644 --- a/start.py +++ b/start.py @@ -4,6 +4,7 @@ import math import sys, pdb import numba as nb +import argparse # import config file and apply configuration import isleconfig @@ -12,49 +13,40 @@ replic_ID = None override_no_riskmodels = False -# handle command line arguments -if (len(sys.argv) > 1): - if "--abce" in sys.argv: - # if command line argument --abce is given, override use_abce from config file - argument_idx = sys.argv.index("--abce") - assert len(sys.argv) > argument_idx + 1, "Error: No argument given for keyword --abce" - isleconfig.use_abce = True if int(sys.argv[argument_idx + 1]) == 1 else False - if "--oneriskmodel" in sys.argv: - # allow overriding the number of riskmodels from standard config (with 1) - isleconfig.oneriskmodel = True - override_no_riskmodels = 1 - if "--riskmodels" in sys.argv: - # allow overriding the number of riskmodels from standard config (with 1 or other numbers) - argument_idx = sys.argv.index("--riskmodels") - assert len(sys.argv) > argument_idx + 1, "Error: No argument given for keyword --riskmodels" - override_no_riskmodels = int(sys.argv[argument_idx + 1]) - if "--replicid" in sys.argv: - # if replication ID is given, pass this to the simulation so that the risk profile can be restored - argument_idx = sys.argv.index("--replicid") - assert len(sys.argv) > argument_idx + 1, "Error: No argument given for keyword --replicid" - replic_ID = int(sys.argv[argument_idx + 1]) - if "--replicating" in sys.argv: - # if this is a simulation run designed to replicate another, override the config filr parameter - isleconfig.replicating = True - assert replic_ID is not None, "Error: Replication requires a replication ID to identify run to be replicated" - if "--randomseed" in sys.argv: - # allow setting of numpy random seed - argument_idx = sys.argv.index("--randomseed") - assert len(sys.argv) > argument_idx + 1, "Error: No argument given for keyword --randomseed" - randomseed = float(sys.argv[argument_idx + 1]) - seed = int(randomseed) - else: - # allow setting of numpy random seed - np.random.seed() - seed = np.random.randint(0, 2 ** 31 - 1) - if "--foreground" in sys.argv: - # force foreground runs even if replication ID is given (which defaults to background runs) - isleconfig.force_foreground = True +# use argparse to handle command line arguments +parser = argparse.ArgumentParser(description='Model the Insurance sector') +parser.add_argument("--abce", action="store_true", help="use abce") +parser.add_argument("--oneriskmodel", action="store_true", help="allow overriding the number of riskmodels from the standard config (with 1)") +parser.add_argument("--riskmodels", type=int, choices=[1,2,3,4], help="allow overriding the number of riskmodels from standard config (with 1 or other numbers)") +parser.add_argument("--replicid", type=int, help="if replication ID is given, pass this to the simulation so that the risk profile can be restored") +parser.add_argument("--replicating", action="store_true", help="if this is a simulation run designed to replicate another, override the config file parameter") +parser.add_argument("--randomseed", type=float, help="allow setting of numpy random seed") +parser.add_argument("--foreground", action="store_true", help="force foreground runs even if replication ID is given (which defaults to background runs)") +parser.add_argument("-v", "--verbose", action="store_true", help="more detailed output") +args = parser.parse_args() + +if args.abce: + isleconfig.use_abce = True +if args.oneriskmodel: + isleconfig.oneriskmodel = True + override_no_riskmodels = 1 +if args.riskmodels: + override_no_riskmodels = args.riskmodels +if args.replicid: + replic_ID = args.replicid +if args.replicating: + isleconfig.replicating = True + assert replic_ID is not None, "Error: Replication requires a replication ID to identify run to be replicated" +if args.randomseed: + randomseed = args.randomseed + seed = int(randomseed) else: - # allow setting of numpy random seed np.random.seed() seed = np.random.randint(0, 2 ** 31 - 1) - +if args.foreground: + isleconfig.force_foreground = True +if args.verbose: + isleconfig.verbose = True # import isle and abce modules if isleconfig.use_abce: diff --git a/starter_four.sh b/starter_four.sh old mode 100644 new mode 100755 diff --git a/starter_one.sh b/starter_one.sh old mode 100644 new mode 100755 diff --git a/starter_three.sh b/starter_three.sh old mode 100644 new mode 100755 diff --git a/starter_two.sh b/starter_two.sh index 703ae22..1500636 100755 --- a/starter_two.sh +++ b/starter_two.sh @@ -8,7 +8,7 @@ mv data/two_reincontracts.dat data/two_reincontracts.dat_$(date +%Y_%h_%d_%H_%M) mv data/two_reincash.dat data/two_reincash.dat_$(date +%Y_%h_%d_%H_%M) mv data/two_premium.dat data/two_premium.dat_$(date +%Y_%h_%d_%H_%M) -for ((i=0; i<300; i++)) do +for ((i=0; i<2; i++)) do #python insurancesimulation.py $i python start.py --abce 0 --replicid $i done From 0c8e4af81775acca71a299b7265f37bb52962d1c Mon Sep 17 00:00:00 2001 From: AEL-H Date: Fri, 24 Aug 2018 16:44:47 +0100 Subject: [PATCH 3/4] included agent.operational --- visualisation.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/visualisation.py b/visualisation.py index 3d3a4f8..92ab0f4 100644 --- a/visualisation.py +++ b/visualisation.py @@ -6,11 +6,11 @@ # read in data for each agent for each timestep # read in insurancefirm data -rfile = open("data/two_insurance_firms_cash.dat","r") +rfile = open("data/insurance_firms_cash.dat","r") insurance_firms_cash = [eval(k) for k in rfile] rfile.close() # read in reinsurancefirm data -rfile = open("data/two_reinsurance_firms_cash.dat","r") +rfile = open("data/reinsurance_firms_cash.dat","r") reinsurance_firms_cash = [eval(k) for k in rfile] rfile.close() @@ -42,9 +42,10 @@ def data_stream(self): for timestep in self.data: casharr = [] idarr = [] - for (cash, id) in timestep: - casharr.append(cash) - idarr.append(id) + for (cash, id, operational) in timestep: + if operational: + casharr.append(cash) + idarr.append(id) yield casharr,idarr def update(self, i): @@ -61,5 +62,5 @@ def save(self): def show(self): plt.show() -anim = InsuranceFirmAnimation(first_run_reinsurance) +anim = InsuranceFirmAnimation(first_run_insurance) anim.show() From 8599f7c32931f36086b983eb4c19e9cdec4c6541 Mon Sep 17 00:00:00 2001 From: AEL-H Date: Tue, 28 Aug 2018 16:07:58 +0100 Subject: [PATCH 4/4] added format strings for the plot titles, display insurers and reinsurers side by side in sync --- visualisation.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/visualisation.py b/visualisation.py index 92ab0f4..632d19f 100644 --- a/visualisation.py +++ b/visualisation.py @@ -29,13 +29,13 @@ def __init__(self, data): self.data = data self.fig, self.ax = plt.subplots() self.stream = self.data_stream() - self.ani = animation.FuncAnimation(self.fig, self.update, interval=40, + self.ani = animation.FuncAnimation(self.fig, self.update, repeat=False, interval=40, init_func=self.setup_plot) def setup_plot(self): """Initial drawing of the plots.""" casharr,idarr = next(self.stream) - self.pie = self.ax.pie(casharr, labels=idarr) + self.pie = self.ax.pie(casharr, labels=idarr,autopct='%1.0f%%') return self.pie, def data_stream(self): @@ -52,15 +52,18 @@ def update(self, i): self.ax.clear() self.ax.axis('equal') casharr,idarr = next(self.stream) - self.pie = self.ax.pie(casharr, labels=idarr) - self.ax.set_title("Timestep : " + str(i)) + self.pie = self.ax.pie(casharr, labels=idarr,autopct='%1.0f%%') + self.ax.set_title("Timestep : {:,.0f} | Total cash : {:,.0f}".format(i,sum(casharr))) return self.pie, - def save(self): - self.ani.save('line.mp4', writer='ffmpeg', dpi=80) + def save(self,filename): + self.ani.save(filename, writer='ffmpeg', dpi=80) def show(self): plt.show() -anim = InsuranceFirmAnimation(first_run_insurance) -anim.show() +anim1 = InsuranceFirmAnimation(first_run_insurance) +anim2 = InsuranceFirmAnimation(first_run_reinsurance) +#anim1.save("insurance.mp4") +#anim2.save("reinsurance.mp4") +plt.show()