diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..edf9dae --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [{ + "name": "Python: Current File with profiler", + "type": "python", + "request": "launch", + "module": "cProfile", + "args": [ + "-o", "tmp.prof", "${file}" + ] + }, + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/econ/__pycache__/exchange.cpython-310.pyc b/econ/__pycache__/exchange.cpython-310.pyc new file mode 100644 index 0000000..94d7f36 Binary files /dev/null and b/econ/__pycache__/exchange.cpython-310.pyc differ diff --git a/econ/__pycache__/exchange.cpython-38.pyc b/econ/__pycache__/exchange.cpython-38.pyc index 31b3e60..dc2fb53 100644 Binary files a/econ/__pycache__/exchange.cpython-38.pyc and b/econ/__pycache__/exchange.cpython-38.pyc differ diff --git a/econ/__pycache__/simulation.cpython-310.pyc b/econ/__pycache__/simulation.cpython-310.pyc new file mode 100644 index 0000000..16ff743 Binary files /dev/null and b/econ/__pycache__/simulation.cpython-310.pyc differ diff --git a/econ/__pycache__/simulation.cpython-38.pyc b/econ/__pycache__/simulation.cpython-38.pyc index 220c4a6..acb7c7a 100644 Binary files a/econ/__pycache__/simulation.cpython-38.pyc and b/econ/__pycache__/simulation.cpython-38.pyc differ diff --git a/econ/agents/__pycache__/autoproduction.cpython-310.pyc b/econ/agents/__pycache__/autoproduction.cpython-310.pyc new file mode 100644 index 0000000..8d5cb15 Binary files /dev/null and b/econ/agents/__pycache__/autoproduction.cpython-310.pyc differ diff --git a/econ/agents/__pycache__/base_agent.cpython-310.pyc b/econ/agents/__pycache__/base_agent.cpython-310.pyc new file mode 100644 index 0000000..de80bed Binary files /dev/null and b/econ/agents/__pycache__/base_agent.cpython-310.pyc differ diff --git a/econ/agents/__pycache__/base_aquire_agent.cpython-310.pyc b/econ/agents/__pycache__/base_aquire_agent.cpython-310.pyc new file mode 100644 index 0000000..2d5a95e Binary files /dev/null and b/econ/agents/__pycache__/base_aquire_agent.cpython-310.pyc differ diff --git a/econ/agents/__pycache__/base_distribution_agent.cpython-310.pyc b/econ/agents/__pycache__/base_distribution_agent.cpython-310.pyc new file mode 100644 index 0000000..35d69b6 Binary files /dev/null and b/econ/agents/__pycache__/base_distribution_agent.cpython-310.pyc differ diff --git a/econ/agents/__pycache__/base_distribution_agent.cpython-38.pyc b/econ/agents/__pycache__/base_distribution_agent.cpython-38.pyc index 92ef9dd..c10894e 100644 Binary files a/econ/agents/__pycache__/base_distribution_agent.cpython-38.pyc and b/econ/agents/__pycache__/base_distribution_agent.cpython-38.pyc differ diff --git a/econ/agents/__pycache__/price_believe_aquire.cpython-310.pyc b/econ/agents/__pycache__/price_believe_aquire.cpython-310.pyc new file mode 100644 index 0000000..7b5177c Binary files /dev/null and b/econ/agents/__pycache__/price_believe_aquire.cpython-310.pyc differ diff --git a/econ/agents/__pycache__/price_believe_distribute.cpython-310.pyc b/econ/agents/__pycache__/price_believe_distribute.cpython-310.pyc new file mode 100644 index 0000000..accced4 Binary files /dev/null and b/econ/agents/__pycache__/price_believe_distribute.cpython-310.pyc differ diff --git a/econ/agents/base_distribution_agent.py b/econ/agents/base_distribution_agent.py index dba6bc3..a8b8042 100644 --- a/econ/agents/base_distribution_agent.py +++ b/econ/agents/base_distribution_agent.py @@ -94,6 +94,7 @@ class Base_Distribution_Agent(BaseAgent,ABC): if k in cx.order_trades_map: trades.append(cx.order_trades_map[k]) self.trades=trades + return trades diff --git a/econ/agents/price_believe_aquire.py b/econ/agents/price_believe_aquire.py index 26179ed..71388a3 100644 --- a/econ/agents/price_believe_aquire.py +++ b/econ/agents/price_believe_aquire.py @@ -104,5 +104,6 @@ class Price_Believe_Aquire_Agent(Base_Aquire_Agent): self.collect_resource_from_cxs(self.resource) # book keeping self.update_trades() - + self.open_orders={i: [] for i in range(len(self.exchanges))} + self.orders={i: {} for i in range(len(self.exchanges))} return super().reset(episode) \ No newline at end of file diff --git a/econ/agents/price_believe_distribute.py b/econ/agents/price_believe_distribute.py index 76ae0bc..fdf33f5 100644 --- a/econ/agents/price_believe_distribute.py +++ b/econ/agents/price_believe_distribute.py @@ -101,5 +101,6 @@ class Price_Believe_Distribiute_Agent(Base_Distribution_Agent): self.collect_resource_from_cxs(self.resource) # book keeping self.update_trades() - + self.open_orders={i: [] for i in range(len(self.exchanges))} + self.orders={i: {} for i in range(len(self.exchanges))} return super().reset(episode) \ No newline at end of file diff --git a/econ/business/Price_Believe_Business.py b/econ/business/Price_Believe_Business.py index c1df810..1d67158 100644 --- a/econ/business/Price_Believe_Business.py +++ b/econ/business/Price_Believe_Business.py @@ -31,7 +31,7 @@ class Price_Believe_Business(Business): return self.distribute.open_qty+self.inventory[self.production["name"]] def close_business(self): - for a in self.aquire: + for k,a in self.aquire.items(): a.unregister() self.distribute.unregister() - self.production.unregister() \ No newline at end of file + self.craft.unregister() \ No newline at end of file diff --git a/econ/business/__pycache__/Price_Believe_Business.cpython-310.pyc b/econ/business/__pycache__/Price_Believe_Business.cpython-310.pyc new file mode 100644 index 0000000..569f977 Binary files /dev/null and b/econ/business/__pycache__/Price_Believe_Business.cpython-310.pyc differ diff --git a/econ/business/__pycache__/base_business.cpython-310.pyc b/econ/business/__pycache__/base_business.cpython-310.pyc new file mode 100644 index 0000000..de521ee Binary files /dev/null and b/econ/business/__pycache__/base_business.cpython-310.pyc differ diff --git a/econ/cells/__pycache__/cell.cpython-310.pyc b/econ/cells/__pycache__/cell.cpython-310.pyc new file mode 100644 index 0000000..8b3d78f Binary files /dev/null and b/econ/cells/__pycache__/cell.cpython-310.pyc differ diff --git a/econ/cells/__pycache__/db.cpython-310.pyc b/econ/cells/__pycache__/db.cpython-310.pyc new file mode 100644 index 0000000..0c5ef01 Binary files /dev/null and b/econ/cells/__pycache__/db.cpython-310.pyc differ diff --git a/econ/commoditys/__pycache__/commoditys.cpython-310.pyc b/econ/commoditys/__pycache__/commoditys.cpython-310.pyc new file mode 100644 index 0000000..e4b0cd2 Binary files /dev/null and b/econ/commoditys/__pycache__/commoditys.cpython-310.pyc differ diff --git a/econ/exchange.py b/econ/exchange.py index 4304d51..ce5835d 100644 --- a/econ/exchange.py +++ b/econ/exchange.py @@ -33,6 +33,7 @@ class Exchange(): self.demand={} self.total_supply={} self.supply={} + self.traded_commoditys={} def add_to_account(self,account_id,resource,amount): """ @@ -241,6 +242,7 @@ class Exchange(): self.best_ask[resource]=best_ask self.best_bid[resource]=best_bid + self.traded_commoditys[resource]=True def get_account_resource_amount(self,account_id,resource): """ @@ -260,25 +262,23 @@ class Exchange(): return self.total_supply[resource] return 0 - def log_step(self,name,episode,episode_length,step): + def log_step(self,name,episode,episode_length,step,autolog=True): timepoint=episode*episode_length+step localStepDB={} - data={} - data["cxid"]=name - data["episode"]=episode - data["step"]=step - data["tstep"]=timepoint - data["instrm"]="None" - data["best_ask"]=-1 - data["best_bid"]=-1 - data["total_demand"]=-1 - data["total_supply"]=-1 - data["market_rate"]=-1 - for id,order in self.orders.items(): - t=data.copy() - t["instrm"]=order.instmt - localStepDB[order.instmt]=t + for instrm,order in self.traded_commoditys.items(): + data={} + data["cxid"]=name + data["episode"]=episode + data["step"]=step + data["tstep"]=timepoint + data["instrm"]=instrm + data["best_ask"]=0 + data["best_bid"]=0 + data["total_demand"]=0 + data["total_supply"]=0 + data["market_rate"]=0 + localStepDB[instrm]=data ## add best ask/best bid for item , value in self.best_ask.items(): @@ -299,9 +299,10 @@ class Exchange(): if value!=None: localStepDB[item]["market_rate"]=value - for id,item in localStepDB.items(): - log.EXBooksData.append(item) - return data + if autolog: + for id,item in localStepDB.items(): + log.EXBooksData.append(item) + return localStepDB def log_episode(self,name,episode): for t in self.executed_trades: diff --git a/econ/simulation.py b/econ/simulation.py index 3f17564..7af50ed 100644 --- a/econ/simulation.py +++ b/econ/simulation.py @@ -4,13 +4,15 @@ from .exchange import Exchange from .business import Price_Believe_Business import uuid import time - - +import logging +from concurrent.futures import ThreadPoolExecutor +import log class Simulation(): """ Class for controlling the different calculation steps of the Simulation. """ def __init__(self) -> None: + self.timings={} self.tick_funcs={} self.reset_funcs={} self.tick_count=0 @@ -19,6 +21,9 @@ class Simulation(): self.populated_cells={} self.businesses=[] self.production_util={} + self.taskpool=ThreadPoolExecutor() + + self.setup_timing(["dss","dsa","dab","dbl","dt"]) for k in cm.productions.items(): l=k[1] for i in l: @@ -75,11 +80,19 @@ class Simulation(): for b in self.businesses: b.tick(self.tick_count) if b.balance<=0: - self.close_business(b.id) + self.remove_business(b.id) busstep=time.time() self.tick_count+=1 self.log_cxs_tick(episode_length) self.log_business_tick(episode_length) + logstep=time.time() + self.timings["dss"]+=setup-start + self.timings["dsa"]+=agentstep-setup + self.timings["dab"]+=busstep-agentstep + self.timings["dbl"]+=logstep-busstep + self.timings["dt"]+=logstep-start + + def reset(self): """ @@ -134,28 +147,35 @@ class Simulation(): def remove_business(self,id): bus=None - for i,busl in self.businesses: + for busl in self.businesses: if busl.id==id: - bus=i + bus=busl break bus.close_business() self.businesses.remove(bus) + self.production_util[bus.production["id"]]-=1 def get_max_profit_prod(self): """ Returns the prod with the highest profit in last episode """ - profit=self.businesses[0].balance-self.businesses[0].balance_history[-1] - prod=self.businesses[0].production + profit={} for b in self.businesses: + id=b.production["id"] diff=b.balance-b.balance_history[-1] - if diff>profit: - profit=diff - prod=b.production - return prod["id"] + if id not in profit: + profit[id]=0 + profit[id]+=diff + best=None + bestv=0 + for k,v in profit.items(): + if bestv0: - sim.create_bussiness(1) +while len(sim.get_underutelized_prods(2))>0: + sim.create_bussiness(2) #sim.reset() -for a in tqdm(range(30)): +for a in tqdm(range(50)): for i in range(100): sim.tick(100) sim.reset() diff --git a/tmp.prof b/tmp.prof new file mode 100644 index 0000000..c347d41 Binary files /dev/null and b/tmp.prof differ