support/retro_contest/__init__.py (72 lines of code) (raw):
import csv
import gym
import numpy as np
import time
class StochasticFrameSkip(gym.Wrapper):
def __init__(self, env, n, stickprob):
gym.Wrapper.__init__(self, env)
self.n = n
self.stickprob = stickprob
self.curac = None
self.rng = np.random.RandomState()
def reset(self, **kwargs):
self.curac = None
return self.env.reset(**kwargs)
def step(self, ac):
done = False
totrew = 0
for i in range(self.n):
# First step after reset, use action
if self.curac is None:
self.curac = ac
# First substep, delay with probability=stickprob
elif i == 0:
if self.rng.rand() > self.stickprob:
self.curac = ac
# Second substep, new action definitely kicks in
elif i == 1:
self.curac = ac
ob, rew, done, info = self.env.step(self.curac)
totrew += rew
if done:
break
return ob, totrew, done, info
class Monitor(gym.Wrapper):
def __init__(self, env, monitorfile, logfile=None):
gym.Wrapper.__init__(self, env)
self.file = open(monitorfile, 'w')
self.csv = csv.DictWriter(self.file, ['r', 'l', 't'])
self.log = open(logfile, 'w')
self.logcsv = csv.DictWriter(self.log, ['l', 't'])
self.episode_reward = 0
self.episode_length = 0
self.total_length = 0
self.start = None
self.csv.writeheader()
self.file.flush()
self.logcsv.writeheader()
self.log.flush()
def reset(self, **kwargs):
if not self.start:
self.start = time.time()
else:
self.csv.writerow({
'r': self.episode_reward,
'l': self.episode_length,
't': time.time() - self.start
})
self.file.flush()
self.episode_length = 0
self.episode_reward = 0
return self.env.reset(**kwargs)
def step(self, ac):
ob, rew, done, info = self.env.step(ac)
self.episode_length += 1
self.total_length += 1
self.episode_reward += rew
if self.total_length % 1000 == 0:
self.logcsv.writerow({
'l': self.total_length,
't': time.time() - self.start
})
self.log.flush()
return ob, rew, done, info
def __del__(self):
self.file.close()