ui export
This commit is contained in:
@@ -2,3 +2,5 @@ logs/*
|
|||||||
_pycache_
|
_pycache_
|
||||||
*.pyc
|
*.pyc
|
||||||
*tfevents*
|
*tfevents*
|
||||||
|
db/econ_data/*
|
||||||
|
db/metabase_data/*
|
||||||
@@ -5,7 +5,7 @@ services:
|
|||||||
postgres:
|
postgres:
|
||||||
image: postgres:10
|
image: postgres:10
|
||||||
volumes:
|
volumes:
|
||||||
- "./db_data:/var/lib/postgresql/data"
|
- "./metabase_data:/var/lib/postgresql/data"
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: metabase
|
POSTGRES_DB: metabase
|
||||||
@@ -20,7 +20,6 @@ services:
|
|||||||
- "3000:3000"
|
- "3000:3000"
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
JAVA_TIMEZONE: Europe/Istanbul
|
|
||||||
MB_ENCRYPTION_SECRET_KEY: ${MB}
|
MB_ENCRYPTION_SECRET_KEY: ${MB}
|
||||||
MB_DB_TYPE: postgres
|
MB_DB_TYPE: postgres
|
||||||
MB_DB_DBNAME: metabase
|
MB_DB_DBNAME: metabase
|
||||||
@@ -33,9 +32,11 @@ services:
|
|||||||
image: mongo
|
image: mongo
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
MONGO_INITDB_DATABASE: example
|
MONGO_INITDB_DATABASE: econ
|
||||||
MONGO_INITDB_ROOT_USERNAME: root
|
MONGO_INITDB_ROOT_USERNAME: root
|
||||||
MONGO_INITDB_ROOT_PASSWORD: example
|
MONGO_INITDB_ROOT_PASSWORD: econ
|
||||||
|
ports:
|
||||||
|
- '27017:27017'
|
||||||
volumes:
|
volumes:
|
||||||
- /home/angelo/mongodata:/data/db
|
- ./econ_data:/data/db
|
||||||
|
|
||||||
@@ -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()
|
||||||
@@ -64,7 +64,7 @@ env_config = {
|
|||||||
'allow_observation_scaling': True,
|
'allow_observation_scaling': True,
|
||||||
'dense_log_frequency': 100,
|
'dense_log_frequency': 100,
|
||||||
'world_dense_log_frequency':1,
|
'world_dense_log_frequency':1,
|
||||||
'energy_cost':0,
|
'energy_cost':0.2,
|
||||||
'energy_warmup_method': "auto",
|
'energy_warmup_method': "auto",
|
||||||
'energy_warmup_constant': 4000,
|
'energy_warmup_constant': 4000,
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ eval_env_config = {
|
|||||||
'isoelastic_eta':0.001,
|
'isoelastic_eta':0.001,
|
||||||
'dense_log_frequency': 1,
|
'dense_log_frequency': 1,
|
||||||
'world_dense_log_frequency':1,
|
'world_dense_log_frequency':1,
|
||||||
'energy_cost':0,
|
'energy_cost':0.2,
|
||||||
'energy_warmup_method': "auto",
|
'energy_warmup_method': "auto",
|
||||||
'energy_warmup_constant': 4000,
|
'energy_warmup_constant': 4000,
|
||||||
|
|
||||||
@@ -138,6 +138,7 @@ eval_env_config = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
num_frames=1
|
num_frames=1
|
||||||
|
CONNECTION_STRING = "mongodb+srv://root:econ@localhost:/econ"
|
||||||
|
|
||||||
class TensorboardCallback(BaseCallback):
|
class TensorboardCallback(BaseCallback):
|
||||||
"""
|
"""
|
||||||
@@ -292,8 +293,8 @@ runname="run_{}".format(run_number)
|
|||||||
model_db=[None,None] # object for storing model
|
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 = 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=learning_rate_adj_trade,env=stackenv_traid, 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=4e-4,env=stackenv_traid, seed=500,verbose=1,device="cuda",tensorboard_log="./log")
|
||||||
|
|
||||||
n_agents=econ.n_agents
|
n_agents=econ.n_agents
|
||||||
|
|
||||||
@@ -308,9 +309,9 @@ while True:
|
|||||||
#Train
|
#Train
|
||||||
runname="run_{}_{}".format(run_number,"basic")
|
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")
|
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.start()
|
||||||
thread_model_traid.start()
|
thread_model_traid.start()
|
||||||
|
|||||||
+1
-2
@@ -1,5 +1,4 @@
|
|||||||
dash
|
|
||||||
pandas
|
pandas
|
||||||
|
pymongo
|
||||||
gym
|
gym
|
||||||
ray[rllib]
|
ray[rllib]
|
||||||
@@ -25,6 +25,7 @@ from stable_baselines3.common.callbacks import BaseCallback
|
|||||||
import yaml
|
import yaml
|
||||||
import time
|
import time
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
|
from db.export_to_mongo import MongoExporter
|
||||||
|
|
||||||
env_config = {
|
env_config = {
|
||||||
# ===== SCENARIO CLASS =====
|
# ===== SCENARIO CLASS =====
|
||||||
@@ -52,7 +53,7 @@ env_config = {
|
|||||||
# ===== SCENARIO CLASS ARGUMENTS =====
|
# ===== SCENARIO CLASS ARGUMENTS =====
|
||||||
# (optional) kwargs that are added by the Scenario class (i.e. not defined in BaseEnvironment)
|
# (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,
|
'fixed_four_skill_and_loc': True,
|
||||||
|
|
||||||
# ===== STANDARD ARGUMENTS ======
|
# ===== 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
|
num_frames=1
|
||||||
|
CONNECTION_STRING = "mongodb://root:econ@localhost:27017/"
|
||||||
class TensorboardCallback(BaseCallback):
|
class TensorboardCallback(BaseCallback):
|
||||||
"""
|
"""
|
||||||
Custom callback for plotting additional values in tensorboard.
|
Custom callback for plotting additional values in tensorboard.
|
||||||
@@ -238,7 +184,6 @@ def printReplay(econ,agentid):
|
|||||||
|
|
||||||
#Setup Env Objects
|
#Setup Env Objects
|
||||||
econ=foundation.make_env_instance(**env_config)
|
econ=foundation.make_env_instance(**env_config)
|
||||||
|
|
||||||
market=econ.get_component("ContinuousDoubleAuction")
|
market=econ.get_component("ContinuousDoubleAuction")
|
||||||
action=market.get_n_actions("TradingAgent")
|
action=market.get_n_actions("TradingAgent")
|
||||||
baseEconWrapper=BaseEconWrapper(econ)
|
baseEconWrapper=BaseEconWrapper(econ)
|
||||||
@@ -246,8 +191,8 @@ baseEconWrapper.run()
|
|||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
mobileRecieverEconWrapper=RecieverEconWrapper(base_econ=baseEconWrapper,agent_classname="BasicMobileAgent")
|
mobileRecieverEconWrapper=RecieverEconWrapper(base_econ=baseEconWrapper,agent_classname="BasicMobileAgent")
|
||||||
tradeRecieverEconWrapper=RecieverEconWrapper(base_econ=baseEconWrapper,agent_classname="TradingAgent")
|
tradeRecieverEconWrapper=RecieverEconWrapper(base_econ=baseEconWrapper,agent_classname="TradingAgent")
|
||||||
sb3_traderConverter=SB3EconConverter(tradeRecieverEconWrapper,econ,"TradingAgent",True)
|
sb3_traderConverter=SB3EconConverter(tradeRecieverEconWrapper,econ,"TradingAgent",False)
|
||||||
sb3Converter=SB3EconConverter(mobileRecieverEconWrapper,econ,"BasicMobileAgent",True)
|
sb3Converter=SB3EconConverter(mobileRecieverEconWrapper,econ,"BasicMobileAgent",False)
|
||||||
# attach sb3 wrappers
|
# attach sb3 wrappers
|
||||||
|
|
||||||
monenv=VecMonitor(venv=sb3Converter,info_keywords=["social/productivity","trend/productivity"])
|
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)
|
stackenv_traid=vec_frame_stack.VecFrameStack(venv=montraidingenv,n_stack=num_frames)
|
||||||
# Model setup complete
|
# 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=monenv.reset()
|
||||||
|
obs=montraidingenv.reset()
|
||||||
|
|
||||||
# define training functions
|
# define training functions
|
||||||
def train(model,timesteps, econ_call,process_bar,name,db,index):
|
def train(model,timesteps, econ_call,process_bar,name,db,index):
|
||||||
@@ -297,37 +222,39 @@ model_trade=MaskablePPO("MlpPolicy",n_steps=int(env_config['episode_length']*2),
|
|||||||
# Setup complete
|
# Setup complete
|
||||||
|
|
||||||
# Load models
|
# Load models
|
||||||
model.load("basic.ai")
|
model=model.load("basic.ai")
|
||||||
model_trade.load("trade.ai")
|
model_trade=model_trade.load("trade.ai")
|
||||||
|
|
||||||
|
exporter=MongoExporter(CONNECTION_STRING,"econ",econ)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
print("### EVAL ###")
|
print("### EVAL ###")
|
||||||
obs_basic=stackenv_basic_eval.reset()
|
obs_basic=stackenv_basic.reset()
|
||||||
obs_trade=stackenv_traid_eval.reset()
|
obs_trade=stackenv_traid.reset()
|
||||||
done=False
|
done=False
|
||||||
for i in tqdm(range(eval_env_config['episode_length'])):
|
for i in tqdm(range(env_config['episode_length'])):
|
||||||
#create masks
|
#create masks
|
||||||
masks_basic=stackenv_basic_eval.action_masks()
|
masks_basic=stackenv_basic.action_masks()
|
||||||
masks_trade=stackenv_traid_eval.action_masks()
|
masks_trade=stackenv_traid.action_masks()
|
||||||
# get actions
|
# get actions
|
||||||
action_basic=model.predict(obs_basic,action_masks=masks_basic)
|
action_basic=model.predict(obs_basic,action_masks=masks_basic)
|
||||||
action_trade=model_trade.predict(obs_trade,action_masks=masks_trade)
|
action_trade=model_trade.predict(obs_trade,action_masks=masks_trade)
|
||||||
#submit async directly for non blocking operation
|
#submit async directly for non blocking operation
|
||||||
sb3Converter_eval.step_async(action_basic[0])
|
sb3Converter.step_async(action_basic[0])
|
||||||
sb3_traderConverter_eval.step_async(action_trade[0])
|
sb3_traderConverter.step_async(action_trade[0])
|
||||||
# retieve full results
|
# retieve full results
|
||||||
obs_basic,rew_basic,done_e,info=stackenv_basic_eval.step(action_basic[0])
|
obs_basic,rew_basic,done_e,info=stackenv_basic.step(action_basic[0])
|
||||||
obs_trade,rew_trade,done_e,info=stackenv_traid_eval.step(action_trade[0])
|
obs_trade,rew_trade,done_e,info=stackenv_traid.step(action_trade[0])
|
||||||
done=done_e[0]
|
done=done_e[0]
|
||||||
|
|
||||||
|
|
||||||
|
exporter.submit_full_market()
|
||||||
market=econ_eval.get_component("ContinuousDoubleAuction")
|
market=econ.get_component("ContinuousDoubleAuction")
|
||||||
craft=econ_eval.get_component("Craft")
|
craft=econ.get_component("Craft")
|
||||||
# trades=market.get_dense_log()
|
# trades=market.get_dense_log()
|
||||||
build=craft.get_dense_log()
|
build=craft.get_dense_log()
|
||||||
met=econ_eval.previous_episode_metrics
|
met=econ.previous_episode_metrics
|
||||||
printReplay(econ_eval,21)
|
printReplay(econ,21)
|
||||||
#printMarket(trades)
|
#printMarket(trades)
|
||||||
#printBuilds(builds=build)
|
#printBuilds(builds=build)
|
||||||
print("social/productivity: {}".format(met["social/productivity"]))
|
print("social/productivity: {}".format(met["social/productivity"]))
|
||||||
|
|||||||
Reference in New Issue
Block a user