ok dokey, performance ist ein wenig besser

This commit is contained in:
2023-06-27 09:17:14 +02:00
parent 5514f3f1d9
commit b7dc7b99d1
15 changed files with 81 additions and 30 deletions
-1
View File
@@ -4,4 +4,3 @@ spec:
res: res:
- 'Food': 1 - 'Food': 1
- 'Fruit': 0.1 - 'Fruit': 0.1
- 'Fuel': 0.1
+2 -2
View File
@@ -6,7 +6,7 @@ spec:
prod: prod:
- Raw_Agriculture_Plot: 1 - Raw_Agriculture_Plot: 1
- name: Fruit - name: Fruit
amount: 10 amount: 75
prod: prod:
- Raw_Agriculture_Plot: 1 - Raw_Agriculture_Plot: 1
- name: Wood - name: Wood
@@ -20,7 +20,7 @@ spec:
- Wood: 1 - Wood: 1
- name: Food - name: Food
amount: 5 amount: 10
prod: prod:
- Fuel: 1 - Fuel: 1
- Fruit: 1 - Fruit: 1
+4 -4
View File
@@ -6,12 +6,12 @@ spec:
- name: grass - name: grass
res: res:
- 'Raw_Agriculture_Plot': 1 - 'Raw_Agriculture_Plot': 0.5
- 'Raw_Forrest': 1 - 'Raw_Forrest': 0.5
- name: forrest - name: forrest
res: res:
- 'Raw_Agriculture_Plot': 1 - 'Raw_Agriculture_Plot': 0.5
- 'Raw_Forrest': 2 - 'Raw_Forrest': 0.5
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -29,7 +29,7 @@ class BaseAgent(ABC):
""" """
Disables agent by removing it from the simulation Disables agent by removing it from the simulation
""" """
self.simulation.unregister_agent(id) self.simulation.unregister_agent(self.id)
def register(self): def register(self):
""" """
Enables agent by adding it to the simulation: Enables agent by adding it to the simulation:
+1 -2
View File
@@ -55,8 +55,7 @@ class Base_Distribution_Agent(BaseAgent,ABC):
if not self.business.inventory[self.resource]>=amount: if not self.business.inventory[self.resource]>=amount:
return False # we dont have enough balance return False # we dont have enough balance
if amount>self.max_batch_qty:
amount=self.max_batch_qty
self.business.inventory[self.resource]-=amount self.business.inventory[self.resource]-=amount
cx.add_to_account(self.id,self.resource,amount) # prepaid charge account for cx cx.add_to_account(self.id,self.resource,amount) # prepaid charge account for cx
order=cx.submit_order(self.id,self.resource,amount,price_per,Side.SELL) order=cx.submit_order(self.id,self.resource,amount,price_per,Side.SELL)
+28 -11
View File
@@ -6,6 +6,7 @@ from influxdb_client import InfluxDBClient, Point
import time import time
import pandas as pd import pandas as pd
import uuid import uuid
import threading
software_start=int(time.time()) software_start=int(time.time())
class Exchange(): class Exchange():
@@ -30,16 +31,18 @@ class Exchange():
self.best_ask={} self.best_ask={}
self.best_bid={} self.best_bid={}
self.total_demand={} self.total_demand={}
self.demand={} #self.demand={}
self.total_supply={} self.total_supply={}
self.supply={} #self.supply={}
self.traded_commoditys={} self.traded_commoditys={}
self.lock=threading.Lock()
def add_to_account(self,account_id,resource,amount): def add_to_account(self,account_id,resource,amount):
""" """
Adds resources to account escrow Adds resources to account escrow
""" """
#check if account exists #check if account exists
self.lock.acquire()
if account_id not in self.account: if account_id not in self.account:
self.account[account_id]={_bal: 0} self.account[account_id]={_bal: 0}
#check if ressource exists #check if ressource exists
@@ -47,12 +50,14 @@ class Exchange():
self.account[account_id][resource]=0 self.account[account_id][resource]=0
self.account[account_id][resource]+=amount self.account[account_id][resource]+=amount
self.lock.release()
def remove_from_account(self,account_id,resource,amount) -> int: def remove_from_account(self,account_id,resource,amount) -> int:
""" """
Remove resources from account. Returns amount retrieved Remove resources from account. Returns amount retrieved
""" """
#check if account exists #check if account exists
self.lock.acquire()
if account_id not in self.account: if account_id not in self.account:
self.account[account_id]={_bal: 0} self.account[account_id]={_bal: 0}
#check if ressource exists #check if ressource exists
@@ -65,6 +70,7 @@ class Exchange():
self.account[account_id][resource]=0 self.account[account_id][resource]=0
else: else:
self.account[account_id][resource]-=amount self.account[account_id][resource]-=amount
self.lock.release()
return ret return ret
def _move_to_escrow(self,account_id,resource,amount): def _move_to_escrow(self,account_id,resource,amount):
@@ -133,13 +139,14 @@ class Exchange():
# no sufficient resources # no sufficient resources
return None return None
# create order and execude any trades # create order and execude any trades
self.lock.acquire()
order,trades=self.lme.add_order(resource,price,amount,side) order,trades=self.lme.add_order(resource,price,amount,side)
self.orders[order.order_id]=order self.orders[order.order_id]=order
self.order_account_map[order.order_id]=account_id self.order_account_map[order.order_id]=account_id
self._execute_trades(trades) self._execute_trades(trades)
self.calculate_resource_metrics(resource) self.calculate_resource_metrics(resource)
self.lock.release()
return order return order
def cancel_order(self,order_id): def cancel_order(self,order_id):
@@ -152,6 +159,7 @@ class Exchange():
order=self.orders[order_id] order=self.orders[order_id]
if self._is_order_complete(order): if self._is_order_complete(order):
return False return False
self.lock.acquire()
order=self.lme.cancel_order(order_id,order.instmt) order=self.lme.cancel_order(order_id,order.instmt)
if order_id in self.order_trades_map: # has order any kind of trades if order_id in self.order_trades_map: # has order any kind of trades
@@ -171,6 +179,7 @@ class Exchange():
qty_traded+=trade.trade_qty qty_traded+=trade.trade_qty
qty_diff=qty_submitted-qty_traded qty_diff=qty_submitted-qty_traded
self._move_to_account(self.order_account_map[order_id],order.instmt,qty_diff) self._move_to_account(self.order_account_map[order_id],order.instmt,qty_diff)
self.lock.release()
return True return True
@@ -222,21 +231,29 @@ class Exchange():
def calculate_resource_metrics(self, resource): def calculate_resource_metrics(self, resource):
order_book = self.lme.order_books.setdefault(resource, OrderBook()) order_book = self.lme.order_books.setdefault(resource, OrderBook())
best_bid = max(order_book.bids.keys()) if len(order_book.bids) > 0 else None best_bid = None
best_ask = max(order_book.asks.keys()) if len(order_book.asks) > 0 else None best_ask = None
self.total_demand[resource]=0 self.total_demand[resource]=0
self.demand[resource]={} #self.demand[resource]={}
for k,v in order_book.bids.items(): for k,v in order_book.bids.items():
self.demand[resource][k]=0 # self.demand[resource][k]=0
if best_bid==None:
best_bid=k
if best_bid<=k:
best_bid=k
for o in v: for o in v:
self.demand[resource][k]+=o.leaves_qty # self.demand[resource][k]+=o.leaves_qty
self.total_demand[resource]+=o.leaves_qty self.total_demand[resource]+=o.leaves_qty
self.supply[resource]={} #self.supply[resource]={}
self.total_supply[resource]=0 self.total_supply[resource]=0
for k,v in order_book.asks.items(): for k,v in order_book.asks.items():
self.supply[resource][k]=0 # self.supply[resource][k]=0
if best_ask==None:
best_ask=k
if best_ask<=k:
best_ask=k
for o in v: for o in v:
self.supply[resource][k]+=o.leaves_qty # self.supply[resource][k]+=o.leaves_qty
self.total_supply[resource]+=o.leaves_qty self.total_supply[resource]+=o.leaves_qty
+24 -4
View File
@@ -61,10 +61,15 @@ class Simulation():
""" """
keys=list(self.tick_funcs.keys()) keys=list(self.tick_funcs.keys())
random.shuffle(keys) random.shuffle(keys)
tasks=[]
for k in keys: for k in keys:
fun=self.tick_funcs[k] fun=self.tick_funcs[k]
fun(self.tick_count,self.episode_count) fun(self.tick_count,self.episode_count)
self.taskpool.map(self._execute_tick,tasks)
def _execute_tick(args):
fun=args[0]
fun(args[1],args[2])
def tick(self,episode_length): def tick(self,episode_length):
""" """
@@ -83,13 +88,15 @@ class Simulation():
busstep=time.time() busstep=time.time()
self.tick_count+=1 self.tick_count+=1
self.log_cxs_tick(episode_length) self.log_cxs_tick(episode_length)
self.log_business_tick(episode_length) #self.log_business_tick(episode_length)
logstep=time.time() logstep=time.time()
self.timings["dss"]+=setup-start self.timings["dss"]+=setup-start
self.timings["dsa"]+=agentstep-setup self.timings["dsa"]+=agentstep-setup
self.timings["dsap"]=self.timings["dsa"]/(len(self.tick_funcs)+1)
self.timings["dab"]+=busstep-agentstep self.timings["dab"]+=busstep-agentstep
self.timings["dbl"]+=logstep-busstep self.timings["dbl"]+=logstep-busstep
self.timings["dt"]+=logstep-start self.timings["dt"]+=logstep-start
@@ -98,13 +105,23 @@ class Simulation():
Resets all agents to new Episode Resets all agents to new Episode
""" """
self.log_cxs_episode() self.log_cxs_episode()
self.log_business_episode()
for k,v in self.reset_funcs.items(): for k,v in self.reset_funcs.items():
v(self.episode_count) v(self.episode_count)
for cell_id,cell in self.cells.items(): for cell_id,cell in self.cells.items():
cell.setup_supply_for_episode() cell.setup_supply_for_episode()
toclose=[]
for b in self.businesses: for b in self.businesses:
b.tick_episode(self.episode_count)
if b.balance<=0: if b.balance<=0:
self.remove_business(b.id) toclose.append(b.id)
for close in toclose:
self.remove_business(close)
self.timings["numBus"]=len(self.businesses)
self.timings["tickfuncs"]=len(self.tick_funcs)
self.timings["episode"]=self.episode_count
log.PerformanceData.append(self.timings.copy())
self.setup_timing(["dss","dsa","dsap","dab","dbl","dt"])
self.tick_count=0 self.tick_count=0
self.episode_count+=1 self.episode_count+=1
@@ -239,7 +256,10 @@ class Simulation():
def log_business_tick(self,episode_length): def log_business_tick(self,episode_length):
for bus in self.businesses: for bus in self.businesses:
bus.log(self.episode_count,episode_length,self.tick_count) bus.log(self.episode_count,episode_length,self.tick_count)
def log_business_episode(self):
for bus in self.businesses:
bus.log(self.episode_count,1,0)
def setup_timing(self,metrics): def setup_timing(self,metrics):
for met in metrics: for met in metrics:
self.timings[met]=0 self.timings[met]=0
+11
View File
@@ -16,6 +16,7 @@ EXInit=False
EXBooksData=[] EXBooksData=[]
EXTradeData=[] EXTradeData=[]
BUSINESSData=[] BUSINESSData=[]
PerformanceData=[]
def get_client(): def get_client():
global write_client global write_client
if write_client==None: if write_client==None:
@@ -43,3 +44,13 @@ def writeBusinessData():
df.to_sql('business', con=db, if_exists='replace', df.to_sql('business', con=db, if_exists='replace',
index=False,chunksize=10000) index=False,chunksize=10000)
print(f"business completed: {df.size}") print(f"business completed: {df.size}")
def writePerformanceData():
db = create_engine(posturl)
df=pd.DataFrame(PerformanceData)
df.to_sql('performance', con=db, if_exists='replace',
index=False,chunksize=10000)
print(f"performance completed: {df.size}")
def clearlog():
EXBooksData=[]
EXTradeData=[]
BUSINESSData=[]
Binary file not shown.
+10 -5
View File
@@ -29,20 +29,25 @@ cxs=[cx]
#cx.submit_order(2,"Gem",1,10,Side.SELL) #cx.submit_order(2,"Gem",1,10,Side.SELL)
sim=Simulation() sim=Simulation()
sim.seed(55) sim.seed(42)
sim.set_cells(cells[:10]) sim.set_cells(cells)
sim.reset() sim.reset()
#sim.tick(1) #sim.tick(1)
# create info # create info
while len(sim.get_underutelized_prods(2))>0: while len(sim.get_underutelized_prods(5))>0:
sim.create_bussiness(2) sim.create_bussiness(5)
#sim.reset() #sim.reset()
for a in tqdm(range(50)): for a in tqdm(range(50)):
for i in range(100): for i in range(100):
sim.tick(100) sim.tick(100)
print(f"|Stats| Num of Businesses: {len(sim.businesses)} Num Tickfunk: {len(sim.tick_funcs)} Time Agent Tick: {sim.timings['dsa']} Time Logging {sim.timings['dbl']}")
sim.reset() sim.reset()
sim.create_bussiness(2) sim.create_bussiness(3)
log.writeEXData() log.writeEXData()
log.writeBusinessData() log.writeBusinessData()
log.writePerformanceData()
print("help") print("help")
BIN
View File
Binary file not shown.