hdppo-Pendulum-v1 / enjoy.py
ChirathD's picture
Add hdppo-Pendulum-v1 package (weights, code, model card)
1dbe253 verified
Raw
History Blame Contribute Delete
2.97 kB
import argparse
import os
import gymnasium as gym
import numpy as np
import train_hdppo as m
def _warmup_encoder(agent, env_id, n_steps=200):
env = gym.make(env_id)
obs, _ = env.reset(seed=0)
for i in range(n_steps):
Hr, Hi = agent.encoder.encode(obs)
action = agent.actor.greedy(Hr, Hi)
obs, _, term, trunc, _ = env.step(action)
if term or trunc:
obs, _ = env.reset(seed=i + 1)
env.close()
def load_agent_from_checkpoint(path, seed=42, warmup=True):
data = np.load(path)
cfg = dict(m.PENDULUM_CONFIG)
cfg['D'] = int(data['D'])
cfg['beta'] = float(data['beta_base'])
cfg['fpe_phi_init'] = data['fpe_phi']
if 'feat_lo' in data:
cfg['feat_lo'] = data['feat_lo'].tolist()
cfg['feat_hi'] = data['feat_hi'].tolist()
agent = m.HDPPOAgentContinuous(cfg, seed=seed)
agent.actor.W_re = data['W_actor_re'].copy()
agent.actor.W_im = data['W_actor_im'].copy()
if 'log_std' in data:
agent.actor.log_std = data['log_std'].copy()
if 'W_critic_re' in data:
agent.critic.W_re = data['W_critic_re'].copy()
agent.critic.W_im = data['W_critic_im'].copy()
agent.critic.bias = float(data['critic_bias'])
if warmup:
_warmup_encoder(agent, 'Pendulum-v1')
return agent
def resolve_weights(weights_arg):
if os.path.isfile(weights_arg):
return weights_arg
try:
from huggingface_hub import hf_hub_download
except ImportError as exc:
raise SystemExit('Install huggingface_hub to load remote checkpoints: pip install huggingface_hub') from exc
return hf_hub_download(repo_id=weights_arg, filename='hdppo-Pendulum-v1/weights.npz')
def main():
parser = argparse.ArgumentParser(description='Enjoy HD-PPO on Pendulum-v1')
parser.add_argument('--weights', default='hdppo-Pendulum-v1/weights.npz')
parser.add_argument('--episodes', type=int, default=5)
parser.add_argument('--seed', type=int, default=10000)
parser.add_argument('--render', action='store_true')
args = parser.parse_args()
weights = resolve_weights(args.weights)
agent = load_agent_from_checkpoint(weights, seed=args.seed)
if args.render:
env = gym.make('Pendulum-v1', render_mode='human')
for ep in range(args.episodes):
obs, _ = env.reset(seed=args.seed + ep)
done = False
ep_r = 0.0
while not done:
Hr, Hi = agent.encoder.encode(obs)
action = agent.actor.greedy(Hr, Hi)
obs, reward, term, trunc, _ = env.step(action)
ep_r += reward
done = term or trunc
print(f'episode {ep + 1}: return={ep_r:.1f}')
env.close()
else:
stats = m.evaluate_agent(agent, n_episodes=args.episodes, seed_base=args.seed)
print(f'mean={stats['mean_reward']:.2f} ci95={stats['ci95_reward']:.2f}')
if __name__ == '__main__':
main()