ui export

This commit is contained in:
2023-01-18 11:32:10 +01:00
parent 1ee1c2eb04
commit f1982d1fe4
11 changed files with 93 additions and 116 deletions
+2
View File
@@ -2,3 +2,5 @@ logs/*
_pycache_
*.pyc
*tfevents*
db/econ_data/*
db/metabase_data/*
BIN
View File
Binary file not shown.
+2
View File
@@ -0,0 +1,2 @@
MB=123456789123456798
POSTGRES_PASSWORD=change_me
View File
@@ -5,7 +5,7 @@ services:
postgres:
image: postgres:10
volumes:
- "./db_data:/var/lib/postgresql/data"
- "./metabase_data:/var/lib/postgresql/data"
restart: always
environment:
POSTGRES_DB: metabase
@@ -20,7 +20,6 @@ services:
- "3000:3000"
restart: always
environment:
JAVA_TIMEZONE: Europe/Istanbul
MB_ENCRYPTION_SECRET_KEY: ${MB}
MB_DB_TYPE: postgres
MB_DB_DBNAME: metabase
@@ -33,9 +32,11 @@ services:
image: mongo
restart: always
environment:
MONGO_INITDB_DATABASE: example
MONGO_INITDB_DATABASE: econ
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
MONGO_INITDB_ROOT_PASSWORD: econ
ports:
- '27017:27017'
volumes:
- /home/angelo/mongodata:/data/db
- ./econ_data:/data/db
+48
View File
@@ -0,0 +1,48 @@
from pymongo import MongoClient
cmt="current_market_trades"
cma="current_market_asks"
cmb="current_market_bids"
class MongoExporter():
def __init__(self,conn_string,db,econ) -> None:
# Provide the mongodb atlas url to connect python to mongodb using pymongo
# Create a connection using MongoClient. You can import MongoClient or use pymongo.MongoClient
client = MongoClient(conn_string)
# Create the database for our example (we will use the same database throughout the tutorial
self.client=client[db]
self.econ=econ
def reset_market(self):
"""Resets the current market data in the analytics stack"""
c=self.client
c[cmt].drop()
c[cma].drop()
c[cmb].drop()
def submit_full_market(self):
c=self.client
market=self.econ.get_component("ContinuousDoubleAuction")
self.reset_market()
for i in range(len(market.executed_trades)):
step=market.executed_trades[i]
if len(step)>0:
for transaction in step:
transaction["step"]=i
c[cmt].insert_one(transaction)
c[cma].insert_many(market.asks)
c[cmb].insert_many(market.bids)
# This is added so that many files can reuse the function get_database()
+7 -6
View File
@@ -64,7 +64,7 @@ env_config = {
'allow_observation_scaling': True,
'dense_log_frequency': 100,
'world_dense_log_frequency':1,
'energy_cost':0,
'energy_cost':0.2,
'energy_warmup_method': "auto",
'energy_warmup_constant': 4000,
@@ -120,7 +120,7 @@ eval_env_config = {
'isoelastic_eta':0.001,
'dense_log_frequency': 1,
'world_dense_log_frequency':1,
'energy_cost':0,
'energy_cost':0.2,
'energy_warmup_method': "auto",
'energy_warmup_constant': 4000,
@@ -138,6 +138,7 @@ eval_env_config = {
}
num_frames=1
CONNECTION_STRING = "mongodb+srv://root:econ@localhost:/econ"
class TensorboardCallback(BaseCallback):
"""
@@ -292,8 +293,8 @@ runname="run_{}".format(run_number)
model_db=[None,None] # object for storing model
model = MaskablePPO("MlpPolicy",n_steps=int(env_config['episode_length']*2),ent_coef=0.001, vf_coef=0.5 ,gamma=0.99, learning_rate=learning_rate_adj_basic,env=stackenv_basic, seed=445,verbose=1,device="cuda",tensorboard_log="./log")
model_trade=MaskablePPO("MlpPolicy",n_steps=int(env_config['episode_length']*2),ent_coef=0.001, vf_coef=0.5 ,gamma=0.99, learning_rate=learning_rate_adj_trade,env=stackenv_traid, seed=445,verbose=1,device="cuda",tensorboard_log="./log")
model = MaskablePPO("MlpPolicy",n_steps=int(env_config['episode_length']*2),ent_coef=0.001, vf_coef=0.5 ,gamma=0.99, learning_rate=4e-4,env=stackenv_basic, seed=500,verbose=1,device="cuda",tensorboard_log="./log")
model_trade=MaskablePPO("MlpPolicy",n_steps=int(env_config['episode_length']*2),ent_coef=0.001, vf_coef=0.5 ,gamma=0.99, learning_rate=4e-4,env=stackenv_traid, seed=500,verbose=1,device="cuda",tensorboard_log="./log")
n_agents=econ.n_agents
@@ -308,9 +309,9 @@ while True:
#Train
runname="run_{}_{}".format(run_number,"basic")
thread_model=Thread(target=train,args=(model,total_required_for_episode_basic*150,econ,True,runname,model_db,0))
thread_model=Thread(target=train,args=(model,total_required_for_episode_basic*50,econ,True,runname,model_db,0))
runname="run_{}_{}".format(run_number,"trader")
thread_model_traid=Thread(target=train,args=(model_trade,total_required_for_episode_traid*150,econ,False,runname,model_db,1))
thread_model_traid=Thread(target=train,args=(model_trade,total_required_for_episode_traid*50,econ,False,runname,model_db,1))
thread_model.start()
thread_model_traid.start()
+1 -2
View File
@@ -1,5 +1,4 @@
dash
pandas
pymongo
gym
ray[rllib]
+26 -99
View File
@@ -25,6 +25,7 @@ from stable_baselines3.common.callbacks import BaseCallback
import yaml
import time
from threading import Thread
from db.export_to_mongo import MongoExporter
env_config = {
# ===== SCENARIO CLASS =====
@@ -52,7 +53,7 @@ env_config = {
# ===== SCENARIO CLASS ARGUMENTS =====
# (optional) kwargs that are added by the Scenario class (i.e. not defined in BaseEnvironment)
'starting_agent_coin': 20,
'starting_agent_coin': 50,
'fixed_four_skill_and_loc': True,
# ===== STANDARD ARGUMENTS ======
@@ -82,63 +83,8 @@ env_config = {
}
eval_env_config = {
# ===== SCENARIO CLASS =====
# Which Scenario class to use: the class's name in the Scenario Registry (foundation.scenarios).
# The environment object will be an instance of the Scenario class.
'scenario_name': 'econ',
# ===== COMPONENTS =====
# Which components to use (specified as list of ("component_name", {component_kwargs}) tuples).
# "component_name" refers to the Component class's name in the Component Registry (foundation.components)
# {component_kwargs} is a dictionary of kwargs passed to the Component class
# The order in which components reset, step, and generate obs follows their listed order below.
'components': [
# (1) Building houses
('Craft', {'skill_dist': "pareto", 'commodities': ["Gem"],'max_skill_amount_benefit':2}),
# (2) Trading collectible resources
('ContinuousDoubleAuction', {'max_num_orders': 10}),
# (3) Movement and resource collection
('SimpleGather', {}),
('ExternalMarket',{'market_demand':{
'Gem': 15
}}),
],
# ===== SCENARIO CLASS ARGUMENTS =====
# (optional) kwargs that are added by the Scenario class (i.e. not defined in BaseEnvironment)
'starting_agent_coin': 20,
'fixed_four_skill_and_loc': True,
# ===== STANDARD ARGUMENTS ======
# kwargs that are used by every Scenario class (i.e. defined in BaseEnvironment)
'agent_composition': {"BasicMobileAgent": 20,"TradingAgent":5}, # Number of non-planner agents (must be > 1)
'world_size': [1, 1], # [Height, Width] of the env world
'episode_length': 256, # Number of timesteps per episode
'allow_observation_scaling': True,
'isoelastic_eta':0.001,
'dense_log_frequency': 1,
'world_dense_log_frequency':1,
'energy_cost':0,
'energy_warmup_method': "auto",
'energy_warmup_constant': 4000,
# In multi-action-mode, the policy selects an action for each action subspace (defined in component code).
# Otherwise, the policy selects only 1 action.
'multi_action_mode_agents': False,
'multi_action_mode_planner': False,
# When flattening observations, concatenate scalar & vector observations before output.
# Otherwise, return observations with minimal processing.
'flatten_observations': False,
# When Flattening masks, concatenate each action subspace mask into a single array.
# Note: flatten_masks = True is required for masking action logits in the code below.
'flatten_masks': True,
}
num_frames=1
CONNECTION_STRING = "mongodb://root:econ@localhost:27017/"
class TensorboardCallback(BaseCallback):
"""
Custom callback for plotting additional values in tensorboard.
@@ -238,7 +184,6 @@ def printReplay(econ,agentid):
#Setup Env Objects
econ=foundation.make_env_instance(**env_config)
market=econ.get_component("ContinuousDoubleAuction")
action=market.get_n_actions("TradingAgent")
baseEconWrapper=BaseEconWrapper(econ)
@@ -246,8 +191,8 @@ baseEconWrapper.run()
time.sleep(0.5)
mobileRecieverEconWrapper=RecieverEconWrapper(base_econ=baseEconWrapper,agent_classname="BasicMobileAgent")
tradeRecieverEconWrapper=RecieverEconWrapper(base_econ=baseEconWrapper,agent_classname="TradingAgent")
sb3_traderConverter=SB3EconConverter(tradeRecieverEconWrapper,econ,"TradingAgent",True)
sb3Converter=SB3EconConverter(mobileRecieverEconWrapper,econ,"BasicMobileAgent",True)
sb3_traderConverter=SB3EconConverter(tradeRecieverEconWrapper,econ,"TradingAgent",False)
sb3Converter=SB3EconConverter(mobileRecieverEconWrapper,econ,"BasicMobileAgent",False)
# attach sb3 wrappers
monenv=VecMonitor(venv=sb3Converter,info_keywords=["social/productivity","trend/productivity"])
@@ -257,28 +202,8 @@ stackenv_basic=vec_frame_stack.VecFrameStack(venv=monenv,n_stack=num_frames)
stackenv_traid=vec_frame_stack.VecFrameStack(venv=montraidingenv,n_stack=num_frames)
# Model setup complete
# Setup Eval Env
econ_eval=foundation.make_env_instance(**eval_env_config)
baseEconWrapper_eval=BaseEconWrapper(econ_eval)
baseEconWrapper_eval.run()
time.sleep(0.5)
mobileRecieverEconWrapper_eval=RecieverEconWrapper(base_econ=baseEconWrapper_eval,agent_classname="BasicMobileAgent")
tradeRecieverEconWrapper_eval=RecieverEconWrapper(base_econ=baseEconWrapper_eval,agent_classname="TradingAgent")
sb3_traderConverter_eval=SB3EconConverter(tradeRecieverEconWrapper_eval,econ_eval,"TradingAgent",False)
sb3Converter_eval=SB3EconConverter(mobileRecieverEconWrapper_eval,econ_eval,"BasicMobileAgent",False)
# attach sb3 wrappers
monenv_eval=VecMonitor(venv=sb3Converter_eval,info_keywords=["social/productivity","trend/productivity"])
montraidingenv_eval=VecMonitor(venv=sb3_traderConverter_eval)
stackenv_basic_eval=vec_frame_stack.VecFrameStack(venv=monenv_eval,n_stack=num_frames)
stackenv_traid_eval=vec_frame_stack.VecFrameStack(venv=montraidingenv_eval,n_stack=num_frames)
obs=monenv.reset()
obs=montraidingenv.reset()
# define training functions
def train(model,timesteps, econ_call,process_bar,name,db,index):
@@ -297,39 +222,41 @@ model_trade=MaskablePPO("MlpPolicy",n_steps=int(env_config['episode_length']*2),
# Setup complete
# Load models
model.load("basic.ai")
model_trade.load("trade.ai")
model=model.load("basic.ai")
model_trade=model_trade.load("trade.ai")
exporter=MongoExporter(CONNECTION_STRING,"econ",econ)
while True:
print("### EVAL ###")
obs_basic=stackenv_basic_eval.reset()
obs_trade=stackenv_traid_eval.reset()
obs_basic=stackenv_basic.reset()
obs_trade=stackenv_traid.reset()
done=False
for i in tqdm(range(eval_env_config['episode_length'])):
for i in tqdm(range(env_config['episode_length'])):
#create masks
masks_basic=stackenv_basic_eval.action_masks()
masks_trade=stackenv_traid_eval.action_masks()
masks_basic=stackenv_basic.action_masks()
masks_trade=stackenv_traid.action_masks()
# get actions
action_basic=model.predict(obs_basic,action_masks=masks_basic)
action_trade=model_trade.predict(obs_trade,action_masks=masks_trade)
#submit async directly for non blocking operation
sb3Converter_eval.step_async(action_basic[0])
sb3_traderConverter_eval.step_async(action_trade[0])
sb3Converter.step_async(action_basic[0])
sb3_traderConverter.step_async(action_trade[0])
# retieve full results
obs_basic,rew_basic,done_e,info=stackenv_basic_eval.step(action_basic[0])
obs_trade,rew_trade,done_e,info=stackenv_traid_eval.step(action_trade[0])
obs_basic,rew_basic,done_e,info=stackenv_basic.step(action_basic[0])
obs_trade,rew_trade,done_e,info=stackenv_traid.step(action_trade[0])
done=done_e[0]
market=econ_eval.get_component("ContinuousDoubleAuction")
craft=econ_eval.get_component("Craft")
exporter.submit_full_market()
market=econ.get_component("ContinuousDoubleAuction")
craft=econ.get_component("Craft")
# trades=market.get_dense_log()
build=craft.get_dense_log()
met=econ_eval.previous_episode_metrics
printReplay(econ_eval,21)
# printMarket(trades)
# printBuilds(builds=build)
met=econ.previous_episode_metrics
printReplay(econ,21)
#printMarket(trades)
#printBuilds(builds=build)
print("social/productivity: {}".format(met["social/productivity"]))
print("labor/weighted_cost: {}".format(met["labor/weighted_cost"]))
print("labor/warmup_integrator: {}".format(met["labor/warmup_integrator"]))
BIN
View File
Binary file not shown.
-3
View File
@@ -1,3 +0,0 @@
MB=change_me
POSTGRES_PASSWORD=change_me
PGADMIN_PASSWORD=change_me