mirror of
https://github.com/velocitatem/PHANTOM.git
synced 2026-05-31 08:33:36 +00:00
chore: adding simulation logging with wandb
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
from .demand import estimate_demand, generate_demand_for_actor
|
||||
from .behavior import sample_behavior
|
||||
from .render import DashboardRenderer, style_axis
|
||||
from .wrappers import EconomicMetricsWrapper
|
||||
from .callbacks import MetricsCallback, EvalMetricsCallback
|
||||
from .providers import ProviderBenchmark, ProviderResult, BenchmarkConfig
|
||||
|
||||
@@ -1,27 +1,39 @@
|
||||
from sim.rl.behavior_loader.models import BehaviorModel, AgentBehaviorModel, aggregate_event_transitions
|
||||
from sim.rl.behavior_loader.models import (
|
||||
BehaviorModel,
|
||||
AgentBehaviorModel,
|
||||
aggregate_event_transitions,
|
||||
)
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from .demand import generate_demand_for_actor
|
||||
|
||||
base_dir = "/home/velocitatem/Documents/Projects/PHANTOM/experiments"
|
||||
human_dir, agent_dir = f"{base_dir}/collected_data/", f"{base_dir}/agents/collected_data/"
|
||||
human_dir, agent_dir = (
|
||||
f"{base_dir}/collected_data/",
|
||||
f"{base_dir}/agents/collected_data/",
|
||||
)
|
||||
|
||||
_cache = {} # lazy cache for models and base pivots
|
||||
|
||||
|
||||
def _get_base_pivot(human: bool):
|
||||
key = 'human' if human else 'agent'
|
||||
key = "human" if human else "agent"
|
||||
if key not in _cache:
|
||||
model = BehaviorModel(human_dir) if human else AgentBehaviorModel(agent_dir)
|
||||
mdp = model.build_MDP()
|
||||
_cache[key] = pd.DataFrame(aggregate_event_transitions(mdp)).fillna(0.0)
|
||||
return _cache[key]
|
||||
|
||||
|
||||
def adjust_behavior_to_condition(condition, transition_matrix):
|
||||
# expand NxN transition matrix to (N*P)x(N*P) weighted by demand condition
|
||||
cond_norm = condition / np.sum(condition)
|
||||
n_products = len(condition)
|
||||
base_vals = transition_matrix.values
|
||||
base_cols, base_rows = transition_matrix.columns.tolist(), transition_matrix.index.tolist()
|
||||
base_cols, base_rows = (
|
||||
transition_matrix.columns.tolist(),
|
||||
transition_matrix.index.tolist(),
|
||||
)
|
||||
|
||||
# expand via kronecker-like tiling: each cell becomes a P*P block weighted by outer product of cond_norm
|
||||
expanded = np.kron(base_vals, np.outer(cond_norm, cond_norm))
|
||||
@@ -29,19 +41,24 @@ def adjust_behavior_to_condition(condition, transition_matrix):
|
||||
new_rows = [f"{r}_product{p}" for r in base_rows for p in range(n_products)]
|
||||
return pd.DataFrame(expanded, index=new_rows, columns=new_cols)
|
||||
|
||||
|
||||
def sample_behavior(condition, human=True, max_len=40):
|
||||
base_pivot = _get_base_pivot(human)
|
||||
adjusted_transitions = adjust_behavior_to_condition(condition, base_pivot)
|
||||
|
||||
trajectory = [np.random.choice(adjusted_transitions.index)]
|
||||
while len(trajectory) < max_len or 'checkout' in trajectory[-1]:
|
||||
while len(trajectory) < max_len and "checkout" not in trajectory[-1]:
|
||||
probs = adjusted_transitions.loc[trajectory[-1]].values
|
||||
sample = np.random.choice(adjusted_transitions.columns, p=probs/np.sum(probs) if np.sum(probs) > 0 else None)
|
||||
sample = np.random.choice(
|
||||
adjusted_transitions.columns,
|
||||
p=probs / np.sum(probs) if np.sum(probs) > 0 else None,
|
||||
)
|
||||
trajectory.append(sample)
|
||||
return trajectory
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
t=sample_behavior(generate_demand_for_actor(np.array([10,20,30])), human=True)
|
||||
t = sample_behavior(generate_demand_for_actor(np.array([10, 20, 30])), human=True)
|
||||
print(t)
|
||||
t=sample_behavior(generate_demand_for_actor(np.array([10,20,30])), human=False)
|
||||
t = sample_behavior(generate_demand_for_actor(np.array([10, 20, 30])), human=False)
|
||||
print(t)
|
||||
|
||||
Reference in New Issue
Block a user