mirror of
https://github.com/wassname/rl-portfolio-management.git
synced 2026-06-27 16:46:41 +08:00
10364 lines
1.1 MiB
Plaintext
10364 lines
1.1 MiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2017-10-27T23:42:41.698676Z",
|
|
"start_time": "2017-10-27T23:42:41.695152Z"
|
|
}
|
|
},
|
|
"source": [
|
|
"This notebook is a little easier for beginners because it uses pytorch. You need to clone a repo to get it working:\n",
|
|
"\n",
|
|
"```sh\n",
|
|
"# you need this repo, so clone it\n",
|
|
"git clone https://github.com/wassname/DeepRL.git\n",
|
|
"cd DeepRL\n",
|
|
"git reset --hard aeae2c5d585e5853dc638968b1f090eb60abd351\n",
|
|
"cd ..\n",
|
|
"mkdir data log evaluation_log\n",
|
|
"```\n",
|
|
"\n",
|
|
"This contains some minor modifications from https://github.com/ShangtongZhang/DeepRL.git\n",
|
|
"\n",
|
|
"The notebook tries DPPG with the [EIIE model](https://arxiv.org/pdf/1706.10059.pdf)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T03:51:12.766648Z",
|
|
"start_time": "2018-02-18T03:51:12.763971Z"
|
|
},
|
|
"scrolled": true
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"I also uncommented reward normalization in DDPG_agent.py#L64 because otherwise my small reward les to large Q's, inf losses, and NaN actions and weights."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:08.118663Z",
|
|
"start_time": "2018-02-18T06:06:07.274323Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:__main__:__main__ logger started.\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# plotting\n",
|
|
"%matplotlib notebook\n",
|
|
"from matplotlib import pyplot as plt\n",
|
|
"import seaborn as sns\n",
|
|
"plt.style.use('ggplot')\n",
|
|
"\n",
|
|
"# numeric\n",
|
|
"import numpy as np\n",
|
|
"from numpy import random\n",
|
|
"import pandas as pd\n",
|
|
"\n",
|
|
"# utils\n",
|
|
"from tqdm import tqdm_notebook as tqdm\n",
|
|
"from collections import Counter\n",
|
|
"import tempfile\n",
|
|
"import logging\n",
|
|
"import time\n",
|
|
"import datetime\n",
|
|
"\n",
|
|
"# logging\n",
|
|
"logger = log = logging.getLogger(__name__)\n",
|
|
"log.setLevel(logging.INFO)\n",
|
|
"logging.basicConfig()\n",
|
|
"log.info('%s logger started.', __name__)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:08.150314Z",
|
|
"start_time": "2018-02-18T06:06:08.122827Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import os\n",
|
|
"os.sys.path.append(os.path.abspath('.'))\n",
|
|
"os.sys.path.append(os.path.abspath('DeepRL'))\n",
|
|
"%reload_ext autoreload\n",
|
|
"%autoreload 2"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-01-15T06:04:03.382623Z",
|
|
"start_time": "2018-01-15T06:04:03.312027Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:08.172640Z",
|
|
"start_time": "2018-02-18T06:06:08.152417Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# params\n",
|
|
"window_length = 50\n",
|
|
"steps = 128\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:08.209252Z",
|
|
"start_time": "2018-02-18T06:06:08.176664Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# save dir\n",
|
|
"import datetime\n",
|
|
"ts = datetime.datetime.utcnow().strftime('%Y%m%d_%H-%M-%S')\n",
|
|
"\n",
|
|
"save_path = './outputs/pytorch-DDPG/pytorch-DDPG-EIIE-action-crypto-%s.model' % ts\n",
|
|
"save_path\n",
|
|
"try:\n",
|
|
" os.makedirs(os.path.dirname(save_path))\n",
|
|
"except OSError:\n",
|
|
" pass"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:08.984401Z",
|
|
"start_time": "2018-02-18T06:06:08.212090Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/home/wassname/.pyenv/versions/3.5.3/envs/jupyter3/lib/python3.5/site-packages/h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
|
|
" from ._conv import register_converters as _register_converters\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"tensorboard --logdir runs/ddpg-20180218_06-06-08\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# setup tensorboard logging\n",
|
|
"from tensorboard_logger import configure, log_value\n",
|
|
"tag = 'ddpg-' + ts\n",
|
|
"print('tensorboard --logdir '+\"runs/\" + tag)\n",
|
|
"try:\n",
|
|
" configure(\"runs/\" + tag)\n",
|
|
"except ValueError as e:\n",
|
|
" print(e)\n",
|
|
" pass"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-01-23T04:25:35.539014Z",
|
|
"start_time": "2018-01-23T04:25:32.708434Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Env"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:09.100223Z",
|
|
"start_time": "2018-02-18T06:06:08.986130Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"from rl_portfolio_management.environments.portfolio import PortfolioEnv\n",
|
|
"from rl_portfolio_management.util import MDD, sharpe, softmax\n",
|
|
"from rl_portfolio_management.wrappers import SoftmaxActions, TransposeHistory, ConcatStates\n",
|
|
"\n",
|
|
"df_train = pd.read_hdf('./data/poloniex_30m.hf',key='train')\n",
|
|
"df_test = pd.read_hdf('./data/poloniex_30m.hf',key='test')\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-01-15T06:17:58.191717Z",
|
|
"start_time": "2018-01-15T06:17:56.636432Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:09.175657Z",
|
|
"start_time": "2018-02-18T06:06:09.112261Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import gym\n",
|
|
"class DeepRLWrapper(gym.Wrapper):\n",
|
|
" def __init__(self, env):\n",
|
|
" super().__init__(env)\n",
|
|
" self.render_on_reset = False\n",
|
|
" \n",
|
|
" self.state_dim = self.observation_space.shape\n",
|
|
" self.action_dim = self.action_space.shape[0]\n",
|
|
" \n",
|
|
" self.name = 'PortfolioEnv'\n",
|
|
" self.success_threshold = 2\n",
|
|
" \n",
|
|
" def normalize_state(self, state):\n",
|
|
" return state\n",
|
|
" \n",
|
|
" def step(self, action):\n",
|
|
" state, reward, done, info =self.env.step(action)\n",
|
|
" reward*=1e4 # often reward scaling is important sooo...\n",
|
|
" return state, reward, done, info\n",
|
|
" \n",
|
|
" def reset(self): \n",
|
|
" # here's a roundabout way to get it to plot on reset\n",
|
|
" if self.render_on_reset: \n",
|
|
" self.env.render('notebook')\n",
|
|
"\n",
|
|
" return self.env.reset()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:09.290527Z",
|
|
"start_time": "2018-02-18T06:06:09.195655Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"((4, 51, 3), (4, 51, 3))"
|
|
]
|
|
},
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"def task_fn():\n",
|
|
" env = PortfolioEnv(df=df_train, steps=steps, output_mode='EIIE')\n",
|
|
" env = TransposeHistory(env)\n",
|
|
" env = ConcatStates(env)\n",
|
|
" env = SoftmaxActions(env)\n",
|
|
" env = DeepRLWrapper(env)\n",
|
|
" return env\n",
|
|
"\n",
|
|
"def task_fn_test():\n",
|
|
" env = PortfolioEnv(df=df_test, steps=steps, output_mode='EIIE')\n",
|
|
" env = TransposeHistory(env)\n",
|
|
" env = ConcatStates(env)\n",
|
|
" env = SoftmaxActions(env)\n",
|
|
" env = DeepRLWrapper(env)\n",
|
|
" return env\n",
|
|
" \n",
|
|
"# sanity check\n",
|
|
"task = task_fn()\n",
|
|
"task.reset().shape, task.step(task.action_space.sample())[0].shape"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Agent and models"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:09.450771Z",
|
|
"start_time": "2018-02-18T06:06:09.292152Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# load\n",
|
|
"import pickle\n",
|
|
"import shutil\n",
|
|
"\n",
|
|
"def save_ddpg(agent):\n",
|
|
" agent_type = agent.__class__.__name__\n",
|
|
" save_file = 'data/%s-%s-model-%s.bin' % (agent_type, config.tag, agent.task.name)\n",
|
|
" agent.save(save_file)\n",
|
|
" print(save_file)\n",
|
|
" \n",
|
|
"\n",
|
|
"def load_ddpg(agent):\n",
|
|
" agent_type = agent.__class__.__name__\n",
|
|
" save_file = 'data/%s-%s-model-%s.bin' % (agent_type, config.tag, agent.task.name)\n",
|
|
" new_states = pickle.load(open(save_file, 'rb'))\n",
|
|
" states = agent.worker_network.load_state_dict(new_states)\n",
|
|
"\n",
|
|
"\n",
|
|
"def load_stats_ddpg(agent):\n",
|
|
" agent_type = agent.__class__.__name__\n",
|
|
" online_stats_file = 'data/%s-%s-online-stats-%s.bin' % (\n",
|
|
" agent_type, config.tag, agent.task.name)\n",
|
|
" try:\n",
|
|
" steps, rewards = pickle.load(open(online_stats_file, 'rb'))\n",
|
|
" except FileNotFoundError:\n",
|
|
" steps =[]\n",
|
|
" rewards=[]\n",
|
|
" df_online = pd.DataFrame(np.array([steps, rewards]).T, columns=['steps','rewards'])\n",
|
|
" if len(df_online):\n",
|
|
" df_online['step'] = df_online['steps'].cumsum()\n",
|
|
" df_online.index.name = 'episodes'\n",
|
|
" \n",
|
|
" stats_file = 'data/%s-%s-all-stats-%s.bin' % (agent_type, config.tag, agent.task.name)\n",
|
|
" try:\n",
|
|
" stats = pickle.load(open(stats_file, 'rb'))\n",
|
|
" except FileNotFoundError:\n",
|
|
" stats = {}\n",
|
|
" df = pd.DataFrame(stats[\"test_rewards\"], columns=['rewards'])\n",
|
|
" if len(df):\n",
|
|
"# df[\"steps\"]=range(len(df))*50\n",
|
|
"\n",
|
|
" df.index.name = 'episodes'\n",
|
|
" return df_online, df"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-01-15T06:02:01.252356Z",
|
|
"start_time": "2018-01-15T06:02:01.208525Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:09.751094Z",
|
|
"start_time": "2018-02-18T06:06:09.453781Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import logging\n",
|
|
"from agent import ProximalPolicyOptimization, DisjointActorCriticNet #, DeterministicActorNet, DeterministicCriticNet\n",
|
|
"from component import GaussianPolicy, HighDimActionReplay, OrnsteinUhlenbeckProcess\n",
|
|
"from utils import Config, Logger\n",
|
|
"import gym\n",
|
|
"import torch\n",
|
|
"gym.logger.setLevel(logging.INFO)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-01-15T05:24:46.546070Z",
|
|
"start_time": "2018-01-15T05:24:46.542443Z"
|
|
}
|
|
},
|
|
"source": [
|
|
"# Alg"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:10.618760Z",
|
|
"start_time": "2018-02-18T06:06:09.753415Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Modified from https://github.com/ShangtongZhang/DeepRL to log to tensorboard\n",
|
|
"\n",
|
|
"from utils.normalizer import Normalizer\n",
|
|
"\n",
|
|
"null_normaliser = lambda x:x\n",
|
|
"\n",
|
|
"class DDPGAgent:\n",
|
|
" def __init__(self, config):\n",
|
|
" self.config = config\n",
|
|
" self.task = config.task_fn()\n",
|
|
" self.worker_network = config.network_fn()\n",
|
|
" self.target_network = config.network_fn()\n",
|
|
" self.target_network.load_state_dict(self.worker_network.state_dict())\n",
|
|
" self.actor_opt = config.actor_optimizer_fn(self.worker_network.actor.parameters())\n",
|
|
" self.critic_opt = config.critic_optimizer_fn(self.worker_network.critic.parameters())\n",
|
|
" self.replay = config.replay_fn()\n",
|
|
" self.random_process = config.random_process_fn()\n",
|
|
" self.criterion = nn.MSELoss()\n",
|
|
" self.total_steps = 0\n",
|
|
"\n",
|
|
" self.state_normalizer = Normalizer(self.task.state_dim) # null_normaliser # \n",
|
|
" self.reward_normalizer = Normalizer(1)\n",
|
|
"\n",
|
|
" def soft_update(self, target, src):\n",
|
|
" for target_param, param in zip(target.parameters(), src.parameters()):\n",
|
|
" target_param.data.copy_(target_param.data * (1.0 - self.config.target_network_mix) +\n",
|
|
" param.data * self.config.target_network_mix)\n",
|
|
"\n",
|
|
" def save(self, file_name):\n",
|
|
" with open(file_name, 'wb') as f:\n",
|
|
" torch.save(self.worker_network.state_dict(), f)\n",
|
|
"\n",
|
|
" def episode(self, deterministic=False, video_recorder=None):\n",
|
|
" self.random_process.reset_states()\n",
|
|
" state = self.task.reset()\n",
|
|
" state = self.state_normalizer(state)\n",
|
|
"\n",
|
|
" config = self.config\n",
|
|
" actor = self.worker_network.actor\n",
|
|
" critic = self.worker_network.critic\n",
|
|
" target_actor = self.target_network.actor\n",
|
|
" target_critic = self.target_network.critic\n",
|
|
"\n",
|
|
" steps = 0\n",
|
|
" total_reward = 0.0\n",
|
|
" while True:\n",
|
|
" actor.eval()\n",
|
|
" action = actor.predict(np.stack([state])).flatten()\n",
|
|
" if not deterministic:\n",
|
|
" action += self.random_process.sample()\n",
|
|
" next_state, reward, done, info = self.task.step(action)\n",
|
|
" if video_recorder is not None:\n",
|
|
" video_recorder.capture_frame()\n",
|
|
" done = (done or (config.max_episode_length and steps >= config.max_episode_length))\n",
|
|
" next_state = self.state_normalizer(next_state) * config.reward_scaling\n",
|
|
" total_reward += reward\n",
|
|
" \n",
|
|
" # tensorboard logging\n",
|
|
" prefix = 'test_' if deterministic else ''\n",
|
|
" log_value(prefix + 'reward', reward, self.total_steps)\n",
|
|
"# log_value(prefix + 'action', action, steps)\n",
|
|
" log_value('memory_size', self.replay.size(), self.total_steps) \n",
|
|
" for key in info:\n",
|
|
" log_value(key, info[key], self.total_steps) \n",
|
|
" \n",
|
|
" reward = self.reward_normalizer(reward)\n",
|
|
"\n",
|
|
" if not deterministic:\n",
|
|
" self.replay.feed([state, action, reward, next_state, int(done)])\n",
|
|
" self.total_steps += 1\n",
|
|
"\n",
|
|
" steps += 1\n",
|
|
" state = next_state\n",
|
|
"\n",
|
|
" if done:\n",
|
|
" break\n",
|
|
"\n",
|
|
" if not deterministic and self.replay.size() >= config.min_memory_size:\n",
|
|
" self.worker_network.train()\n",
|
|
" experiences = self.replay.sample()\n",
|
|
" states, actions, rewards, next_states, terminals = experiences\n",
|
|
" q_next = target_critic.predict(next_states, target_actor.predict(next_states))\n",
|
|
" terminals = critic.to_torch_variable(terminals).unsqueeze(1)\n",
|
|
" rewards = critic.to_torch_variable(rewards).unsqueeze(1)\n",
|
|
" q_next = config.discount * q_next * (1 - terminals)\n",
|
|
" q_next.add_(rewards)\n",
|
|
" q_next = q_next.detach()\n",
|
|
" q = critic.predict(states, actions)\n",
|
|
" critic_loss = self.criterion(q, q_next)\n",
|
|
"\n",
|
|
" critic.zero_grad()\n",
|
|
" self.critic_opt.zero_grad()\n",
|
|
" critic_loss.backward()\n",
|
|
" if config.gradient_clip:\n",
|
|
" grad_critic = nn.utils.clip_grad_norm(self.worker_network.parameters(), config.gradient_clip)\n",
|
|
" self.critic_opt.step()\n",
|
|
"\n",
|
|
" actions = actor.predict(states, False)\n",
|
|
" var_actions = Variable(actions.data, requires_grad=True)\n",
|
|
" q = critic.predict(states, var_actions)\n",
|
|
" q.backward(torch.ones(q.size()))\n",
|
|
"\n",
|
|
" actor.zero_grad()\n",
|
|
" self.actor_opt.zero_grad()\n",
|
|
" actions.backward(-var_actions.grad.data)\n",
|
|
" if config.gradient_clip:\n",
|
|
" grad_actor = nn.utils.clip_grad_norm(self.worker_network.parameters(), config.gradient_clip)\n",
|
|
" self.actor_opt.step()\n",
|
|
" \n",
|
|
" # tensorboard logging\n",
|
|
" log_value('critic_loss', critic_loss.cpu().data.numpy().squeeze(), self.total_steps)\n",
|
|
" log_value('loss_action', -q.sum(), self.total_steps)\n",
|
|
" if config.gradient_clip:\n",
|
|
" log_value('grad_critic', grad_critic, self.total_steps)\n",
|
|
" log_value('grad_actor', grad_actor, self.total_steps)\n",
|
|
"\n",
|
|
" self.soft_update(self.target_network, self.worker_network)\n",
|
|
"\n",
|
|
" return total_reward, steps"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-01-15T06:33:40.472361Z",
|
|
"start_time": "2018-01-15T06:33:40.450577Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Model"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:10.648063Z",
|
|
"start_time": "2018-02-18T06:06:10.620822Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import torch\n",
|
|
"from torch.autograd import Variable\n",
|
|
"import torch.nn as nn\n",
|
|
"import torch.nn.functional as F\n",
|
|
"import numpy as np"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:10.685519Z",
|
|
"start_time": "2018-02-18T06:06:10.649679Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"((4, 51, 3), 4)"
|
|
]
|
|
},
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"task.state_dim, task.action_dim"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:11.251457Z",
|
|
"start_time": "2018-02-18T06:06:10.688106Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"\n",
|
|
"from network.base_network import BasicNet\n",
|
|
"\n",
|
|
"class DeterministicActorNet(nn.Module, BasicNet):\n",
|
|
" def __init__(self,\n",
|
|
" state_dim,\n",
|
|
" action_dim,\n",
|
|
" action_gate,\n",
|
|
" action_scale,\n",
|
|
" gpu=False,\n",
|
|
" batch_norm=False,\n",
|
|
" non_linear=F.relu):\n",
|
|
" super(DeterministicActorNet, self).__init__()\n",
|
|
"\n",
|
|
" stride_time = state_dim[1] - 1 - 2 #\n",
|
|
" features = task.state_dim[0]\n",
|
|
" h0 = 2\n",
|
|
" h1 = 30\n",
|
|
" self.conv1 = nn.Conv2d(features, h0, (3, 1))\n",
|
|
" self.conv2 = nn.Conv2d(h0, h1, (stride_time, 1), stride=(stride_time, 1))\n",
|
|
" self.conv3 = nn.Conv2d((h1+1), 1, (1, 1))\n",
|
|
"\n",
|
|
" self.action_scale = action_scale\n",
|
|
" self.action_gate = action_gate\n",
|
|
" self.non_linear = non_linear\n",
|
|
"\n",
|
|
" if batch_norm:\n",
|
|
" self.bn1 = nn.BatchNorm1d(h0)\n",
|
|
" self.bn2 = nn.BatchNorm1d(h1)\n",
|
|
"\n",
|
|
" self.batch_norm = batch_norm\n",
|
|
" BasicNet.__init__(self, None, gpu, False)\n",
|
|
"\n",
|
|
"\n",
|
|
" def forward(self, x):\n",
|
|
" x = self.to_torch_variable(x)\n",
|
|
" \n",
|
|
" w0 = x[:,:1,:1,:] # weights from last step \n",
|
|
" x = x[:,:,1:,:]\n",
|
|
" \n",
|
|
" phi0 = self.non_linear(self.conv1(x))\n",
|
|
" if self.batch_norm:\n",
|
|
" phi0 = self.bn1(phi0)\n",
|
|
" phi1 = self.non_linear(self.conv2(phi0))\n",
|
|
" h = torch.cat([phi1,w0], 1)\n",
|
|
" if self.batch_norm:\n",
|
|
" h = self.bn2(h)\n",
|
|
" \n",
|
|
" action = self.conv3(h)\n",
|
|
" \n",
|
|
" # add cash_bias before we softmax\n",
|
|
" cash_bias_int = 0\n",
|
|
" cash_bias = self.to_torch_variable(torch.ones(action.size())[:,:,:,:1] * cash_bias_int)\n",
|
|
" action = torch.cat([cash_bias, action], -1)\n",
|
|
" \n",
|
|
" batch_size = action.size()[0]\n",
|
|
" action = action.view((batch_size,-1))\n",
|
|
" if self.action_gate:\n",
|
|
" action = self.action_scale * self.action_gate(action)\n",
|
|
" return action\n",
|
|
"\n",
|
|
" def predict(self, x, to_numpy=True):\n",
|
|
" y = self.forward(x)\n",
|
|
" if to_numpy:\n",
|
|
" y = y.cpu().data.numpy()\n",
|
|
" return y\n",
|
|
"\n",
|
|
"class DeterministicCriticNet(nn.Module, BasicNet):\n",
|
|
" def __init__(self,\n",
|
|
" state_dim,\n",
|
|
" action_dim,\n",
|
|
" gpu=False,\n",
|
|
" batch_norm=False,\n",
|
|
" non_linear=F.relu):\n",
|
|
" super(DeterministicCriticNet, self).__init__()\n",
|
|
" stride_time = state_dim[1] - 1 - 2 #\n",
|
|
" self.features = features = task.state_dim[0]\n",
|
|
" h0=2\n",
|
|
" h1=20\n",
|
|
" self.action = actions = action_dim -1\n",
|
|
" self.conv1 = nn.Conv2d(features, h0, (3, 1))\n",
|
|
" self.conv2 = nn.Conv2d(h0, h1, (stride_time, 1), stride=(stride_time, 1))\n",
|
|
" self.layer3 = nn.Linear((h1+2)*actions, 1)\n",
|
|
" self.non_linear = non_linear\n",
|
|
"\n",
|
|
" if batch_norm:\n",
|
|
" self.bn1 = nn.BatchNorm1d(h0)\n",
|
|
" self.bn2 = nn.BatchNorm1d(h1)\n",
|
|
" self.batch_norm = batch_norm\n",
|
|
"\n",
|
|
" BasicNet.__init__(self, None, gpu, False)\n",
|
|
"\n",
|
|
"\n",
|
|
" def forward(self, x, action):\n",
|
|
" x = self.to_torch_variable(x)\n",
|
|
" action = self.to_torch_variable(action)[:,None,None,:-1] # remove cash bias\n",
|
|
" \n",
|
|
" w0 = x[:,:1,:1,:] # weights from last step \n",
|
|
" x = x[:,:,1:,:]\n",
|
|
" \n",
|
|
" phi0 = self.non_linear(self.conv1(x))\n",
|
|
" if self.batch_norm:\n",
|
|
" phi0 = self.bn1(phi0)\n",
|
|
" phi1 = self.non_linear(self.conv2(phi0))\n",
|
|
" h = torch.cat([phi1,w0,action], 1)\n",
|
|
" if self.batch_norm:\n",
|
|
" h = self.bn2(h)\n",
|
|
" \n",
|
|
" batch_size = x.size()[0]\n",
|
|
" action = self.layer3(h.view((batch_size,-1)))\n",
|
|
" return action\n",
|
|
"\n",
|
|
" def predict(self, x, action):\n",
|
|
" return self.forward(x, action)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T03:09:10.244296Z",
|
|
"start_time": "2018-02-18T03:09:10.218211Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Config"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-10T04:53:05.213318Z",
|
|
"start_time": "2018-02-10T04:53:05.209185Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T06:06:11.430338Z",
|
|
"start_time": "2018-02-18T06:06:11.253821Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<__main__.DDPGAgent at 0x7fd290197160>"
|
|
]
|
|
},
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"config = Config()\n",
|
|
"config.task_fn = task_fn\n",
|
|
"task = config.task_fn()\n",
|
|
"config.actor_network_fn = lambda: DeterministicActorNet(\n",
|
|
" task.state_dim, task.action_dim, action_gate=None, action_scale=1.0, non_linear=F.relu, batch_norm=False, gpu=False)\n",
|
|
"config.critic_network_fn = lambda: DeterministicCriticNet(\n",
|
|
" task.state_dim, task.action_dim, non_linear=F.relu, batch_norm=False, gpu=False)\n",
|
|
"config.network_fn = lambda: DisjointActorCriticNet(config.actor_network_fn, config.critic_network_fn)\n",
|
|
"config.actor_optimizer_fn = lambda params: torch.optim.Adam(params, lr=4e-5)\n",
|
|
"config.critic_optimizer_fn =\\\n",
|
|
" lambda params: torch.optim.Adam(params, lr=5e-4, weight_decay=0.001)\n",
|
|
"config.replay_fn = lambda: HighDimActionReplay(memory_size=600, batch_size=64)\n",
|
|
"config.random_process_fn = \\\n",
|
|
" lambda: OrnsteinUhlenbeckProcess(size=task.action_dim, theta=0.15, sigma=0.2, sigma_min=0.00002, n_steps_annealing=10000)\n",
|
|
"config.discount = 0.0\n",
|
|
"\n",
|
|
"config.min_memory_size = 50\n",
|
|
"config.target_network_mix = 0.001\n",
|
|
"config.max_steps = 300000\n",
|
|
"config.max_episode_length = 3000\n",
|
|
"config.target_network_mix = 0.01\n",
|
|
"config.noise_decay_interval = 100000\n",
|
|
"config.gradient_clip = 20\n",
|
|
"config.min_epsilon = 0.1\n",
|
|
"\n",
|
|
"# Many papers have found rewards scaling to be an important parameter. But while they focus on the scaling factor\n",
|
|
"# I think they should focus on the end variance with a range of 200-400. e.g. https://arxiv.org/pdf/1709.06560.pdf\n",
|
|
"# Hard to tell for sure without experiments to prove it\n",
|
|
"config.reward_scaling = 1000\n",
|
|
"\n",
|
|
"config.test_interval = 10\n",
|
|
"config.test_repetitions = 1\n",
|
|
"config.save_interval = 40\n",
|
|
"config.logger = Logger('./log', gym.logger)\n",
|
|
"config.tag = tag\n",
|
|
"agent = DDPGAgent(config)\n",
|
|
"agent"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Train"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T07:56:13.422024Z",
|
|
"start_time": "2018-02-18T06:06:11.432034Z"
|
|
},
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 1, reward -27.754773, avg reward -27.754773, total steps 128, episode step 128\n",
|
|
"[2018-02-18 14:06:13,642] episode 1, reward -27.754773, avg reward -27.754773, total steps 128, episode step 128\n",
|
|
"INFO:gym:episode 2, reward -38.238554, avg reward -32.996664, total steps 256, episode step 128\n",
|
|
"[2018-02-18 14:06:16,083] episode 2, reward -38.238554, avg reward -32.996664, total steps 256, episode step 128\n",
|
|
"INFO:gym:episode 3, reward -44.410998, avg reward -36.801442, total steps 384, episode step 128\n",
|
|
"[2018-02-18 14:06:18,260] episode 3, reward -44.410998, avg reward -36.801442, total steps 384, episode step 128\n",
|
|
"INFO:gym:episode 4, reward -23.274828, avg reward -33.419788, total steps 512, episode step 128\n",
|
|
"[2018-02-18 14:06:20,447] episode 4, reward -23.274828, avg reward -33.419788, total steps 512, episode step 128\n",
|
|
"INFO:gym:episode 5, reward -5.559020, avg reward -27.847635, total steps 640, episode step 128\n",
|
|
"[2018-02-18 14:06:22,493] episode 5, reward -5.559020, avg reward -27.847635, total steps 640, episode step 128\n",
|
|
"INFO:gym:episode 6, reward -8.956107, avg reward -24.699047, total steps 768, episode step 128\n",
|
|
"[2018-02-18 14:06:24,514] episode 6, reward -8.956107, avg reward -24.699047, total steps 768, episode step 128\n",
|
|
"INFO:gym:episode 7, reward 0.713179, avg reward -21.068729, total steps 896, episode step 128\n",
|
|
"[2018-02-18 14:06:26,994] episode 7, reward 0.713179, avg reward -21.068729, total steps 896, episode step 128\n",
|
|
"INFO:gym:episode 8, reward -0.219803, avg reward -18.462613, total steps 1024, episode step 128\n",
|
|
"[2018-02-18 14:06:29,209] episode 8, reward -0.219803, avg reward -18.462613, total steps 1024, episode step 128\n",
|
|
"INFO:gym:episode 9, reward 0.865873, avg reward -16.315003, total steps 1152, episode step 128\n",
|
|
"[2018-02-18 14:06:31,364] episode 9, reward 0.865873, avg reward -16.315003, total steps 1152, episode step 128\n",
|
|
"INFO:gym:episode 10, reward -4.859469, avg reward -15.169450, total steps 1280, episode step 128\n",
|
|
"[2018-02-18 14:06:33,588] episode 10, reward -4.859469, avg reward -15.169450, total steps 1280, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:06:33,592] Testing...\n",
|
|
"INFO:gym:Avg reward -3.381443(0.000000)\n",
|
|
"[2018-02-18 14:06:33,943] Avg reward -3.381443(0.000000)\n",
|
|
"INFO:gym:episode 11, reward -1.950081, avg reward -13.967689, total steps 1408, episode step 128\n",
|
|
"[2018-02-18 14:06:36,058] episode 11, reward -1.950081, avg reward -13.967689, total steps 1408, episode step 128\n",
|
|
"INFO:gym:episode 12, reward -0.788184, avg reward -12.869397, total steps 1536, episode step 128\n",
|
|
"[2018-02-18 14:06:38,362] episode 12, reward -0.788184, avg reward -12.869397, total steps 1536, episode step 128\n",
|
|
"INFO:gym:episode 13, reward -4.020482, avg reward -12.188711, total steps 1664, episode step 128\n",
|
|
"[2018-02-18 14:06:40,533] episode 13, reward -4.020482, avg reward -12.188711, total steps 1664, episode step 128\n",
|
|
"INFO:gym:episode 14, reward -0.034295, avg reward -11.320539, total steps 1792, episode step 128\n",
|
|
"[2018-02-18 14:06:42,560] episode 14, reward -0.034295, avg reward -11.320539, total steps 1792, episode step 128\n",
|
|
"INFO:gym:episode 15, reward -0.144642, avg reward -10.575479, total steps 1920, episode step 128\n",
|
|
"[2018-02-18 14:06:45,146] episode 15, reward -0.144642, avg reward -10.575479, total steps 1920, episode step 128\n",
|
|
"INFO:gym:episode 16, reward -1.408640, avg reward -10.002551, total steps 2048, episode step 128\n",
|
|
"[2018-02-18 14:06:48,053] episode 16, reward -1.408640, avg reward -10.002551, total steps 2048, episode step 128\n",
|
|
"INFO:gym:episode 17, reward -0.489197, avg reward -9.442942, total steps 2176, episode step 128\n",
|
|
"[2018-02-18 14:06:50,963] episode 17, reward -0.489197, avg reward -9.442942, total steps 2176, episode step 128\n",
|
|
"INFO:gym:episode 18, reward -0.788969, avg reward -8.962166, total steps 2304, episode step 128\n",
|
|
"[2018-02-18 14:06:53,710] episode 18, reward -0.788969, avg reward -8.962166, total steps 2304, episode step 128\n",
|
|
"INFO:gym:episode 19, reward -0.629342, avg reward -8.523596, total steps 2432, episode step 128\n",
|
|
"[2018-02-18 14:06:56,006] episode 19, reward -0.629342, avg reward -8.523596, total steps 2432, episode step 128\n",
|
|
"INFO:gym:episode 20, reward -1.471716, avg reward -8.171002, total steps 2560, episode step 128\n",
|
|
"[2018-02-18 14:06:58,297] episode 20, reward -1.471716, avg reward -8.171002, total steps 2560, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:06:58,301] Testing...\n",
|
|
"INFO:gym:Avg reward -1.314647(0.000000)\n",
|
|
"[2018-02-18 14:06:58,716] Avg reward -1.314647(0.000000)\n",
|
|
"INFO:gym:episode 21, reward -0.345674, avg reward -7.798368, total steps 2688, episode step 128\n",
|
|
"[2018-02-18 14:07:00,939] episode 21, reward -0.345674, avg reward -7.798368, total steps 2688, episode step 128\n",
|
|
"INFO:gym:episode 22, reward -2.611613, avg reward -7.562606, total steps 2816, episode step 128\n",
|
|
"[2018-02-18 14:07:03,438] episode 22, reward -2.611613, avg reward -7.562606, total steps 2816, episode step 128\n",
|
|
"INFO:gym:episode 23, reward -0.093136, avg reward -7.237847, total steps 2944, episode step 128\n",
|
|
"[2018-02-18 14:07:06,078] episode 23, reward -0.093136, avg reward -7.237847, total steps 2944, episode step 128\n",
|
|
"INFO:gym:episode 24, reward -0.344387, avg reward -6.950619, total steps 3072, episode step 128\n",
|
|
"[2018-02-18 14:07:08,973] episode 24, reward -0.344387, avg reward -6.950619, total steps 3072, episode step 128\n",
|
|
"INFO:gym:episode 25, reward -0.006518, avg reward -6.672855, total steps 3200, episode step 128\n",
|
|
"[2018-02-18 14:07:11,123] episode 25, reward -0.006518, avg reward -6.672855, total steps 3200, episode step 128\n",
|
|
"INFO:gym:episode 26, reward -2.503625, avg reward -6.512500, total steps 3328, episode step 128\n",
|
|
"[2018-02-18 14:07:13,188] episode 26, reward -2.503625, avg reward -6.512500, total steps 3328, episode step 128\n",
|
|
"INFO:gym:episode 27, reward 0.099246, avg reward -6.267621, total steps 3456, episode step 128\n",
|
|
"[2018-02-18 14:07:15,682] episode 27, reward 0.099246, avg reward -6.267621, total steps 3456, episode step 128\n",
|
|
"INFO:gym:episode 28, reward -0.116397, avg reward -6.047934, total steps 3584, episode step 128\n",
|
|
"[2018-02-18 14:07:18,037] episode 28, reward -0.116397, avg reward -6.047934, total steps 3584, episode step 128\n",
|
|
"INFO:gym:episode 29, reward -0.926681, avg reward -5.871339, total steps 3712, episode step 128\n",
|
|
"[2018-02-18 14:07:20,897] episode 29, reward -0.926681, avg reward -5.871339, total steps 3712, episode step 128\n",
|
|
"INFO:gym:episode 30, reward -1.255574, avg reward -5.717480, total steps 3840, episode step 128\n",
|
|
"[2018-02-18 14:07:23,018] episode 30, reward -1.255574, avg reward -5.717480, total steps 3840, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:07:23,024] Testing...\n",
|
|
"INFO:gym:Avg reward -0.766670(0.000000)\n",
|
|
"[2018-02-18 14:07:23,399] Avg reward -0.766670(0.000000)\n",
|
|
"INFO:gym:episode 31, reward -0.294656, avg reward -5.542550, total steps 3968, episode step 128\n",
|
|
"[2018-02-18 14:07:25,521] episode 31, reward -0.294656, avg reward -5.542550, total steps 3968, episode step 128\n",
|
|
"INFO:gym:episode 32, reward -1.227889, avg reward -5.407717, total steps 4096, episode step 128\n",
|
|
"[2018-02-18 14:07:27,867] episode 32, reward -1.227889, avg reward -5.407717, total steps 4096, episode step 128\n",
|
|
"INFO:gym:episode 33, reward 0.099027, avg reward -5.240846, total steps 4224, episode step 128\n",
|
|
"[2018-02-18 14:07:30,811] episode 33, reward 0.099027, avg reward -5.240846, total steps 4224, episode step 128\n",
|
|
"INFO:gym:episode 34, reward -2.130265, avg reward -5.149359, total steps 4352, episode step 128\n",
|
|
"[2018-02-18 14:07:33,351] episode 34, reward -2.130265, avg reward -5.149359, total steps 4352, episode step 128\n",
|
|
"INFO:gym:episode 35, reward -0.539813, avg reward -5.017657, total steps 4480, episode step 128\n",
|
|
"[2018-02-18 14:07:35,823] episode 35, reward -0.539813, avg reward -5.017657, total steps 4480, episode step 128\n",
|
|
"INFO:gym:episode 36, reward 0.034985, avg reward -4.877306, total steps 4608, episode step 128\n",
|
|
"[2018-02-18 14:07:38,284] episode 36, reward 0.034985, avg reward -4.877306, total steps 4608, episode step 128\n",
|
|
"INFO:gym:episode 37, reward -0.456235, avg reward -4.757818, total steps 4736, episode step 128\n",
|
|
"[2018-02-18 14:07:40,673] episode 37, reward -0.456235, avg reward -4.757818, total steps 4736, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 38, reward -1.535611, avg reward -4.673023, total steps 4864, episode step 128\n",
|
|
"[2018-02-18 14:07:43,443] episode 38, reward -1.535611, avg reward -4.673023, total steps 4864, episode step 128\n",
|
|
"INFO:gym:episode 39, reward 0.052444, avg reward -4.551857, total steps 4992, episode step 128\n",
|
|
"[2018-02-18 14:07:46,402] episode 39, reward 0.052444, avg reward -4.551857, total steps 4992, episode step 128\n",
|
|
"INFO:gym:episode 40, reward -0.321126, avg reward -4.446089, total steps 5120, episode step 128\n",
|
|
"[2018-02-18 14:07:48,800] episode 40, reward -0.321126, avg reward -4.446089, total steps 5120, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:07:48,801] Testing...\n",
|
|
"INFO:gym:Avg reward 0.055954(0.000000)\n",
|
|
"[2018-02-18 14:07:49,215] Avg reward 0.055954(0.000000)\n",
|
|
"INFO:gym:episode 41, reward -0.378356, avg reward -4.346876, total steps 5248, episode step 128\n",
|
|
"[2018-02-18 14:07:51,334] episode 41, reward -0.378356, avg reward -4.346876, total steps 5248, episode step 128\n",
|
|
"INFO:gym:episode 42, reward -0.285972, avg reward -4.250187, total steps 5376, episode step 128\n",
|
|
"[2018-02-18 14:07:53,320] episode 42, reward -0.285972, avg reward -4.250187, total steps 5376, episode step 128\n",
|
|
"INFO:gym:episode 43, reward -0.065350, avg reward -4.152866, total steps 5504, episode step 128\n",
|
|
"[2018-02-18 14:07:55,697] episode 43, reward -0.065350, avg reward -4.152866, total steps 5504, episode step 128\n",
|
|
"INFO:gym:episode 44, reward -0.813370, avg reward -4.076968, total steps 5632, episode step 128\n",
|
|
"[2018-02-18 14:07:58,445] episode 44, reward -0.813370, avg reward -4.076968, total steps 5632, episode step 128\n",
|
|
"INFO:gym:episode 45, reward -0.281904, avg reward -3.992633, total steps 5760, episode step 128\n",
|
|
"[2018-02-18 14:08:01,274] episode 45, reward -0.281904, avg reward -3.992633, total steps 5760, episode step 128\n",
|
|
"INFO:gym:episode 46, reward 0.309194, avg reward -3.899115, total steps 5888, episode step 128\n",
|
|
"[2018-02-18 14:08:04,064] episode 46, reward 0.309194, avg reward -3.899115, total steps 5888, episode step 128\n",
|
|
"INFO:gym:episode 47, reward -0.211927, avg reward -3.820664, total steps 6016, episode step 128\n",
|
|
"[2018-02-18 14:08:06,869] episode 47, reward -0.211927, avg reward -3.820664, total steps 6016, episode step 128\n",
|
|
"INFO:gym:episode 48, reward -0.156079, avg reward -3.744319, total steps 6144, episode step 128\n",
|
|
"[2018-02-18 14:08:08,935] episode 48, reward -0.156079, avg reward -3.744319, total steps 6144, episode step 128\n",
|
|
"INFO:gym:episode 49, reward -0.401676, avg reward -3.676102, total steps 6272, episode step 128\n",
|
|
"[2018-02-18 14:08:11,019] episode 49, reward -0.401676, avg reward -3.676102, total steps 6272, episode step 128\n",
|
|
"INFO:gym:episode 50, reward 0.329574, avg reward -3.595988, total steps 6400, episode step 128\n",
|
|
"[2018-02-18 14:08:13,346] episode 50, reward 0.329574, avg reward -3.595988, total steps 6400, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:08:13,349] Testing...\n",
|
|
"INFO:gym:Avg reward -0.583005(0.000000)\n",
|
|
"[2018-02-18 14:08:13,981] Avg reward -0.583005(0.000000)\n",
|
|
"INFO:gym:episode 51, reward 0.009372, avg reward -3.525295, total steps 6528, episode step 128\n",
|
|
"[2018-02-18 14:08:16,384] episode 51, reward 0.009372, avg reward -3.525295, total steps 6528, episode step 128\n",
|
|
"INFO:gym:episode 52, reward -0.431848, avg reward -3.465805, total steps 6656, episode step 128\n",
|
|
"[2018-02-18 14:08:18,587] episode 52, reward -0.431848, avg reward -3.465805, total steps 6656, episode step 128\n",
|
|
"INFO:gym:episode 53, reward 0.170881, avg reward -3.397189, total steps 6784, episode step 128\n",
|
|
"[2018-02-18 14:08:21,151] episode 53, reward 0.170881, avg reward -3.397189, total steps 6784, episode step 128\n",
|
|
"INFO:gym:episode 54, reward -0.568819, avg reward -3.344812, total steps 6912, episode step 128\n",
|
|
"[2018-02-18 14:08:23,734] episode 54, reward -0.568819, avg reward -3.344812, total steps 6912, episode step 128\n",
|
|
"INFO:gym:episode 55, reward -0.100944, avg reward -3.285832, total steps 7040, episode step 128\n",
|
|
"[2018-02-18 14:08:26,397] episode 55, reward -0.100944, avg reward -3.285832, total steps 7040, episode step 128\n",
|
|
"INFO:gym:episode 56, reward -0.007395, avg reward -3.227289, total steps 7168, episode step 128\n",
|
|
"[2018-02-18 14:08:28,896] episode 56, reward -0.007395, avg reward -3.227289, total steps 7168, episode step 128\n",
|
|
"INFO:gym:episode 57, reward -0.417079, avg reward -3.177987, total steps 7296, episode step 128\n",
|
|
"[2018-02-18 14:08:31,129] episode 57, reward -0.417079, avg reward -3.177987, total steps 7296, episode step 128\n",
|
|
"INFO:gym:episode 58, reward -0.257807, avg reward -3.127639, total steps 7424, episode step 128\n",
|
|
"[2018-02-18 14:08:33,511] episode 58, reward -0.257807, avg reward -3.127639, total steps 7424, episode step 128\n",
|
|
"INFO:gym:episode 59, reward -0.050452, avg reward -3.075483, total steps 7552, episode step 128\n",
|
|
"[2018-02-18 14:08:35,689] episode 59, reward -0.050452, avg reward -3.075483, total steps 7552, episode step 128\n",
|
|
"INFO:gym:episode 60, reward -0.229443, avg reward -3.028049, total steps 7680, episode step 128\n",
|
|
"[2018-02-18 14:08:37,779] episode 60, reward -0.229443, avg reward -3.028049, total steps 7680, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:08:37,780] Testing...\n",
|
|
"INFO:gym:Avg reward -0.017822(0.000000)\n",
|
|
"[2018-02-18 14:08:38,140] Avg reward -0.017822(0.000000)\n",
|
|
"INFO:gym:episode 61, reward -0.464015, avg reward -2.986016, total steps 7808, episode step 128\n",
|
|
"[2018-02-18 14:08:40,238] episode 61, reward -0.464015, avg reward -2.986016, total steps 7808, episode step 128\n",
|
|
"INFO:gym:episode 62, reward 0.062706, avg reward -2.936843, total steps 7936, episode step 128\n",
|
|
"[2018-02-18 14:08:42,308] episode 62, reward 0.062706, avg reward -2.936843, total steps 7936, episode step 128\n",
|
|
"INFO:gym:episode 63, reward 0.345025, avg reward -2.884750, total steps 8064, episode step 128\n",
|
|
"[2018-02-18 14:08:44,369] episode 63, reward 0.345025, avg reward -2.884750, total steps 8064, episode step 128\n",
|
|
"INFO:gym:episode 64, reward 0.512165, avg reward -2.831673, total steps 8192, episode step 128\n",
|
|
"[2018-02-18 14:08:46,428] episode 64, reward 0.512165, avg reward -2.831673, total steps 8192, episode step 128\n",
|
|
"INFO:gym:episode 65, reward 0.536662, avg reward -2.779852, total steps 8320, episode step 128\n",
|
|
"[2018-02-18 14:08:48,594] episode 65, reward 0.536662, avg reward -2.779852, total steps 8320, episode step 128\n",
|
|
"INFO:gym:episode 66, reward 0.035421, avg reward -2.737197, total steps 8448, episode step 128\n",
|
|
"[2018-02-18 14:08:50,864] episode 66, reward 0.035421, avg reward -2.737197, total steps 8448, episode step 128\n",
|
|
"INFO:gym:episode 67, reward -0.250618, avg reward -2.700084, total steps 8576, episode step 128\n",
|
|
"[2018-02-18 14:08:52,985] episode 67, reward -0.250618, avg reward -2.700084, total steps 8576, episode step 128\n",
|
|
"INFO:gym:episode 68, reward -0.637072, avg reward -2.669745, total steps 8704, episode step 128\n",
|
|
"[2018-02-18 14:08:55,259] episode 68, reward -0.637072, avg reward -2.669745, total steps 8704, episode step 128\n",
|
|
"INFO:gym:episode 69, reward 0.276029, avg reward -2.627053, total steps 8832, episode step 128\n",
|
|
"[2018-02-18 14:08:57,450] episode 69, reward 0.276029, avg reward -2.627053, total steps 8832, episode step 128\n",
|
|
"INFO:gym:episode 70, reward -0.583442, avg reward -2.597858, total steps 8960, episode step 128\n",
|
|
"[2018-02-18 14:08:59,679] episode 70, reward -0.583442, avg reward -2.597858, total steps 8960, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:08:59,681] Testing...\n",
|
|
"INFO:gym:Avg reward -0.291422(0.000000)\n",
|
|
"[2018-02-18 14:09:00,046] Avg reward -0.291422(0.000000)\n",
|
|
"INFO:gym:episode 71, reward -0.431480, avg reward -2.567346, total steps 9088, episode step 128\n",
|
|
"[2018-02-18 14:09:02,314] episode 71, reward -0.431480, avg reward -2.567346, total steps 9088, episode step 128\n",
|
|
"INFO:gym:episode 72, reward -0.283994, avg reward -2.535633, total steps 9216, episode step 128\n",
|
|
"[2018-02-18 14:09:04,407] episode 72, reward -0.283994, avg reward -2.535633, total steps 9216, episode step 128\n",
|
|
"INFO:gym:episode 73, reward -0.285047, avg reward -2.504803, total steps 9344, episode step 128\n",
|
|
"[2018-02-18 14:09:06,490] episode 73, reward -0.285047, avg reward -2.504803, total steps 9344, episode step 128\n",
|
|
"INFO:gym:episode 74, reward -0.415954, avg reward -2.476575, total steps 9472, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:09:08,689] episode 74, reward -0.415954, avg reward -2.476575, total steps 9472, episode step 128\n",
|
|
"INFO:gym:episode 75, reward 0.167118, avg reward -2.441326, total steps 9600, episode step 128\n",
|
|
"[2018-02-18 14:09:10,755] episode 75, reward 0.167118, avg reward -2.441326, total steps 9600, episode step 128\n",
|
|
"INFO:gym:episode 76, reward -0.026937, avg reward -2.409558, total steps 9728, episode step 128\n",
|
|
"[2018-02-18 14:09:12,817] episode 76, reward -0.026937, avg reward -2.409558, total steps 9728, episode step 128\n",
|
|
"INFO:gym:episode 77, reward -0.374907, avg reward -2.383134, total steps 9856, episode step 128\n",
|
|
"[2018-02-18 14:09:14,950] episode 77, reward -0.374907, avg reward -2.383134, total steps 9856, episode step 128\n",
|
|
"INFO:gym:episode 78, reward -0.555474, avg reward -2.359702, total steps 9984, episode step 128\n",
|
|
"[2018-02-18 14:09:17,133] episode 78, reward -0.555474, avg reward -2.359702, total steps 9984, episode step 128\n",
|
|
"INFO:gym:episode 79, reward -0.409236, avg reward -2.335013, total steps 10112, episode step 128\n",
|
|
"[2018-02-18 14:09:19,504] episode 79, reward -0.409236, avg reward -2.335013, total steps 10112, episode step 128\n",
|
|
"INFO:gym:episode 80, reward 0.239460, avg reward -2.302832, total steps 10240, episode step 128\n",
|
|
"[2018-02-18 14:09:21,604] episode 80, reward 0.239460, avg reward -2.302832, total steps 10240, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:09:21,608] Testing...\n",
|
|
"INFO:gym:Avg reward -0.070146(0.000000)\n",
|
|
"[2018-02-18 14:09:22,096] Avg reward -0.070146(0.000000)\n",
|
|
"INFO:gym:episode 81, reward -0.404656, avg reward -2.279397, total steps 10368, episode step 128\n",
|
|
"[2018-02-18 14:09:24,681] episode 81, reward -0.404656, avg reward -2.279397, total steps 10368, episode step 128\n",
|
|
"INFO:gym:episode 82, reward -0.152280, avg reward -2.253457, total steps 10496, episode step 128\n",
|
|
"[2018-02-18 14:09:27,220] episode 82, reward -0.152280, avg reward -2.253457, total steps 10496, episode step 128\n",
|
|
"INFO:gym:episode 83, reward -0.256786, avg reward -2.229401, total steps 10624, episode step 128\n",
|
|
"[2018-02-18 14:09:29,620] episode 83, reward -0.256786, avg reward -2.229401, total steps 10624, episode step 128\n",
|
|
"INFO:gym:episode 84, reward -0.171086, avg reward -2.204897, total steps 10752, episode step 128\n",
|
|
"[2018-02-18 14:09:31,859] episode 84, reward -0.171086, avg reward -2.204897, total steps 10752, episode step 128\n",
|
|
"INFO:gym:episode 85, reward 0.198807, avg reward -2.176618, total steps 10880, episode step 128\n",
|
|
"[2018-02-18 14:09:34,101] episode 85, reward 0.198807, avg reward -2.176618, total steps 10880, episode step 128\n",
|
|
"INFO:gym:episode 86, reward -0.624787, avg reward -2.158574, total steps 11008, episode step 128\n",
|
|
"[2018-02-18 14:09:36,525] episode 86, reward -0.624787, avg reward -2.158574, total steps 11008, episode step 128\n",
|
|
"INFO:gym:episode 87, reward -0.333925, avg reward -2.137601, total steps 11136, episode step 128\n",
|
|
"[2018-02-18 14:09:38,835] episode 87, reward -0.333925, avg reward -2.137601, total steps 11136, episode step 128\n",
|
|
"INFO:gym:episode 88, reward -0.285594, avg reward -2.116555, total steps 11264, episode step 128\n",
|
|
"[2018-02-18 14:09:40,961] episode 88, reward -0.285594, avg reward -2.116555, total steps 11264, episode step 128\n",
|
|
"INFO:gym:episode 89, reward -0.408023, avg reward -2.097358, total steps 11392, episode step 128\n",
|
|
"[2018-02-18 14:09:43,075] episode 89, reward -0.408023, avg reward -2.097358, total steps 11392, episode step 128\n",
|
|
"INFO:gym:episode 90, reward 0.171666, avg reward -2.072147, total steps 11520, episode step 128\n",
|
|
"[2018-02-18 14:09:45,195] episode 90, reward 0.171666, avg reward -2.072147, total steps 11520, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:09:45,196] Testing...\n",
|
|
"INFO:gym:Avg reward -0.431761(0.000000)\n",
|
|
"[2018-02-18 14:09:45,564] Avg reward -0.431761(0.000000)\n",
|
|
"INFO:gym:episode 91, reward -0.354682, avg reward -2.053273, total steps 11648, episode step 128\n",
|
|
"[2018-02-18 14:09:47,719] episode 91, reward -0.354682, avg reward -2.053273, total steps 11648, episode step 128\n",
|
|
"INFO:gym:episode 92, reward -0.264261, avg reward -2.033828, total steps 11776, episode step 128\n",
|
|
"[2018-02-18 14:09:49,749] episode 92, reward -0.264261, avg reward -2.033828, total steps 11776, episode step 128\n",
|
|
"INFO:gym:episode 93, reward -0.316633, avg reward -2.015363, total steps 11904, episode step 128\n",
|
|
"[2018-02-18 14:09:51,849] episode 93, reward -0.316633, avg reward -2.015363, total steps 11904, episode step 128\n",
|
|
"INFO:gym:episode 94, reward -0.434831, avg reward -1.998549, total steps 12032, episode step 128\n",
|
|
"[2018-02-18 14:09:54,036] episode 94, reward -0.434831, avg reward -1.998549, total steps 12032, episode step 128\n",
|
|
"INFO:gym:episode 95, reward -0.113078, avg reward -1.978702, total steps 12160, episode step 128\n",
|
|
"[2018-02-18 14:09:56,076] episode 95, reward -0.113078, avg reward -1.978702, total steps 12160, episode step 128\n",
|
|
"INFO:gym:episode 96, reward 0.098661, avg reward -1.957063, total steps 12288, episode step 128\n",
|
|
"[2018-02-18 14:09:58,172] episode 96, reward 0.098661, avg reward -1.957063, total steps 12288, episode step 128\n",
|
|
"INFO:gym:episode 97, reward 0.008744, avg reward -1.936797, total steps 12416, episode step 128\n",
|
|
"[2018-02-18 14:10:00,577] episode 97, reward 0.008744, avg reward -1.936797, total steps 12416, episode step 128\n",
|
|
"INFO:gym:episode 98, reward -0.461358, avg reward -1.921741, total steps 12544, episode step 128\n",
|
|
"[2018-02-18 14:10:03,094] episode 98, reward -0.461358, avg reward -1.921741, total steps 12544, episode step 128\n",
|
|
"INFO:gym:episode 99, reward 0.022747, avg reward -1.902100, total steps 12672, episode step 128\n",
|
|
"[2018-02-18 14:10:05,566] episode 99, reward 0.022747, avg reward -1.902100, total steps 12672, episode step 128\n",
|
|
"INFO:gym:episode 100, reward -0.603704, avg reward -1.889116, total steps 12800, episode step 128\n",
|
|
"[2018-02-18 14:10:07,872] episode 100, reward -0.603704, avg reward -1.889116, total steps 12800, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:10:07,876] Testing...\n",
|
|
"INFO:gym:Avg reward -0.109769(0.000000)\n",
|
|
"[2018-02-18 14:10:08,276] Avg reward -0.109769(0.000000)\n",
|
|
"INFO:gym:episode 101, reward -0.246408, avg reward -1.614032, total steps 12928, episode step 128\n",
|
|
"[2018-02-18 14:10:10,689] episode 101, reward -0.246408, avg reward -1.614032, total steps 12928, episode step 128\n",
|
|
"INFO:gym:episode 102, reward -0.322121, avg reward -1.234868, total steps 13056, episode step 128\n",
|
|
"[2018-02-18 14:10:13,318] episode 102, reward -0.322121, avg reward -1.234868, total steps 13056, episode step 128\n",
|
|
"INFO:gym:episode 103, reward -0.152661, avg reward -0.792285, total steps 13184, episode step 128\n",
|
|
"[2018-02-18 14:10:15,639] episode 103, reward -0.152661, avg reward -0.792285, total steps 13184, episode step 128\n",
|
|
"INFO:gym:episode 104, reward 0.028475, avg reward -0.559252, total steps 13312, episode step 128\n",
|
|
"[2018-02-18 14:10:17,788] episode 104, reward 0.028475, avg reward -0.559252, total steps 13312, episode step 128\n",
|
|
"INFO:gym:episode 105, reward 0.015711, avg reward -0.503504, total steps 13440, episode step 128\n",
|
|
"[2018-02-18 14:10:20,165] episode 105, reward 0.015711, avg reward -0.503504, total steps 13440, episode step 128\n",
|
|
"INFO:gym:episode 106, reward -0.233761, avg reward -0.416281, total steps 13568, episode step 128\n",
|
|
"[2018-02-18 14:10:22,930] episode 106, reward -0.233761, avg reward -0.416281, total steps 13568, episode step 128\n",
|
|
"INFO:gym:episode 107, reward -0.072074, avg reward -0.424133, total steps 13696, episode step 128\n",
|
|
"[2018-02-18 14:10:25,241] episode 107, reward -0.072074, avg reward -0.424133, total steps 13696, episode step 128\n",
|
|
"INFO:gym:episode 108, reward -0.033923, avg reward -0.422275, total steps 13824, episode step 128\n",
|
|
"[2018-02-18 14:10:27,733] episode 108, reward -0.033923, avg reward -0.422275, total steps 13824, episode step 128\n",
|
|
"INFO:gym:episode 109, reward 0.278668, avg reward -0.428147, total steps 13952, episode step 128\n",
|
|
"[2018-02-18 14:10:30,158] episode 109, reward 0.278668, avg reward -0.428147, total steps 13952, episode step 128\n",
|
|
"INFO:gym:episode 110, reward -0.061443, avg reward -0.380166, total steps 14080, episode step 128\n",
|
|
"[2018-02-18 14:10:32,751] episode 110, reward -0.061443, avg reward -0.380166, total steps 14080, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:10:32,755] Testing...\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:Avg reward -0.297198(0.000000)\n",
|
|
"[2018-02-18 14:10:33,251] Avg reward -0.297198(0.000000)\n",
|
|
"INFO:gym:episode 111, reward -0.016000, avg reward -0.360825, total steps 14208, episode step 128\n",
|
|
"[2018-02-18 14:10:35,412] episode 111, reward -0.016000, avg reward -0.360825, total steps 14208, episode step 128\n",
|
|
"INFO:gym:episode 112, reward -0.080619, avg reward -0.353750, total steps 14336, episode step 128\n",
|
|
"[2018-02-18 14:10:37,926] episode 112, reward -0.080619, avg reward -0.353750, total steps 14336, episode step 128\n",
|
|
"INFO:gym:episode 113, reward -0.030061, avg reward -0.313846, total steps 14464, episode step 128\n",
|
|
"[2018-02-18 14:10:40,645] episode 113, reward -0.030061, avg reward -0.313846, total steps 14464, episode step 128\n",
|
|
"INFO:gym:episode 114, reward -0.048807, avg reward -0.313991, total steps 14592, episode step 128\n",
|
|
"[2018-02-18 14:10:43,210] episode 114, reward -0.048807, avg reward -0.313991, total steps 14592, episode step 128\n",
|
|
"INFO:gym:episode 115, reward -0.094559, avg reward -0.313490, total steps 14720, episode step 128\n",
|
|
"[2018-02-18 14:10:45,780] episode 115, reward -0.094559, avg reward -0.313490, total steps 14720, episode step 128\n",
|
|
"INFO:gym:episode 116, reward -0.059038, avg reward -0.299994, total steps 14848, episode step 128\n",
|
|
"[2018-02-18 14:10:48,101] episode 116, reward -0.059038, avg reward -0.299994, total steps 14848, episode step 128\n",
|
|
"INFO:gym:episode 117, reward -0.235718, avg reward -0.297459, total steps 14976, episode step 128\n",
|
|
"[2018-02-18 14:10:50,504] episode 117, reward -0.235718, avg reward -0.297459, total steps 14976, episode step 128\n",
|
|
"INFO:gym:episode 118, reward -0.030220, avg reward -0.289872, total steps 15104, episode step 128\n",
|
|
"[2018-02-18 14:10:52,720] episode 118, reward -0.030220, avg reward -0.289872, total steps 15104, episode step 128\n",
|
|
"INFO:gym:episode 119, reward -0.295930, avg reward -0.286538, total steps 15232, episode step 128\n",
|
|
"[2018-02-18 14:10:55,088] episode 119, reward -0.295930, avg reward -0.286538, total steps 15232, episode step 128\n",
|
|
"INFO:gym:episode 120, reward -0.025253, avg reward -0.272073, total steps 15360, episode step 128\n",
|
|
"[2018-02-18 14:10:57,441] episode 120, reward -0.025253, avg reward -0.272073, total steps 15360, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:10:57,443] Testing...\n",
|
|
"INFO:gym:Avg reward -0.158218(0.000000)\n",
|
|
"[2018-02-18 14:10:57,817] Avg reward -0.158218(0.000000)\n",
|
|
"INFO:gym:episode 121, reward -0.024994, avg reward -0.268866, total steps 15488, episode step 128\n",
|
|
"[2018-02-18 14:10:59,935] episode 121, reward -0.024994, avg reward -0.268866, total steps 15488, episode step 128\n",
|
|
"INFO:gym:episode 122, reward -0.117230, avg reward -0.243922, total steps 15616, episode step 128\n",
|
|
"[2018-02-18 14:11:01,973] episode 122, reward -0.117230, avg reward -0.243922, total steps 15616, episode step 128\n",
|
|
"INFO:gym:episode 123, reward -0.124639, avg reward -0.244237, total steps 15744, episode step 128\n",
|
|
"[2018-02-18 14:11:03,967] episode 123, reward -0.124639, avg reward -0.244237, total steps 15744, episode step 128\n",
|
|
"INFO:gym:episode 124, reward -0.092982, avg reward -0.241723, total steps 15872, episode step 128\n",
|
|
"[2018-02-18 14:11:06,052] episode 124, reward -0.092982, avg reward -0.241723, total steps 15872, episode step 128\n",
|
|
"INFO:gym:episode 125, reward -0.110750, avg reward -0.242766, total steps 16000, episode step 128\n",
|
|
"[2018-02-18 14:11:08,086] episode 125, reward -0.110750, avg reward -0.242766, total steps 16000, episode step 128\n",
|
|
"INFO:gym:episode 126, reward -0.186871, avg reward -0.219598, total steps 16128, episode step 128\n",
|
|
"[2018-02-18 14:11:10,132] episode 126, reward -0.186871, avg reward -0.219598, total steps 16128, episode step 128\n",
|
|
"INFO:gym:episode 127, reward -0.116325, avg reward -0.221754, total steps 16256, episode step 128\n",
|
|
"[2018-02-18 14:11:12,274] episode 127, reward -0.116325, avg reward -0.221754, total steps 16256, episode step 128\n",
|
|
"INFO:gym:episode 128, reward -0.055515, avg reward -0.221145, total steps 16384, episode step 128\n",
|
|
"[2018-02-18 14:11:14,548] episode 128, reward -0.055515, avg reward -0.221145, total steps 16384, episode step 128\n",
|
|
"INFO:gym:episode 129, reward -0.141341, avg reward -0.213291, total steps 16512, episode step 128\n",
|
|
"[2018-02-18 14:11:16,638] episode 129, reward -0.141341, avg reward -0.213291, total steps 16512, episode step 128\n",
|
|
"INFO:gym:episode 130, reward -0.188112, avg reward -0.202617, total steps 16640, episode step 128\n",
|
|
"[2018-02-18 14:11:18,812] episode 130, reward -0.188112, avg reward -0.202617, total steps 16640, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:11:18,815] Testing...\n",
|
|
"INFO:gym:Avg reward -0.120143(0.000000)\n",
|
|
"[2018-02-18 14:11:19,241] Avg reward -0.120143(0.000000)\n",
|
|
"INFO:gym:episode 131, reward 0.013117, avg reward -0.199539, total steps 16768, episode step 128\n",
|
|
"[2018-02-18 14:11:21,628] episode 131, reward 0.013117, avg reward -0.199539, total steps 16768, episode step 128\n",
|
|
"INFO:gym:episode 132, reward 0.014865, avg reward -0.187112, total steps 16896, episode step 128\n",
|
|
"[2018-02-18 14:11:24,115] episode 132, reward 0.014865, avg reward -0.187112, total steps 16896, episode step 128\n",
|
|
"INFO:gym:episode 133, reward 0.042943, avg reward -0.187672, total steps 17024, episode step 128\n",
|
|
"[2018-02-18 14:11:26,678] episode 133, reward 0.042943, avg reward -0.187672, total steps 17024, episode step 128\n",
|
|
"INFO:gym:episode 134, reward -0.046242, avg reward -0.166832, total steps 17152, episode step 128\n",
|
|
"[2018-02-18 14:11:29,247] episode 134, reward -0.046242, avg reward -0.166832, total steps 17152, episode step 128\n",
|
|
"INFO:gym:episode 135, reward 0.012938, avg reward -0.161305, total steps 17280, episode step 128\n",
|
|
"[2018-02-18 14:11:31,612] episode 135, reward 0.012938, avg reward -0.161305, total steps 17280, episode step 128\n",
|
|
"INFO:gym:episode 136, reward -0.381354, avg reward -0.165468, total steps 17408, episode step 128\n",
|
|
"[2018-02-18 14:11:33,947] episode 136, reward -0.381354, avg reward -0.165468, total steps 17408, episode step 128\n",
|
|
"INFO:gym:episode 137, reward -0.094160, avg reward -0.161847, total steps 17536, episode step 128\n",
|
|
"[2018-02-18 14:11:36,176] episode 137, reward -0.094160, avg reward -0.161847, total steps 17536, episode step 128\n",
|
|
"INFO:gym:episode 138, reward -0.278735, avg reward -0.149279, total steps 17664, episode step 128\n",
|
|
"[2018-02-18 14:11:38,268] episode 138, reward -0.278735, avg reward -0.149279, total steps 17664, episode step 128\n",
|
|
"INFO:gym:episode 139, reward -0.196261, avg reward -0.151766, total steps 17792, episode step 128\n",
|
|
"[2018-02-18 14:11:40,301] episode 139, reward -0.196261, avg reward -0.151766, total steps 17792, episode step 128\n",
|
|
"INFO:gym:episode 140, reward -0.223778, avg reward -0.150792, total steps 17920, episode step 128\n",
|
|
"[2018-02-18 14:11:42,326] episode 140, reward -0.223778, avg reward -0.150792, total steps 17920, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:11:42,332] Testing...\n",
|
|
"INFO:gym:Avg reward -0.162297(0.000000)\n",
|
|
"[2018-02-18 14:11:42,680] Avg reward -0.162297(0.000000)\n",
|
|
"INFO:gym:episode 141, reward -0.257213, avg reward -0.149581, total steps 18048, episode step 128\n",
|
|
"[2018-02-18 14:11:45,106] episode 141, reward -0.257213, avg reward -0.149581, total steps 18048, episode step 128\n",
|
|
"INFO:gym:episode 142, reward -0.425900, avg reward -0.150980, total steps 18176, episode step 128\n",
|
|
"[2018-02-18 14:11:47,118] episode 142, reward -0.425900, avg reward -0.150980, total steps 18176, episode step 128\n",
|
|
"INFO:gym:episode 143, reward -0.003547, avg reward -0.150362, total steps 18304, episode step 128\n",
|
|
"[2018-02-18 14:11:49,100] episode 143, reward -0.003547, avg reward -0.150362, total steps 18304, episode step 128\n",
|
|
"INFO:gym:episode 144, reward 0.107197, avg reward -0.141156, total steps 18432, episode step 128\n",
|
|
"[2018-02-18 14:11:51,073] episode 144, reward 0.107197, avg reward -0.141156, total steps 18432, episode step 128\n",
|
|
"INFO:gym:episode 145, reward 0.054193, avg reward -0.137795, total steps 18560, episode step 128\n",
|
|
"[2018-02-18 14:11:53,120] episode 145, reward 0.054193, avg reward -0.137795, total steps 18560, episode step 128\n",
|
|
"INFO:gym:episode 146, reward -0.172881, avg reward -0.142616, total steps 18688, episode step 128\n",
|
|
"[2018-02-18 14:11:55,078] episode 146, reward -0.172881, avg reward -0.142616, total steps 18688, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 147, reward 0.027771, avg reward -0.140219, total steps 18816, episode step 128\n",
|
|
"[2018-02-18 14:11:57,063] episode 147, reward 0.027771, avg reward -0.140219, total steps 18816, episode step 128\n",
|
|
"INFO:gym:episode 148, reward -0.308236, avg reward -0.141741, total steps 18944, episode step 128\n",
|
|
"[2018-02-18 14:11:59,199] episode 148, reward -0.308236, avg reward -0.141741, total steps 18944, episode step 128\n",
|
|
"INFO:gym:episode 149, reward -0.029165, avg reward -0.138016, total steps 19072, episode step 128\n",
|
|
"[2018-02-18 14:12:01,469] episode 149, reward -0.029165, avg reward -0.138016, total steps 19072, episode step 128\n",
|
|
"INFO:gym:episode 150, reward -0.358389, avg reward -0.144895, total steps 19200, episode step 128\n",
|
|
"[2018-02-18 14:12:03,646] episode 150, reward -0.358389, avg reward -0.144895, total steps 19200, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:12:03,650] Testing...\n",
|
|
"INFO:gym:Avg reward -0.068248(0.000000)\n",
|
|
"[2018-02-18 14:12:04,012] Avg reward -0.068248(0.000000)\n",
|
|
"INFO:gym:episode 151, reward -0.120023, avg reward -0.146189, total steps 19328, episode step 128\n",
|
|
"[2018-02-18 14:12:06,228] episode 151, reward -0.120023, avg reward -0.146189, total steps 19328, episode step 128\n",
|
|
"INFO:gym:episode 152, reward -0.259124, avg reward -0.144462, total steps 19456, episode step 128\n",
|
|
"[2018-02-18 14:12:08,465] episode 152, reward -0.259124, avg reward -0.144462, total steps 19456, episode step 128\n",
|
|
"INFO:gym:episode 153, reward -0.069532, avg reward -0.146866, total steps 19584, episode step 128\n",
|
|
"[2018-02-18 14:12:10,619] episode 153, reward -0.069532, avg reward -0.146866, total steps 19584, episode step 128\n",
|
|
"INFO:gym:episode 154, reward -0.145001, avg reward -0.142628, total steps 19712, episode step 128\n",
|
|
"[2018-02-18 14:12:12,723] episode 154, reward -0.145001, avg reward -0.142628, total steps 19712, episode step 128\n",
|
|
"INFO:gym:episode 155, reward -0.179297, avg reward -0.143411, total steps 19840, episode step 128\n",
|
|
"[2018-02-18 14:12:14,766] episode 155, reward -0.179297, avg reward -0.143411, total steps 19840, episode step 128\n",
|
|
"INFO:gym:episode 156, reward -0.372938, avg reward -0.147067, total steps 19968, episode step 128\n",
|
|
"[2018-02-18 14:12:16,882] episode 156, reward -0.372938, avg reward -0.147067, total steps 19968, episode step 128\n",
|
|
"INFO:gym:episode 157, reward -0.093312, avg reward -0.143829, total steps 20096, episode step 128\n",
|
|
"[2018-02-18 14:12:19,127] episode 157, reward -0.093312, avg reward -0.143829, total steps 20096, episode step 128\n",
|
|
"INFO:gym:episode 158, reward -0.321621, avg reward -0.144467, total steps 20224, episode step 128\n",
|
|
"[2018-02-18 14:12:21,225] episode 158, reward -0.321621, avg reward -0.144467, total steps 20224, episode step 128\n",
|
|
"INFO:gym:episode 159, reward -0.120910, avg reward -0.145172, total steps 20352, episode step 128\n",
|
|
"[2018-02-18 14:12:23,260] episode 159, reward -0.120910, avg reward -0.145172, total steps 20352, episode step 128\n",
|
|
"INFO:gym:episode 160, reward -0.117740, avg reward -0.144055, total steps 20480, episode step 128\n",
|
|
"[2018-02-18 14:12:25,281] episode 160, reward -0.117740, avg reward -0.144055, total steps 20480, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:12:25,284] Testing...\n",
|
|
"INFO:gym:Avg reward -0.124617(0.000000)\n",
|
|
"[2018-02-18 14:12:25,609] Avg reward -0.124617(0.000000)\n",
|
|
"INFO:gym:episode 161, reward -0.254188, avg reward -0.141957, total steps 20608, episode step 128\n",
|
|
"[2018-02-18 14:12:27,645] episode 161, reward -0.254188, avg reward -0.141957, total steps 20608, episode step 128\n",
|
|
"INFO:gym:episode 162, reward 0.168525, avg reward -0.140898, total steps 20736, episode step 128\n",
|
|
"[2018-02-18 14:12:29,757] episode 162, reward 0.168525, avg reward -0.140898, total steps 20736, episode step 128\n",
|
|
"INFO:gym:episode 163, reward -0.086927, avg reward -0.145218, total steps 20864, episode step 128\n",
|
|
"[2018-02-18 14:12:31,780] episode 163, reward -0.086927, avg reward -0.145218, total steps 20864, episode step 128\n",
|
|
"INFO:gym:episode 164, reward 0.001503, avg reward -0.150325, total steps 20992, episode step 128\n",
|
|
"[2018-02-18 14:12:33,872] episode 164, reward 0.001503, avg reward -0.150325, total steps 20992, episode step 128\n",
|
|
"INFO:gym:episode 165, reward -0.178860, avg reward -0.157480, total steps 21120, episode step 128\n",
|
|
"[2018-02-18 14:12:36,095] episode 165, reward -0.178860, avg reward -0.157480, total steps 21120, episode step 128\n",
|
|
"INFO:gym:episode 166, reward -0.212521, avg reward -0.159959, total steps 21248, episode step 128\n",
|
|
"[2018-02-18 14:12:38,319] episode 166, reward -0.212521, avg reward -0.159959, total steps 21248, episode step 128\n",
|
|
"INFO:gym:episode 167, reward 0.071091, avg reward -0.156742, total steps 21376, episode step 128\n",
|
|
"[2018-02-18 14:12:40,589] episode 167, reward 0.071091, avg reward -0.156742, total steps 21376, episode step 128\n",
|
|
"INFO:gym:episode 168, reward -0.184757, avg reward -0.152219, total steps 21504, episode step 128\n",
|
|
"[2018-02-18 14:12:42,847] episode 168, reward -0.184757, avg reward -0.152219, total steps 21504, episode step 128\n",
|
|
"INFO:gym:episode 169, reward 0.001373, avg reward -0.154965, total steps 21632, episode step 128\n",
|
|
"[2018-02-18 14:12:45,260] episode 169, reward 0.001373, avg reward -0.154965, total steps 21632, episode step 128\n",
|
|
"INFO:gym:episode 170, reward -0.246452, avg reward -0.151596, total steps 21760, episode step 128\n",
|
|
"[2018-02-18 14:12:47,619] episode 170, reward -0.246452, avg reward -0.151596, total steps 21760, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:12:47,620] Testing...\n",
|
|
"INFO:gym:Avg reward -0.183946(0.000000)\n",
|
|
"[2018-02-18 14:12:47,966] Avg reward -0.183946(0.000000)\n",
|
|
"INFO:gym:episode 171, reward -0.194417, avg reward -0.149225, total steps 21888, episode step 128\n",
|
|
"[2018-02-18 14:12:50,394] episode 171, reward -0.194417, avg reward -0.149225, total steps 21888, episode step 128\n",
|
|
"INFO:gym:episode 172, reward -0.067500, avg reward -0.147060, total steps 22016, episode step 128\n",
|
|
"[2018-02-18 14:12:52,735] episode 172, reward -0.067500, avg reward -0.147060, total steps 22016, episode step 128\n",
|
|
"INFO:gym:episode 173, reward -0.089882, avg reward -0.145108, total steps 22144, episode step 128\n",
|
|
"[2018-02-18 14:12:55,126] episode 173, reward -0.089882, avg reward -0.145108, total steps 22144, episode step 128\n",
|
|
"INFO:gym:episode 174, reward 0.019564, avg reward -0.140753, total steps 22272, episode step 128\n",
|
|
"[2018-02-18 14:12:57,647] episode 174, reward 0.019564, avg reward -0.140753, total steps 22272, episode step 128\n",
|
|
"INFO:gym:episode 175, reward -0.083899, avg reward -0.143263, total steps 22400, episode step 128\n",
|
|
"[2018-02-18 14:13:00,265] episode 175, reward -0.083899, avg reward -0.143263, total steps 22400, episode step 128\n",
|
|
"INFO:gym:episode 176, reward -0.073405, avg reward -0.143728, total steps 22528, episode step 128\n",
|
|
"[2018-02-18 14:13:02,962] episode 176, reward -0.073405, avg reward -0.143728, total steps 22528, episode step 128\n",
|
|
"INFO:gym:episode 177, reward -0.225988, avg reward -0.142239, total steps 22656, episode step 128\n",
|
|
"[2018-02-18 14:13:05,448] episode 177, reward -0.225988, avg reward -0.142239, total steps 22656, episode step 128\n",
|
|
"INFO:gym:episode 178, reward -0.223716, avg reward -0.138921, total steps 22784, episode step 128\n",
|
|
"[2018-02-18 14:13:07,971] episode 178, reward -0.223716, avg reward -0.138921, total steps 22784, episode step 128\n",
|
|
"INFO:gym:episode 179, reward -0.042319, avg reward -0.135252, total steps 22912, episode step 128\n",
|
|
"[2018-02-18 14:13:10,738] episode 179, reward -0.042319, avg reward -0.135252, total steps 22912, episode step 128\n",
|
|
"INFO:gym:episode 180, reward -0.054649, avg reward -0.138193, total steps 23040, episode step 128\n",
|
|
"[2018-02-18 14:13:13,453] episode 180, reward -0.054649, avg reward -0.138193, total steps 23040, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:13:13,454] Testing...\n",
|
|
"INFO:gym:Avg reward -0.085319(0.000000)\n",
|
|
"[2018-02-18 14:13:13,847] Avg reward -0.085319(0.000000)\n",
|
|
"INFO:gym:episode 181, reward -0.123320, avg reward -0.135380, total steps 23168, episode step 128\n",
|
|
"[2018-02-18 14:13:16,396] episode 181, reward -0.123320, avg reward -0.135380, total steps 23168, episode step 128\n",
|
|
"INFO:gym:episode 182, reward 0.069951, avg reward -0.133158, total steps 23296, episode step 128\n",
|
|
"[2018-02-18 14:13:18,976] episode 182, reward 0.069951, avg reward -0.133158, total steps 23296, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 183, reward 0.037859, avg reward -0.130211, total steps 23424, episode step 128\n",
|
|
"[2018-02-18 14:13:21,539] episode 183, reward 0.037859, avg reward -0.130211, total steps 23424, episode step 128\n",
|
|
"INFO:gym:episode 184, reward -0.122502, avg reward -0.129725, total steps 23552, episode step 128\n",
|
|
"[2018-02-18 14:13:24,078] episode 184, reward -0.122502, avg reward -0.129725, total steps 23552, episode step 128\n",
|
|
"INFO:gym:episode 185, reward -0.108088, avg reward -0.132794, total steps 23680, episode step 128\n",
|
|
"[2018-02-18 14:13:26,676] episode 185, reward -0.108088, avg reward -0.132794, total steps 23680, episode step 128\n",
|
|
"INFO:gym:episode 186, reward -0.046730, avg reward -0.127014, total steps 23808, episode step 128\n",
|
|
"[2018-02-18 14:13:29,180] episode 186, reward -0.046730, avg reward -0.127014, total steps 23808, episode step 128\n",
|
|
"INFO:gym:episode 187, reward -0.096179, avg reward -0.124636, total steps 23936, episode step 128\n",
|
|
"[2018-02-18 14:13:31,742] episode 187, reward -0.096179, avg reward -0.124636, total steps 23936, episode step 128\n",
|
|
"INFO:gym:episode 188, reward -0.130386, avg reward -0.123084, total steps 24064, episode step 128\n",
|
|
"[2018-02-18 14:13:34,160] episode 188, reward -0.130386, avg reward -0.123084, total steps 24064, episode step 128\n",
|
|
"INFO:gym:episode 189, reward -0.032719, avg reward -0.119331, total steps 24192, episode step 128\n",
|
|
"[2018-02-18 14:13:36,672] episode 189, reward -0.032719, avg reward -0.119331, total steps 24192, episode step 128\n",
|
|
"INFO:gym:episode 190, reward -0.045830, avg reward -0.121506, total steps 24320, episode step 128\n",
|
|
"[2018-02-18 14:13:39,284] episode 190, reward -0.045830, avg reward -0.121506, total steps 24320, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:13:39,288] Testing...\n",
|
|
"INFO:gym:Avg reward -0.030750(0.000000)\n",
|
|
"[2018-02-18 14:13:39,623] Avg reward -0.030750(0.000000)\n",
|
|
"INFO:gym:episode 191, reward 0.002312, avg reward -0.117936, total steps 24448, episode step 128\n",
|
|
"[2018-02-18 14:13:42,431] episode 191, reward 0.002312, avg reward -0.117936, total steps 24448, episode step 128\n",
|
|
"INFO:gym:episode 192, reward -0.078065, avg reward -0.116074, total steps 24576, episode step 128\n",
|
|
"[2018-02-18 14:13:45,411] episode 192, reward -0.078065, avg reward -0.116074, total steps 24576, episode step 128\n",
|
|
"INFO:gym:episode 193, reward -0.089270, avg reward -0.113800, total steps 24704, episode step 128\n",
|
|
"[2018-02-18 14:13:48,511] episode 193, reward -0.089270, avg reward -0.113800, total steps 24704, episode step 128\n",
|
|
"INFO:gym:episode 194, reward -0.144706, avg reward -0.110899, total steps 24832, episode step 128\n",
|
|
"[2018-02-18 14:13:51,818] episode 194, reward -0.144706, avg reward -0.110899, total steps 24832, episode step 128\n",
|
|
"INFO:gym:episode 195, reward 0.057408, avg reward -0.109194, total steps 24960, episode step 128\n",
|
|
"[2018-02-18 14:13:55,236] episode 195, reward 0.057408, avg reward -0.109194, total steps 24960, episode step 128\n",
|
|
"INFO:gym:episode 196, reward -0.016524, avg reward -0.110346, total steps 25088, episode step 128\n",
|
|
"[2018-02-18 14:13:58,596] episode 196, reward -0.016524, avg reward -0.110346, total steps 25088, episode step 128\n",
|
|
"INFO:gym:episode 197, reward 0.002410, avg reward -0.110410, total steps 25216, episode step 128\n",
|
|
"[2018-02-18 14:14:02,225] episode 197, reward 0.002410, avg reward -0.110410, total steps 25216, episode step 128\n",
|
|
"INFO:gym:episode 198, reward -0.123699, avg reward -0.107033, total steps 25344, episode step 128\n",
|
|
"[2018-02-18 14:14:05,747] episode 198, reward -0.123699, avg reward -0.107033, total steps 25344, episode step 128\n",
|
|
"INFO:gym:episode 199, reward -0.070621, avg reward -0.107967, total steps 25472, episode step 128\n",
|
|
"[2018-02-18 14:14:09,599] episode 199, reward -0.070621, avg reward -0.107967, total steps 25472, episode step 128\n",
|
|
"INFO:gym:episode 200, reward -0.089424, avg reward -0.102824, total steps 25600, episode step 128\n",
|
|
"[2018-02-18 14:14:13,577] episode 200, reward -0.089424, avg reward -0.102824, total steps 25600, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:14:13,582] Testing...\n",
|
|
"INFO:gym:Avg reward 0.380339(0.000000)\n",
|
|
"[2018-02-18 14:14:14,007] Avg reward 0.380339(0.000000)\n",
|
|
"INFO:gym:episode 201, reward -0.035517, avg reward -0.100715, total steps 25728, episode step 128\n",
|
|
"[2018-02-18 14:14:18,099] episode 201, reward -0.035517, avg reward -0.100715, total steps 25728, episode step 128\n",
|
|
"INFO:gym:episode 202, reward -0.171553, avg reward -0.099209, total steps 25856, episode step 128\n",
|
|
"[2018-02-18 14:14:22,535] episode 202, reward -0.171553, avg reward -0.099209, total steps 25856, episode step 128\n",
|
|
"INFO:gym:episode 203, reward -0.069846, avg reward -0.098381, total steps 25984, episode step 128\n",
|
|
"[2018-02-18 14:14:26,620] episode 203, reward -0.069846, avg reward -0.098381, total steps 25984, episode step 128\n",
|
|
"INFO:gym:episode 204, reward -0.086717, avg reward -0.099533, total steps 26112, episode step 128\n",
|
|
"[2018-02-18 14:14:30,590] episode 204, reward -0.086717, avg reward -0.099533, total steps 26112, episode step 128\n",
|
|
"INFO:gym:episode 205, reward -0.087781, avg reward -0.100568, total steps 26240, episode step 128\n",
|
|
"[2018-02-18 14:14:34,581] episode 205, reward -0.087781, avg reward -0.100568, total steps 26240, episode step 128\n",
|
|
"INFO:gym:episode 206, reward -0.056205, avg reward -0.098792, total steps 26368, episode step 128\n",
|
|
"[2018-02-18 14:14:38,763] episode 206, reward -0.056205, avg reward -0.098792, total steps 26368, episode step 128\n",
|
|
"INFO:gym:episode 207, reward -0.256463, avg reward -0.100636, total steps 26496, episode step 128\n",
|
|
"[2018-02-18 14:14:43,203] episode 207, reward -0.256463, avg reward -0.100636, total steps 26496, episode step 128\n",
|
|
"INFO:gym:episode 208, reward -0.168858, avg reward -0.101986, total steps 26624, episode step 128\n",
|
|
"[2018-02-18 14:14:47,392] episode 208, reward -0.168858, avg reward -0.101986, total steps 26624, episode step 128\n",
|
|
"INFO:gym:episode 209, reward -0.079494, avg reward -0.105567, total steps 26752, episode step 128\n",
|
|
"[2018-02-18 14:14:51,529] episode 209, reward -0.079494, avg reward -0.105567, total steps 26752, episode step 128\n",
|
|
"INFO:gym:episode 210, reward -0.128241, avg reward -0.106235, total steps 26880, episode step 128\n",
|
|
"[2018-02-18 14:14:55,959] episode 210, reward -0.128241, avg reward -0.106235, total steps 26880, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:14:55,961] Testing...\n",
|
|
"INFO:gym:Avg reward -0.368873(0.000000)\n",
|
|
"[2018-02-18 14:14:56,356] Avg reward -0.368873(0.000000)\n",
|
|
"INFO:gym:episode 211, reward -0.159426, avg reward -0.107669, total steps 27008, episode step 128\n",
|
|
"[2018-02-18 14:15:00,982] episode 211, reward -0.159426, avg reward -0.107669, total steps 27008, episode step 128\n",
|
|
"INFO:gym:episode 212, reward 0.016161, avg reward -0.106702, total steps 27136, episode step 128\n",
|
|
"[2018-02-18 14:15:05,718] episode 212, reward 0.016161, avg reward -0.106702, total steps 27136, episode step 128\n",
|
|
"INFO:gym:episode 213, reward -0.068348, avg reward -0.107085, total steps 27264, episode step 128\n",
|
|
"[2018-02-18 14:15:10,585] episode 213, reward -0.068348, avg reward -0.107085, total steps 27264, episode step 128\n",
|
|
"INFO:gym:episode 214, reward -0.014889, avg reward -0.106745, total steps 27392, episode step 128\n",
|
|
"[2018-02-18 14:15:15,414] episode 214, reward -0.014889, avg reward -0.106745, total steps 27392, episode step 128\n",
|
|
"INFO:gym:episode 215, reward 0.086933, avg reward -0.104930, total steps 27520, episode step 128\n",
|
|
"[2018-02-18 14:15:20,721] episode 215, reward 0.086933, avg reward -0.104930, total steps 27520, episode step 128\n",
|
|
"INFO:gym:episode 216, reward -0.141422, avg reward -0.105754, total steps 27648, episode step 128\n",
|
|
"[2018-02-18 14:15:25,892] episode 216, reward -0.141422, avg reward -0.105754, total steps 27648, episode step 128\n",
|
|
"INFO:gym:episode 217, reward -0.008320, avg reward -0.103480, total steps 27776, episode step 128\n",
|
|
"[2018-02-18 14:15:30,763] episode 217, reward -0.008320, avg reward -0.103480, total steps 27776, episode step 128\n",
|
|
"INFO:gym:episode 218, reward 0.018808, avg reward -0.102990, total steps 27904, episode step 128\n",
|
|
"[2018-02-18 14:15:35,868] episode 218, reward 0.018808, avg reward -0.102990, total steps 27904, episode step 128\n",
|
|
"INFO:gym:episode 219, reward 0.013383, avg reward -0.099897, total steps 28032, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:15:40,914] episode 219, reward 0.013383, avg reward -0.099897, total steps 28032, episode step 128\n",
|
|
"INFO:gym:episode 220, reward -0.176706, avg reward -0.101411, total steps 28160, episode step 128\n",
|
|
"[2018-02-18 14:15:45,788] episode 220, reward -0.176706, avg reward -0.101411, total steps 28160, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:15:45,791] Testing...\n",
|
|
"INFO:gym:Avg reward -0.070726(0.000000)\n",
|
|
"[2018-02-18 14:15:46,420] Avg reward -0.070726(0.000000)\n",
|
|
"INFO:gym:episode 221, reward -0.036541, avg reward -0.101527, total steps 28288, episode step 128\n",
|
|
"[2018-02-18 14:15:50,844] episode 221, reward -0.036541, avg reward -0.101527, total steps 28288, episode step 128\n",
|
|
"INFO:gym:episode 222, reward -0.116075, avg reward -0.101515, total steps 28416, episode step 128\n",
|
|
"[2018-02-18 14:15:54,867] episode 222, reward -0.116075, avg reward -0.101515, total steps 28416, episode step 128\n",
|
|
"INFO:gym:episode 223, reward -0.011756, avg reward -0.100387, total steps 28544, episode step 128\n",
|
|
"[2018-02-18 14:15:58,788] episode 223, reward -0.011756, avg reward -0.100387, total steps 28544, episode step 128\n",
|
|
"INFO:gym:episode 224, reward -0.038311, avg reward -0.099840, total steps 28672, episode step 128\n",
|
|
"[2018-02-18 14:16:01,032] episode 224, reward -0.038311, avg reward -0.099840, total steps 28672, episode step 128\n",
|
|
"INFO:gym:episode 225, reward 0.010263, avg reward -0.098630, total steps 28800, episode step 128\n",
|
|
"[2018-02-18 14:16:03,212] episode 225, reward 0.010263, avg reward -0.098630, total steps 28800, episode step 128\n",
|
|
"INFO:gym:episode 226, reward -0.002156, avg reward -0.096783, total steps 28928, episode step 128\n",
|
|
"[2018-02-18 14:16:05,506] episode 226, reward -0.002156, avg reward -0.096783, total steps 28928, episode step 128\n",
|
|
"INFO:gym:episode 227, reward -0.155121, avg reward -0.097170, total steps 29056, episode step 128\n",
|
|
"[2018-02-18 14:16:07,492] episode 227, reward -0.155121, avg reward -0.097170, total steps 29056, episode step 128\n",
|
|
"INFO:gym:episode 228, reward -0.023215, avg reward -0.096847, total steps 29184, episode step 128\n",
|
|
"[2018-02-18 14:16:09,474] episode 228, reward -0.023215, avg reward -0.096847, total steps 29184, episode step 128\n",
|
|
"INFO:gym:episode 229, reward -0.162118, avg reward -0.097055, total steps 29312, episode step 128\n",
|
|
"[2018-02-18 14:16:11,665] episode 229, reward -0.162118, avg reward -0.097055, total steps 29312, episode step 128\n",
|
|
"INFO:gym:episode 230, reward -0.042938, avg reward -0.095603, total steps 29440, episode step 128\n",
|
|
"[2018-02-18 14:16:13,819] episode 230, reward -0.042938, avg reward -0.095603, total steps 29440, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:16:13,822] Testing...\n",
|
|
"INFO:gym:Avg reward -0.004167(0.000000)\n",
|
|
"[2018-02-18 14:16:14,195] Avg reward -0.004167(0.000000)\n",
|
|
"INFO:gym:episode 231, reward -0.014549, avg reward -0.095880, total steps 29568, episode step 128\n",
|
|
"[2018-02-18 14:16:16,390] episode 231, reward -0.014549, avg reward -0.095880, total steps 29568, episode step 128\n",
|
|
"INFO:gym:episode 232, reward 0.085754, avg reward -0.095171, total steps 29696, episode step 128\n",
|
|
"[2018-02-18 14:16:18,820] episode 232, reward 0.085754, avg reward -0.095171, total steps 29696, episode step 128\n",
|
|
"INFO:gym:episode 233, reward -0.108158, avg reward -0.096682, total steps 29824, episode step 128\n",
|
|
"[2018-02-18 14:16:21,154] episode 233, reward -0.108158, avg reward -0.096682, total steps 29824, episode step 128\n",
|
|
"INFO:gym:episode 234, reward -0.028970, avg reward -0.096510, total steps 29952, episode step 128\n",
|
|
"[2018-02-18 14:16:23,376] episode 234, reward -0.028970, avg reward -0.096510, total steps 29952, episode step 128\n",
|
|
"INFO:gym:episode 235, reward -0.001952, avg reward -0.096658, total steps 30080, episode step 128\n",
|
|
"[2018-02-18 14:16:25,466] episode 235, reward -0.001952, avg reward -0.096658, total steps 30080, episode step 128\n",
|
|
"INFO:gym:episode 236, reward -0.031522, avg reward -0.093160, total steps 30208, episode step 128\n",
|
|
"[2018-02-18 14:16:27,462] episode 236, reward -0.031522, avg reward -0.093160, total steps 30208, episode step 128\n",
|
|
"INFO:gym:episode 237, reward -0.098385, avg reward -0.093202, total steps 30336, episode step 128\n",
|
|
"[2018-02-18 14:16:29,439] episode 237, reward -0.098385, avg reward -0.093202, total steps 30336, episode step 128\n",
|
|
"INFO:gym:episode 238, reward -0.003630, avg reward -0.090451, total steps 30464, episode step 128\n",
|
|
"[2018-02-18 14:16:31,413] episode 238, reward -0.003630, avg reward -0.090451, total steps 30464, episode step 128\n",
|
|
"INFO:gym:episode 239, reward -0.014929, avg reward -0.088638, total steps 30592, episode step 128\n",
|
|
"[2018-02-18 14:16:33,397] episode 239, reward -0.014929, avg reward -0.088638, total steps 30592, episode step 128\n",
|
|
"INFO:gym:episode 240, reward -0.357913, avg reward -0.089979, total steps 30720, episode step 128\n",
|
|
"[2018-02-18 14:16:35,440] episode 240, reward -0.357913, avg reward -0.089979, total steps 30720, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:16:35,444] Testing...\n",
|
|
"INFO:gym:Avg reward -0.038213(0.000000)\n",
|
|
"[2018-02-18 14:16:35,806] Avg reward -0.038213(0.000000)\n",
|
|
"INFO:gym:episode 241, reward -0.117020, avg reward -0.088577, total steps 30848, episode step 128\n",
|
|
"[2018-02-18 14:16:38,144] episode 241, reward -0.117020, avg reward -0.088577, total steps 30848, episode step 128\n",
|
|
"INFO:gym:episode 242, reward 0.037891, avg reward -0.083940, total steps 30976, episode step 128\n",
|
|
"[2018-02-18 14:16:40,389] episode 242, reward 0.037891, avg reward -0.083940, total steps 30976, episode step 128\n",
|
|
"INFO:gym:episode 243, reward -0.047448, avg reward -0.084379, total steps 31104, episode step 128\n",
|
|
"[2018-02-18 14:16:42,535] episode 243, reward -0.047448, avg reward -0.084379, total steps 31104, episode step 128\n",
|
|
"INFO:gym:episode 244, reward -0.098421, avg reward -0.086435, total steps 31232, episode step 128\n",
|
|
"[2018-02-18 14:16:44,828] episode 244, reward -0.098421, avg reward -0.086435, total steps 31232, episode step 128\n",
|
|
"INFO:gym:episode 245, reward 0.002702, avg reward -0.086950, total steps 31360, episode step 128\n",
|
|
"[2018-02-18 14:16:47,190] episode 245, reward 0.002702, avg reward -0.086950, total steps 31360, episode step 128\n",
|
|
"INFO:gym:episode 246, reward -0.067720, avg reward -0.085898, total steps 31488, episode step 128\n",
|
|
"[2018-02-18 14:16:49,512] episode 246, reward -0.067720, avg reward -0.085898, total steps 31488, episode step 128\n",
|
|
"INFO:gym:episode 247, reward -0.002225, avg reward -0.086198, total steps 31616, episode step 128\n",
|
|
"[2018-02-18 14:16:51,784] episode 247, reward -0.002225, avg reward -0.086198, total steps 31616, episode step 128\n",
|
|
"INFO:gym:episode 248, reward -0.017842, avg reward -0.083294, total steps 31744, episode step 128\n",
|
|
"[2018-02-18 14:16:54,080] episode 248, reward -0.017842, avg reward -0.083294, total steps 31744, episode step 128\n",
|
|
"INFO:gym:episode 249, reward -0.015324, avg reward -0.083156, total steps 31872, episode step 128\n",
|
|
"[2018-02-18 14:16:56,375] episode 249, reward -0.015324, avg reward -0.083156, total steps 31872, episode step 128\n",
|
|
"INFO:gym:episode 250, reward -0.002721, avg reward -0.079599, total steps 32000, episode step 128\n",
|
|
"[2018-02-18 14:16:58,715] episode 250, reward -0.002721, avg reward -0.079599, total steps 32000, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:16:58,716] Testing...\n",
|
|
"INFO:gym:Avg reward -0.008136(0.000000)\n",
|
|
"[2018-02-18 14:16:59,143] Avg reward -0.008136(0.000000)\n",
|
|
"INFO:gym:episode 251, reward -0.010110, avg reward -0.078500, total steps 32128, episode step 128\n",
|
|
"[2018-02-18 14:17:01,803] episode 251, reward -0.010110, avg reward -0.078500, total steps 32128, episode step 128\n",
|
|
"INFO:gym:episode 252, reward -0.119859, avg reward -0.077107, total steps 32256, episode step 128\n",
|
|
"[2018-02-18 14:17:04,690] episode 252, reward -0.119859, avg reward -0.077107, total steps 32256, episode step 128\n",
|
|
"INFO:gym:episode 253, reward -0.021474, avg reward -0.076627, total steps 32384, episode step 128\n",
|
|
"[2018-02-18 14:17:07,756] episode 253, reward -0.021474, avg reward -0.076627, total steps 32384, episode step 128\n",
|
|
"INFO:gym:episode 254, reward -0.037575, avg reward -0.075552, total steps 32512, episode step 128\n",
|
|
"[2018-02-18 14:17:10,558] episode 254, reward -0.037575, avg reward -0.075552, total steps 32512, episode step 128\n",
|
|
"INFO:gym:episode 255, reward -0.030567, avg reward -0.074065, total steps 32640, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:17:13,362] episode 255, reward -0.030567, avg reward -0.074065, total steps 32640, episode step 128\n",
|
|
"INFO:gym:episode 256, reward -0.018242, avg reward -0.070518, total steps 32768, episode step 128\n",
|
|
"[2018-02-18 14:17:16,667] episode 256, reward -0.018242, avg reward -0.070518, total steps 32768, episode step 128\n",
|
|
"INFO:gym:episode 257, reward -0.044012, avg reward -0.070025, total steps 32896, episode step 128\n",
|
|
"[2018-02-18 14:17:19,880] episode 257, reward -0.044012, avg reward -0.070025, total steps 32896, episode step 128\n",
|
|
"INFO:gym:episode 258, reward -0.097242, avg reward -0.067781, total steps 33024, episode step 128\n",
|
|
"[2018-02-18 14:17:23,220] episode 258, reward -0.097242, avg reward -0.067781, total steps 33024, episode step 128\n",
|
|
"INFO:gym:episode 259, reward -0.080130, avg reward -0.067374, total steps 33152, episode step 128\n",
|
|
"[2018-02-18 14:17:26,850] episode 259, reward -0.080130, avg reward -0.067374, total steps 33152, episode step 128\n",
|
|
"INFO:gym:episode 260, reward -0.259781, avg reward -0.068794, total steps 33280, episode step 128\n",
|
|
"[2018-02-18 14:17:30,551] episode 260, reward -0.259781, avg reward -0.068794, total steps 33280, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:17:30,555] Testing...\n",
|
|
"INFO:gym:Avg reward 0.071085(0.000000)\n",
|
|
"[2018-02-18 14:17:30,959] Avg reward 0.071085(0.000000)\n",
|
|
"INFO:gym:episode 261, reward -0.335660, avg reward -0.069609, total steps 33408, episode step 128\n",
|
|
"[2018-02-18 14:17:34,760] episode 261, reward -0.335660, avg reward -0.069609, total steps 33408, episode step 128\n",
|
|
"INFO:gym:episode 262, reward -0.109726, avg reward -0.072391, total steps 33536, episode step 128\n",
|
|
"[2018-02-18 14:17:38,345] episode 262, reward -0.109726, avg reward -0.072391, total steps 33536, episode step 128\n",
|
|
"INFO:gym:episode 263, reward -0.003948, avg reward -0.071561, total steps 33664, episode step 128\n",
|
|
"[2018-02-18 14:17:41,937] episode 263, reward -0.003948, avg reward -0.071561, total steps 33664, episode step 128\n",
|
|
"INFO:gym:episode 264, reward -0.130354, avg reward -0.072880, total steps 33792, episode step 128\n",
|
|
"[2018-02-18 14:17:45,398] episode 264, reward -0.130354, avg reward -0.072880, total steps 33792, episode step 128\n",
|
|
"INFO:gym:episode 265, reward -0.129483, avg reward -0.072386, total steps 33920, episode step 128\n",
|
|
"[2018-02-18 14:17:48,686] episode 265, reward -0.129483, avg reward -0.072386, total steps 33920, episode step 128\n",
|
|
"INFO:gym:episode 266, reward -0.125101, avg reward -0.071512, total steps 34048, episode step 128\n",
|
|
"[2018-02-18 14:17:51,835] episode 266, reward -0.125101, avg reward -0.071512, total steps 34048, episode step 128\n",
|
|
"INFO:gym:episode 267, reward -0.099608, avg reward -0.073219, total steps 34176, episode step 128\n",
|
|
"[2018-02-18 14:17:55,057] episode 267, reward -0.099608, avg reward -0.073219, total steps 34176, episode step 128\n",
|
|
"INFO:gym:episode 268, reward -0.091287, avg reward -0.072284, total steps 34304, episode step 128\n",
|
|
"[2018-02-18 14:17:58,740] episode 268, reward -0.091287, avg reward -0.072284, total steps 34304, episode step 128\n",
|
|
"INFO:gym:episode 269, reward 0.013277, avg reward -0.072165, total steps 34432, episode step 128\n",
|
|
"[2018-02-18 14:18:02,918] episode 269, reward 0.013277, avg reward -0.072165, total steps 34432, episode step 128\n",
|
|
"INFO:gym:episode 270, reward -0.050166, avg reward -0.070202, total steps 34560, episode step 128\n",
|
|
"[2018-02-18 14:18:06,851] episode 270, reward -0.050166, avg reward -0.070202, total steps 34560, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:18:06,852] Testing...\n",
|
|
"INFO:gym:Avg reward -0.061392(0.000000)\n",
|
|
"[2018-02-18 14:18:07,352] Avg reward -0.061392(0.000000)\n",
|
|
"INFO:gym:episode 271, reward -0.021043, avg reward -0.068469, total steps 34688, episode step 128\n",
|
|
"[2018-02-18 14:18:11,815] episode 271, reward -0.021043, avg reward -0.068469, total steps 34688, episode step 128\n",
|
|
"INFO:gym:episode 272, reward 0.013987, avg reward -0.067654, total steps 34816, episode step 128\n",
|
|
"[2018-02-18 14:18:15,750] episode 272, reward 0.013987, avg reward -0.067654, total steps 34816, episode step 128\n",
|
|
"INFO:gym:episode 273, reward 0.030334, avg reward -0.066452, total steps 34944, episode step 128\n",
|
|
"[2018-02-18 14:18:19,396] episode 273, reward 0.030334, avg reward -0.066452, total steps 34944, episode step 128\n",
|
|
"INFO:gym:episode 274, reward -0.079493, avg reward -0.067442, total steps 35072, episode step 128\n",
|
|
"[2018-02-18 14:18:22,710] episode 274, reward -0.079493, avg reward -0.067442, total steps 35072, episode step 128\n",
|
|
"INFO:gym:episode 275, reward -0.010090, avg reward -0.066704, total steps 35200, episode step 128\n",
|
|
"[2018-02-18 14:18:26,056] episode 275, reward -0.010090, avg reward -0.066704, total steps 35200, episode step 128\n",
|
|
"INFO:gym:episode 276, reward -0.040562, avg reward -0.066376, total steps 35328, episode step 128\n",
|
|
"[2018-02-18 14:18:29,688] episode 276, reward -0.040562, avg reward -0.066376, total steps 35328, episode step 128\n",
|
|
"INFO:gym:episode 277, reward -0.098229, avg reward -0.065098, total steps 35456, episode step 128\n",
|
|
"[2018-02-18 14:18:33,547] episode 277, reward -0.098229, avg reward -0.065098, total steps 35456, episode step 128\n",
|
|
"INFO:gym:episode 278, reward -0.001862, avg reward -0.062879, total steps 35584, episode step 128\n",
|
|
"[2018-02-18 14:18:37,856] episode 278, reward -0.001862, avg reward -0.062879, total steps 35584, episode step 128\n",
|
|
"INFO:gym:episode 279, reward -0.001743, avg reward -0.062474, total steps 35712, episode step 128\n",
|
|
"[2018-02-18 14:18:42,524] episode 279, reward -0.001743, avg reward -0.062474, total steps 35712, episode step 128\n",
|
|
"INFO:gym:episode 280, reward -0.073109, avg reward -0.062658, total steps 35840, episode step 128\n",
|
|
"[2018-02-18 14:18:47,520] episode 280, reward -0.073109, avg reward -0.062658, total steps 35840, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:18:47,526] Testing...\n",
|
|
"INFO:gym:Avg reward -0.063823(0.000000)\n",
|
|
"[2018-02-18 14:18:47,938] Avg reward -0.063823(0.000000)\n",
|
|
"INFO:gym:episode 281, reward -0.033523, avg reward -0.061760, total steps 35968, episode step 128\n",
|
|
"[2018-02-18 14:18:52,086] episode 281, reward -0.033523, avg reward -0.061760, total steps 35968, episode step 128\n",
|
|
"INFO:gym:episode 282, reward 0.010080, avg reward -0.062359, total steps 36096, episode step 128\n",
|
|
"[2018-02-18 14:18:56,018] episode 282, reward 0.010080, avg reward -0.062359, total steps 36096, episode step 128\n",
|
|
"INFO:gym:episode 283, reward -0.007318, avg reward -0.062811, total steps 36224, episode step 128\n",
|
|
"[2018-02-18 14:18:59,940] episode 283, reward -0.007318, avg reward -0.062811, total steps 36224, episode step 128\n",
|
|
"INFO:gym:episode 284, reward 0.012121, avg reward -0.061465, total steps 36352, episode step 128\n",
|
|
"[2018-02-18 14:19:03,950] episode 284, reward 0.012121, avg reward -0.061465, total steps 36352, episode step 128\n",
|
|
"INFO:gym:episode 285, reward -0.029174, avg reward -0.060675, total steps 36480, episode step 128\n",
|
|
"[2018-02-18 14:19:08,004] episode 285, reward -0.029174, avg reward -0.060675, total steps 36480, episode step 128\n",
|
|
"INFO:gym:episode 286, reward -0.258208, avg reward -0.062790, total steps 36608, episode step 128\n",
|
|
"[2018-02-18 14:19:12,204] episode 286, reward -0.258208, avg reward -0.062790, total steps 36608, episode step 128\n",
|
|
"INFO:gym:episode 287, reward -0.083422, avg reward -0.062663, total steps 36736, episode step 128\n",
|
|
"[2018-02-18 14:19:16,233] episode 287, reward -0.083422, avg reward -0.062663, total steps 36736, episode step 128\n",
|
|
"INFO:gym:episode 288, reward 0.034519, avg reward -0.061014, total steps 36864, episode step 128\n",
|
|
"[2018-02-18 14:19:20,686] episode 288, reward 0.034519, avg reward -0.061014, total steps 36864, episode step 128\n",
|
|
"INFO:gym:episode 289, reward -0.010113, avg reward -0.060788, total steps 36992, episode step 128\n",
|
|
"[2018-02-18 14:19:25,205] episode 289, reward -0.010113, avg reward -0.060788, total steps 36992, episode step 128\n",
|
|
"INFO:gym:episode 290, reward -0.051180, avg reward -0.060841, total steps 37120, episode step 128\n",
|
|
"[2018-02-18 14:19:29,496] episode 290, reward -0.051180, avg reward -0.060841, total steps 37120, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:19:29,497] Testing...\n",
|
|
"INFO:gym:Avg reward -0.020899(0.000000)\n",
|
|
"[2018-02-18 14:19:29,866] Avg reward -0.020899(0.000000)\n",
|
|
"INFO:gym:episode 291, reward -0.069579, avg reward -0.061560, total steps 37248, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:19:34,103] episode 291, reward -0.069579, avg reward -0.061560, total steps 37248, episode step 128\n",
|
|
"INFO:gym:episode 292, reward 0.010293, avg reward -0.060676, total steps 37376, episode step 128\n",
|
|
"[2018-02-18 14:19:38,331] episode 292, reward 0.010293, avg reward -0.060676, total steps 37376, episode step 128\n",
|
|
"INFO:gym:episode 293, reward -0.017736, avg reward -0.059961, total steps 37504, episode step 128\n",
|
|
"[2018-02-18 14:19:42,720] episode 293, reward -0.017736, avg reward -0.059961, total steps 37504, episode step 128\n",
|
|
"INFO:gym:episode 294, reward 0.006970, avg reward -0.058444, total steps 37632, episode step 128\n",
|
|
"[2018-02-18 14:19:47,337] episode 294, reward 0.006970, avg reward -0.058444, total steps 37632, episode step 128\n",
|
|
"INFO:gym:episode 295, reward 0.005457, avg reward -0.058964, total steps 37760, episode step 128\n",
|
|
"[2018-02-18 14:19:51,830] episode 295, reward 0.005457, avg reward -0.058964, total steps 37760, episode step 128\n",
|
|
"INFO:gym:episode 296, reward -0.170717, avg reward -0.060506, total steps 37888, episode step 128\n",
|
|
"[2018-02-18 14:19:56,160] episode 296, reward -0.170717, avg reward -0.060506, total steps 37888, episode step 128\n",
|
|
"INFO:gym:episode 297, reward -0.047163, avg reward -0.061001, total steps 38016, episode step 128\n",
|
|
"[2018-02-18 14:20:00,700] episode 297, reward -0.047163, avg reward -0.061001, total steps 38016, episode step 128\n",
|
|
"INFO:gym:episode 298, reward -0.345679, avg reward -0.063221, total steps 38144, episode step 128\n",
|
|
"[2018-02-18 14:20:05,589] episode 298, reward -0.345679, avg reward -0.063221, total steps 38144, episode step 128\n",
|
|
"INFO:gym:episode 299, reward -0.009886, avg reward -0.062614, total steps 38272, episode step 128\n",
|
|
"[2018-02-18 14:20:09,277] episode 299, reward -0.009886, avg reward -0.062614, total steps 38272, episode step 128\n",
|
|
"INFO:gym:episode 300, reward -0.010145, avg reward -0.061821, total steps 38400, episode step 128\n",
|
|
"[2018-02-18 14:20:12,793] episode 300, reward -0.010145, avg reward -0.061821, total steps 38400, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:20:12,794] Testing...\n",
|
|
"INFO:gym:Avg reward -0.101505(0.000000)\n",
|
|
"[2018-02-18 14:20:13,215] Avg reward -0.101505(0.000000)\n",
|
|
"INFO:gym:episode 301, reward -0.177000, avg reward -0.063236, total steps 38528, episode step 128\n",
|
|
"[2018-02-18 14:20:16,786] episode 301, reward -0.177000, avg reward -0.063236, total steps 38528, episode step 128\n",
|
|
"INFO:gym:episode 302, reward -0.005469, avg reward -0.061575, total steps 38656, episode step 128\n",
|
|
"[2018-02-18 14:20:20,637] episode 302, reward -0.005469, avg reward -0.061575, total steps 38656, episode step 128\n",
|
|
"INFO:gym:episode 303, reward -0.009472, avg reward -0.060971, total steps 38784, episode step 128\n",
|
|
"[2018-02-18 14:20:25,160] episode 303, reward -0.009472, avg reward -0.060971, total steps 38784, episode step 128\n",
|
|
"INFO:gym:episode 304, reward -0.020497, avg reward -0.060309, total steps 38912, episode step 128\n",
|
|
"[2018-02-18 14:20:29,496] episode 304, reward -0.020497, avg reward -0.060309, total steps 38912, episode step 128\n",
|
|
"INFO:gym:episode 305, reward -0.007683, avg reward -0.059508, total steps 39040, episode step 128\n",
|
|
"[2018-02-18 14:20:34,127] episode 305, reward -0.007683, avg reward -0.059508, total steps 39040, episode step 128\n",
|
|
"INFO:gym:episode 306, reward -0.016823, avg reward -0.059114, total steps 39168, episode step 128\n",
|
|
"[2018-02-18 14:20:38,027] episode 306, reward -0.016823, avg reward -0.059114, total steps 39168, episode step 128\n",
|
|
"INFO:gym:episode 307, reward -0.095324, avg reward -0.057503, total steps 39296, episode step 128\n",
|
|
"[2018-02-18 14:20:41,884] episode 307, reward -0.095324, avg reward -0.057503, total steps 39296, episode step 128\n",
|
|
"INFO:gym:episode 308, reward -0.024783, avg reward -0.056062, total steps 39424, episode step 128\n",
|
|
"[2018-02-18 14:20:44,309] episode 308, reward -0.024783, avg reward -0.056062, total steps 39424, episode step 128\n",
|
|
"INFO:gym:episode 309, reward -0.104151, avg reward -0.056309, total steps 39552, episode step 128\n",
|
|
"[2018-02-18 14:20:46,497] episode 309, reward -0.104151, avg reward -0.056309, total steps 39552, episode step 128\n",
|
|
"INFO:gym:episode 310, reward -0.101050, avg reward -0.056037, total steps 39680, episode step 128\n",
|
|
"[2018-02-18 14:20:49,014] episode 310, reward -0.101050, avg reward -0.056037, total steps 39680, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:20:49,016] Testing...\n",
|
|
"INFO:gym:Avg reward -0.069044(0.000000)\n",
|
|
"[2018-02-18 14:20:49,398] Avg reward -0.069044(0.000000)\n",
|
|
"INFO:gym:episode 311, reward -0.023626, avg reward -0.054679, total steps 39808, episode step 128\n",
|
|
"[2018-02-18 14:20:51,618] episode 311, reward -0.023626, avg reward -0.054679, total steps 39808, episode step 128\n",
|
|
"INFO:gym:episode 312, reward 0.004127, avg reward -0.054799, total steps 39936, episode step 128\n",
|
|
"[2018-02-18 14:20:53,726] episode 312, reward 0.004127, avg reward -0.054799, total steps 39936, episode step 128\n",
|
|
"INFO:gym:episode 313, reward -0.002082, avg reward -0.054137, total steps 40064, episode step 128\n",
|
|
"[2018-02-18 14:20:55,814] episode 313, reward -0.002082, avg reward -0.054137, total steps 40064, episode step 128\n",
|
|
"INFO:gym:episode 314, reward -0.002043, avg reward -0.054008, total steps 40192, episode step 128\n",
|
|
"[2018-02-18 14:20:58,165] episode 314, reward -0.002043, avg reward -0.054008, total steps 40192, episode step 128\n",
|
|
"INFO:gym:episode 315, reward -0.001524, avg reward -0.054893, total steps 40320, episode step 128\n",
|
|
"[2018-02-18 14:21:00,443] episode 315, reward -0.001524, avg reward -0.054893, total steps 40320, episode step 128\n",
|
|
"INFO:gym:episode 316, reward -0.033371, avg reward -0.053812, total steps 40448, episode step 128\n",
|
|
"[2018-02-18 14:21:02,667] episode 316, reward -0.033371, avg reward -0.053812, total steps 40448, episode step 128\n",
|
|
"INFO:gym:episode 317, reward -0.008798, avg reward -0.053817, total steps 40576, episode step 128\n",
|
|
"[2018-02-18 14:21:04,974] episode 317, reward -0.008798, avg reward -0.053817, total steps 40576, episode step 128\n",
|
|
"INFO:gym:episode 318, reward -0.118120, avg reward -0.055186, total steps 40704, episode step 128\n",
|
|
"[2018-02-18 14:21:07,137] episode 318, reward -0.118120, avg reward -0.055186, total steps 40704, episode step 128\n",
|
|
"INFO:gym:episode 319, reward -0.039634, avg reward -0.055716, total steps 40832, episode step 128\n",
|
|
"[2018-02-18 14:21:09,308] episode 319, reward -0.039634, avg reward -0.055716, total steps 40832, episode step 128\n",
|
|
"INFO:gym:episode 320, reward -0.034144, avg reward -0.054291, total steps 40960, episode step 128\n",
|
|
"[2018-02-18 14:21:11,524] episode 320, reward -0.034144, avg reward -0.054291, total steps 40960, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:21:11,527] Testing...\n",
|
|
"INFO:gym:Avg reward 0.020916(0.000000)\n",
|
|
"[2018-02-18 14:21:11,885] Avg reward 0.020916(0.000000)\n",
|
|
"INFO:gym:episode 321, reward -0.013557, avg reward -0.054061, total steps 41088, episode step 128\n",
|
|
"[2018-02-18 14:21:14,065] episode 321, reward -0.013557, avg reward -0.054061, total steps 41088, episode step 128\n",
|
|
"INFO:gym:episode 322, reward -0.087317, avg reward -0.053773, total steps 41216, episode step 128\n",
|
|
"[2018-02-18 14:21:16,241] episode 322, reward -0.087317, avg reward -0.053773, total steps 41216, episode step 128\n",
|
|
"INFO:gym:episode 323, reward -0.012781, avg reward -0.053784, total steps 41344, episode step 128\n",
|
|
"[2018-02-18 14:21:18,480] episode 323, reward -0.012781, avg reward -0.053784, total steps 41344, episode step 128\n",
|
|
"INFO:gym:episode 324, reward -0.015541, avg reward -0.053556, total steps 41472, episode step 128\n",
|
|
"[2018-02-18 14:21:20,865] episode 324, reward -0.015541, avg reward -0.053556, total steps 41472, episode step 128\n",
|
|
"INFO:gym:episode 325, reward -0.144537, avg reward -0.055104, total steps 41600, episode step 128\n",
|
|
"[2018-02-18 14:21:23,258] episode 325, reward -0.144537, avg reward -0.055104, total steps 41600, episode step 128\n",
|
|
"INFO:gym:episode 326, reward -0.032483, avg reward -0.055407, total steps 41728, episode step 128\n",
|
|
"[2018-02-18 14:21:25,815] episode 326, reward -0.032483, avg reward -0.055407, total steps 41728, episode step 128\n",
|
|
"INFO:gym:episode 327, reward -0.058393, avg reward -0.054440, total steps 41856, episode step 128\n",
|
|
"[2018-02-18 14:21:28,536] episode 327, reward -0.058393, avg reward -0.054440, total steps 41856, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 328, reward -0.055333, avg reward -0.054761, total steps 41984, episode step 128\n",
|
|
"[2018-02-18 14:21:30,644] episode 328, reward -0.055333, avg reward -0.054761, total steps 41984, episode step 128\n",
|
|
"INFO:gym:episode 329, reward -0.077064, avg reward -0.053911, total steps 42112, episode step 128\n",
|
|
"[2018-02-18 14:21:33,018] episode 329, reward -0.077064, avg reward -0.053911, total steps 42112, episode step 128\n",
|
|
"INFO:gym:episode 330, reward -0.011950, avg reward -0.053601, total steps 42240, episode step 128\n",
|
|
"[2018-02-18 14:21:35,548] episode 330, reward -0.011950, avg reward -0.053601, total steps 42240, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:21:35,550] Testing...\n",
|
|
"INFO:gym:Avg reward -0.016572(0.000000)\n",
|
|
"[2018-02-18 14:21:36,008] Avg reward -0.016572(0.000000)\n",
|
|
"INFO:gym:episode 331, reward -0.005276, avg reward -0.053508, total steps 42368, episode step 128\n",
|
|
"[2018-02-18 14:21:38,885] episode 331, reward -0.005276, avg reward -0.053508, total steps 42368, episode step 128\n",
|
|
"INFO:gym:episode 332, reward -0.072826, avg reward -0.055094, total steps 42496, episode step 128\n",
|
|
"[2018-02-18 14:21:42,166] episode 332, reward -0.072826, avg reward -0.055094, total steps 42496, episode step 128\n",
|
|
"INFO:gym:episode 333, reward -0.003293, avg reward -0.054045, total steps 42624, episode step 128\n",
|
|
"[2018-02-18 14:21:46,066] episode 333, reward -0.003293, avg reward -0.054045, total steps 42624, episode step 128\n",
|
|
"INFO:gym:episode 334, reward 0.018062, avg reward -0.053575, total steps 42752, episode step 128\n",
|
|
"[2018-02-18 14:21:50,371] episode 334, reward 0.018062, avg reward -0.053575, total steps 42752, episode step 128\n",
|
|
"INFO:gym:episode 335, reward -0.002677, avg reward -0.053582, total steps 42880, episode step 128\n",
|
|
"[2018-02-18 14:21:54,687] episode 335, reward -0.002677, avg reward -0.053582, total steps 42880, episode step 128\n",
|
|
"INFO:gym:episode 336, reward -0.007477, avg reward -0.053342, total steps 43008, episode step 128\n",
|
|
"[2018-02-18 14:21:59,332] episode 336, reward -0.007477, avg reward -0.053342, total steps 43008, episode step 128\n",
|
|
"INFO:gym:episode 337, reward -0.005227, avg reward -0.052410, total steps 43136, episode step 128\n",
|
|
"[2018-02-18 14:22:03,303] episode 337, reward -0.005227, avg reward -0.052410, total steps 43136, episode step 128\n",
|
|
"INFO:gym:episode 338, reward -0.004036, avg reward -0.052414, total steps 43264, episode step 128\n",
|
|
"[2018-02-18 14:22:07,390] episode 338, reward -0.004036, avg reward -0.052414, total steps 43264, episode step 128\n",
|
|
"INFO:gym:episode 339, reward -0.035765, avg reward -0.052622, total steps 43392, episode step 128\n",
|
|
"[2018-02-18 14:22:11,634] episode 339, reward -0.035765, avg reward -0.052622, total steps 43392, episode step 128\n",
|
|
"INFO:gym:episode 340, reward -0.005328, avg reward -0.049097, total steps 43520, episode step 128\n",
|
|
"[2018-02-18 14:22:16,357] episode 340, reward -0.005328, avg reward -0.049097, total steps 43520, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:22:16,358] Testing...\n",
|
|
"INFO:gym:Avg reward -0.004799(0.000000)\n",
|
|
"[2018-02-18 14:22:16,836] Avg reward -0.004799(0.000000)\n",
|
|
"INFO:gym:episode 341, reward -0.014420, avg reward -0.048071, total steps 43648, episode step 128\n",
|
|
"[2018-02-18 14:22:21,535] episode 341, reward -0.014420, avg reward -0.048071, total steps 43648, episode step 128\n",
|
|
"INFO:gym:episode 342, reward -0.001754, avg reward -0.048467, total steps 43776, episode step 128\n",
|
|
"[2018-02-18 14:22:26,096] episode 342, reward -0.001754, avg reward -0.048467, total steps 43776, episode step 128\n",
|
|
"INFO:gym:episode 343, reward -0.065554, avg reward -0.048648, total steps 43904, episode step 128\n",
|
|
"[2018-02-18 14:22:30,285] episode 343, reward -0.065554, avg reward -0.048648, total steps 43904, episode step 128\n",
|
|
"INFO:gym:episode 344, reward 0.030769, avg reward -0.047356, total steps 44032, episode step 128\n",
|
|
"[2018-02-18 14:22:34,512] episode 344, reward 0.030769, avg reward -0.047356, total steps 44032, episode step 128\n",
|
|
"INFO:gym:episode 345, reward -0.021209, avg reward -0.047595, total steps 44160, episode step 128\n",
|
|
"[2018-02-18 14:22:38,781] episode 345, reward -0.021209, avg reward -0.047595, total steps 44160, episode step 128\n",
|
|
"INFO:gym:episode 346, reward -0.005317, avg reward -0.046971, total steps 44288, episode step 128\n",
|
|
"[2018-02-18 14:22:43,036] episode 346, reward -0.005317, avg reward -0.046971, total steps 44288, episode step 128\n",
|
|
"INFO:gym:episode 347, reward -0.048263, avg reward -0.047432, total steps 44416, episode step 128\n",
|
|
"[2018-02-18 14:22:47,850] episode 347, reward -0.048263, avg reward -0.047432, total steps 44416, episode step 128\n",
|
|
"INFO:gym:episode 348, reward -0.015190, avg reward -0.047405, total steps 44544, episode step 128\n",
|
|
"[2018-02-18 14:22:52,749] episode 348, reward -0.015190, avg reward -0.047405, total steps 44544, episode step 128\n",
|
|
"INFO:gym:episode 349, reward -0.001795, avg reward -0.047270, total steps 44672, episode step 128\n",
|
|
"[2018-02-18 14:22:57,591] episode 349, reward -0.001795, avg reward -0.047270, total steps 44672, episode step 128\n",
|
|
"INFO:gym:episode 350, reward -0.081876, avg reward -0.048061, total steps 44800, episode step 128\n",
|
|
"[2018-02-18 14:23:01,880] episode 350, reward -0.081876, avg reward -0.048061, total steps 44800, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:23:01,885] Testing...\n",
|
|
"INFO:gym:Avg reward -0.006496(0.000000)\n",
|
|
"[2018-02-18 14:23:02,473] Avg reward -0.006496(0.000000)\n",
|
|
"INFO:gym:episode 351, reward 0.021848, avg reward -0.047742, total steps 44928, episode step 128\n",
|
|
"[2018-02-18 14:23:06,777] episode 351, reward 0.021848, avg reward -0.047742, total steps 44928, episode step 128\n",
|
|
"INFO:gym:episode 352, reward -0.002535, avg reward -0.046569, total steps 45056, episode step 128\n",
|
|
"[2018-02-18 14:23:11,503] episode 352, reward -0.002535, avg reward -0.046569, total steps 45056, episode step 128\n",
|
|
"INFO:gym:episode 353, reward -0.090630, avg reward -0.047260, total steps 45184, episode step 128\n",
|
|
"[2018-02-18 14:23:17,416] episode 353, reward -0.090630, avg reward -0.047260, total steps 45184, episode step 128\n",
|
|
"INFO:gym:episode 354, reward -0.001486, avg reward -0.046899, total steps 45312, episode step 128\n",
|
|
"[2018-02-18 14:23:23,237] episode 354, reward -0.001486, avg reward -0.046899, total steps 45312, episode step 128\n",
|
|
"INFO:gym:episode 355, reward -0.003667, avg reward -0.046630, total steps 45440, episode step 128\n",
|
|
"[2018-02-18 14:23:28,000] episode 355, reward -0.003667, avg reward -0.046630, total steps 45440, episode step 128\n",
|
|
"INFO:gym:episode 356, reward 0.075486, avg reward -0.045693, total steps 45568, episode step 128\n",
|
|
"[2018-02-18 14:23:33,247] episode 356, reward 0.075486, avg reward -0.045693, total steps 45568, episode step 128\n",
|
|
"INFO:gym:episode 357, reward -0.030253, avg reward -0.045555, total steps 45696, episode step 128\n",
|
|
"[2018-02-18 14:23:39,613] episode 357, reward -0.030253, avg reward -0.045555, total steps 45696, episode step 128\n",
|
|
"INFO:gym:episode 358, reward -0.053954, avg reward -0.045122, total steps 45824, episode step 128\n",
|
|
"[2018-02-18 14:23:44,970] episode 358, reward -0.053954, avg reward -0.045122, total steps 45824, episode step 128\n",
|
|
"INFO:gym:episode 359, reward -0.027063, avg reward -0.044592, total steps 45952, episode step 128\n",
|
|
"[2018-02-18 14:23:49,750] episode 359, reward -0.027063, avg reward -0.044592, total steps 45952, episode step 128\n",
|
|
"INFO:gym:episode 360, reward -0.063429, avg reward -0.042628, total steps 46080, episode step 128\n",
|
|
"[2018-02-18 14:23:54,413] episode 360, reward -0.063429, avg reward -0.042628, total steps 46080, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:23:54,416] Testing...\n",
|
|
"INFO:gym:Avg reward -0.006795(0.000000)\n",
|
|
"[2018-02-18 14:23:54,805] Avg reward -0.006795(0.000000)\n",
|
|
"INFO:gym:episode 361, reward -0.029692, avg reward -0.039569, total steps 46208, episode step 128\n",
|
|
"[2018-02-18 14:23:59,277] episode 361, reward -0.029692, avg reward -0.039569, total steps 46208, episode step 128\n",
|
|
"INFO:gym:episode 362, reward -0.024734, avg reward -0.038719, total steps 46336, episode step 128\n",
|
|
"[2018-02-18 14:24:04,086] episode 362, reward -0.024734, avg reward -0.038719, total steps 46336, episode step 128\n",
|
|
"INFO:gym:episode 363, reward -0.055073, avg reward -0.039230, total steps 46464, episode step 128\n",
|
|
"[2018-02-18 14:24:08,878] episode 363, reward -0.055073, avg reward -0.039230, total steps 46464, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 364, reward -0.004636, avg reward -0.037973, total steps 46592, episode step 128\n",
|
|
"[2018-02-18 14:24:13,812] episode 364, reward -0.004636, avg reward -0.037973, total steps 46592, episode step 128\n",
|
|
"INFO:gym:episode 365, reward 0.003083, avg reward -0.036647, total steps 46720, episode step 128\n",
|
|
"[2018-02-18 14:24:18,543] episode 365, reward 0.003083, avg reward -0.036647, total steps 46720, episode step 128\n",
|
|
"INFO:gym:episode 366, reward -0.047539, avg reward -0.035871, total steps 46848, episode step 128\n",
|
|
"[2018-02-18 14:24:23,666] episode 366, reward -0.047539, avg reward -0.035871, total steps 46848, episode step 128\n",
|
|
"INFO:gym:episode 367, reward -0.140345, avg reward -0.036279, total steps 46976, episode step 128\n",
|
|
"[2018-02-18 14:24:28,779] episode 367, reward -0.140345, avg reward -0.036279, total steps 46976, episode step 128\n",
|
|
"INFO:gym:episode 368, reward 0.007194, avg reward -0.035294, total steps 47104, episode step 128\n",
|
|
"[2018-02-18 14:24:33,560] episode 368, reward 0.007194, avg reward -0.035294, total steps 47104, episode step 128\n",
|
|
"INFO:gym:episode 369, reward -0.001766, avg reward -0.035444, total steps 47232, episode step 128\n",
|
|
"[2018-02-18 14:24:38,484] episode 369, reward -0.001766, avg reward -0.035444, total steps 47232, episode step 128\n",
|
|
"INFO:gym:episode 370, reward -0.027431, avg reward -0.035217, total steps 47360, episode step 128\n",
|
|
"[2018-02-18 14:24:42,782] episode 370, reward -0.027431, avg reward -0.035217, total steps 47360, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:24:42,788] Testing...\n",
|
|
"INFO:gym:Avg reward 0.046636(0.000000)\n",
|
|
"[2018-02-18 14:24:43,204] Avg reward 0.046636(0.000000)\n",
|
|
"INFO:gym:episode 371, reward -0.027525, avg reward -0.035282, total steps 47488, episode step 128\n",
|
|
"[2018-02-18 14:24:47,871] episode 371, reward -0.027525, avg reward -0.035282, total steps 47488, episode step 128\n",
|
|
"INFO:gym:episode 372, reward -0.006279, avg reward -0.035485, total steps 47616, episode step 128\n",
|
|
"[2018-02-18 14:24:52,744] episode 372, reward -0.006279, avg reward -0.035485, total steps 47616, episode step 128\n",
|
|
"INFO:gym:episode 373, reward -0.085445, avg reward -0.036642, total steps 47744, episode step 128\n",
|
|
"[2018-02-18 14:24:57,276] episode 373, reward -0.085445, avg reward -0.036642, total steps 47744, episode step 128\n",
|
|
"INFO:gym:episode 374, reward 0.180684, avg reward -0.034041, total steps 47872, episode step 128\n",
|
|
"[2018-02-18 14:25:01,791] episode 374, reward 0.180684, avg reward -0.034041, total steps 47872, episode step 128\n",
|
|
"INFO:gym:episode 375, reward -0.074142, avg reward -0.034681, total steps 48000, episode step 128\n",
|
|
"[2018-02-18 14:25:06,186] episode 375, reward -0.074142, avg reward -0.034681, total steps 48000, episode step 128\n",
|
|
"INFO:gym:episode 376, reward -0.044459, avg reward -0.034720, total steps 48128, episode step 128\n",
|
|
"[2018-02-18 14:25:10,234] episode 376, reward -0.044459, avg reward -0.034720, total steps 48128, episode step 128\n",
|
|
"INFO:gym:episode 377, reward -0.027910, avg reward -0.034017, total steps 48256, episode step 128\n",
|
|
"[2018-02-18 14:25:14,154] episode 377, reward -0.027910, avg reward -0.034017, total steps 48256, episode step 128\n",
|
|
"INFO:gym:episode 378, reward -0.002703, avg reward -0.034025, total steps 48384, episode step 128\n",
|
|
"[2018-02-18 14:25:17,484] episode 378, reward -0.002703, avg reward -0.034025, total steps 48384, episode step 128\n",
|
|
"INFO:gym:episode 379, reward -0.056047, avg reward -0.034568, total steps 48512, episode step 128\n",
|
|
"[2018-02-18 14:25:20,254] episode 379, reward -0.056047, avg reward -0.034568, total steps 48512, episode step 128\n",
|
|
"INFO:gym:episode 380, reward -0.034214, avg reward -0.034179, total steps 48640, episode step 128\n",
|
|
"[2018-02-18 14:25:22,521] episode 380, reward -0.034214, avg reward -0.034179, total steps 48640, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:25:22,523] Testing...\n",
|
|
"INFO:gym:Avg reward -0.019224(0.000000)\n",
|
|
"[2018-02-18 14:25:22,943] Avg reward -0.019224(0.000000)\n",
|
|
"INFO:gym:episode 381, reward -0.043115, avg reward -0.034275, total steps 48768, episode step 128\n",
|
|
"[2018-02-18 14:25:25,205] episode 381, reward -0.043115, avg reward -0.034275, total steps 48768, episode step 128\n",
|
|
"INFO:gym:episode 382, reward -0.049755, avg reward -0.034874, total steps 48896, episode step 128\n",
|
|
"[2018-02-18 14:25:27,457] episode 382, reward -0.049755, avg reward -0.034874, total steps 48896, episode step 128\n",
|
|
"INFO:gym:episode 383, reward 0.005300, avg reward -0.034748, total steps 49024, episode step 128\n",
|
|
"[2018-02-18 14:25:29,725] episode 383, reward 0.005300, avg reward -0.034748, total steps 49024, episode step 128\n",
|
|
"INFO:gym:episode 384, reward -0.027669, avg reward -0.035145, total steps 49152, episode step 128\n",
|
|
"[2018-02-18 14:25:31,930] episode 384, reward -0.027669, avg reward -0.035145, total steps 49152, episode step 128\n",
|
|
"INFO:gym:episode 385, reward -0.032697, avg reward -0.035181, total steps 49280, episode step 128\n",
|
|
"[2018-02-18 14:25:34,352] episode 385, reward -0.032697, avg reward -0.035181, total steps 49280, episode step 128\n",
|
|
"INFO:gym:episode 386, reward -0.002609, avg reward -0.032625, total steps 49408, episode step 128\n",
|
|
"[2018-02-18 14:25:36,742] episode 386, reward -0.002609, avg reward -0.032625, total steps 49408, episode step 128\n",
|
|
"INFO:gym:episode 387, reward -0.004572, avg reward -0.031836, total steps 49536, episode step 128\n",
|
|
"[2018-02-18 14:25:39,288] episode 387, reward -0.004572, avg reward -0.031836, total steps 49536, episode step 128\n",
|
|
"INFO:gym:episode 388, reward -0.070674, avg reward -0.032888, total steps 49664, episode step 128\n",
|
|
"[2018-02-18 14:25:42,008] episode 388, reward -0.070674, avg reward -0.032888, total steps 49664, episode step 128\n",
|
|
"INFO:gym:episode 389, reward -0.067528, avg reward -0.033462, total steps 49792, episode step 128\n",
|
|
"[2018-02-18 14:25:44,648] episode 389, reward -0.067528, avg reward -0.033462, total steps 49792, episode step 128\n",
|
|
"INFO:gym:episode 390, reward -0.111015, avg reward -0.034061, total steps 49920, episode step 128\n",
|
|
"[2018-02-18 14:25:47,150] episode 390, reward -0.111015, avg reward -0.034061, total steps 49920, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:25:47,151] Testing...\n",
|
|
"INFO:gym:Avg reward -0.056060(0.000000)\n",
|
|
"[2018-02-18 14:25:47,524] Avg reward -0.056060(0.000000)\n",
|
|
"INFO:gym:episode 391, reward -0.138659, avg reward -0.034751, total steps 50048, episode step 128\n",
|
|
"[2018-02-18 14:25:49,777] episode 391, reward -0.138659, avg reward -0.034751, total steps 50048, episode step 128\n",
|
|
"INFO:gym:episode 392, reward -0.012219, avg reward -0.034977, total steps 50176, episode step 128\n",
|
|
"[2018-02-18 14:25:51,904] episode 392, reward -0.012219, avg reward -0.034977, total steps 50176, episode step 128\n",
|
|
"INFO:gym:episode 393, reward -0.001758, avg reward -0.034817, total steps 50304, episode step 128\n",
|
|
"[2018-02-18 14:25:54,079] episode 393, reward -0.001758, avg reward -0.034817, total steps 50304, episode step 128\n",
|
|
"INFO:gym:episode 394, reward -0.019142, avg reward -0.035078, total steps 50432, episode step 128\n",
|
|
"[2018-02-18 14:25:56,753] episode 394, reward -0.019142, avg reward -0.035078, total steps 50432, episode step 128\n",
|
|
"INFO:gym:episode 395, reward -0.123089, avg reward -0.036363, total steps 50560, episode step 128\n",
|
|
"[2018-02-18 14:26:00,031] episode 395, reward -0.123089, avg reward -0.036363, total steps 50560, episode step 128\n",
|
|
"INFO:gym:episode 396, reward 0.008975, avg reward -0.034566, total steps 50688, episode step 128\n",
|
|
"[2018-02-18 14:26:03,364] episode 396, reward 0.008975, avg reward -0.034566, total steps 50688, episode step 128\n",
|
|
"INFO:gym:episode 397, reward -0.081893, avg reward -0.034914, total steps 50816, episode step 128\n",
|
|
"[2018-02-18 14:26:06,965] episode 397, reward -0.081893, avg reward -0.034914, total steps 50816, episode step 128\n",
|
|
"INFO:gym:episode 398, reward -0.018929, avg reward -0.031646, total steps 50944, episode step 128\n",
|
|
"[2018-02-18 14:26:10,429] episode 398, reward -0.018929, avg reward -0.031646, total steps 50944, episode step 128\n",
|
|
"INFO:gym:episode 399, reward -0.072314, avg reward -0.032270, total steps 51072, episode step 128\n",
|
|
"[2018-02-18 14:26:13,849] episode 399, reward -0.072314, avg reward -0.032270, total steps 51072, episode step 128\n",
|
|
"INFO:gym:episode 400, reward -0.093241, avg reward -0.033101, total steps 51200, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:26:17,462] episode 400, reward -0.093241, avg reward -0.033101, total steps 51200, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:26:17,468] Testing...\n",
|
|
"INFO:gym:Avg reward -0.084684(0.000000)\n",
|
|
"[2018-02-18 14:26:17,897] Avg reward -0.084684(0.000000)\n",
|
|
"INFO:gym:episode 401, reward -0.022755, avg reward -0.031559, total steps 51328, episode step 128\n",
|
|
"[2018-02-18 14:26:21,757] episode 401, reward -0.022755, avg reward -0.031559, total steps 51328, episode step 128\n",
|
|
"INFO:gym:episode 402, reward -0.026395, avg reward -0.031768, total steps 51456, episode step 128\n",
|
|
"[2018-02-18 14:26:26,426] episode 402, reward -0.026395, avg reward -0.031768, total steps 51456, episode step 128\n",
|
|
"INFO:gym:episode 403, reward -0.007230, avg reward -0.031746, total steps 51584, episode step 128\n",
|
|
"[2018-02-18 14:26:30,353] episode 403, reward -0.007230, avg reward -0.031746, total steps 51584, episode step 128\n",
|
|
"INFO:gym:episode 404, reward -0.010584, avg reward -0.031647, total steps 51712, episode step 128\n",
|
|
"[2018-02-18 14:26:34,176] episode 404, reward -0.010584, avg reward -0.031647, total steps 51712, episode step 128\n",
|
|
"INFO:gym:episode 405, reward -0.008433, avg reward -0.031654, total steps 51840, episode step 128\n",
|
|
"[2018-02-18 14:26:37,913] episode 405, reward -0.008433, avg reward -0.031654, total steps 51840, episode step 128\n",
|
|
"INFO:gym:episode 406, reward -0.009502, avg reward -0.031581, total steps 51968, episode step 128\n",
|
|
"[2018-02-18 14:26:41,725] episode 406, reward -0.009502, avg reward -0.031581, total steps 51968, episode step 128\n",
|
|
"INFO:gym:episode 407, reward -0.056767, avg reward -0.031195, total steps 52096, episode step 128\n",
|
|
"[2018-02-18 14:26:45,870] episode 407, reward -0.056767, avg reward -0.031195, total steps 52096, episode step 128\n",
|
|
"INFO:gym:episode 408, reward -0.045311, avg reward -0.031401, total steps 52224, episode step 128\n",
|
|
"[2018-02-18 14:26:49,776] episode 408, reward -0.045311, avg reward -0.031401, total steps 52224, episode step 128\n",
|
|
"INFO:gym:episode 409, reward -0.001969, avg reward -0.030379, total steps 52352, episode step 128\n",
|
|
"[2018-02-18 14:26:53,934] episode 409, reward -0.001969, avg reward -0.030379, total steps 52352, episode step 128\n",
|
|
"INFO:gym:episode 410, reward -0.023007, avg reward -0.029598, total steps 52480, episode step 128\n",
|
|
"[2018-02-18 14:26:58,460] episode 410, reward -0.023007, avg reward -0.029598, total steps 52480, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:26:58,462] Testing...\n",
|
|
"INFO:gym:Avg reward -0.009690(0.000000)\n",
|
|
"[2018-02-18 14:26:59,043] Avg reward -0.009690(0.000000)\n",
|
|
"INFO:gym:episode 411, reward -0.015740, avg reward -0.029520, total steps 52608, episode step 128\n",
|
|
"[2018-02-18 14:27:03,528] episode 411, reward -0.015740, avg reward -0.029520, total steps 52608, episode step 128\n",
|
|
"INFO:gym:episode 412, reward 0.003090, avg reward -0.029530, total steps 52736, episode step 128\n",
|
|
"[2018-02-18 14:27:07,725] episode 412, reward 0.003090, avg reward -0.029530, total steps 52736, episode step 128\n",
|
|
"INFO:gym:episode 413, reward -0.032347, avg reward -0.029833, total steps 52864, episode step 128\n",
|
|
"[2018-02-18 14:27:11,885] episode 413, reward -0.032347, avg reward -0.029833, total steps 52864, episode step 128\n",
|
|
"INFO:gym:episode 414, reward -0.019218, avg reward -0.030004, total steps 52992, episode step 128\n",
|
|
"[2018-02-18 14:27:16,112] episode 414, reward -0.019218, avg reward -0.030004, total steps 52992, episode step 128\n",
|
|
"INFO:gym:episode 415, reward -0.052014, avg reward -0.030509, total steps 53120, episode step 128\n",
|
|
"[2018-02-18 14:27:19,639] episode 415, reward -0.052014, avg reward -0.030509, total steps 53120, episode step 128\n",
|
|
"INFO:gym:episode 416, reward -0.049083, avg reward -0.030666, total steps 53248, episode step 128\n",
|
|
"[2018-02-18 14:27:23,246] episode 416, reward -0.049083, avg reward -0.030666, total steps 53248, episode step 128\n",
|
|
"INFO:gym:episode 417, reward -0.006391, avg reward -0.030642, total steps 53376, episode step 128\n",
|
|
"[2018-02-18 14:27:26,785] episode 417, reward -0.006391, avg reward -0.030642, total steps 53376, episode step 128\n",
|
|
"INFO:gym:episode 418, reward -0.085143, avg reward -0.030313, total steps 53504, episode step 128\n",
|
|
"[2018-02-18 14:27:30,529] episode 418, reward -0.085143, avg reward -0.030313, total steps 53504, episode step 128\n",
|
|
"INFO:gym:episode 419, reward 0.012652, avg reward -0.029790, total steps 53632, episode step 128\n",
|
|
"[2018-02-18 14:27:34,173] episode 419, reward 0.012652, avg reward -0.029790, total steps 53632, episode step 128\n",
|
|
"INFO:gym:episode 420, reward -0.078112, avg reward -0.030229, total steps 53760, episode step 128\n",
|
|
"[2018-02-18 14:27:37,876] episode 420, reward -0.078112, avg reward -0.030229, total steps 53760, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:27:37,878] Testing...\n",
|
|
"INFO:gym:Avg reward -0.041218(0.000000)\n",
|
|
"[2018-02-18 14:27:38,251] Avg reward -0.041218(0.000000)\n",
|
|
"INFO:gym:episode 421, reward -0.012296, avg reward -0.030217, total steps 53888, episode step 128\n",
|
|
"[2018-02-18 14:27:42,559] episode 421, reward -0.012296, avg reward -0.030217, total steps 53888, episode step 128\n",
|
|
"INFO:gym:episode 422, reward -0.025659, avg reward -0.029600, total steps 54016, episode step 128\n",
|
|
"[2018-02-18 14:27:46,629] episode 422, reward -0.025659, avg reward -0.029600, total steps 54016, episode step 128\n",
|
|
"INFO:gym:episode 423, reward -0.051871, avg reward -0.029991, total steps 54144, episode step 128\n",
|
|
"[2018-02-18 14:27:51,044] episode 423, reward -0.051871, avg reward -0.029991, total steps 54144, episode step 128\n",
|
|
"INFO:gym:episode 424, reward -0.018138, avg reward -0.030017, total steps 54272, episode step 128\n",
|
|
"[2018-02-18 14:27:55,715] episode 424, reward -0.018138, avg reward -0.030017, total steps 54272, episode step 128\n",
|
|
"INFO:gym:episode 425, reward -0.010032, avg reward -0.028672, total steps 54400, episode step 128\n",
|
|
"[2018-02-18 14:28:00,631] episode 425, reward -0.010032, avg reward -0.028672, total steps 54400, episode step 128\n",
|
|
"INFO:gym:episode 426, reward 0.024850, avg reward -0.028099, total steps 54528, episode step 128\n",
|
|
"[2018-02-18 14:28:05,162] episode 426, reward 0.024850, avg reward -0.028099, total steps 54528, episode step 128\n",
|
|
"INFO:gym:episode 427, reward 0.001901, avg reward -0.027496, total steps 54656, episode step 128\n",
|
|
"[2018-02-18 14:28:10,209] episode 427, reward 0.001901, avg reward -0.027496, total steps 54656, episode step 128\n",
|
|
"INFO:gym:episode 428, reward -0.010541, avg reward -0.027048, total steps 54784, episode step 128\n",
|
|
"[2018-02-18 14:28:14,715] episode 428, reward -0.010541, avg reward -0.027048, total steps 54784, episode step 128\n",
|
|
"INFO:gym:episode 429, reward -0.004771, avg reward -0.026325, total steps 54912, episode step 128\n",
|
|
"[2018-02-18 14:28:19,311] episode 429, reward -0.004771, avg reward -0.026325, total steps 54912, episode step 128\n",
|
|
"INFO:gym:episode 430, reward -0.034577, avg reward -0.026551, total steps 55040, episode step 128\n",
|
|
"[2018-02-18 14:28:24,515] episode 430, reward -0.034577, avg reward -0.026551, total steps 55040, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:28:24,518] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002253(0.000000)\n",
|
|
"[2018-02-18 14:28:25,315] Avg reward -0.002253(0.000000)\n",
|
|
"INFO:gym:episode 431, reward -0.000695, avg reward -0.026505, total steps 55168, episode step 128\n",
|
|
"[2018-02-18 14:28:30,413] episode 431, reward -0.000695, avg reward -0.026505, total steps 55168, episode step 128\n",
|
|
"INFO:gym:episode 432, reward -0.007107, avg reward -0.025848, total steps 55296, episode step 128\n",
|
|
"[2018-02-18 14:28:34,931] episode 432, reward -0.007107, avg reward -0.025848, total steps 55296, episode step 128\n",
|
|
"INFO:gym:episode 433, reward -0.008998, avg reward -0.025905, total steps 55424, episode step 128\n",
|
|
"[2018-02-18 14:28:39,501] episode 433, reward -0.008998, avg reward -0.025905, total steps 55424, episode step 128\n",
|
|
"INFO:gym:episode 434, reward -0.001759, avg reward -0.026103, total steps 55552, episode step 128\n",
|
|
"[2018-02-18 14:28:44,452] episode 434, reward -0.001759, avg reward -0.026103, total steps 55552, episode step 128\n",
|
|
"INFO:gym:episode 435, reward -0.055433, avg reward -0.026631, total steps 55680, episode step 128\n",
|
|
"[2018-02-18 14:28:49,759] episode 435, reward -0.055433, avg reward -0.026631, total steps 55680, episode step 128\n",
|
|
"INFO:gym:episode 436, reward -0.008394, avg reward -0.026640, total steps 55808, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:28:54,819] episode 436, reward -0.008394, avg reward -0.026640, total steps 55808, episode step 128\n",
|
|
"INFO:gym:episode 437, reward -0.070446, avg reward -0.027292, total steps 55936, episode step 128\n",
|
|
"[2018-02-18 14:29:00,083] episode 437, reward -0.070446, avg reward -0.027292, total steps 55936, episode step 128\n",
|
|
"INFO:gym:episode 438, reward -0.013341, avg reward -0.027385, total steps 56064, episode step 128\n",
|
|
"[2018-02-18 14:29:05,447] episode 438, reward -0.013341, avg reward -0.027385, total steps 56064, episode step 128\n",
|
|
"INFO:gym:episode 439, reward -0.048013, avg reward -0.027508, total steps 56192, episode step 128\n",
|
|
"[2018-02-18 14:29:09,797] episode 439, reward -0.048013, avg reward -0.027508, total steps 56192, episode step 128\n",
|
|
"INFO:gym:episode 440, reward -0.002775, avg reward -0.027482, total steps 56320, episode step 128\n",
|
|
"[2018-02-18 14:29:14,029] episode 440, reward -0.002775, avg reward -0.027482, total steps 56320, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:29:14,035] Testing...\n",
|
|
"INFO:gym:Avg reward -0.085402(0.000000)\n",
|
|
"[2018-02-18 14:29:14,505] Avg reward -0.085402(0.000000)\n",
|
|
"INFO:gym:episode 441, reward -0.002213, avg reward -0.027360, total steps 56448, episode step 128\n",
|
|
"[2018-02-18 14:29:19,037] episode 441, reward -0.002213, avg reward -0.027360, total steps 56448, episode step 128\n",
|
|
"INFO:gym:episode 442, reward -0.030907, avg reward -0.027652, total steps 56576, episode step 128\n",
|
|
"[2018-02-18 14:29:23,469] episode 442, reward -0.030907, avg reward -0.027652, total steps 56576, episode step 128\n",
|
|
"INFO:gym:episode 443, reward -0.004436, avg reward -0.027041, total steps 56704, episode step 128\n",
|
|
"[2018-02-18 14:29:27,432] episode 443, reward -0.004436, avg reward -0.027041, total steps 56704, episode step 128\n",
|
|
"INFO:gym:episode 444, reward -0.041065, avg reward -0.027759, total steps 56832, episode step 128\n",
|
|
"[2018-02-18 14:29:31,338] episode 444, reward -0.041065, avg reward -0.027759, total steps 56832, episode step 128\n",
|
|
"INFO:gym:episode 445, reward -0.010908, avg reward -0.027656, total steps 56960, episode step 128\n",
|
|
"[2018-02-18 14:29:35,557] episode 445, reward -0.010908, avg reward -0.027656, total steps 56960, episode step 128\n",
|
|
"INFO:gym:episode 446, reward -0.000529, avg reward -0.027608, total steps 57088, episode step 128\n",
|
|
"[2018-02-18 14:29:40,347] episode 446, reward -0.000529, avg reward -0.027608, total steps 57088, episode step 128\n",
|
|
"INFO:gym:episode 447, reward -0.009676, avg reward -0.027222, total steps 57216, episode step 128\n",
|
|
"[2018-02-18 14:29:43,378] episode 447, reward -0.009676, avg reward -0.027222, total steps 57216, episode step 128\n",
|
|
"INFO:gym:episode 448, reward -0.004672, avg reward -0.027117, total steps 57344, episode step 128\n",
|
|
"[2018-02-18 14:29:45,537] episode 448, reward -0.004672, avg reward -0.027117, total steps 57344, episode step 128\n",
|
|
"INFO:gym:episode 449, reward 0.004595, avg reward -0.027053, total steps 57472, episode step 128\n",
|
|
"[2018-02-18 14:29:47,759] episode 449, reward 0.004595, avg reward -0.027053, total steps 57472, episode step 128\n",
|
|
"INFO:gym:episode 450, reward -0.038383, avg reward -0.026618, total steps 57600, episode step 128\n",
|
|
"[2018-02-18 14:29:50,020] episode 450, reward -0.038383, avg reward -0.026618, total steps 57600, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:29:50,024] Testing...\n",
|
|
"INFO:gym:Avg reward 0.005578(0.000000)\n",
|
|
"[2018-02-18 14:29:50,584] Avg reward 0.005578(0.000000)\n",
|
|
"INFO:gym:episode 451, reward -0.067676, avg reward -0.027513, total steps 57728, episode step 128\n",
|
|
"[2018-02-18 14:29:52,962] episode 451, reward -0.067676, avg reward -0.027513, total steps 57728, episode step 128\n",
|
|
"INFO:gym:episode 452, reward -0.004553, avg reward -0.027534, total steps 57856, episode step 128\n",
|
|
"[2018-02-18 14:29:55,204] episode 452, reward -0.004553, avg reward -0.027534, total steps 57856, episode step 128\n",
|
|
"INFO:gym:episode 453, reward -0.030957, avg reward -0.026937, total steps 57984, episode step 128\n",
|
|
"[2018-02-18 14:29:57,330] episode 453, reward -0.030957, avg reward -0.026937, total steps 57984, episode step 128\n",
|
|
"INFO:gym:episode 454, reward -0.035832, avg reward -0.027280, total steps 58112, episode step 128\n",
|
|
"[2018-02-18 14:29:59,500] episode 454, reward -0.035832, avg reward -0.027280, total steps 58112, episode step 128\n",
|
|
"INFO:gym:episode 455, reward -0.016006, avg reward -0.027404, total steps 58240, episode step 128\n",
|
|
"[2018-02-18 14:30:01,618] episode 455, reward -0.016006, avg reward -0.027404, total steps 58240, episode step 128\n",
|
|
"INFO:gym:episode 456, reward -0.041857, avg reward -0.028577, total steps 58368, episode step 128\n",
|
|
"[2018-02-18 14:30:03,977] episode 456, reward -0.041857, avg reward -0.028577, total steps 58368, episode step 128\n",
|
|
"INFO:gym:episode 457, reward -0.018135, avg reward -0.028456, total steps 58496, episode step 128\n",
|
|
"[2018-02-18 14:30:06,280] episode 457, reward -0.018135, avg reward -0.028456, total steps 58496, episode step 128\n",
|
|
"INFO:gym:episode 458, reward -0.005845, avg reward -0.027975, total steps 58624, episode step 128\n",
|
|
"[2018-02-18 14:30:08,600] episode 458, reward -0.005845, avg reward -0.027975, total steps 58624, episode step 128\n",
|
|
"INFO:gym:episode 459, reward -0.035387, avg reward -0.028058, total steps 58752, episode step 128\n",
|
|
"[2018-02-18 14:30:11,057] episode 459, reward -0.035387, avg reward -0.028058, total steps 58752, episode step 128\n",
|
|
"INFO:gym:episode 460, reward -0.074725, avg reward -0.028171, total steps 58880, episode step 128\n",
|
|
"[2018-02-18 14:30:13,562] episode 460, reward -0.074725, avg reward -0.028171, total steps 58880, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:30:13,564] Testing...\n",
|
|
"INFO:gym:Avg reward -0.081282(0.000000)\n",
|
|
"[2018-02-18 14:30:13,994] Avg reward -0.081282(0.000000)\n",
|
|
"INFO:gym:episode 461, reward -0.003693, avg reward -0.027911, total steps 59008, episode step 128\n",
|
|
"[2018-02-18 14:30:16,527] episode 461, reward -0.003693, avg reward -0.027911, total steps 59008, episode step 128\n",
|
|
"INFO:gym:episode 462, reward -0.001702, avg reward -0.027681, total steps 59136, episode step 128\n",
|
|
"[2018-02-18 14:30:18,975] episode 462, reward -0.001702, avg reward -0.027681, total steps 59136, episode step 128\n",
|
|
"INFO:gym:episode 463, reward -0.007474, avg reward -0.027205, total steps 59264, episode step 128\n",
|
|
"[2018-02-18 14:30:21,320] episode 463, reward -0.007474, avg reward -0.027205, total steps 59264, episode step 128\n",
|
|
"INFO:gym:episode 464, reward -0.054965, avg reward -0.027708, total steps 59392, episode step 128\n",
|
|
"[2018-02-18 14:30:23,846] episode 464, reward -0.054965, avg reward -0.027708, total steps 59392, episode step 128\n",
|
|
"INFO:gym:episode 465, reward -0.029520, avg reward -0.028034, total steps 59520, episode step 128\n",
|
|
"[2018-02-18 14:30:26,107] episode 465, reward -0.029520, avg reward -0.028034, total steps 59520, episode step 128\n",
|
|
"INFO:gym:episode 466, reward -0.048352, avg reward -0.028042, total steps 59648, episode step 128\n",
|
|
"[2018-02-18 14:30:28,608] episode 466, reward -0.048352, avg reward -0.028042, total steps 59648, episode step 128\n",
|
|
"INFO:gym:episode 467, reward -0.083973, avg reward -0.027478, total steps 59776, episode step 128\n",
|
|
"[2018-02-18 14:30:31,114] episode 467, reward -0.083973, avg reward -0.027478, total steps 59776, episode step 128\n",
|
|
"INFO:gym:episode 468, reward 0.002465, avg reward -0.027526, total steps 59904, episode step 128\n",
|
|
"[2018-02-18 14:30:33,446] episode 468, reward 0.002465, avg reward -0.027526, total steps 59904, episode step 128\n",
|
|
"INFO:gym:episode 469, reward -0.005027, avg reward -0.027558, total steps 60032, episode step 128\n",
|
|
"[2018-02-18 14:30:35,881] episode 469, reward -0.005027, avg reward -0.027558, total steps 60032, episode step 128\n",
|
|
"INFO:gym:episode 470, reward -0.013958, avg reward -0.027424, total steps 60160, episode step 128\n",
|
|
"[2018-02-18 14:30:38,168] episode 470, reward -0.013958, avg reward -0.027424, total steps 60160, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:30:38,174] Testing...\n",
|
|
"INFO:gym:Avg reward -0.005507(0.000000)\n",
|
|
"[2018-02-18 14:30:38,611] Avg reward -0.005507(0.000000)\n",
|
|
"INFO:gym:episode 471, reward -0.012361, avg reward -0.027272, total steps 60288, episode step 128\n",
|
|
"[2018-02-18 14:30:40,897] episode 471, reward -0.012361, avg reward -0.027272, total steps 60288, episode step 128\n",
|
|
"INFO:gym:episode 472, reward -0.006831, avg reward -0.027278, total steps 60416, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:30:43,221] episode 472, reward -0.006831, avg reward -0.027278, total steps 60416, episode step 128\n",
|
|
"INFO:gym:episode 473, reward -0.012367, avg reward -0.026547, total steps 60544, episode step 128\n",
|
|
"[2018-02-18 14:30:45,828] episode 473, reward -0.012367, avg reward -0.026547, total steps 60544, episode step 128\n",
|
|
"INFO:gym:episode 474, reward -0.029824, avg reward -0.028652, total steps 60672, episode step 128\n",
|
|
"[2018-02-18 14:30:48,233] episode 474, reward -0.029824, avg reward -0.028652, total steps 60672, episode step 128\n",
|
|
"INFO:gym:episode 475, reward -0.004896, avg reward -0.027959, total steps 60800, episode step 128\n",
|
|
"[2018-02-18 14:30:50,719] episode 475, reward -0.004896, avg reward -0.027959, total steps 60800, episode step 128\n",
|
|
"INFO:gym:episode 476, reward -0.044864, avg reward -0.027963, total steps 60928, episode step 128\n",
|
|
"[2018-02-18 14:30:53,263] episode 476, reward -0.044864, avg reward -0.027963, total steps 60928, episode step 128\n",
|
|
"INFO:gym:episode 477, reward -0.007114, avg reward -0.027755, total steps 61056, episode step 128\n",
|
|
"[2018-02-18 14:30:55,937] episode 477, reward -0.007114, avg reward -0.027755, total steps 61056, episode step 128\n",
|
|
"INFO:gym:episode 478, reward -0.001758, avg reward -0.027746, total steps 61184, episode step 128\n",
|
|
"[2018-02-18 14:30:58,345] episode 478, reward -0.001758, avg reward -0.027746, total steps 61184, episode step 128\n",
|
|
"INFO:gym:episode 479, reward 0.006638, avg reward -0.027119, total steps 61312, episode step 128\n",
|
|
"[2018-02-18 14:31:00,911] episode 479, reward 0.006638, avg reward -0.027119, total steps 61312, episode step 128\n",
|
|
"INFO:gym:episode 480, reward -0.057082, avg reward -0.027348, total steps 61440, episode step 128\n",
|
|
"[2018-02-18 14:31:03,897] episode 480, reward -0.057082, avg reward -0.027348, total steps 61440, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:31:03,901] Testing...\n",
|
|
"INFO:gym:Avg reward -0.003468(0.000000)\n",
|
|
"[2018-02-18 14:31:04,383] Avg reward -0.003468(0.000000)\n",
|
|
"INFO:gym:episode 481, reward -0.026026, avg reward -0.027177, total steps 61568, episode step 128\n",
|
|
"[2018-02-18 14:31:07,531] episode 481, reward -0.026026, avg reward -0.027177, total steps 61568, episode step 128\n",
|
|
"INFO:gym:episode 482, reward -0.009363, avg reward -0.026773, total steps 61696, episode step 128\n",
|
|
"[2018-02-18 14:31:10,739] episode 482, reward -0.009363, avg reward -0.026773, total steps 61696, episode step 128\n",
|
|
"INFO:gym:episode 483, reward -0.024589, avg reward -0.027072, total steps 61824, episode step 128\n",
|
|
"[2018-02-18 14:31:14,201] episode 483, reward -0.024589, avg reward -0.027072, total steps 61824, episode step 128\n",
|
|
"INFO:gym:episode 484, reward -0.001752, avg reward -0.026813, total steps 61952, episode step 128\n",
|
|
"[2018-02-18 14:31:17,802] episode 484, reward -0.001752, avg reward -0.026813, total steps 61952, episode step 128\n",
|
|
"INFO:gym:episode 485, reward -0.010427, avg reward -0.026590, total steps 62080, episode step 128\n",
|
|
"[2018-02-18 14:31:21,565] episode 485, reward -0.010427, avg reward -0.026590, total steps 62080, episode step 128\n",
|
|
"INFO:gym:episode 486, reward -0.002755, avg reward -0.026592, total steps 62208, episode step 128\n",
|
|
"[2018-02-18 14:31:25,643] episode 486, reward -0.002755, avg reward -0.026592, total steps 62208, episode step 128\n",
|
|
"INFO:gym:episode 487, reward -0.010116, avg reward -0.026647, total steps 62336, episode step 128\n",
|
|
"[2018-02-18 14:31:29,982] episode 487, reward -0.010116, avg reward -0.026647, total steps 62336, episode step 128\n",
|
|
"INFO:gym:episode 488, reward -0.001940, avg reward -0.025960, total steps 62464, episode step 128\n",
|
|
"[2018-02-18 14:31:34,276] episode 488, reward -0.001940, avg reward -0.025960, total steps 62464, episode step 128\n",
|
|
"INFO:gym:episode 489, reward -0.001912, avg reward -0.025303, total steps 62592, episode step 128\n",
|
|
"[2018-02-18 14:31:38,542] episode 489, reward -0.001912, avg reward -0.025303, total steps 62592, episode step 128\n",
|
|
"INFO:gym:episode 490, reward -0.000852, avg reward -0.024202, total steps 62720, episode step 128\n",
|
|
"[2018-02-18 14:31:42,607] episode 490, reward -0.000852, avg reward -0.024202, total steps 62720, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:31:42,613] Testing...\n",
|
|
"INFO:gym:Avg reward -0.008134(0.000000)\n",
|
|
"[2018-02-18 14:31:43,035] Avg reward -0.008134(0.000000)\n",
|
|
"INFO:gym:episode 491, reward -0.024140, avg reward -0.023057, total steps 62848, episode step 128\n",
|
|
"[2018-02-18 14:31:47,364] episode 491, reward -0.024140, avg reward -0.023057, total steps 62848, episode step 128\n",
|
|
"INFO:gym:episode 492, reward -0.008009, avg reward -0.023015, total steps 62976, episode step 128\n",
|
|
"[2018-02-18 14:31:51,622] episode 492, reward -0.008009, avg reward -0.023015, total steps 62976, episode step 128\n",
|
|
"INFO:gym:episode 493, reward 0.113687, avg reward -0.021860, total steps 63104, episode step 128\n",
|
|
"[2018-02-18 14:31:56,064] episode 493, reward 0.113687, avg reward -0.021860, total steps 63104, episode step 128\n",
|
|
"INFO:gym:episode 494, reward -0.001794, avg reward -0.021687, total steps 63232, episode step 128\n",
|
|
"[2018-02-18 14:32:00,714] episode 494, reward -0.001794, avg reward -0.021687, total steps 63232, episode step 128\n",
|
|
"INFO:gym:episode 495, reward -0.002892, avg reward -0.020485, total steps 63360, episode step 128\n",
|
|
"[2018-02-18 14:32:05,517] episode 495, reward -0.002892, avg reward -0.020485, total steps 63360, episode step 128\n",
|
|
"INFO:gym:episode 496, reward -0.000355, avg reward -0.020578, total steps 63488, episode step 128\n",
|
|
"[2018-02-18 14:32:10,146] episode 496, reward -0.000355, avg reward -0.020578, total steps 63488, episode step 128\n",
|
|
"INFO:gym:episode 497, reward -0.004659, avg reward -0.019806, total steps 63616, episode step 128\n",
|
|
"[2018-02-18 14:32:14,452] episode 497, reward -0.004659, avg reward -0.019806, total steps 63616, episode step 128\n",
|
|
"INFO:gym:episode 498, reward -0.001757, avg reward -0.019634, total steps 63744, episode step 128\n",
|
|
"[2018-02-18 14:32:18,722] episode 498, reward -0.001757, avg reward -0.019634, total steps 63744, episode step 128\n",
|
|
"INFO:gym:episode 499, reward -0.002149, avg reward -0.018932, total steps 63872, episode step 128\n",
|
|
"[2018-02-18 14:32:23,415] episode 499, reward -0.002149, avg reward -0.018932, total steps 63872, episode step 128\n",
|
|
"INFO:gym:episode 500, reward 0.056706, avg reward -0.017433, total steps 64000, episode step 128\n",
|
|
"[2018-02-18 14:32:28,876] episode 500, reward 0.056706, avg reward -0.017433, total steps 64000, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:32:28,879] Testing...\n",
|
|
"INFO:gym:Avg reward -0.016637(0.000000)\n",
|
|
"[2018-02-18 14:32:29,359] Avg reward -0.016637(0.000000)\n",
|
|
"INFO:gym:episode 501, reward -0.011838, avg reward -0.017324, total steps 64128, episode step 128\n",
|
|
"[2018-02-18 14:32:35,001] episode 501, reward -0.011838, avg reward -0.017324, total steps 64128, episode step 128\n",
|
|
"INFO:gym:episode 502, reward -0.001758, avg reward -0.017077, total steps 64256, episode step 128\n",
|
|
"[2018-02-18 14:32:41,085] episode 502, reward -0.001758, avg reward -0.017077, total steps 64256, episode step 128\n",
|
|
"INFO:gym:episode 503, reward -0.036940, avg reward -0.017374, total steps 64384, episode step 128\n",
|
|
"[2018-02-18 14:32:47,274] episode 503, reward -0.036940, avg reward -0.017374, total steps 64384, episode step 128\n",
|
|
"INFO:gym:episode 504, reward -0.024076, avg reward -0.017509, total steps 64512, episode step 128\n",
|
|
"[2018-02-18 14:32:52,837] episode 504, reward -0.024076, avg reward -0.017509, total steps 64512, episode step 128\n",
|
|
"INFO:gym:episode 505, reward -0.001717, avg reward -0.017442, total steps 64640, episode step 128\n",
|
|
"[2018-02-18 14:32:58,044] episode 505, reward -0.001717, avg reward -0.017442, total steps 64640, episode step 128\n",
|
|
"INFO:gym:episode 506, reward -0.001760, avg reward -0.017365, total steps 64768, episode step 128\n",
|
|
"[2018-02-18 14:33:03,351] episode 506, reward -0.001760, avg reward -0.017365, total steps 64768, episode step 128\n",
|
|
"INFO:gym:episode 507, reward -0.030747, avg reward -0.017104, total steps 64896, episode step 128\n",
|
|
"[2018-02-18 14:33:08,384] episode 507, reward -0.030747, avg reward -0.017104, total steps 64896, episode step 128\n",
|
|
"INFO:gym:episode 508, reward -0.004493, avg reward -0.016696, total steps 65024, episode step 128\n",
|
|
"[2018-02-18 14:33:13,466] episode 508, reward -0.004493, avg reward -0.016696, total steps 65024, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 509, reward -0.001795, avg reward -0.016695, total steps 65152, episode step 128\n",
|
|
"[2018-02-18 14:33:19,339] episode 509, reward -0.001795, avg reward -0.016695, total steps 65152, episode step 128\n",
|
|
"INFO:gym:episode 510, reward -0.019962, avg reward -0.016664, total steps 65280, episode step 128\n",
|
|
"[2018-02-18 14:33:24,703] episode 510, reward -0.019962, avg reward -0.016664, total steps 65280, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:33:24,709] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002411(0.000000)\n",
|
|
"[2018-02-18 14:33:25,204] Avg reward -0.002411(0.000000)\n",
|
|
"INFO:gym:episode 511, reward -0.002793, avg reward -0.016535, total steps 65408, episode step 128\n",
|
|
"[2018-02-18 14:33:30,346] episode 511, reward -0.002793, avg reward -0.016535, total steps 65408, episode step 128\n",
|
|
"INFO:gym:episode 512, reward -0.033855, avg reward -0.016904, total steps 65536, episode step 128\n",
|
|
"[2018-02-18 14:33:35,311] episode 512, reward -0.033855, avg reward -0.016904, total steps 65536, episode step 128\n",
|
|
"INFO:gym:episode 513, reward -0.020695, avg reward -0.016788, total steps 65664, episode step 128\n",
|
|
"[2018-02-18 14:33:40,453] episode 513, reward -0.020695, avg reward -0.016788, total steps 65664, episode step 128\n",
|
|
"INFO:gym:episode 514, reward -0.001775, avg reward -0.016613, total steps 65792, episode step 128\n",
|
|
"[2018-02-18 14:33:45,218] episode 514, reward -0.001775, avg reward -0.016613, total steps 65792, episode step 128\n",
|
|
"INFO:gym:episode 515, reward 0.003675, avg reward -0.016056, total steps 65920, episode step 128\n",
|
|
"[2018-02-18 14:33:50,037] episode 515, reward 0.003675, avg reward -0.016056, total steps 65920, episode step 128\n",
|
|
"INFO:gym:episode 516, reward -0.005596, avg reward -0.015621, total steps 66048, episode step 128\n",
|
|
"[2018-02-18 14:33:55,076] episode 516, reward -0.005596, avg reward -0.015621, total steps 66048, episode step 128\n",
|
|
"INFO:gym:episode 517, reward -0.017671, avg reward -0.015734, total steps 66176, episode step 128\n",
|
|
"[2018-02-18 14:34:00,372] episode 517, reward -0.017671, avg reward -0.015734, total steps 66176, episode step 128\n",
|
|
"INFO:gym:episode 518, reward -0.007521, avg reward -0.014958, total steps 66304, episode step 128\n",
|
|
"[2018-02-18 14:34:05,819] episode 518, reward -0.007521, avg reward -0.014958, total steps 66304, episode step 128\n",
|
|
"INFO:gym:episode 519, reward -0.003316, avg reward -0.015118, total steps 66432, episode step 128\n",
|
|
"[2018-02-18 14:34:10,772] episode 519, reward -0.003316, avg reward -0.015118, total steps 66432, episode step 128\n",
|
|
"INFO:gym:episode 520, reward -0.006878, avg reward -0.014405, total steps 66560, episode step 128\n",
|
|
"[2018-02-18 14:34:15,601] episode 520, reward -0.006878, avg reward -0.014405, total steps 66560, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:34:15,612] Testing...\n",
|
|
"INFO:gym:Avg reward -0.000999(0.000000)\n",
|
|
"[2018-02-18 14:34:16,572] Avg reward -0.000999(0.000000)\n",
|
|
"INFO:gym:episode 521, reward 0.010859, avg reward -0.014174, total steps 66688, episode step 128\n",
|
|
"[2018-02-18 14:34:21,884] episode 521, reward 0.010859, avg reward -0.014174, total steps 66688, episode step 128\n",
|
|
"INFO:gym:episode 522, reward -0.019578, avg reward -0.014113, total steps 66816, episode step 128\n",
|
|
"[2018-02-18 14:34:26,675] episode 522, reward -0.019578, avg reward -0.014113, total steps 66816, episode step 128\n",
|
|
"INFO:gym:episode 523, reward -0.002110, avg reward -0.013615, total steps 66944, episode step 128\n",
|
|
"[2018-02-18 14:34:31,212] episode 523, reward -0.002110, avg reward -0.013615, total steps 66944, episode step 128\n",
|
|
"INFO:gym:episode 524, reward -0.016465, avg reward -0.013599, total steps 67072, episode step 128\n",
|
|
"[2018-02-18 14:34:35,751] episode 524, reward -0.016465, avg reward -0.013599, total steps 67072, episode step 128\n",
|
|
"INFO:gym:episode 525, reward 0.000694, avg reward -0.013491, total steps 67200, episode step 128\n",
|
|
"[2018-02-18 14:34:40,483] episode 525, reward 0.000694, avg reward -0.013491, total steps 67200, episode step 128\n",
|
|
"INFO:gym:episode 526, reward -0.015823, avg reward -0.013898, total steps 67328, episode step 128\n",
|
|
"[2018-02-18 14:34:45,480] episode 526, reward -0.015823, avg reward -0.013898, total steps 67328, episode step 128\n",
|
|
"INFO:gym:episode 527, reward -0.082488, avg reward -0.014742, total steps 67456, episode step 128\n",
|
|
"[2018-02-18 14:34:50,171] episode 527, reward -0.082488, avg reward -0.014742, total steps 67456, episode step 128\n",
|
|
"INFO:gym:episode 528, reward -0.002367, avg reward -0.014660, total steps 67584, episode step 128\n",
|
|
"[2018-02-18 14:34:54,626] episode 528, reward -0.002367, avg reward -0.014660, total steps 67584, episode step 128\n",
|
|
"INFO:gym:episode 529, reward -0.010612, avg reward -0.014719, total steps 67712, episode step 128\n",
|
|
"[2018-02-18 14:34:58,618] episode 529, reward -0.010612, avg reward -0.014719, total steps 67712, episode step 128\n",
|
|
"INFO:gym:episode 530, reward -0.004255, avg reward -0.014415, total steps 67840, episode step 128\n",
|
|
"[2018-02-18 14:35:02,692] episode 530, reward -0.004255, avg reward -0.014415, total steps 67840, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:35:02,695] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002743(0.000000)\n",
|
|
"[2018-02-18 14:35:03,098] Avg reward -0.002743(0.000000)\n",
|
|
"INFO:gym:episode 531, reward -0.002158, avg reward -0.014430, total steps 67968, episode step 128\n",
|
|
"[2018-02-18 14:35:07,756] episode 531, reward -0.002158, avg reward -0.014430, total steps 67968, episode step 128\n",
|
|
"INFO:gym:episode 532, reward -0.006461, avg reward -0.014424, total steps 68096, episode step 128\n",
|
|
"[2018-02-18 14:35:12,299] episode 532, reward -0.006461, avg reward -0.014424, total steps 68096, episode step 128\n",
|
|
"INFO:gym:episode 533, reward -0.071435, avg reward -0.015048, total steps 68224, episode step 128\n",
|
|
"[2018-02-18 14:35:17,163] episode 533, reward -0.071435, avg reward -0.015048, total steps 68224, episode step 128\n",
|
|
"INFO:gym:episode 534, reward -0.004967, avg reward -0.015080, total steps 68352, episode step 128\n",
|
|
"[2018-02-18 14:35:21,686] episode 534, reward -0.004967, avg reward -0.015080, total steps 68352, episode step 128\n",
|
|
"INFO:gym:episode 535, reward -0.036356, avg reward -0.014889, total steps 68480, episode step 128\n",
|
|
"[2018-02-18 14:35:26,191] episode 535, reward -0.036356, avg reward -0.014889, total steps 68480, episode step 128\n",
|
|
"INFO:gym:episode 536, reward -0.002296, avg reward -0.014828, total steps 68608, episode step 128\n",
|
|
"[2018-02-18 14:35:30,260] episode 536, reward -0.002296, avg reward -0.014828, total steps 68608, episode step 128\n",
|
|
"INFO:gym:episode 537, reward -0.002084, avg reward -0.014145, total steps 68736, episode step 128\n",
|
|
"[2018-02-18 14:35:34,545] episode 537, reward -0.002084, avg reward -0.014145, total steps 68736, episode step 128\n",
|
|
"INFO:gym:episode 538, reward -0.011692, avg reward -0.014128, total steps 68864, episode step 128\n",
|
|
"[2018-02-18 14:35:38,701] episode 538, reward -0.011692, avg reward -0.014128, total steps 68864, episode step 128\n",
|
|
"INFO:gym:episode 539, reward -0.008135, avg reward -0.013729, total steps 68992, episode step 128\n",
|
|
"[2018-02-18 14:35:42,832] episode 539, reward -0.008135, avg reward -0.013729, total steps 68992, episode step 128\n",
|
|
"INFO:gym:episode 540, reward -0.009191, avg reward -0.013794, total steps 69120, episode step 128\n",
|
|
"[2018-02-18 14:35:47,182] episode 540, reward -0.009191, avg reward -0.013794, total steps 69120, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:35:47,183] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001921(0.000000)\n",
|
|
"[2018-02-18 14:35:47,630] Avg reward -0.001921(0.000000)\n",
|
|
"INFO:gym:episode 541, reward -0.005567, avg reward -0.013827, total steps 69248, episode step 128\n",
|
|
"[2018-02-18 14:35:51,930] episode 541, reward -0.005567, avg reward -0.013827, total steps 69248, episode step 128\n",
|
|
"INFO:gym:episode 542, reward -0.004231, avg reward -0.013560, total steps 69376, episode step 128\n",
|
|
"[2018-02-18 14:35:56,114] episode 542, reward -0.004231, avg reward -0.013560, total steps 69376, episode step 128\n",
|
|
"INFO:gym:episode 543, reward -0.008669, avg reward -0.013603, total steps 69504, episode step 128\n",
|
|
"[2018-02-18 14:36:00,077] episode 543, reward -0.008669, avg reward -0.013603, total steps 69504, episode step 128\n",
|
|
"INFO:gym:episode 544, reward -0.004934, avg reward -0.013241, total steps 69632, episode step 128\n",
|
|
"[2018-02-18 14:36:04,213] episode 544, reward -0.004934, avg reward -0.013241, total steps 69632, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 545, reward -0.017790, avg reward -0.013310, total steps 69760, episode step 128\n",
|
|
"[2018-02-18 14:36:08,680] episode 545, reward -0.017790, avg reward -0.013310, total steps 69760, episode step 128\n",
|
|
"INFO:gym:episode 546, reward -0.003491, avg reward -0.013340, total steps 69888, episode step 128\n",
|
|
"[2018-02-18 14:36:13,766] episode 546, reward -0.003491, avg reward -0.013340, total steps 69888, episode step 128\n",
|
|
"INFO:gym:episode 547, reward -0.008704, avg reward -0.013330, total steps 70016, episode step 128\n",
|
|
"[2018-02-18 14:36:18,089] episode 547, reward -0.008704, avg reward -0.013330, total steps 70016, episode step 128\n",
|
|
"INFO:gym:episode 548, reward -0.004290, avg reward -0.013326, total steps 70144, episode step 128\n",
|
|
"[2018-02-18 14:36:22,697] episode 548, reward -0.004290, avg reward -0.013326, total steps 70144, episode step 128\n",
|
|
"INFO:gym:episode 549, reward -0.007691, avg reward -0.013449, total steps 70272, episode step 128\n",
|
|
"[2018-02-18 14:36:27,195] episode 549, reward -0.007691, avg reward -0.013449, total steps 70272, episode step 128\n",
|
|
"INFO:gym:episode 550, reward -0.004575, avg reward -0.013111, total steps 70400, episode step 128\n",
|
|
"[2018-02-18 14:36:31,188] episode 550, reward -0.004575, avg reward -0.013111, total steps 70400, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:36:31,190] Testing...\n",
|
|
"INFO:gym:Avg reward -0.034863(0.000000)\n",
|
|
"[2018-02-18 14:36:31,595] Avg reward -0.034863(0.000000)\n",
|
|
"INFO:gym:episode 551, reward -0.038946, avg reward -0.012824, total steps 70528, episode step 128\n",
|
|
"[2018-02-18 14:36:35,151] episode 551, reward -0.038946, avg reward -0.012824, total steps 70528, episode step 128\n",
|
|
"INFO:gym:episode 552, reward -0.040845, avg reward -0.013187, total steps 70656, episode step 128\n",
|
|
"[2018-02-18 14:36:37,346] episode 552, reward -0.040845, avg reward -0.013187, total steps 70656, episode step 128\n",
|
|
"INFO:gym:episode 553, reward -0.018115, avg reward -0.013058, total steps 70784, episode step 128\n",
|
|
"[2018-02-18 14:36:39,618] episode 553, reward -0.018115, avg reward -0.013058, total steps 70784, episode step 128\n",
|
|
"INFO:gym:episode 554, reward -0.013484, avg reward -0.012835, total steps 70912, episode step 128\n",
|
|
"[2018-02-18 14:36:41,735] episode 554, reward -0.013484, avg reward -0.012835, total steps 70912, episode step 128\n",
|
|
"INFO:gym:episode 555, reward 0.001385, avg reward -0.012661, total steps 71040, episode step 128\n",
|
|
"[2018-02-18 14:36:43,965] episode 555, reward 0.001385, avg reward -0.012661, total steps 71040, episode step 128\n",
|
|
"INFO:gym:episode 556, reward -0.003165, avg reward -0.012274, total steps 71168, episode step 128\n",
|
|
"[2018-02-18 14:36:46,531] episode 556, reward -0.003165, avg reward -0.012274, total steps 71168, episode step 128\n",
|
|
"INFO:gym:episode 557, reward -0.040081, avg reward -0.012493, total steps 71296, episode step 128\n",
|
|
"[2018-02-18 14:36:48,752] episode 557, reward -0.040081, avg reward -0.012493, total steps 71296, episode step 128\n",
|
|
"INFO:gym:episode 558, reward -0.045932, avg reward -0.012894, total steps 71424, episode step 128\n",
|
|
"[2018-02-18 14:36:51,158] episode 558, reward -0.045932, avg reward -0.012894, total steps 71424, episode step 128\n",
|
|
"INFO:gym:episode 559, reward -0.009782, avg reward -0.012638, total steps 71552, episode step 128\n",
|
|
"[2018-02-18 14:36:53,647] episode 559, reward -0.009782, avg reward -0.012638, total steps 71552, episode step 128\n",
|
|
"INFO:gym:episode 560, reward -0.029769, avg reward -0.012189, total steps 71680, episode step 128\n",
|
|
"[2018-02-18 14:36:56,164] episode 560, reward -0.029769, avg reward -0.012189, total steps 71680, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:36:56,170] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001069(0.000000)\n",
|
|
"[2018-02-18 14:36:56,585] Avg reward -0.001069(0.000000)\n",
|
|
"INFO:gym:episode 561, reward -0.016595, avg reward -0.012318, total steps 71808, episode step 128\n",
|
|
"[2018-02-18 14:36:59,011] episode 561, reward -0.016595, avg reward -0.012318, total steps 71808, episode step 128\n",
|
|
"INFO:gym:episode 562, reward -0.002533, avg reward -0.012326, total steps 71936, episode step 128\n",
|
|
"[2018-02-18 14:37:01,502] episode 562, reward -0.002533, avg reward -0.012326, total steps 71936, episode step 128\n",
|
|
"INFO:gym:episode 563, reward -0.039102, avg reward -0.012642, total steps 72064, episode step 128\n",
|
|
"[2018-02-18 14:37:03,976] episode 563, reward -0.039102, avg reward -0.012642, total steps 72064, episode step 128\n",
|
|
"INFO:gym:episode 564, reward -0.000087, avg reward -0.012093, total steps 72192, episode step 128\n",
|
|
"[2018-02-18 14:37:06,343] episode 564, reward -0.000087, avg reward -0.012093, total steps 72192, episode step 128\n",
|
|
"INFO:gym:episode 565, reward -0.004277, avg reward -0.011841, total steps 72320, episode step 128\n",
|
|
"[2018-02-18 14:37:08,770] episode 565, reward -0.004277, avg reward -0.011841, total steps 72320, episode step 128\n",
|
|
"INFO:gym:episode 566, reward -0.020563, avg reward -0.011563, total steps 72448, episode step 128\n",
|
|
"[2018-02-18 14:37:11,277] episode 566, reward -0.020563, avg reward -0.011563, total steps 72448, episode step 128\n",
|
|
"INFO:gym:episode 567, reward -0.002507, avg reward -0.010748, total steps 72576, episode step 128\n",
|
|
"[2018-02-18 14:37:14,344] episode 567, reward -0.002507, avg reward -0.010748, total steps 72576, episode step 128\n",
|
|
"INFO:gym:episode 568, reward -0.031546, avg reward -0.011089, total steps 72704, episode step 128\n",
|
|
"[2018-02-18 14:37:17,305] episode 568, reward -0.031546, avg reward -0.011089, total steps 72704, episode step 128\n",
|
|
"INFO:gym:episode 569, reward -0.002838, avg reward -0.011067, total steps 72832, episode step 128\n",
|
|
"[2018-02-18 14:37:20,128] episode 569, reward -0.002838, avg reward -0.011067, total steps 72832, episode step 128\n",
|
|
"INFO:gym:episode 570, reward -0.011119, avg reward -0.011038, total steps 72960, episode step 128\n",
|
|
"[2018-02-18 14:37:22,827] episode 570, reward -0.011119, avg reward -0.011038, total steps 72960, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:37:22,829] Testing...\n",
|
|
"INFO:gym:Avg reward -0.041960(0.000000)\n",
|
|
"[2018-02-18 14:37:23,268] Avg reward -0.041960(0.000000)\n",
|
|
"INFO:gym:episode 571, reward -0.013039, avg reward -0.011045, total steps 73088, episode step 128\n",
|
|
"[2018-02-18 14:37:26,244] episode 571, reward -0.013039, avg reward -0.011045, total steps 73088, episode step 128\n",
|
|
"INFO:gym:episode 572, reward -0.006274, avg reward -0.011040, total steps 73216, episode step 128\n",
|
|
"[2018-02-18 14:37:29,615] episode 572, reward -0.006274, avg reward -0.011040, total steps 73216, episode step 128\n",
|
|
"INFO:gym:episode 573, reward -0.002635, avg reward -0.010942, total steps 73344, episode step 128\n",
|
|
"[2018-02-18 14:37:32,944] episode 573, reward -0.002635, avg reward -0.010942, total steps 73344, episode step 128\n",
|
|
"INFO:gym:episode 574, reward -0.002221, avg reward -0.010666, total steps 73472, episode step 128\n",
|
|
"[2018-02-18 14:37:36,487] episode 574, reward -0.002221, avg reward -0.010666, total steps 73472, episode step 128\n",
|
|
"INFO:gym:episode 575, reward -0.001704, avg reward -0.010634, total steps 73600, episode step 128\n",
|
|
"[2018-02-18 14:37:40,364] episode 575, reward -0.001704, avg reward -0.010634, total steps 73600, episode step 128\n",
|
|
"INFO:gym:episode 576, reward -0.005759, avg reward -0.010243, total steps 73728, episode step 128\n",
|
|
"[2018-02-18 14:37:44,292] episode 576, reward -0.005759, avg reward -0.010243, total steps 73728, episode step 128\n",
|
|
"INFO:gym:episode 577, reward -0.001983, avg reward -0.010192, total steps 73856, episode step 128\n",
|
|
"[2018-02-18 14:37:48,187] episode 577, reward -0.001983, avg reward -0.010192, total steps 73856, episode step 128\n",
|
|
"INFO:gym:episode 578, reward -0.007107, avg reward -0.010245, total steps 73984, episode step 128\n",
|
|
"[2018-02-18 14:37:51,707] episode 578, reward -0.007107, avg reward -0.010245, total steps 73984, episode step 128\n",
|
|
"INFO:gym:episode 579, reward -0.044086, avg reward -0.010753, total steps 74112, episode step 128\n",
|
|
"[2018-02-18 14:37:55,004] episode 579, reward -0.044086, avg reward -0.010753, total steps 74112, episode step 128\n",
|
|
"INFO:gym:episode 580, reward -0.037149, avg reward -0.010553, total steps 74240, episode step 128\n",
|
|
"[2018-02-18 14:37:58,388] episode 580, reward -0.037149, avg reward -0.010553, total steps 74240, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:37:58,390] Testing...\n",
|
|
"INFO:gym:Avg reward -0.025624(0.000000)\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:37:58,847] Avg reward -0.025624(0.000000)\n",
|
|
"INFO:gym:episode 581, reward -0.005133, avg reward -0.010344, total steps 74368, episode step 128\n",
|
|
"[2018-02-18 14:38:02,286] episode 581, reward -0.005133, avg reward -0.010344, total steps 74368, episode step 128\n",
|
|
"INFO:gym:episode 582, reward 0.000850, avg reward -0.010242, total steps 74496, episode step 128\n",
|
|
"[2018-02-18 14:38:06,364] episode 582, reward 0.000850, avg reward -0.010242, total steps 74496, episode step 128\n",
|
|
"INFO:gym:episode 583, reward -0.014191, avg reward -0.010138, total steps 74624, episode step 128\n",
|
|
"[2018-02-18 14:38:10,514] episode 583, reward -0.014191, avg reward -0.010138, total steps 74624, episode step 128\n",
|
|
"INFO:gym:episode 584, reward 0.002328, avg reward -0.010097, total steps 74752, episode step 128\n",
|
|
"[2018-02-18 14:38:14,481] episode 584, reward 0.002328, avg reward -0.010097, total steps 74752, episode step 128\n",
|
|
"INFO:gym:episode 585, reward -0.037401, avg reward -0.010367, total steps 74880, episode step 128\n",
|
|
"[2018-02-18 14:38:18,657] episode 585, reward -0.037401, avg reward -0.010367, total steps 74880, episode step 128\n",
|
|
"INFO:gym:episode 586, reward -0.021974, avg reward -0.010559, total steps 75008, episode step 128\n",
|
|
"[2018-02-18 14:38:22,761] episode 586, reward -0.021974, avg reward -0.010559, total steps 75008, episode step 128\n",
|
|
"INFO:gym:episode 587, reward -0.002142, avg reward -0.010480, total steps 75136, episode step 128\n",
|
|
"[2018-02-18 14:38:26,861] episode 587, reward -0.002142, avg reward -0.010480, total steps 75136, episode step 128\n",
|
|
"INFO:gym:episode 588, reward -0.004526, avg reward -0.010505, total steps 75264, episode step 128\n",
|
|
"[2018-02-18 14:38:31,402] episode 588, reward -0.004526, avg reward -0.010505, total steps 75264, episode step 128\n",
|
|
"INFO:gym:episode 589, reward -0.010647, avg reward -0.010593, total steps 75392, episode step 128\n",
|
|
"[2018-02-18 14:38:35,945] episode 589, reward -0.010647, avg reward -0.010593, total steps 75392, episode step 128\n",
|
|
"INFO:gym:episode 590, reward -0.001830, avg reward -0.010603, total steps 75520, episode step 128\n",
|
|
"[2018-02-18 14:38:41,057] episode 590, reward -0.001830, avg reward -0.010603, total steps 75520, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:38:41,062] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002177(0.000000)\n",
|
|
"[2018-02-18 14:38:41,682] Avg reward -0.002177(0.000000)\n",
|
|
"INFO:gym:episode 591, reward -0.032600, avg reward -0.010687, total steps 75648, episode step 128\n",
|
|
"[2018-02-18 14:38:46,959] episode 591, reward -0.032600, avg reward -0.010687, total steps 75648, episode step 128\n",
|
|
"INFO:gym:episode 592, reward -0.011255, avg reward -0.010720, total steps 75776, episode step 128\n",
|
|
"[2018-02-18 14:38:52,579] episode 592, reward -0.011255, avg reward -0.010720, total steps 75776, episode step 128\n",
|
|
"INFO:gym:episode 593, reward 0.008244, avg reward -0.011774, total steps 75904, episode step 128\n",
|
|
"[2018-02-18 14:38:57,957] episode 593, reward 0.008244, avg reward -0.011774, total steps 75904, episode step 128\n",
|
|
"INFO:gym:episode 594, reward -0.012780, avg reward -0.011884, total steps 76032, episode step 128\n",
|
|
"[2018-02-18 14:39:03,626] episode 594, reward -0.012780, avg reward -0.011884, total steps 76032, episode step 128\n",
|
|
"INFO:gym:episode 595, reward -0.018282, avg reward -0.012038, total steps 76160, episode step 128\n",
|
|
"[2018-02-18 14:39:09,178] episode 595, reward -0.018282, avg reward -0.012038, total steps 76160, episode step 128\n",
|
|
"INFO:gym:episode 596, reward -0.022597, avg reward -0.012260, total steps 76288, episode step 128\n",
|
|
"[2018-02-18 14:39:15,095] episode 596, reward -0.022597, avg reward -0.012260, total steps 76288, episode step 128\n",
|
|
"INFO:gym:episode 597, reward -0.001822, avg reward -0.012232, total steps 76416, episode step 128\n",
|
|
"[2018-02-18 14:39:20,758] episode 597, reward -0.001822, avg reward -0.012232, total steps 76416, episode step 128\n",
|
|
"INFO:gym:episode 598, reward -0.027733, avg reward -0.012492, total steps 76544, episode step 128\n",
|
|
"[2018-02-18 14:39:26,538] episode 598, reward -0.027733, avg reward -0.012492, total steps 76544, episode step 128\n",
|
|
"INFO:gym:episode 599, reward -0.018465, avg reward -0.012655, total steps 76672, episode step 128\n",
|
|
"[2018-02-18 14:39:31,995] episode 599, reward -0.018465, avg reward -0.012655, total steps 76672, episode step 128\n",
|
|
"INFO:gym:episode 600, reward -0.007946, avg reward -0.013301, total steps 76800, episode step 128\n",
|
|
"[2018-02-18 14:39:37,304] episode 600, reward -0.007946, avg reward -0.013301, total steps 76800, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:39:37,308] Testing...\n",
|
|
"INFO:gym:Avg reward -0.005749(0.000000)\n",
|
|
"[2018-02-18 14:39:37,919] Avg reward -0.005749(0.000000)\n",
|
|
"INFO:gym:episode 601, reward -0.001584, avg reward -0.013199, total steps 76928, episode step 128\n",
|
|
"[2018-02-18 14:39:43,533] episode 601, reward -0.001584, avg reward -0.013199, total steps 76928, episode step 128\n",
|
|
"INFO:gym:episode 602, reward -0.008724, avg reward -0.013268, total steps 77056, episode step 128\n",
|
|
"[2018-02-18 14:39:49,365] episode 602, reward -0.008724, avg reward -0.013268, total steps 77056, episode step 128\n",
|
|
"INFO:gym:episode 603, reward -0.001757, avg reward -0.012917, total steps 77184, episode step 128\n",
|
|
"[2018-02-18 14:39:55,422] episode 603, reward -0.001757, avg reward -0.012917, total steps 77184, episode step 128\n",
|
|
"INFO:gym:episode 604, reward -0.007044, avg reward -0.012746, total steps 77312, episode step 128\n",
|
|
"[2018-02-18 14:40:01,298] episode 604, reward -0.007044, avg reward -0.012746, total steps 77312, episode step 128\n",
|
|
"INFO:gym:episode 605, reward -0.014081, avg reward -0.012870, total steps 77440, episode step 128\n",
|
|
"[2018-02-18 14:40:06,531] episode 605, reward -0.014081, avg reward -0.012870, total steps 77440, episode step 128\n",
|
|
"INFO:gym:episode 606, reward -0.006127, avg reward -0.012914, total steps 77568, episode step 128\n",
|
|
"[2018-02-18 14:40:11,246] episode 606, reward -0.006127, avg reward -0.012914, total steps 77568, episode step 128\n",
|
|
"INFO:gym:episode 607, reward -0.013697, avg reward -0.012743, total steps 77696, episode step 128\n",
|
|
"[2018-02-18 14:40:16,302] episode 607, reward -0.013697, avg reward -0.012743, total steps 77696, episode step 128\n",
|
|
"INFO:gym:episode 608, reward -0.001765, avg reward -0.012716, total steps 77824, episode step 128\n",
|
|
"[2018-02-18 14:40:20,959] episode 608, reward -0.001765, avg reward -0.012716, total steps 77824, episode step 128\n",
|
|
"INFO:gym:episode 609, reward -0.008210, avg reward -0.012780, total steps 77952, episode step 128\n",
|
|
"[2018-02-18 14:40:24,943] episode 609, reward -0.008210, avg reward -0.012780, total steps 77952, episode step 128\n",
|
|
"INFO:gym:episode 610, reward -0.063618, avg reward -0.013217, total steps 78080, episode step 128\n",
|
|
"[2018-02-18 14:40:27,145] episode 610, reward -0.063618, avg reward -0.013217, total steps 78080, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:40:27,146] Testing...\n",
|
|
"INFO:gym:Avg reward 0.015005(0.000000)\n",
|
|
"[2018-02-18 14:40:27,567] Avg reward 0.015005(0.000000)\n",
|
|
"INFO:gym:episode 611, reward -0.011399, avg reward -0.013303, total steps 78208, episode step 128\n",
|
|
"[2018-02-18 14:40:29,891] episode 611, reward -0.011399, avg reward -0.013303, total steps 78208, episode step 128\n",
|
|
"INFO:gym:episode 612, reward -0.009560, avg reward -0.013060, total steps 78336, episode step 128\n",
|
|
"[2018-02-18 14:40:32,307] episode 612, reward -0.009560, avg reward -0.013060, total steps 78336, episode step 128\n",
|
|
"INFO:gym:episode 613, reward -0.002064, avg reward -0.012873, total steps 78464, episode step 128\n",
|
|
"[2018-02-18 14:40:34,856] episode 613, reward -0.002064, avg reward -0.012873, total steps 78464, episode step 128\n",
|
|
"INFO:gym:episode 614, reward -0.002403, avg reward -0.012880, total steps 78592, episode step 128\n",
|
|
"[2018-02-18 14:40:37,302] episode 614, reward -0.002403, avg reward -0.012880, total steps 78592, episode step 128\n",
|
|
"INFO:gym:episode 615, reward -0.033599, avg reward -0.013252, total steps 78720, episode step 128\n",
|
|
"[2018-02-18 14:40:39,763] episode 615, reward -0.033599, avg reward -0.013252, total steps 78720, episode step 128\n",
|
|
"INFO:gym:episode 616, reward -0.001904, avg reward -0.013215, total steps 78848, episode step 128\n",
|
|
"[2018-02-18 14:40:42,281] episode 616, reward -0.001904, avg reward -0.013215, total steps 78848, episode step 128\n",
|
|
"INFO:gym:episode 617, reward -0.003534, avg reward -0.013074, total steps 78976, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:40:44,666] episode 617, reward -0.003534, avg reward -0.013074, total steps 78976, episode step 128\n",
|
|
"INFO:gym:episode 618, reward 0.000294, avg reward -0.012996, total steps 79104, episode step 128\n",
|
|
"[2018-02-18 14:40:47,097] episode 618, reward 0.000294, avg reward -0.012996, total steps 79104, episode step 128\n",
|
|
"INFO:gym:episode 619, reward -0.010514, avg reward -0.013068, total steps 79232, episode step 128\n",
|
|
"[2018-02-18 14:40:49,807] episode 619, reward -0.010514, avg reward -0.013068, total steps 79232, episode step 128\n",
|
|
"INFO:gym:episode 620, reward -0.005871, avg reward -0.013058, total steps 79360, episode step 128\n",
|
|
"[2018-02-18 14:40:52,565] episode 620, reward -0.005871, avg reward -0.013058, total steps 79360, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:40:52,566] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002333(0.000000)\n",
|
|
"[2018-02-18 14:40:53,360] Avg reward -0.002333(0.000000)\n",
|
|
"INFO:gym:episode 621, reward -0.008150, avg reward -0.013248, total steps 79488, episode step 128\n",
|
|
"[2018-02-18 14:40:55,631] episode 621, reward -0.008150, avg reward -0.013248, total steps 79488, episode step 128\n",
|
|
"INFO:gym:episode 622, reward -0.023253, avg reward -0.013285, total steps 79616, episode step 128\n",
|
|
"[2018-02-18 14:40:57,728] episode 622, reward -0.023253, avg reward -0.013285, total steps 79616, episode step 128\n",
|
|
"INFO:gym:episode 623, reward -0.013473, avg reward -0.013398, total steps 79744, episode step 128\n",
|
|
"[2018-02-18 14:41:00,370] episode 623, reward -0.013473, avg reward -0.013398, total steps 79744, episode step 128\n",
|
|
"INFO:gym:episode 624, reward -0.001863, avg reward -0.013252, total steps 79872, episode step 128\n",
|
|
"[2018-02-18 14:41:02,932] episode 624, reward -0.001863, avg reward -0.013252, total steps 79872, episode step 128\n",
|
|
"INFO:gym:episode 625, reward -0.030252, avg reward -0.013562, total steps 80000, episode step 128\n",
|
|
"[2018-02-18 14:41:05,727] episode 625, reward -0.030252, avg reward -0.013562, total steps 80000, episode step 128\n",
|
|
"INFO:gym:episode 626, reward 0.004006, avg reward -0.013363, total steps 80128, episode step 128\n",
|
|
"[2018-02-18 14:41:08,266] episode 626, reward 0.004006, avg reward -0.013363, total steps 80128, episode step 128\n",
|
|
"INFO:gym:episode 627, reward -0.004745, avg reward -0.012586, total steps 80256, episode step 128\n",
|
|
"[2018-02-18 14:41:10,718] episode 627, reward -0.004745, avg reward -0.012586, total steps 80256, episode step 128\n",
|
|
"INFO:gym:episode 628, reward -0.001789, avg reward -0.012580, total steps 80384, episode step 128\n",
|
|
"[2018-02-18 14:41:13,151] episode 628, reward -0.001789, avg reward -0.012580, total steps 80384, episode step 128\n",
|
|
"INFO:gym:episode 629, reward 0.000192, avg reward -0.012472, total steps 80512, episode step 128\n",
|
|
"[2018-02-18 14:41:15,739] episode 629, reward 0.000192, avg reward -0.012472, total steps 80512, episode step 128\n",
|
|
"INFO:gym:episode 630, reward -0.001748, avg reward -0.012447, total steps 80640, episode step 128\n",
|
|
"[2018-02-18 14:41:18,568] episode 630, reward -0.001748, avg reward -0.012447, total steps 80640, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:41:18,571] Testing...\n",
|
|
"INFO:gym:Avg reward -0.004516(0.000000)\n",
|
|
"[2018-02-18 14:41:18,958] Avg reward -0.004516(0.000000)\n",
|
|
"INFO:gym:episode 631, reward -0.012825, avg reward -0.012554, total steps 80768, episode step 128\n",
|
|
"[2018-02-18 14:41:21,880] episode 631, reward -0.012825, avg reward -0.012554, total steps 80768, episode step 128\n",
|
|
"INFO:gym:episode 632, reward -0.014999, avg reward -0.012639, total steps 80896, episode step 128\n",
|
|
"[2018-02-18 14:41:24,961] episode 632, reward -0.014999, avg reward -0.012639, total steps 80896, episode step 128\n",
|
|
"INFO:gym:episode 633, reward -0.004710, avg reward -0.011972, total steps 81024, episode step 128\n",
|
|
"[2018-02-18 14:41:28,491] episode 633, reward -0.004710, avg reward -0.011972, total steps 81024, episode step 128\n",
|
|
"INFO:gym:episode 634, reward -0.024220, avg reward -0.012164, total steps 81152, episode step 128\n",
|
|
"[2018-02-18 14:41:32,164] episode 634, reward -0.024220, avg reward -0.012164, total steps 81152, episode step 128\n",
|
|
"INFO:gym:episode 635, reward -0.007005, avg reward -0.011871, total steps 81280, episode step 128\n",
|
|
"[2018-02-18 14:41:35,547] episode 635, reward -0.007005, avg reward -0.011871, total steps 81280, episode step 128\n",
|
|
"INFO:gym:episode 636, reward -0.001662, avg reward -0.011865, total steps 81408, episode step 128\n",
|
|
"[2018-02-18 14:41:38,657] episode 636, reward -0.001662, avg reward -0.011865, total steps 81408, episode step 128\n",
|
|
"INFO:gym:episode 637, reward 0.006854, avg reward -0.011775, total steps 81536, episode step 128\n",
|
|
"[2018-02-18 14:41:41,806] episode 637, reward 0.006854, avg reward -0.011775, total steps 81536, episode step 128\n",
|
|
"INFO:gym:episode 638, reward -0.007314, avg reward -0.011731, total steps 81664, episode step 128\n",
|
|
"[2018-02-18 14:41:45,153] episode 638, reward -0.007314, avg reward -0.011731, total steps 81664, episode step 128\n",
|
|
"INFO:gym:episode 639, reward -0.003619, avg reward -0.011686, total steps 81792, episode step 128\n",
|
|
"[2018-02-18 14:41:49,067] episode 639, reward -0.003619, avg reward -0.011686, total steps 81792, episode step 128\n",
|
|
"INFO:gym:episode 640, reward -0.026155, avg reward -0.011856, total steps 81920, episode step 128\n",
|
|
"[2018-02-18 14:41:52,754] episode 640, reward -0.026155, avg reward -0.011856, total steps 81920, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:41:52,761] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001809(0.000000)\n",
|
|
"[2018-02-18 14:41:53,282] Avg reward -0.001809(0.000000)\n",
|
|
"INFO:gym:episode 641, reward -0.001178, avg reward -0.011812, total steps 82048, episode step 128\n",
|
|
"[2018-02-18 14:41:57,246] episode 641, reward -0.001178, avg reward -0.011812, total steps 82048, episode step 128\n",
|
|
"INFO:gym:episode 642, reward -0.011027, avg reward -0.011880, total steps 82176, episode step 128\n",
|
|
"[2018-02-18 14:42:00,988] episode 642, reward -0.011027, avg reward -0.011880, total steps 82176, episode step 128\n",
|
|
"INFO:gym:episode 643, reward -0.020981, avg reward -0.012003, total steps 82304, episode step 128\n",
|
|
"[2018-02-18 14:42:04,801] episode 643, reward -0.020981, avg reward -0.012003, total steps 82304, episode step 128\n",
|
|
"INFO:gym:episode 644, reward -0.004467, avg reward -0.011998, total steps 82432, episode step 128\n",
|
|
"[2018-02-18 14:42:08,702] episode 644, reward -0.004467, avg reward -0.011998, total steps 82432, episode step 128\n",
|
|
"INFO:gym:episode 645, reward -0.003677, avg reward -0.011857, total steps 82560, episode step 128\n",
|
|
"[2018-02-18 14:42:12,656] episode 645, reward -0.003677, avg reward -0.011857, total steps 82560, episode step 128\n",
|
|
"INFO:gym:episode 646, reward -0.004355, avg reward -0.011866, total steps 82688, episode step 128\n",
|
|
"[2018-02-18 14:42:16,374] episode 646, reward -0.004355, avg reward -0.011866, total steps 82688, episode step 128\n",
|
|
"INFO:gym:episode 647, reward -0.009007, avg reward -0.011869, total steps 82816, episode step 128\n",
|
|
"[2018-02-18 14:42:20,228] episode 647, reward -0.009007, avg reward -0.011869, total steps 82816, episode step 128\n",
|
|
"INFO:gym:episode 648, reward -0.004872, avg reward -0.011875, total steps 82944, episode step 128\n",
|
|
"[2018-02-18 14:42:24,074] episode 648, reward -0.004872, avg reward -0.011875, total steps 82944, episode step 128\n",
|
|
"INFO:gym:episode 649, reward -0.058922, avg reward -0.012387, total steps 83072, episode step 128\n",
|
|
"[2018-02-18 14:42:27,980] episode 649, reward -0.058922, avg reward -0.012387, total steps 83072, episode step 128\n",
|
|
"INFO:gym:episode 650, reward -0.001760, avg reward -0.012359, total steps 83200, episode step 128\n",
|
|
"[2018-02-18 14:42:31,805] episode 650, reward -0.001760, avg reward -0.012359, total steps 83200, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:42:31,808] Testing...\n",
|
|
"INFO:gym:Avg reward -0.041231(0.000000)\n",
|
|
"[2018-02-18 14:42:32,220] Avg reward -0.041231(0.000000)\n",
|
|
"INFO:gym:episode 651, reward -0.004030, avg reward -0.012010, total steps 83328, episode step 128\n",
|
|
"[2018-02-18 14:42:36,158] episode 651, reward -0.004030, avg reward -0.012010, total steps 83328, episode step 128\n",
|
|
"INFO:gym:episode 652, reward -0.019943, avg reward -0.011801, total steps 83456, episode step 128\n",
|
|
"[2018-02-18 14:42:40,226] episode 652, reward -0.019943, avg reward -0.011801, total steps 83456, episode step 128\n",
|
|
"INFO:gym:episode 653, reward 0.006428, avg reward -0.011555, total steps 83584, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:42:44,654] episode 653, reward 0.006428, avg reward -0.011555, total steps 83584, episode step 128\n",
|
|
"INFO:gym:episode 654, reward -0.016394, avg reward -0.011584, total steps 83712, episode step 128\n",
|
|
"[2018-02-18 14:42:49,273] episode 654, reward -0.016394, avg reward -0.011584, total steps 83712, episode step 128\n",
|
|
"INFO:gym:episode 655, reward -0.004235, avg reward -0.011641, total steps 83840, episode step 128\n",
|
|
"[2018-02-18 14:42:53,964] episode 655, reward -0.004235, avg reward -0.011641, total steps 83840, episode step 128\n",
|
|
"INFO:gym:episode 656, reward -0.001931, avg reward -0.011628, total steps 83968, episode step 128\n",
|
|
"[2018-02-18 14:42:58,347] episode 656, reward -0.001931, avg reward -0.011628, total steps 83968, episode step 128\n",
|
|
"INFO:gym:episode 657, reward -0.004535, avg reward -0.011273, total steps 84096, episode step 128\n",
|
|
"[2018-02-18 14:43:03,075] episode 657, reward -0.004535, avg reward -0.011273, total steps 84096, episode step 128\n",
|
|
"INFO:gym:episode 658, reward -0.002455, avg reward -0.010838, total steps 84224, episode step 128\n",
|
|
"[2018-02-18 14:43:08,399] episode 658, reward -0.002455, avg reward -0.010838, total steps 84224, episode step 128\n",
|
|
"INFO:gym:episode 659, reward -0.002061, avg reward -0.010761, total steps 84352, episode step 128\n",
|
|
"[2018-02-18 14:43:13,438] episode 659, reward -0.002061, avg reward -0.010761, total steps 84352, episode step 128\n",
|
|
"INFO:gym:episode 660, reward -0.001064, avg reward -0.010474, total steps 84480, episode step 128\n",
|
|
"[2018-02-18 14:43:17,588] episode 660, reward -0.001064, avg reward -0.010474, total steps 84480, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:43:17,592] Testing...\n",
|
|
"INFO:gym:Avg reward 0.012988(0.000000)\n",
|
|
"[2018-02-18 14:43:18,414] Avg reward 0.012988(0.000000)\n",
|
|
"INFO:gym:episode 661, reward -0.006453, avg reward -0.010372, total steps 84608, episode step 128\n",
|
|
"[2018-02-18 14:43:22,242] episode 661, reward -0.006453, avg reward -0.010372, total steps 84608, episode step 128\n",
|
|
"INFO:gym:episode 662, reward -0.025515, avg reward -0.010602, total steps 84736, episode step 128\n",
|
|
"[2018-02-18 14:43:27,066] episode 662, reward -0.025515, avg reward -0.010602, total steps 84736, episode step 128\n",
|
|
"INFO:gym:episode 663, reward -0.003452, avg reward -0.010246, total steps 84864, episode step 128\n",
|
|
"[2018-02-18 14:43:31,831] episode 663, reward -0.003452, avg reward -0.010246, total steps 84864, episode step 128\n",
|
|
"INFO:gym:episode 664, reward -0.009282, avg reward -0.010338, total steps 84992, episode step 128\n",
|
|
"[2018-02-18 14:43:36,504] episode 664, reward -0.009282, avg reward -0.010338, total steps 84992, episode step 128\n",
|
|
"INFO:gym:episode 665, reward -0.014244, avg reward -0.010437, total steps 85120, episode step 128\n",
|
|
"[2018-02-18 14:43:40,808] episode 665, reward -0.014244, avg reward -0.010437, total steps 85120, episode step 128\n",
|
|
"INFO:gym:episode 666, reward -0.001608, avg reward -0.010248, total steps 85248, episode step 128\n",
|
|
"[2018-02-18 14:43:45,224] episode 666, reward -0.001608, avg reward -0.010248, total steps 85248, episode step 128\n",
|
|
"INFO:gym:episode 667, reward -0.002057, avg reward -0.010243, total steps 85376, episode step 128\n",
|
|
"[2018-02-18 14:43:49,536] episode 667, reward -0.002057, avg reward -0.010243, total steps 85376, episode step 128\n",
|
|
"INFO:gym:episode 668, reward -0.000022, avg reward -0.009928, total steps 85504, episode step 128\n",
|
|
"[2018-02-18 14:43:53,878] episode 668, reward -0.000022, avg reward -0.009928, total steps 85504, episode step 128\n",
|
|
"INFO:gym:episode 669, reward -0.024575, avg reward -0.010145, total steps 85632, episode step 128\n",
|
|
"[2018-02-18 14:43:58,376] episode 669, reward -0.024575, avg reward -0.010145, total steps 85632, episode step 128\n",
|
|
"INFO:gym:episode 670, reward -0.001760, avg reward -0.010052, total steps 85760, episode step 128\n",
|
|
"[2018-02-18 14:44:02,930] episode 670, reward -0.001760, avg reward -0.010052, total steps 85760, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:44:02,934] Testing...\n",
|
|
"INFO:gym:Avg reward 0.009980(0.000000)\n",
|
|
"[2018-02-18 14:44:03,317] Avg reward 0.009980(0.000000)\n",
|
|
"INFO:gym:episode 671, reward -0.001764, avg reward -0.009939, total steps 85888, episode step 128\n",
|
|
"[2018-02-18 14:44:08,243] episode 671, reward -0.001764, avg reward -0.009939, total steps 85888, episode step 128\n",
|
|
"INFO:gym:episode 672, reward -0.018500, avg reward -0.010061, total steps 86016, episode step 128\n",
|
|
"[2018-02-18 14:44:12,907] episode 672, reward -0.018500, avg reward -0.010061, total steps 86016, episode step 128\n",
|
|
"INFO:gym:episode 673, reward -0.004353, avg reward -0.010079, total steps 86144, episode step 128\n",
|
|
"[2018-02-18 14:44:17,265] episode 673, reward -0.004353, avg reward -0.010079, total steps 86144, episode step 128\n",
|
|
"INFO:gym:episode 674, reward -0.001860, avg reward -0.010075, total steps 86272, episode step 128\n",
|
|
"[2018-02-18 14:44:21,821] episode 674, reward -0.001860, avg reward -0.010075, total steps 86272, episode step 128\n",
|
|
"INFO:gym:episode 675, reward -0.001420, avg reward -0.010072, total steps 86400, episode step 128\n",
|
|
"[2018-02-18 14:44:26,285] episode 675, reward -0.001420, avg reward -0.010072, total steps 86400, episode step 128\n",
|
|
"INFO:gym:episode 676, reward -0.006565, avg reward -0.010080, total steps 86528, episode step 128\n",
|
|
"[2018-02-18 14:44:31,232] episode 676, reward -0.006565, avg reward -0.010080, total steps 86528, episode step 128\n",
|
|
"INFO:gym:episode 677, reward -0.002456, avg reward -0.010085, total steps 86656, episode step 128\n",
|
|
"[2018-02-18 14:44:36,042] episode 677, reward -0.002456, avg reward -0.010085, total steps 86656, episode step 128\n",
|
|
"INFO:gym:episode 678, reward -0.001192, avg reward -0.010026, total steps 86784, episode step 128\n",
|
|
"[2018-02-18 14:44:40,384] episode 678, reward -0.001192, avg reward -0.010026, total steps 86784, episode step 128\n",
|
|
"INFO:gym:episode 679, reward -0.001321, avg reward -0.009598, total steps 86912, episode step 128\n",
|
|
"[2018-02-18 14:44:44,836] episode 679, reward -0.001321, avg reward -0.009598, total steps 86912, episode step 128\n",
|
|
"INFO:gym:episode 680, reward 0.002807, avg reward -0.009199, total steps 87040, episode step 128\n",
|
|
"[2018-02-18 14:44:49,228] episode 680, reward 0.002807, avg reward -0.009199, total steps 87040, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:44:49,233] Testing...\n",
|
|
"INFO:gym:Avg reward -0.015634(0.000000)\n",
|
|
"[2018-02-18 14:44:49,647] Avg reward -0.015634(0.000000)\n",
|
|
"INFO:gym:episode 681, reward -0.001808, avg reward -0.009165, total steps 87168, episode step 128\n",
|
|
"[2018-02-18 14:44:54,319] episode 681, reward -0.001808, avg reward -0.009165, total steps 87168, episode step 128\n",
|
|
"INFO:gym:episode 682, reward -0.006781, avg reward -0.009242, total steps 87296, episode step 128\n",
|
|
"[2018-02-18 14:44:58,790] episode 682, reward -0.006781, avg reward -0.009242, total steps 87296, episode step 128\n",
|
|
"INFO:gym:episode 683, reward -0.001849, avg reward -0.009118, total steps 87424, episode step 128\n",
|
|
"[2018-02-18 14:45:03,225] episode 683, reward -0.001849, avg reward -0.009118, total steps 87424, episode step 128\n",
|
|
"INFO:gym:episode 684, reward -0.006701, avg reward -0.009208, total steps 87552, episode step 128\n",
|
|
"[2018-02-18 14:45:07,945] episode 684, reward -0.006701, avg reward -0.009208, total steps 87552, episode step 128\n",
|
|
"INFO:gym:episode 685, reward -0.002228, avg reward -0.008857, total steps 87680, episode step 128\n",
|
|
"[2018-02-18 14:45:12,592] episode 685, reward -0.002228, avg reward -0.008857, total steps 87680, episode step 128\n",
|
|
"INFO:gym:episode 686, reward -0.003872, avg reward -0.008676, total steps 87808, episode step 128\n",
|
|
"[2018-02-18 14:45:17,254] episode 686, reward -0.003872, avg reward -0.008676, total steps 87808, episode step 128\n",
|
|
"INFO:gym:episode 687, reward -0.004651, avg reward -0.008701, total steps 87936, episode step 128\n",
|
|
"[2018-02-18 14:45:21,645] episode 687, reward -0.004651, avg reward -0.008701, total steps 87936, episode step 128\n",
|
|
"INFO:gym:episode 688, reward -0.001837, avg reward -0.008674, total steps 88064, episode step 128\n",
|
|
"[2018-02-18 14:45:26,161] episode 688, reward -0.001837, avg reward -0.008674, total steps 88064, episode step 128\n",
|
|
"INFO:gym:episode 689, reward -0.022041, avg reward -0.008788, total steps 88192, episode step 128\n",
|
|
"[2018-02-18 14:45:30,798] episode 689, reward -0.022041, avg reward -0.008788, total steps 88192, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 690, reward -0.006091, avg reward -0.008830, total steps 88320, episode step 128\n",
|
|
"[2018-02-18 14:45:35,435] episode 690, reward -0.006091, avg reward -0.008830, total steps 88320, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:45:35,439] Testing...\n",
|
|
"INFO:gym:Avg reward -0.003791(0.000000)\n",
|
|
"[2018-02-18 14:45:35,847] Avg reward -0.003791(0.000000)\n",
|
|
"INFO:gym:episode 691, reward -0.004564, avg reward -0.008550, total steps 88448, episode step 128\n",
|
|
"[2018-02-18 14:45:40,439] episode 691, reward -0.004564, avg reward -0.008550, total steps 88448, episode step 128\n",
|
|
"INFO:gym:episode 692, reward 0.015788, avg reward -0.008280, total steps 88576, episode step 128\n",
|
|
"[2018-02-18 14:45:44,913] episode 692, reward 0.015788, avg reward -0.008280, total steps 88576, episode step 128\n",
|
|
"INFO:gym:episode 693, reward -0.001744, avg reward -0.008380, total steps 88704, episode step 128\n",
|
|
"[2018-02-18 14:45:49,891] episode 693, reward -0.001744, avg reward -0.008380, total steps 88704, episode step 128\n",
|
|
"INFO:gym:episode 694, reward -0.000570, avg reward -0.008257, total steps 88832, episode step 128\n",
|
|
"[2018-02-18 14:45:53,554] episode 694, reward -0.000570, avg reward -0.008257, total steps 88832, episode step 128\n",
|
|
"INFO:gym:episode 695, reward -0.002703, avg reward -0.008102, total steps 88960, episode step 128\n",
|
|
"[2018-02-18 14:45:57,372] episode 695, reward -0.002703, avg reward -0.008102, total steps 88960, episode step 128\n",
|
|
"INFO:gym:episode 696, reward -0.001689, avg reward -0.007893, total steps 89088, episode step 128\n",
|
|
"[2018-02-18 14:46:01,714] episode 696, reward -0.001689, avg reward -0.007893, total steps 89088, episode step 128\n",
|
|
"INFO:gym:episode 697, reward -0.020905, avg reward -0.008083, total steps 89216, episode step 128\n",
|
|
"[2018-02-18 14:46:06,206] episode 697, reward -0.020905, avg reward -0.008083, total steps 89216, episode step 128\n",
|
|
"INFO:gym:episode 698, reward -0.008809, avg reward -0.007894, total steps 89344, episode step 128\n",
|
|
"[2018-02-18 14:46:10,303] episode 698, reward -0.008809, avg reward -0.007894, total steps 89344, episode step 128\n",
|
|
"INFO:gym:episode 699, reward -0.007095, avg reward -0.007780, total steps 89472, episode step 128\n",
|
|
"[2018-02-18 14:46:14,240] episode 699, reward -0.007095, avg reward -0.007780, total steps 89472, episode step 128\n",
|
|
"INFO:gym:episode 700, reward -0.036327, avg reward -0.008064, total steps 89600, episode step 128\n",
|
|
"[2018-02-18 14:46:17,988] episode 700, reward -0.036327, avg reward -0.008064, total steps 89600, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:46:17,989] Testing...\n",
|
|
"INFO:gym:Avg reward -0.005477(0.000000)\n",
|
|
"[2018-02-18 14:46:18,392] Avg reward -0.005477(0.000000)\n",
|
|
"INFO:gym:episode 701, reward -0.005446, avg reward -0.008103, total steps 89728, episode step 128\n",
|
|
"[2018-02-18 14:46:22,286] episode 701, reward -0.005446, avg reward -0.008103, total steps 89728, episode step 128\n",
|
|
"INFO:gym:episode 702, reward -0.000752, avg reward -0.008023, total steps 89856, episode step 128\n",
|
|
"[2018-02-18 14:46:25,900] episode 702, reward -0.000752, avg reward -0.008023, total steps 89856, episode step 128\n",
|
|
"INFO:gym:episode 703, reward -0.003403, avg reward -0.008040, total steps 89984, episode step 128\n",
|
|
"[2018-02-18 14:46:28,146] episode 703, reward -0.003403, avg reward -0.008040, total steps 89984, episode step 128\n",
|
|
"INFO:gym:episode 704, reward -0.001927, avg reward -0.007988, total steps 90112, episode step 128\n",
|
|
"[2018-02-18 14:46:30,295] episode 704, reward -0.001927, avg reward -0.007988, total steps 90112, episode step 128\n",
|
|
"INFO:gym:episode 705, reward -0.004882, avg reward -0.007896, total steps 90240, episode step 128\n",
|
|
"[2018-02-18 14:46:32,178] episode 705, reward -0.004882, avg reward -0.007896, total steps 90240, episode step 128\n",
|
|
"INFO:gym:episode 706, reward -0.001789, avg reward -0.007853, total steps 90368, episode step 128\n",
|
|
"[2018-02-18 14:46:34,338] episode 706, reward -0.001789, avg reward -0.007853, total steps 90368, episode step 128\n",
|
|
"INFO:gym:episode 707, reward 0.006449, avg reward -0.007652, total steps 90496, episode step 128\n",
|
|
"[2018-02-18 14:46:36,453] episode 707, reward 0.006449, avg reward -0.007652, total steps 90496, episode step 128\n",
|
|
"INFO:gym:episode 708, reward -0.001525, avg reward -0.007649, total steps 90624, episode step 128\n",
|
|
"[2018-02-18 14:46:38,473] episode 708, reward -0.001525, avg reward -0.007649, total steps 90624, episode step 128\n",
|
|
"INFO:gym:episode 709, reward 0.001648, avg reward -0.007551, total steps 90752, episode step 128\n",
|
|
"[2018-02-18 14:46:40,277] episode 709, reward 0.001648, avg reward -0.007551, total steps 90752, episode step 128\n",
|
|
"INFO:gym:episode 710, reward -0.016399, avg reward -0.007078, total steps 90880, episode step 128\n",
|
|
"[2018-02-18 14:46:42,142] episode 710, reward -0.016399, avg reward -0.007078, total steps 90880, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:46:42,143] Testing...\n",
|
|
"INFO:gym:Avg reward -0.007255(0.000000)\n",
|
|
"[2018-02-18 14:46:42,546] Avg reward -0.007255(0.000000)\n",
|
|
"INFO:gym:episode 711, reward -0.052358, avg reward -0.007488, total steps 91008, episode step 128\n",
|
|
"[2018-02-18 14:46:44,374] episode 711, reward -0.052358, avg reward -0.007488, total steps 91008, episode step 128\n",
|
|
"INFO:gym:episode 712, reward -0.003164, avg reward -0.007424, total steps 91136, episode step 128\n",
|
|
"[2018-02-18 14:46:46,179] episode 712, reward -0.003164, avg reward -0.007424, total steps 91136, episode step 128\n",
|
|
"INFO:gym:episode 713, reward -0.041531, avg reward -0.007819, total steps 91264, episode step 128\n",
|
|
"[2018-02-18 14:46:48,175] episode 713, reward -0.041531, avg reward -0.007819, total steps 91264, episode step 128\n",
|
|
"INFO:gym:episode 714, reward -0.004784, avg reward -0.007843, total steps 91392, episode step 128\n",
|
|
"[2018-02-18 14:46:50,098] episode 714, reward -0.004784, avg reward -0.007843, total steps 91392, episode step 128\n",
|
|
"INFO:gym:episode 715, reward -0.056364, avg reward -0.008070, total steps 91520, episode step 128\n",
|
|
"[2018-02-18 14:46:52,198] episode 715, reward -0.056364, avg reward -0.008070, total steps 91520, episode step 128\n",
|
|
"INFO:gym:episode 716, reward -0.002191, avg reward -0.008073, total steps 91648, episode step 128\n",
|
|
"[2018-02-18 14:46:54,394] episode 716, reward -0.002191, avg reward -0.008073, total steps 91648, episode step 128\n",
|
|
"INFO:gym:episode 717, reward -0.017020, avg reward -0.008208, total steps 91776, episode step 128\n",
|
|
"[2018-02-18 14:46:56,482] episode 717, reward -0.017020, avg reward -0.008208, total steps 91776, episode step 128\n",
|
|
"INFO:gym:episode 718, reward -0.029047, avg reward -0.008501, total steps 91904, episode step 128\n",
|
|
"[2018-02-18 14:46:58,434] episode 718, reward -0.029047, avg reward -0.008501, total steps 91904, episode step 128\n",
|
|
"INFO:gym:episode 719, reward -0.105568, avg reward -0.009452, total steps 92032, episode step 128\n",
|
|
"[2018-02-18 14:47:00,482] episode 719, reward -0.105568, avg reward -0.009452, total steps 92032, episode step 128\n",
|
|
"INFO:gym:episode 720, reward -0.001244, avg reward -0.009406, total steps 92160, episode step 128\n",
|
|
"[2018-02-18 14:47:02,518] episode 720, reward -0.001244, avg reward -0.009406, total steps 92160, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:47:02,522] Testing...\n",
|
|
"INFO:gym:Avg reward -0.008377(0.000000)\n",
|
|
"[2018-02-18 14:47:02,846] Avg reward -0.008377(0.000000)\n",
|
|
"INFO:gym:episode 721, reward -0.013569, avg reward -0.009460, total steps 92288, episode step 128\n",
|
|
"[2018-02-18 14:47:05,078] episode 721, reward -0.013569, avg reward -0.009460, total steps 92288, episode step 128\n",
|
|
"INFO:gym:episode 722, reward -0.004974, avg reward -0.009277, total steps 92416, episode step 128\n",
|
|
"[2018-02-18 14:47:07,080] episode 722, reward -0.004974, avg reward -0.009277, total steps 92416, episode step 128\n",
|
|
"INFO:gym:episode 723, reward -0.004855, avg reward -0.009191, total steps 92544, episode step 128\n",
|
|
"[2018-02-18 14:47:09,270] episode 723, reward -0.004855, avg reward -0.009191, total steps 92544, episode step 128\n",
|
|
"INFO:gym:episode 724, reward -0.014383, avg reward -0.009316, total steps 92672, episode step 128\n",
|
|
"[2018-02-18 14:47:11,676] episode 724, reward -0.014383, avg reward -0.009316, total steps 92672, episode step 128\n",
|
|
"INFO:gym:episode 725, reward -0.002062, avg reward -0.009034, total steps 92800, episode step 128\n",
|
|
"[2018-02-18 14:47:14,049] episode 725, reward -0.002062, avg reward -0.009034, total steps 92800, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 726, reward -0.003220, avg reward -0.009106, total steps 92928, episode step 128\n",
|
|
"[2018-02-18 14:47:16,246] episode 726, reward -0.003220, avg reward -0.009106, total steps 92928, episode step 128\n",
|
|
"INFO:gym:episode 727, reward -0.022127, avg reward -0.009280, total steps 93056, episode step 128\n",
|
|
"[2018-02-18 14:47:18,431] episode 727, reward -0.022127, avg reward -0.009280, total steps 93056, episode step 128\n",
|
|
"INFO:gym:episode 728, reward -0.003528, avg reward -0.009298, total steps 93184, episode step 128\n",
|
|
"[2018-02-18 14:47:20,946] episode 728, reward -0.003528, avg reward -0.009298, total steps 93184, episode step 128\n",
|
|
"INFO:gym:episode 729, reward -0.002655, avg reward -0.009326, total steps 93312, episode step 128\n",
|
|
"[2018-02-18 14:47:23,335] episode 729, reward -0.002655, avg reward -0.009326, total steps 93312, episode step 128\n",
|
|
"INFO:gym:episode 730, reward -0.012206, avg reward -0.009431, total steps 93440, episode step 128\n",
|
|
"[2018-02-18 14:47:26,146] episode 730, reward -0.012206, avg reward -0.009431, total steps 93440, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:47:26,148] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001792(0.000000)\n",
|
|
"[2018-02-18 14:47:26,526] Avg reward -0.001792(0.000000)\n",
|
|
"INFO:gym:episode 731, reward -0.041080, avg reward -0.009713, total steps 93568, episode step 128\n",
|
|
"[2018-02-18 14:47:29,396] episode 731, reward -0.041080, avg reward -0.009713, total steps 93568, episode step 128\n",
|
|
"INFO:gym:episode 732, reward -0.003843, avg reward -0.009602, total steps 93696, episode step 128\n",
|
|
"[2018-02-18 14:47:32,386] episode 732, reward -0.003843, avg reward -0.009602, total steps 93696, episode step 128\n",
|
|
"INFO:gym:episode 733, reward -0.004918, avg reward -0.009604, total steps 93824, episode step 128\n",
|
|
"[2018-02-18 14:47:35,416] episode 733, reward -0.004918, avg reward -0.009604, total steps 93824, episode step 128\n",
|
|
"INFO:gym:episode 734, reward -0.010643, avg reward -0.009468, total steps 93952, episode step 128\n",
|
|
"[2018-02-18 14:47:38,568] episode 734, reward -0.010643, avg reward -0.009468, total steps 93952, episode step 128\n",
|
|
"INFO:gym:episode 735, reward -0.001773, avg reward -0.009416, total steps 94080, episode step 128\n",
|
|
"[2018-02-18 14:47:41,455] episode 735, reward -0.001773, avg reward -0.009416, total steps 94080, episode step 128\n",
|
|
"INFO:gym:episode 736, reward -0.005965, avg reward -0.009459, total steps 94208, episode step 128\n",
|
|
"[2018-02-18 14:47:44,721] episode 736, reward -0.005965, avg reward -0.009459, total steps 94208, episode step 128\n",
|
|
"INFO:gym:episode 737, reward -0.002159, avg reward -0.009549, total steps 94336, episode step 128\n",
|
|
"[2018-02-18 14:47:47,737] episode 737, reward -0.002159, avg reward -0.009549, total steps 94336, episode step 128\n",
|
|
"INFO:gym:episode 738, reward -0.002955, avg reward -0.009505, total steps 94464, episode step 128\n",
|
|
"[2018-02-18 14:47:50,705] episode 738, reward -0.002955, avg reward -0.009505, total steps 94464, episode step 128\n",
|
|
"INFO:gym:episode 739, reward 0.003034, avg reward -0.009439, total steps 94592, episode step 128\n",
|
|
"[2018-02-18 14:47:53,581] episode 739, reward 0.003034, avg reward -0.009439, total steps 94592, episode step 128\n",
|
|
"INFO:gym:episode 740, reward -0.003847, avg reward -0.009216, total steps 94720, episode step 128\n",
|
|
"[2018-02-18 14:47:56,450] episode 740, reward -0.003847, avg reward -0.009216, total steps 94720, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:47:56,453] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001796(0.000000)\n",
|
|
"[2018-02-18 14:47:56,824] Avg reward -0.001796(0.000000)\n",
|
|
"INFO:gym:episode 741, reward -0.001810, avg reward -0.009222, total steps 94848, episode step 128\n",
|
|
"[2018-02-18 14:47:59,938] episode 741, reward -0.001810, avg reward -0.009222, total steps 94848, episode step 128\n",
|
|
"INFO:gym:episode 742, reward -0.006684, avg reward -0.009178, total steps 94976, episode step 128\n",
|
|
"[2018-02-18 14:48:03,377] episode 742, reward -0.006684, avg reward -0.009178, total steps 94976, episode step 128\n",
|
|
"INFO:gym:episode 743, reward -0.013026, avg reward -0.009099, total steps 95104, episode step 128\n",
|
|
"[2018-02-18 14:48:07,112] episode 743, reward -0.013026, avg reward -0.009099, total steps 95104, episode step 128\n",
|
|
"INFO:gym:episode 744, reward -0.076119, avg reward -0.009815, total steps 95232, episode step 128\n",
|
|
"[2018-02-18 14:48:10,658] episode 744, reward -0.076119, avg reward -0.009815, total steps 95232, episode step 128\n",
|
|
"INFO:gym:episode 745, reward -0.012682, avg reward -0.009905, total steps 95360, episode step 128\n",
|
|
"[2018-02-18 14:48:14,136] episode 745, reward -0.012682, avg reward -0.009905, total steps 95360, episode step 128\n",
|
|
"INFO:gym:episode 746, reward -0.013730, avg reward -0.009999, total steps 95488, episode step 128\n",
|
|
"[2018-02-18 14:48:17,580] episode 746, reward -0.013730, avg reward -0.009999, total steps 95488, episode step 128\n",
|
|
"INFO:gym:episode 747, reward -0.008738, avg reward -0.009997, total steps 95616, episode step 128\n",
|
|
"[2018-02-18 14:48:21,464] episode 747, reward -0.008738, avg reward -0.009997, total steps 95616, episode step 128\n",
|
|
"INFO:gym:episode 748, reward -0.003529, avg reward -0.009983, total steps 95744, episode step 128\n",
|
|
"[2018-02-18 14:48:25,382] episode 748, reward -0.003529, avg reward -0.009983, total steps 95744, episode step 128\n",
|
|
"INFO:gym:episode 749, reward -0.014156, avg reward -0.009535, total steps 95872, episode step 128\n",
|
|
"[2018-02-18 14:48:29,198] episode 749, reward -0.014156, avg reward -0.009535, total steps 95872, episode step 128\n",
|
|
"INFO:gym:episode 750, reward -0.001114, avg reward -0.009529, total steps 96000, episode step 128\n",
|
|
"[2018-02-18 14:48:33,337] episode 750, reward -0.001114, avg reward -0.009529, total steps 96000, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:48:33,344] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001491(0.000000)\n",
|
|
"[2018-02-18 14:48:33,684] Avg reward -0.001491(0.000000)\n",
|
|
"INFO:gym:episode 751, reward -0.003085, avg reward -0.009520, total steps 96128, episode step 128\n",
|
|
"[2018-02-18 14:48:37,957] episode 751, reward -0.003085, avg reward -0.009520, total steps 96128, episode step 128\n",
|
|
"INFO:gym:episode 752, reward -0.002096, avg reward -0.009341, total steps 96256, episode step 128\n",
|
|
"[2018-02-18 14:48:42,199] episode 752, reward -0.002096, avg reward -0.009341, total steps 96256, episode step 128\n",
|
|
"INFO:gym:episode 753, reward 0.043677, avg reward -0.008969, total steps 96384, episode step 128\n",
|
|
"[2018-02-18 14:48:46,518] episode 753, reward 0.043677, avg reward -0.008969, total steps 96384, episode step 128\n",
|
|
"INFO:gym:episode 754, reward -0.003092, avg reward -0.008836, total steps 96512, episode step 128\n",
|
|
"[2018-02-18 14:48:51,065] episode 754, reward -0.003092, avg reward -0.008836, total steps 96512, episode step 128\n",
|
|
"INFO:gym:episode 755, reward -0.004780, avg reward -0.008841, total steps 96640, episode step 128\n",
|
|
"[2018-02-18 14:48:55,431] episode 755, reward -0.004780, avg reward -0.008841, total steps 96640, episode step 128\n",
|
|
"INFO:gym:episode 756, reward -0.004615, avg reward -0.008868, total steps 96768, episode step 128\n",
|
|
"[2018-02-18 14:48:59,489] episode 756, reward -0.004615, avg reward -0.008868, total steps 96768, episode step 128\n",
|
|
"INFO:gym:episode 757, reward -0.003977, avg reward -0.008862, total steps 96896, episode step 128\n",
|
|
"[2018-02-18 14:49:03,637] episode 757, reward -0.003977, avg reward -0.008862, total steps 96896, episode step 128\n",
|
|
"INFO:gym:episode 758, reward -0.011672, avg reward -0.008954, total steps 97024, episode step 128\n",
|
|
"[2018-02-18 14:49:07,965] episode 758, reward -0.011672, avg reward -0.008954, total steps 97024, episode step 128\n",
|
|
"INFO:gym:episode 759, reward -0.016725, avg reward -0.009101, total steps 97152, episode step 128\n",
|
|
"[2018-02-18 14:49:12,069] episode 759, reward -0.016725, avg reward -0.009101, total steps 97152, episode step 128\n",
|
|
"INFO:gym:episode 760, reward -0.026785, avg reward -0.009358, total steps 97280, episode step 128\n",
|
|
"[2018-02-18 14:49:16,402] episode 760, reward -0.026785, avg reward -0.009358, total steps 97280, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:49:16,407] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001530(0.000000)\n",
|
|
"[2018-02-18 14:49:16,734] Avg reward -0.001530(0.000000)\n",
|
|
"INFO:gym:episode 761, reward -0.007357, avg reward -0.009367, total steps 97408, episode step 128\n",
|
|
"[2018-02-18 14:49:20,927] episode 761, reward -0.007357, avg reward -0.009367, total steps 97408, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 762, reward -0.001411, avg reward -0.009126, total steps 97536, episode step 128\n",
|
|
"[2018-02-18 14:49:24,891] episode 762, reward -0.001411, avg reward -0.009126, total steps 97536, episode step 128\n",
|
|
"INFO:gym:episode 763, reward -0.026326, avg reward -0.009355, total steps 97664, episode step 128\n",
|
|
"[2018-02-18 14:49:28,713] episode 763, reward -0.026326, avg reward -0.009355, total steps 97664, episode step 128\n",
|
|
"INFO:gym:episode 764, reward -0.008461, avg reward -0.009347, total steps 97792, episode step 128\n",
|
|
"[2018-02-18 14:49:32,516] episode 764, reward -0.008461, avg reward -0.009347, total steps 97792, episode step 128\n",
|
|
"INFO:gym:episode 765, reward -0.015859, avg reward -0.009363, total steps 97920, episode step 128\n",
|
|
"[2018-02-18 14:49:36,210] episode 765, reward -0.015859, avg reward -0.009363, total steps 97920, episode step 128\n",
|
|
"INFO:gym:episode 766, reward -0.004351, avg reward -0.009390, total steps 98048, episode step 128\n",
|
|
"[2018-02-18 14:49:40,395] episode 766, reward -0.004351, avg reward -0.009390, total steps 98048, episode step 128\n",
|
|
"INFO:gym:episode 767, reward -0.006142, avg reward -0.009431, total steps 98176, episode step 128\n",
|
|
"[2018-02-18 14:49:44,284] episode 767, reward -0.006142, avg reward -0.009431, total steps 98176, episode step 128\n",
|
|
"INFO:gym:episode 768, reward -0.027012, avg reward -0.009701, total steps 98304, episode step 128\n",
|
|
"[2018-02-18 14:49:48,116] episode 768, reward -0.027012, avg reward -0.009701, total steps 98304, episode step 128\n",
|
|
"INFO:gym:episode 769, reward -0.024848, avg reward -0.009704, total steps 98432, episode step 128\n",
|
|
"[2018-02-18 14:49:52,534] episode 769, reward -0.024848, avg reward -0.009704, total steps 98432, episode step 128\n",
|
|
"INFO:gym:episode 770, reward -0.018611, avg reward -0.009872, total steps 98560, episode step 128\n",
|
|
"[2018-02-18 14:49:57,036] episode 770, reward -0.018611, avg reward -0.009872, total steps 98560, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:49:57,039] Testing...\n",
|
|
"INFO:gym:Avg reward -0.009234(0.000000)\n",
|
|
"[2018-02-18 14:49:57,533] Avg reward -0.009234(0.000000)\n",
|
|
"INFO:gym:episode 771, reward -0.002210, avg reward -0.009877, total steps 98688, episode step 128\n",
|
|
"[2018-02-18 14:50:02,026] episode 771, reward -0.002210, avg reward -0.009877, total steps 98688, episode step 128\n",
|
|
"INFO:gym:episode 772, reward -0.001572, avg reward -0.009708, total steps 98816, episode step 128\n",
|
|
"[2018-02-18 14:50:06,310] episode 772, reward -0.001572, avg reward -0.009708, total steps 98816, episode step 128\n",
|
|
"INFO:gym:episode 773, reward -0.017144, avg reward -0.009835, total steps 98944, episode step 128\n",
|
|
"[2018-02-18 14:50:10,715] episode 773, reward -0.017144, avg reward -0.009835, total steps 98944, episode step 128\n",
|
|
"INFO:gym:episode 774, reward -0.037033, avg reward -0.010187, total steps 99072, episode step 128\n",
|
|
"[2018-02-18 14:50:14,461] episode 774, reward -0.037033, avg reward -0.010187, total steps 99072, episode step 128\n",
|
|
"INFO:gym:episode 775, reward -0.001568, avg reward -0.010189, total steps 99200, episode step 128\n",
|
|
"[2018-02-18 14:50:18,199] episode 775, reward -0.001568, avg reward -0.010189, total steps 99200, episode step 128\n",
|
|
"INFO:gym:episode 776, reward -0.000065, avg reward -0.010124, total steps 99328, episode step 128\n",
|
|
"[2018-02-18 14:50:21,670] episode 776, reward -0.000065, avg reward -0.010124, total steps 99328, episode step 128\n",
|
|
"INFO:gym:episode 777, reward -0.073316, avg reward -0.010832, total steps 99456, episode step 128\n",
|
|
"[2018-02-18 14:50:25,110] episode 777, reward -0.073316, avg reward -0.010832, total steps 99456, episode step 128\n",
|
|
"INFO:gym:episode 778, reward -0.007120, avg reward -0.010892, total steps 99584, episode step 128\n",
|
|
"[2018-02-18 14:50:28,571] episode 778, reward -0.007120, avg reward -0.010892, total steps 99584, episode step 128\n",
|
|
"INFO:gym:episode 779, reward -0.011708, avg reward -0.010995, total steps 99712, episode step 128\n",
|
|
"[2018-02-18 14:50:32,122] episode 779, reward -0.011708, avg reward -0.010995, total steps 99712, episode step 128\n",
|
|
"INFO:gym:episode 780, reward -0.000522, avg reward -0.011029, total steps 99840, episode step 128\n",
|
|
"[2018-02-18 14:50:35,717] episode 780, reward -0.000522, avg reward -0.011029, total steps 99840, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:50:35,718] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002213(0.000000)\n",
|
|
"[2018-02-18 14:50:36,056] Avg reward -0.002213(0.000000)\n",
|
|
"INFO:gym:episode 781, reward -0.024996, avg reward -0.011261, total steps 99968, episode step 128\n",
|
|
"[2018-02-18 14:50:39,782] episode 781, reward -0.024996, avg reward -0.011261, total steps 99968, episode step 128\n",
|
|
"INFO:gym:episode 782, reward -0.012914, avg reward -0.011322, total steps 100096, episode step 128\n",
|
|
"[2018-02-18 14:50:43,942] episode 782, reward -0.012914, avg reward -0.011322, total steps 100096, episode step 128\n",
|
|
"INFO:gym:episode 783, reward -0.007436, avg reward -0.011378, total steps 100224, episode step 128\n",
|
|
"[2018-02-18 14:50:46,581] episode 783, reward -0.007436, avg reward -0.011378, total steps 100224, episode step 128\n",
|
|
"INFO:gym:episode 784, reward -0.037465, avg reward -0.011685, total steps 100352, episode step 128\n",
|
|
"[2018-02-18 14:50:48,450] episode 784, reward -0.037465, avg reward -0.011685, total steps 100352, episode step 128\n",
|
|
"INFO:gym:episode 785, reward -0.002957, avg reward -0.011693, total steps 100480, episode step 128\n",
|
|
"[2018-02-18 14:50:50,565] episode 785, reward -0.002957, avg reward -0.011693, total steps 100480, episode step 128\n",
|
|
"INFO:gym:episode 786, reward 0.000131, avg reward -0.011653, total steps 100608, episode step 128\n",
|
|
"[2018-02-18 14:50:52,731] episode 786, reward 0.000131, avg reward -0.011653, total steps 100608, episode step 128\n",
|
|
"INFO:gym:episode 787, reward -0.054679, avg reward -0.012153, total steps 100736, episode step 128\n",
|
|
"[2018-02-18 14:50:54,667] episode 787, reward -0.054679, avg reward -0.012153, total steps 100736, episode step 128\n",
|
|
"INFO:gym:episode 788, reward -0.002545, avg reward -0.012160, total steps 100864, episode step 128\n",
|
|
"[2018-02-18 14:50:56,635] episode 788, reward -0.002545, avg reward -0.012160, total steps 100864, episode step 128\n",
|
|
"INFO:gym:episode 789, reward -0.010466, avg reward -0.012044, total steps 100992, episode step 128\n",
|
|
"[2018-02-18 14:50:58,714] episode 789, reward -0.010466, avg reward -0.012044, total steps 100992, episode step 128\n",
|
|
"INFO:gym:episode 790, reward -0.019356, avg reward -0.012177, total steps 101120, episode step 128\n",
|
|
"[2018-02-18 14:51:00,662] episode 790, reward -0.019356, avg reward -0.012177, total steps 101120, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:51:00,663] Testing...\n",
|
|
"INFO:gym:Avg reward -0.006148(0.000000)\n",
|
|
"[2018-02-18 14:51:01,022] Avg reward -0.006148(0.000000)\n",
|
|
"INFO:gym:episode 791, reward -0.002024, avg reward -0.012152, total steps 101248, episode step 128\n",
|
|
"[2018-02-18 14:51:03,017] episode 791, reward -0.002024, avg reward -0.012152, total steps 101248, episode step 128\n",
|
|
"INFO:gym:episode 792, reward -0.041453, avg reward -0.012724, total steps 101376, episode step 128\n",
|
|
"[2018-02-18 14:51:05,372] episode 792, reward -0.041453, avg reward -0.012724, total steps 101376, episode step 128\n",
|
|
"INFO:gym:episode 793, reward -0.012278, avg reward -0.012829, total steps 101504, episode step 128\n",
|
|
"[2018-02-18 14:51:07,408] episode 793, reward -0.012278, avg reward -0.012829, total steps 101504, episode step 128\n",
|
|
"INFO:gym:episode 794, reward -0.002945, avg reward -0.012853, total steps 101632, episode step 128\n",
|
|
"[2018-02-18 14:51:09,225] episode 794, reward -0.002945, avg reward -0.012853, total steps 101632, episode step 128\n",
|
|
"INFO:gym:episode 795, reward -0.004366, avg reward -0.012870, total steps 101760, episode step 128\n",
|
|
"[2018-02-18 14:51:11,303] episode 795, reward -0.004366, avg reward -0.012870, total steps 101760, episode step 128\n",
|
|
"INFO:gym:episode 796, reward -0.005203, avg reward -0.012905, total steps 101888, episode step 128\n",
|
|
"[2018-02-18 14:51:13,681] episode 796, reward -0.005203, avg reward -0.012905, total steps 101888, episode step 128\n",
|
|
"INFO:gym:episode 797, reward 0.017164, avg reward -0.012524, total steps 102016, episode step 128\n",
|
|
"[2018-02-18 14:51:15,668] episode 797, reward 0.017164, avg reward -0.012524, total steps 102016, episode step 128\n",
|
|
"INFO:gym:episode 798, reward -0.007192, avg reward -0.012508, total steps 102144, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:51:17,504] episode 798, reward -0.007192, avg reward -0.012508, total steps 102144, episode step 128\n",
|
|
"INFO:gym:episode 799, reward -0.001736, avg reward -0.012454, total steps 102272, episode step 128\n",
|
|
"[2018-02-18 14:51:19,502] episode 799, reward -0.001736, avg reward -0.012454, total steps 102272, episode step 128\n",
|
|
"INFO:gym:episode 800, reward -0.033686, avg reward -0.012428, total steps 102400, episode step 128\n",
|
|
"[2018-02-18 14:51:21,798] episode 800, reward -0.033686, avg reward -0.012428, total steps 102400, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:51:21,806] Testing...\n",
|
|
"INFO:gym:Avg reward -0.003198(0.000000)\n",
|
|
"[2018-02-18 14:51:22,320] Avg reward -0.003198(0.000000)\n",
|
|
"INFO:gym:episode 801, reward 0.001026, avg reward -0.012363, total steps 102528, episode step 128\n",
|
|
"[2018-02-18 14:51:24,408] episode 801, reward 0.001026, avg reward -0.012363, total steps 102528, episode step 128\n",
|
|
"INFO:gym:episode 802, reward -0.046486, avg reward -0.012821, total steps 102656, episode step 128\n",
|
|
"[2018-02-18 14:51:26,244] episode 802, reward -0.046486, avg reward -0.012821, total steps 102656, episode step 128\n",
|
|
"INFO:gym:episode 803, reward -0.015509, avg reward -0.012942, total steps 102784, episode step 128\n",
|
|
"[2018-02-18 14:51:28,070] episode 803, reward -0.015509, avg reward -0.012942, total steps 102784, episode step 128\n",
|
|
"INFO:gym:episode 804, reward -0.004828, avg reward -0.012971, total steps 102912, episode step 128\n",
|
|
"[2018-02-18 14:51:30,074] episode 804, reward -0.004828, avg reward -0.012971, total steps 102912, episode step 128\n",
|
|
"INFO:gym:episode 805, reward -0.001705, avg reward -0.012939, total steps 103040, episode step 128\n",
|
|
"[2018-02-18 14:51:31,938] episode 805, reward -0.001705, avg reward -0.012939, total steps 103040, episode step 128\n",
|
|
"INFO:gym:episode 806, reward -0.028908, avg reward -0.013210, total steps 103168, episode step 128\n",
|
|
"[2018-02-18 14:51:34,052] episode 806, reward -0.028908, avg reward -0.013210, total steps 103168, episode step 128\n",
|
|
"INFO:gym:episode 807, reward -0.001751, avg reward -0.013292, total steps 103296, episode step 128\n",
|
|
"[2018-02-18 14:51:36,153] episode 807, reward -0.001751, avg reward -0.013292, total steps 103296, episode step 128\n",
|
|
"INFO:gym:episode 808, reward -0.018201, avg reward -0.013459, total steps 103424, episode step 128\n",
|
|
"[2018-02-18 14:51:38,203] episode 808, reward -0.018201, avg reward -0.013459, total steps 103424, episode step 128\n",
|
|
"INFO:gym:episode 809, reward -0.010064, avg reward -0.013576, total steps 103552, episode step 128\n",
|
|
"[2018-02-18 14:51:40,295] episode 809, reward -0.010064, avg reward -0.013576, total steps 103552, episode step 128\n",
|
|
"INFO:gym:episode 810, reward -0.048949, avg reward -0.013901, total steps 103680, episode step 128\n",
|
|
"[2018-02-18 14:51:42,332] episode 810, reward -0.048949, avg reward -0.013901, total steps 103680, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:51:42,333] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002114(0.000000)\n",
|
|
"[2018-02-18 14:51:42,725] Avg reward -0.002114(0.000000)\n",
|
|
"INFO:gym:episode 811, reward -0.001676, avg reward -0.013395, total steps 103808, episode step 128\n",
|
|
"[2018-02-18 14:51:45,113] episode 811, reward -0.001676, avg reward -0.013395, total steps 103808, episode step 128\n",
|
|
"INFO:gym:episode 812, reward -0.002327, avg reward -0.013386, total steps 103936, episode step 128\n",
|
|
"[2018-02-18 14:51:47,634] episode 812, reward -0.002327, avg reward -0.013386, total steps 103936, episode step 128\n",
|
|
"INFO:gym:episode 813, reward 0.001745, avg reward -0.012954, total steps 104064, episode step 128\n",
|
|
"[2018-02-18 14:51:50,123] episode 813, reward 0.001745, avg reward -0.012954, total steps 104064, episode step 128\n",
|
|
"INFO:gym:episode 814, reward -0.043580, avg reward -0.013342, total steps 104192, episode step 128\n",
|
|
"[2018-02-18 14:51:52,673] episode 814, reward -0.043580, avg reward -0.013342, total steps 104192, episode step 128\n",
|
|
"INFO:gym:episode 815, reward -0.012567, avg reward -0.012904, total steps 104320, episode step 128\n",
|
|
"[2018-02-18 14:51:55,060] episode 815, reward -0.012567, avg reward -0.012904, total steps 104320, episode step 128\n",
|
|
"INFO:gym:episode 816, reward -0.018286, avg reward -0.013064, total steps 104448, episode step 128\n",
|
|
"[2018-02-18 14:51:57,320] episode 816, reward -0.018286, avg reward -0.013064, total steps 104448, episode step 128\n",
|
|
"INFO:gym:episode 817, reward -0.035939, avg reward -0.013254, total steps 104576, episode step 128\n",
|
|
"[2018-02-18 14:51:59,790] episode 817, reward -0.035939, avg reward -0.013254, total steps 104576, episode step 128\n",
|
|
"INFO:gym:episode 818, reward 0.000538, avg reward -0.012958, total steps 104704, episode step 128\n",
|
|
"[2018-02-18 14:52:02,005] episode 818, reward 0.000538, avg reward -0.012958, total steps 104704, episode step 128\n",
|
|
"INFO:gym:episode 819, reward -0.009941, avg reward -0.012002, total steps 104832, episode step 128\n",
|
|
"[2018-02-18 14:52:04,325] episode 819, reward -0.009941, avg reward -0.012002, total steps 104832, episode step 128\n",
|
|
"INFO:gym:episode 820, reward -0.003184, avg reward -0.012021, total steps 104960, episode step 128\n",
|
|
"[2018-02-18 14:52:06,822] episode 820, reward -0.003184, avg reward -0.012021, total steps 104960, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:52:06,823] Testing...\n",
|
|
"INFO:gym:Avg reward -0.040279(0.000000)\n",
|
|
"[2018-02-18 14:52:07,220] Avg reward -0.040279(0.000000)\n",
|
|
"INFO:gym:episode 821, reward -0.011167, avg reward -0.011997, total steps 105088, episode step 128\n",
|
|
"[2018-02-18 14:52:10,445] episode 821, reward -0.011167, avg reward -0.011997, total steps 105088, episode step 128\n",
|
|
"INFO:gym:episode 822, reward -0.006929, avg reward -0.012017, total steps 105216, episode step 128\n",
|
|
"[2018-02-18 14:52:13,821] episode 822, reward -0.006929, avg reward -0.012017, total steps 105216, episode step 128\n",
|
|
"INFO:gym:episode 823, reward -0.026733, avg reward -0.012235, total steps 105344, episode step 128\n",
|
|
"[2018-02-18 14:52:17,658] episode 823, reward -0.026733, avg reward -0.012235, total steps 105344, episode step 128\n",
|
|
"INFO:gym:episode 824, reward -0.010109, avg reward -0.012193, total steps 105472, episode step 128\n",
|
|
"[2018-02-18 14:52:21,357] episode 824, reward -0.010109, avg reward -0.012193, total steps 105472, episode step 128\n",
|
|
"INFO:gym:episode 825, reward -0.017539, avg reward -0.012347, total steps 105600, episode step 128\n",
|
|
"[2018-02-18 14:52:25,004] episode 825, reward -0.017539, avg reward -0.012347, total steps 105600, episode step 128\n",
|
|
"INFO:gym:episode 826, reward -0.011586, avg reward -0.012431, total steps 105728, episode step 128\n",
|
|
"[2018-02-18 14:52:28,638] episode 826, reward -0.011586, avg reward -0.012431, total steps 105728, episode step 128\n",
|
|
"INFO:gym:episode 827, reward -0.016966, avg reward -0.012379, total steps 105856, episode step 128\n",
|
|
"[2018-02-18 14:52:32,173] episode 827, reward -0.016966, avg reward -0.012379, total steps 105856, episode step 128\n",
|
|
"INFO:gym:episode 828, reward -0.017296, avg reward -0.012517, total steps 105984, episode step 128\n",
|
|
"[2018-02-18 14:52:35,928] episode 828, reward -0.017296, avg reward -0.012517, total steps 105984, episode step 128\n",
|
|
"INFO:gym:episode 829, reward -0.017814, avg reward -0.012669, total steps 106112, episode step 128\n",
|
|
"[2018-02-18 14:52:39,763] episode 829, reward -0.017814, avg reward -0.012669, total steps 106112, episode step 128\n",
|
|
"INFO:gym:episode 830, reward -0.001791, avg reward -0.012565, total steps 106240, episode step 128\n",
|
|
"[2018-02-18 14:52:43,624] episode 830, reward -0.001791, avg reward -0.012565, total steps 106240, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:52:43,625] Testing...\n",
|
|
"INFO:gym:Avg reward -0.015335(0.000000)\n",
|
|
"[2018-02-18 14:52:43,969] Avg reward -0.015335(0.000000)\n",
|
|
"INFO:gym:episode 831, reward -0.031561, avg reward -0.012469, total steps 106368, episode step 128\n",
|
|
"[2018-02-18 14:52:48,410] episode 831, reward -0.031561, avg reward -0.012469, total steps 106368, episode step 128\n",
|
|
"INFO:gym:episode 832, reward -0.047031, avg reward -0.012901, total steps 106496, episode step 128\n",
|
|
"[2018-02-18 14:52:52,487] episode 832, reward -0.047031, avg reward -0.012901, total steps 106496, episode step 128\n",
|
|
"INFO:gym:episode 833, reward -0.012588, avg reward -0.012978, total steps 106624, episode step 128\n",
|
|
"[2018-02-18 14:52:56,761] episode 833, reward -0.012588, avg reward -0.012978, total steps 106624, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 834, reward -0.021850, avg reward -0.013090, total steps 106752, episode step 128\n",
|
|
"[2018-02-18 14:53:00,995] episode 834, reward -0.021850, avg reward -0.013090, total steps 106752, episode step 128\n",
|
|
"INFO:gym:episode 835, reward -0.043075, avg reward -0.013503, total steps 106880, episode step 128\n",
|
|
"[2018-02-18 14:53:05,564] episode 835, reward -0.043075, avg reward -0.013503, total steps 106880, episode step 128\n",
|
|
"INFO:gym:episode 836, reward -0.008159, avg reward -0.013525, total steps 107008, episode step 128\n",
|
|
"[2018-02-18 14:53:10,019] episode 836, reward -0.008159, avg reward -0.013525, total steps 107008, episode step 128\n",
|
|
"INFO:gym:episode 837, reward 0.011593, avg reward -0.013387, total steps 107136, episode step 128\n",
|
|
"[2018-02-18 14:53:14,967] episode 837, reward 0.011593, avg reward -0.013387, total steps 107136, episode step 128\n",
|
|
"INFO:gym:episode 838, reward -0.001884, avg reward -0.013377, total steps 107264, episode step 128\n",
|
|
"[2018-02-18 14:53:20,279] episode 838, reward -0.001884, avg reward -0.013377, total steps 107264, episode step 128\n",
|
|
"INFO:gym:episode 839, reward -0.007198, avg reward -0.013479, total steps 107392, episode step 128\n",
|
|
"[2018-02-18 14:53:25,606] episode 839, reward -0.007198, avg reward -0.013479, total steps 107392, episode step 128\n",
|
|
"INFO:gym:episode 840, reward -0.001230, avg reward -0.013453, total steps 107520, episode step 128\n",
|
|
"[2018-02-18 14:53:30,517] episode 840, reward -0.001230, avg reward -0.013453, total steps 107520, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:53:30,542] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001034(0.000000)\n",
|
|
"[2018-02-18 14:53:30,879] Avg reward -0.001034(0.000000)\n",
|
|
"INFO:gym:episode 841, reward -0.050607, avg reward -0.013941, total steps 107648, episode step 128\n",
|
|
"[2018-02-18 14:53:35,490] episode 841, reward -0.050607, avg reward -0.013941, total steps 107648, episode step 128\n",
|
|
"INFO:gym:episode 842, reward -0.000051, avg reward -0.013874, total steps 107776, episode step 128\n",
|
|
"[2018-02-18 14:53:40,040] episode 842, reward -0.000051, avg reward -0.013874, total steps 107776, episode step 128\n",
|
|
"INFO:gym:episode 843, reward -0.031571, avg reward -0.014060, total steps 107904, episode step 128\n",
|
|
"[2018-02-18 14:53:44,812] episode 843, reward -0.031571, avg reward -0.014060, total steps 107904, episode step 128\n",
|
|
"INFO:gym:episode 844, reward -0.020504, avg reward -0.013504, total steps 108032, episode step 128\n",
|
|
"[2018-02-18 14:53:49,874] episode 844, reward -0.020504, avg reward -0.013504, total steps 108032, episode step 128\n",
|
|
"INFO:gym:episode 845, reward -0.010387, avg reward -0.013481, total steps 108160, episode step 128\n",
|
|
"[2018-02-18 14:53:54,689] episode 845, reward -0.010387, avg reward -0.013481, total steps 108160, episode step 128\n",
|
|
"INFO:gym:episode 846, reward -0.038672, avg reward -0.013730, total steps 108288, episode step 128\n",
|
|
"[2018-02-18 14:53:59,660] episode 846, reward -0.038672, avg reward -0.013730, total steps 108288, episode step 128\n",
|
|
"INFO:gym:episode 847, reward 0.004230, avg reward -0.013601, total steps 108416, episode step 128\n",
|
|
"[2018-02-18 14:54:04,217] episode 847, reward 0.004230, avg reward -0.013601, total steps 108416, episode step 128\n",
|
|
"INFO:gym:episode 848, reward -0.001549, avg reward -0.013581, total steps 108544, episode step 128\n",
|
|
"[2018-02-18 14:54:08,452] episode 848, reward -0.001549, avg reward -0.013581, total steps 108544, episode step 128\n",
|
|
"INFO:gym:episode 849, reward -0.010368, avg reward -0.013543, total steps 108672, episode step 128\n",
|
|
"[2018-02-18 14:54:12,760] episode 849, reward -0.010368, avg reward -0.013543, total steps 108672, episode step 128\n",
|
|
"INFO:gym:episode 850, reward -0.001967, avg reward -0.013551, total steps 108800, episode step 128\n",
|
|
"[2018-02-18 14:54:16,957] episode 850, reward -0.001967, avg reward -0.013551, total steps 108800, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:54:16,960] Testing...\n",
|
|
"INFO:gym:Avg reward -0.034593(0.000000)\n",
|
|
"[2018-02-18 14:54:17,339] Avg reward -0.034593(0.000000)\n",
|
|
"INFO:gym:episode 851, reward -0.043463, avg reward -0.013955, total steps 108928, episode step 128\n",
|
|
"[2018-02-18 14:54:22,032] episode 851, reward -0.043463, avg reward -0.013955, total steps 108928, episode step 128\n",
|
|
"INFO:gym:episode 852, reward -0.004292, avg reward -0.013977, total steps 109056, episode step 128\n",
|
|
"[2018-02-18 14:54:26,712] episode 852, reward -0.004292, avg reward -0.013977, total steps 109056, episode step 128\n",
|
|
"INFO:gym:episode 853, reward -0.004941, avg reward -0.014463, total steps 109184, episode step 128\n",
|
|
"[2018-02-18 14:54:31,465] episode 853, reward -0.004941, avg reward -0.014463, total steps 109184, episode step 128\n",
|
|
"INFO:gym:episode 854, reward -0.012531, avg reward -0.014558, total steps 109312, episode step 128\n",
|
|
"[2018-02-18 14:54:35,813] episode 854, reward -0.012531, avg reward -0.014558, total steps 109312, episode step 128\n",
|
|
"INFO:gym:episode 855, reward -0.014712, avg reward -0.014657, total steps 109440, episode step 128\n",
|
|
"[2018-02-18 14:54:39,898] episode 855, reward -0.014712, avg reward -0.014657, total steps 109440, episode step 128\n",
|
|
"INFO:gym:episode 856, reward -0.001549, avg reward -0.014626, total steps 109568, episode step 128\n",
|
|
"[2018-02-18 14:54:44,158] episode 856, reward -0.001549, avg reward -0.014626, total steps 109568, episode step 128\n",
|
|
"INFO:gym:episode 857, reward -0.003823, avg reward -0.014625, total steps 109696, episode step 128\n",
|
|
"[2018-02-18 14:54:48,181] episode 857, reward -0.003823, avg reward -0.014625, total steps 109696, episode step 128\n",
|
|
"INFO:gym:episode 858, reward -0.010153, avg reward -0.014610, total steps 109824, episode step 128\n",
|
|
"[2018-02-18 14:54:52,404] episode 858, reward -0.010153, avg reward -0.014610, total steps 109824, episode step 128\n",
|
|
"INFO:gym:episode 859, reward -0.017362, avg reward -0.014616, total steps 109952, episode step 128\n",
|
|
"[2018-02-18 14:54:55,991] episode 859, reward -0.017362, avg reward -0.014616, total steps 109952, episode step 128\n",
|
|
"INFO:gym:episode 860, reward -0.003087, avg reward -0.014379, total steps 110080, episode step 128\n",
|
|
"[2018-02-18 14:54:59,794] episode 860, reward -0.003087, avg reward -0.014379, total steps 110080, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:54:59,797] Testing...\n",
|
|
"INFO:gym:Avg reward -0.036672(0.000000)\n",
|
|
"[2018-02-18 14:55:00,152] Avg reward -0.036672(0.000000)\n",
|
|
"INFO:gym:episode 861, reward -0.002682, avg reward -0.014332, total steps 110208, episode step 128\n",
|
|
"[2018-02-18 14:55:03,718] episode 861, reward -0.002682, avg reward -0.014332, total steps 110208, episode step 128\n",
|
|
"INFO:gym:episode 862, reward -0.007730, avg reward -0.014396, total steps 110336, episode step 128\n",
|
|
"[2018-02-18 14:55:07,182] episode 862, reward -0.007730, avg reward -0.014396, total steps 110336, episode step 128\n",
|
|
"INFO:gym:episode 863, reward -0.006353, avg reward -0.014196, total steps 110464, episode step 128\n",
|
|
"[2018-02-18 14:55:10,795] episode 863, reward -0.006353, avg reward -0.014196, total steps 110464, episode step 128\n",
|
|
"INFO:gym:episode 864, reward -0.006346, avg reward -0.014175, total steps 110592, episode step 128\n",
|
|
"[2018-02-18 14:55:14,970] episode 864, reward -0.006346, avg reward -0.014175, total steps 110592, episode step 128\n",
|
|
"INFO:gym:episode 865, reward -0.004119, avg reward -0.014057, total steps 110720, episode step 128\n",
|
|
"[2018-02-18 14:55:19,173] episode 865, reward -0.004119, avg reward -0.014057, total steps 110720, episode step 128\n",
|
|
"INFO:gym:episode 866, reward -0.009803, avg reward -0.014112, total steps 110848, episode step 128\n",
|
|
"[2018-02-18 14:55:23,297] episode 866, reward -0.009803, avg reward -0.014112, total steps 110848, episode step 128\n",
|
|
"INFO:gym:episode 867, reward -0.001545, avg reward -0.014066, total steps 110976, episode step 128\n",
|
|
"[2018-02-18 14:55:27,342] episode 867, reward -0.001545, avg reward -0.014066, total steps 110976, episode step 128\n",
|
|
"INFO:gym:episode 868, reward -0.001789, avg reward -0.013814, total steps 111104, episode step 128\n",
|
|
"[2018-02-18 14:55:31,980] episode 868, reward -0.001789, avg reward -0.013814, total steps 111104, episode step 128\n",
|
|
"INFO:gym:episode 869, reward -0.002845, avg reward -0.013594, total steps 111232, episode step 128\n",
|
|
"[2018-02-18 14:55:36,376] episode 869, reward -0.002845, avg reward -0.013594, total steps 111232, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 870, reward -0.003227, avg reward -0.013440, total steps 111360, episode step 128\n",
|
|
"[2018-02-18 14:55:40,932] episode 870, reward -0.003227, avg reward -0.013440, total steps 111360, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:55:40,935] Testing...\n",
|
|
"INFO:gym:Avg reward 0.001064(0.000000)\n",
|
|
"[2018-02-18 14:55:41,317] Avg reward 0.001064(0.000000)\n",
|
|
"INFO:gym:episode 871, reward -0.059269, avg reward -0.014010, total steps 111488, episode step 128\n",
|
|
"[2018-02-18 14:55:45,817] episode 871, reward -0.059269, avg reward -0.014010, total steps 111488, episode step 128\n",
|
|
"INFO:gym:episode 872, reward -0.024189, avg reward -0.014236, total steps 111616, episode step 128\n",
|
|
"[2018-02-18 14:55:50,445] episode 872, reward -0.024189, avg reward -0.014236, total steps 111616, episode step 128\n",
|
|
"INFO:gym:episode 873, reward -0.003881, avg reward -0.014104, total steps 111744, episode step 128\n",
|
|
"[2018-02-18 14:55:54,300] episode 873, reward -0.003881, avg reward -0.014104, total steps 111744, episode step 128\n",
|
|
"INFO:gym:episode 874, reward -0.001422, avg reward -0.013748, total steps 111872, episode step 128\n",
|
|
"[2018-02-18 14:55:56,237] episode 874, reward -0.001422, avg reward -0.013748, total steps 111872, episode step 128\n",
|
|
"INFO:gym:episode 875, reward -0.001963, avg reward -0.013752, total steps 112000, episode step 128\n",
|
|
"[2018-02-18 14:55:58,138] episode 875, reward -0.001963, avg reward -0.013752, total steps 112000, episode step 128\n",
|
|
"INFO:gym:episode 876, reward -0.112940, avg reward -0.014880, total steps 112128, episode step 128\n",
|
|
"[2018-02-18 14:56:00,029] episode 876, reward -0.112940, avg reward -0.014880, total steps 112128, episode step 128\n",
|
|
"INFO:gym:episode 877, reward -0.003236, avg reward -0.014180, total steps 112256, episode step 128\n",
|
|
"[2018-02-18 14:56:01,986] episode 877, reward -0.003236, avg reward -0.014180, total steps 112256, episode step 128\n",
|
|
"INFO:gym:episode 878, reward -0.012516, avg reward -0.014234, total steps 112384, episode step 128\n",
|
|
"[2018-02-18 14:56:03,943] episode 878, reward -0.012516, avg reward -0.014234, total steps 112384, episode step 128\n",
|
|
"INFO:gym:episode 879, reward -0.001794, avg reward -0.014134, total steps 112512, episode step 128\n",
|
|
"[2018-02-18 14:56:05,925] episode 879, reward -0.001794, avg reward -0.014134, total steps 112512, episode step 128\n",
|
|
"INFO:gym:episode 880, reward -0.001589, avg reward -0.014145, total steps 112640, episode step 128\n",
|
|
"[2018-02-18 14:56:07,922] episode 880, reward -0.001589, avg reward -0.014145, total steps 112640, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:56:07,928] Testing...\n",
|
|
"INFO:gym:Avg reward -0.011804(0.000000)\n",
|
|
"[2018-02-18 14:56:08,275] Avg reward -0.011804(0.000000)\n",
|
|
"INFO:gym:episode 881, reward -0.023850, avg reward -0.014134, total steps 112768, episode step 128\n",
|
|
"[2018-02-18 14:56:10,228] episode 881, reward -0.023850, avg reward -0.014134, total steps 112768, episode step 128\n",
|
|
"INFO:gym:episode 882, reward -0.006236, avg reward -0.014067, total steps 112896, episode step 128\n",
|
|
"[2018-02-18 14:56:12,071] episode 882, reward -0.006236, avg reward -0.014067, total steps 112896, episode step 128\n",
|
|
"INFO:gym:episode 883, reward -0.002649, avg reward -0.014019, total steps 113024, episode step 128\n",
|
|
"[2018-02-18 14:56:13,865] episode 883, reward -0.002649, avg reward -0.014019, total steps 113024, episode step 128\n",
|
|
"INFO:gym:episode 884, reward -0.026981, avg reward -0.013914, total steps 113152, episode step 128\n",
|
|
"[2018-02-18 14:56:15,679] episode 884, reward -0.026981, avg reward -0.013914, total steps 113152, episode step 128\n",
|
|
"INFO:gym:episode 885, reward 0.004708, avg reward -0.013837, total steps 113280, episode step 128\n",
|
|
"[2018-02-18 14:56:17,537] episode 885, reward 0.004708, avg reward -0.013837, total steps 113280, episode step 128\n",
|
|
"INFO:gym:episode 886, reward -0.025023, avg reward -0.014089, total steps 113408, episode step 128\n",
|
|
"[2018-02-18 14:56:19,422] episode 886, reward -0.025023, avg reward -0.014089, total steps 113408, episode step 128\n",
|
|
"INFO:gym:episode 887, reward -0.006995, avg reward -0.013612, total steps 113536, episode step 128\n",
|
|
"[2018-02-18 14:56:21,383] episode 887, reward -0.006995, avg reward -0.013612, total steps 113536, episode step 128\n",
|
|
"INFO:gym:episode 888, reward -0.021077, avg reward -0.013798, total steps 113664, episode step 128\n",
|
|
"[2018-02-18 14:56:23,767] episode 888, reward -0.021077, avg reward -0.013798, total steps 113664, episode step 128\n",
|
|
"INFO:gym:episode 889, reward -0.002920, avg reward -0.013722, total steps 113792, episode step 128\n",
|
|
"[2018-02-18 14:56:25,653] episode 889, reward -0.002920, avg reward -0.013722, total steps 113792, episode step 128\n",
|
|
"INFO:gym:episode 890, reward 0.000308, avg reward -0.013525, total steps 113920, episode step 128\n",
|
|
"[2018-02-18 14:56:27,589] episode 890, reward 0.000308, avg reward -0.013525, total steps 113920, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:56:27,590] Testing...\n",
|
|
"INFO:gym:Avg reward -0.015217(0.000000)\n",
|
|
"[2018-02-18 14:56:28,024] Avg reward -0.015217(0.000000)\n",
|
|
"INFO:gym:episode 891, reward -0.051524, avg reward -0.014020, total steps 114048, episode step 128\n",
|
|
"[2018-02-18 14:56:30,132] episode 891, reward -0.051524, avg reward -0.014020, total steps 114048, episode step 128\n",
|
|
"INFO:gym:episode 892, reward -0.005786, avg reward -0.013664, total steps 114176, episode step 128\n",
|
|
"[2018-02-18 14:56:32,329] episode 892, reward -0.005786, avg reward -0.013664, total steps 114176, episode step 128\n",
|
|
"INFO:gym:episode 893, reward -0.006061, avg reward -0.013602, total steps 114304, episode step 128\n",
|
|
"[2018-02-18 14:56:34,314] episode 893, reward -0.006061, avg reward -0.013602, total steps 114304, episode step 128\n",
|
|
"INFO:gym:episode 894, reward -0.003957, avg reward -0.013612, total steps 114432, episode step 128\n",
|
|
"[2018-02-18 14:56:36,148] episode 894, reward -0.003957, avg reward -0.013612, total steps 114432, episode step 128\n",
|
|
"INFO:gym:episode 895, reward -0.045540, avg reward -0.014023, total steps 114560, episode step 128\n",
|
|
"[2018-02-18 14:56:37,906] episode 895, reward -0.045540, avg reward -0.014023, total steps 114560, episode step 128\n",
|
|
"INFO:gym:episode 896, reward 0.001261, avg reward -0.013959, total steps 114688, episode step 128\n",
|
|
"[2018-02-18 14:56:39,662] episode 896, reward 0.001261, avg reward -0.013959, total steps 114688, episode step 128\n",
|
|
"INFO:gym:episode 897, reward -0.008243, avg reward -0.014213, total steps 114816, episode step 128\n",
|
|
"[2018-02-18 14:56:41,406] episode 897, reward -0.008243, avg reward -0.014213, total steps 114816, episode step 128\n",
|
|
"INFO:gym:episode 898, reward -0.006422, avg reward -0.014205, total steps 114944, episode step 128\n",
|
|
"[2018-02-18 14:56:43,226] episode 898, reward -0.006422, avg reward -0.014205, total steps 114944, episode step 128\n",
|
|
"INFO:gym:episode 899, reward -0.000544, avg reward -0.014193, total steps 115072, episode step 128\n",
|
|
"[2018-02-18 14:56:45,425] episode 899, reward -0.000544, avg reward -0.014193, total steps 115072, episode step 128\n",
|
|
"INFO:gym:episode 900, reward -0.003183, avg reward -0.013888, total steps 115200, episode step 128\n",
|
|
"[2018-02-18 14:56:47,311] episode 900, reward -0.003183, avg reward -0.013888, total steps 115200, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:56:47,312] Testing...\n",
|
|
"INFO:gym:Avg reward -0.032204(0.000000)\n",
|
|
"[2018-02-18 14:56:47,649] Avg reward -0.032204(0.000000)\n",
|
|
"INFO:gym:episode 901, reward -0.002245, avg reward -0.013921, total steps 115328, episode step 128\n",
|
|
"[2018-02-18 14:56:50,060] episode 901, reward -0.002245, avg reward -0.013921, total steps 115328, episode step 128\n",
|
|
"INFO:gym:episode 902, reward -0.001920, avg reward -0.013475, total steps 115456, episode step 128\n",
|
|
"[2018-02-18 14:56:52,095] episode 902, reward -0.001920, avg reward -0.013475, total steps 115456, episode step 128\n",
|
|
"INFO:gym:episode 903, reward -0.017643, avg reward -0.013497, total steps 115584, episode step 128\n",
|
|
"[2018-02-18 14:56:54,740] episode 903, reward -0.017643, avg reward -0.013497, total steps 115584, episode step 128\n",
|
|
"INFO:gym:episode 904, reward -0.009782, avg reward -0.013546, total steps 115712, episode step 128\n",
|
|
"[2018-02-18 14:56:56,882] episode 904, reward -0.009782, avg reward -0.013546, total steps 115712, episode step 128\n",
|
|
"INFO:gym:episode 905, reward -0.003955, avg reward -0.013569, total steps 115840, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:56:58,932] episode 905, reward -0.003955, avg reward -0.013569, total steps 115840, episode step 128\n",
|
|
"INFO:gym:episode 906, reward -0.000525, avg reward -0.013285, total steps 115968, episode step 128\n",
|
|
"[2018-02-18 14:57:01,085] episode 906, reward -0.000525, avg reward -0.013285, total steps 115968, episode step 128\n",
|
|
"INFO:gym:episode 907, reward -0.004148, avg reward -0.013309, total steps 116096, episode step 128\n",
|
|
"[2018-02-18 14:57:03,614] episode 907, reward -0.004148, avg reward -0.013309, total steps 116096, episode step 128\n",
|
|
"INFO:gym:episode 908, reward -0.001964, avg reward -0.013146, total steps 116224, episode step 128\n",
|
|
"[2018-02-18 14:57:06,346] episode 908, reward -0.001964, avg reward -0.013146, total steps 116224, episode step 128\n",
|
|
"INFO:gym:episode 909, reward -0.016438, avg reward -0.013210, total steps 116352, episode step 128\n",
|
|
"[2018-02-18 14:57:09,363] episode 909, reward -0.016438, avg reward -0.013210, total steps 116352, episode step 128\n",
|
|
"INFO:gym:episode 910, reward -0.005146, avg reward -0.012772, total steps 116480, episode step 128\n",
|
|
"[2018-02-18 14:57:11,947] episode 910, reward -0.005146, avg reward -0.012772, total steps 116480, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:57:11,948] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002544(0.000000)\n",
|
|
"[2018-02-18 14:57:12,280] Avg reward -0.002544(0.000000)\n",
|
|
"INFO:gym:episode 911, reward -0.002045, avg reward -0.012776, total steps 116608, episode step 128\n",
|
|
"[2018-02-18 14:57:15,218] episode 911, reward -0.002045, avg reward -0.012776, total steps 116608, episode step 128\n",
|
|
"INFO:gym:episode 912, reward -0.001643, avg reward -0.012769, total steps 116736, episode step 128\n",
|
|
"[2018-02-18 14:57:18,088] episode 912, reward -0.001643, avg reward -0.012769, total steps 116736, episode step 128\n",
|
|
"INFO:gym:episode 913, reward -0.030137, avg reward -0.013088, total steps 116864, episode step 128\n",
|
|
"[2018-02-18 14:57:21,497] episode 913, reward -0.030137, avg reward -0.013088, total steps 116864, episode step 128\n",
|
|
"INFO:gym:episode 914, reward -0.020947, avg reward -0.012861, total steps 116992, episode step 128\n",
|
|
"[2018-02-18 14:57:25,579] episode 914, reward -0.020947, avg reward -0.012861, total steps 116992, episode step 128\n",
|
|
"INFO:gym:episode 915, reward -0.007941, avg reward -0.012815, total steps 117120, episode step 128\n",
|
|
"[2018-02-18 14:57:29,141] episode 915, reward -0.007941, avg reward -0.012815, total steps 117120, episode step 128\n",
|
|
"INFO:gym:episode 916, reward -0.064858, avg reward -0.013281, total steps 117248, episode step 128\n",
|
|
"[2018-02-18 14:57:32,737] episode 916, reward -0.064858, avg reward -0.013281, total steps 117248, episode step 128\n",
|
|
"INFO:gym:episode 917, reward -0.025248, avg reward -0.013174, total steps 117376, episode step 128\n",
|
|
"[2018-02-18 14:57:36,814] episode 917, reward -0.025248, avg reward -0.013174, total steps 117376, episode step 128\n",
|
|
"INFO:gym:episode 918, reward -0.010471, avg reward -0.013284, total steps 117504, episode step 128\n",
|
|
"[2018-02-18 14:57:40,788] episode 918, reward -0.010471, avg reward -0.013284, total steps 117504, episode step 128\n",
|
|
"INFO:gym:episode 919, reward -0.001675, avg reward -0.013201, total steps 117632, episode step 128\n",
|
|
"[2018-02-18 14:57:44,758] episode 919, reward -0.001675, avg reward -0.013201, total steps 117632, episode step 128\n",
|
|
"INFO:gym:episode 920, reward -0.013848, avg reward -0.013308, total steps 117760, episode step 128\n",
|
|
"[2018-02-18 14:57:48,812] episode 920, reward -0.013848, avg reward -0.013308, total steps 117760, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:57:48,817] Testing...\n",
|
|
"INFO:gym:Avg reward -0.018410(0.000000)\n",
|
|
"[2018-02-18 14:57:49,166] Avg reward -0.018410(0.000000)\n",
|
|
"INFO:gym:episode 921, reward -0.002002, avg reward -0.013216, total steps 117888, episode step 128\n",
|
|
"[2018-02-18 14:57:53,642] episode 921, reward -0.002002, avg reward -0.013216, total steps 117888, episode step 128\n",
|
|
"INFO:gym:episode 922, reward -0.003889, avg reward -0.013186, total steps 118016, episode step 128\n",
|
|
"[2018-02-18 14:57:58,098] episode 922, reward -0.003889, avg reward -0.013186, total steps 118016, episode step 128\n",
|
|
"INFO:gym:episode 923, reward -0.001746, avg reward -0.012936, total steps 118144, episode step 128\n",
|
|
"[2018-02-18 14:58:02,608] episode 923, reward -0.001746, avg reward -0.012936, total steps 118144, episode step 128\n",
|
|
"INFO:gym:episode 924, reward -0.061860, avg reward -0.013454, total steps 118272, episode step 128\n",
|
|
"[2018-02-18 14:58:07,541] episode 924, reward -0.061860, avg reward -0.013454, total steps 118272, episode step 128\n",
|
|
"INFO:gym:episode 925, reward -0.000715, avg reward -0.013285, total steps 118400, episode step 128\n",
|
|
"[2018-02-18 14:58:12,486] episode 925, reward -0.000715, avg reward -0.013285, total steps 118400, episode step 128\n",
|
|
"INFO:gym:episode 926, reward -0.009079, avg reward -0.013260, total steps 118528, episode step 128\n",
|
|
"[2018-02-18 14:58:17,303] episode 926, reward -0.009079, avg reward -0.013260, total steps 118528, episode step 128\n",
|
|
"INFO:gym:episode 927, reward -0.010518, avg reward -0.013196, total steps 118656, episode step 128\n",
|
|
"[2018-02-18 14:58:22,165] episode 927, reward -0.010518, avg reward -0.013196, total steps 118656, episode step 128\n",
|
|
"INFO:gym:episode 928, reward -0.002528, avg reward -0.013048, total steps 118784, episode step 128\n",
|
|
"[2018-02-18 14:58:27,226] episode 928, reward -0.002528, avg reward -0.013048, total steps 118784, episode step 128\n",
|
|
"INFO:gym:episode 929, reward -0.002909, avg reward -0.012899, total steps 118912, episode step 128\n",
|
|
"[2018-02-18 14:58:32,310] episode 929, reward -0.002909, avg reward -0.012899, total steps 118912, episode step 128\n",
|
|
"INFO:gym:episode 930, reward -0.053623, avg reward -0.013417, total steps 119040, episode step 128\n",
|
|
"[2018-02-18 14:58:37,374] episode 930, reward -0.053623, avg reward -0.013417, total steps 119040, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:58:37,380] Testing...\n",
|
|
"INFO:gym:Avg reward -0.018777(0.000000)\n",
|
|
"[2018-02-18 14:58:37,813] Avg reward -0.018777(0.000000)\n",
|
|
"INFO:gym:episode 931, reward -0.001412, avg reward -0.013116, total steps 119168, episode step 128\n",
|
|
"[2018-02-18 14:58:42,508] episode 931, reward -0.001412, avg reward -0.013116, total steps 119168, episode step 128\n",
|
|
"INFO:gym:episode 932, reward -0.024473, avg reward -0.012890, total steps 119296, episode step 128\n",
|
|
"[2018-02-18 14:58:47,533] episode 932, reward -0.024473, avg reward -0.012890, total steps 119296, episode step 128\n",
|
|
"INFO:gym:episode 933, reward -0.002393, avg reward -0.012788, total steps 119424, episode step 128\n",
|
|
"[2018-02-18 14:58:52,987] episode 933, reward -0.002393, avg reward -0.012788, total steps 119424, episode step 128\n",
|
|
"INFO:gym:episode 934, reward -0.020316, avg reward -0.012773, total steps 119552, episode step 128\n",
|
|
"[2018-02-18 14:58:58,749] episode 934, reward -0.020316, avg reward -0.012773, total steps 119552, episode step 128\n",
|
|
"INFO:gym:episode 935, reward -0.001992, avg reward -0.012362, total steps 119680, episode step 128\n",
|
|
"[2018-02-18 14:59:05,303] episode 935, reward -0.001992, avg reward -0.012362, total steps 119680, episode step 128\n",
|
|
"INFO:gym:episode 936, reward -0.018390, avg reward -0.012465, total steps 119808, episode step 128\n",
|
|
"[2018-02-18 14:59:12,463] episode 936, reward -0.018390, avg reward -0.012465, total steps 119808, episode step 128\n",
|
|
"INFO:gym:episode 937, reward -0.026770, avg reward -0.012848, total steps 119936, episode step 128\n",
|
|
"[2018-02-18 14:59:19,343] episode 937, reward -0.026770, avg reward -0.012848, total steps 119936, episode step 128\n",
|
|
"INFO:gym:episode 938, reward -0.021928, avg reward -0.013049, total steps 120064, episode step 128\n",
|
|
"[2018-02-18 14:59:25,257] episode 938, reward -0.021928, avg reward -0.013049, total steps 120064, episode step 128\n",
|
|
"INFO:gym:episode 939, reward -0.005672, avg reward -0.013033, total steps 120192, episode step 128\n",
|
|
"[2018-02-18 14:59:31,067] episode 939, reward -0.005672, avg reward -0.013033, total steps 120192, episode step 128\n",
|
|
"INFO:gym:episode 940, reward -0.013033, avg reward -0.013151, total steps 120320, episode step 128\n",
|
|
"[2018-02-18 14:59:36,600] episode 940, reward -0.013033, avg reward -0.013151, total steps 120320, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 14:59:36,601] Testing...\n",
|
|
"INFO:gym:Avg reward -0.011749(0.000000)\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 14:59:37,058] Avg reward -0.011749(0.000000)\n",
|
|
"INFO:gym:episode 941, reward -0.005650, avg reward -0.012702, total steps 120448, episode step 128\n",
|
|
"[2018-02-18 14:59:43,131] episode 941, reward -0.005650, avg reward -0.012702, total steps 120448, episode step 128\n",
|
|
"INFO:gym:episode 942, reward -0.001795, avg reward -0.012719, total steps 120576, episode step 128\n",
|
|
"[2018-02-18 14:59:48,304] episode 942, reward -0.001795, avg reward -0.012719, total steps 120576, episode step 128\n",
|
|
"INFO:gym:episode 943, reward -0.011107, avg reward -0.012515, total steps 120704, episode step 128\n",
|
|
"[2018-02-18 14:59:52,482] episode 943, reward -0.011107, avg reward -0.012515, total steps 120704, episode step 128\n",
|
|
"INFO:gym:episode 944, reward -0.010113, avg reward -0.012411, total steps 120832, episode step 128\n",
|
|
"[2018-02-18 14:59:56,368] episode 944, reward -0.010113, avg reward -0.012411, total steps 120832, episode step 128\n",
|
|
"INFO:gym:episode 945, reward -0.006377, avg reward -0.012371, total steps 120960, episode step 128\n",
|
|
"[2018-02-18 15:00:00,461] episode 945, reward -0.006377, avg reward -0.012371, total steps 120960, episode step 128\n",
|
|
"INFO:gym:episode 946, reward 0.001148, avg reward -0.011972, total steps 121088, episode step 128\n",
|
|
"[2018-02-18 15:00:05,111] episode 946, reward 0.001148, avg reward -0.011972, total steps 121088, episode step 128\n",
|
|
"INFO:gym:episode 947, reward -0.001806, avg reward -0.012033, total steps 121216, episode step 128\n",
|
|
"[2018-02-18 15:00:10,152] episode 947, reward -0.001806, avg reward -0.012033, total steps 121216, episode step 128\n",
|
|
"INFO:gym:episode 948, reward -0.078797, avg reward -0.012805, total steps 121344, episode step 128\n",
|
|
"[2018-02-18 15:00:15,367] episode 948, reward -0.078797, avg reward -0.012805, total steps 121344, episode step 128\n",
|
|
"INFO:gym:episode 949, reward -0.003596, avg reward -0.012738, total steps 121472, episode step 128\n",
|
|
"[2018-02-18 15:00:20,890] episode 949, reward -0.003596, avg reward -0.012738, total steps 121472, episode step 128\n",
|
|
"INFO:gym:episode 950, reward -0.001773, avg reward -0.012736, total steps 121600, episode step 128\n",
|
|
"[2018-02-18 15:00:26,317] episode 950, reward -0.001773, avg reward -0.012736, total steps 121600, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:00:26,318] Testing...\n",
|
|
"INFO:gym:Avg reward -0.012669(0.000000)\n",
|
|
"[2018-02-18 15:00:26,696] Avg reward -0.012669(0.000000)\n",
|
|
"INFO:gym:episode 951, reward -0.054941, avg reward -0.012850, total steps 121728, episode step 128\n",
|
|
"[2018-02-18 15:00:31,657] episode 951, reward -0.054941, avg reward -0.012850, total steps 121728, episode step 128\n",
|
|
"INFO:gym:episode 952, reward 0.000293, avg reward -0.012805, total steps 121856, episode step 128\n",
|
|
"[2018-02-18 15:00:36,533] episode 952, reward 0.000293, avg reward -0.012805, total steps 121856, episode step 128\n",
|
|
"INFO:gym:episode 953, reward -0.001742, avg reward -0.012773, total steps 121984, episode step 128\n",
|
|
"[2018-02-18 15:00:40,531] episode 953, reward -0.001742, avg reward -0.012773, total steps 121984, episode step 128\n",
|
|
"INFO:gym:episode 954, reward -0.002030, avg reward -0.012668, total steps 122112, episode step 128\n",
|
|
"[2018-02-18 15:00:44,683] episode 954, reward -0.002030, avg reward -0.012668, total steps 122112, episode step 128\n",
|
|
"INFO:gym:episode 955, reward -0.045029, avg reward -0.012971, total steps 122240, episode step 128\n",
|
|
"[2018-02-18 15:00:49,428] episode 955, reward -0.045029, avg reward -0.012971, total steps 122240, episode step 128\n",
|
|
"INFO:gym:episode 956, reward -0.004233, avg reward -0.012998, total steps 122368, episode step 128\n",
|
|
"[2018-02-18 15:00:53,875] episode 956, reward -0.004233, avg reward -0.012998, total steps 122368, episode step 128\n",
|
|
"INFO:gym:episode 957, reward -0.001748, avg reward -0.012977, total steps 122496, episode step 128\n",
|
|
"[2018-02-18 15:00:58,242] episode 957, reward -0.001748, avg reward -0.012977, total steps 122496, episode step 128\n",
|
|
"INFO:gym:episode 958, reward -0.001938, avg reward -0.012895, total steps 122624, episode step 128\n",
|
|
"[2018-02-18 15:01:02,576] episode 958, reward -0.001938, avg reward -0.012895, total steps 122624, episode step 128\n",
|
|
"INFO:gym:episode 959, reward -0.002593, avg reward -0.012747, total steps 122752, episode step 128\n",
|
|
"[2018-02-18 15:01:05,910] episode 959, reward -0.002593, avg reward -0.012747, total steps 122752, episode step 128\n",
|
|
"INFO:gym:episode 960, reward -0.003557, avg reward -0.012752, total steps 122880, episode step 128\n",
|
|
"[2018-02-18 15:01:07,737] episode 960, reward -0.003557, avg reward -0.012752, total steps 122880, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:01:07,743] Testing...\n",
|
|
"INFO:gym:Avg reward -0.011457(0.000000)\n",
|
|
"[2018-02-18 15:01:08,083] Avg reward -0.011457(0.000000)\n",
|
|
"INFO:gym:episode 961, reward -0.013238, avg reward -0.012857, total steps 123008, episode step 128\n",
|
|
"[2018-02-18 15:01:09,995] episode 961, reward -0.013238, avg reward -0.012857, total steps 123008, episode step 128\n",
|
|
"INFO:gym:episode 962, reward -0.002903, avg reward -0.012809, total steps 123136, episode step 128\n",
|
|
"[2018-02-18 15:01:11,912] episode 962, reward -0.002903, avg reward -0.012809, total steps 123136, episode step 128\n",
|
|
"INFO:gym:episode 963, reward -0.006472, avg reward -0.012810, total steps 123264, episode step 128\n",
|
|
"[2018-02-18 15:01:13,773] episode 963, reward -0.006472, avg reward -0.012810, total steps 123264, episode step 128\n",
|
|
"INFO:gym:episode 964, reward -0.013605, avg reward -0.012883, total steps 123392, episode step 128\n",
|
|
"[2018-02-18 15:01:15,685] episode 964, reward -0.013605, avg reward -0.012883, total steps 123392, episode step 128\n",
|
|
"INFO:gym:episode 965, reward -0.013370, avg reward -0.012975, total steps 123520, episode step 128\n",
|
|
"[2018-02-18 15:01:17,554] episode 965, reward -0.013370, avg reward -0.012975, total steps 123520, episode step 128\n",
|
|
"INFO:gym:episode 966, reward -0.003768, avg reward -0.012915, total steps 123648, episode step 128\n",
|
|
"[2018-02-18 15:01:19,581] episode 966, reward -0.003768, avg reward -0.012915, total steps 123648, episode step 128\n",
|
|
"INFO:gym:episode 967, reward -0.003104, avg reward -0.012930, total steps 123776, episode step 128\n",
|
|
"[2018-02-18 15:01:21,738] episode 967, reward -0.003104, avg reward -0.012930, total steps 123776, episode step 128\n",
|
|
"INFO:gym:episode 968, reward -0.013762, avg reward -0.013050, total steps 123904, episode step 128\n",
|
|
"[2018-02-18 15:01:23,873] episode 968, reward -0.013762, avg reward -0.013050, total steps 123904, episode step 128\n",
|
|
"INFO:gym:episode 969, reward -0.005062, avg reward -0.013072, total steps 124032, episode step 128\n",
|
|
"[2018-02-18 15:01:25,955] episode 969, reward -0.005062, avg reward -0.013072, total steps 124032, episode step 128\n",
|
|
"INFO:gym:episode 970, reward -0.003214, avg reward -0.013072, total steps 124160, episode step 128\n",
|
|
"[2018-02-18 15:01:27,979] episode 970, reward -0.003214, avg reward -0.013072, total steps 124160, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:01:27,981] Testing...\n",
|
|
"INFO:gym:Avg reward -0.017773(0.000000)\n",
|
|
"[2018-02-18 15:01:28,326] Avg reward -0.017773(0.000000)\n",
|
|
"INFO:gym:episode 971, reward -0.012609, avg reward -0.012606, total steps 124288, episode step 128\n",
|
|
"[2018-02-18 15:01:30,293] episode 971, reward -0.012609, avg reward -0.012606, total steps 124288, episode step 128\n",
|
|
"INFO:gym:episode 972, reward -0.005544, avg reward -0.012419, total steps 124416, episode step 128\n",
|
|
"[2018-02-18 15:01:32,582] episode 972, reward -0.005544, avg reward -0.012419, total steps 124416, episode step 128\n",
|
|
"INFO:gym:episode 973, reward -0.013286, avg reward -0.012513, total steps 124544, episode step 128\n",
|
|
"[2018-02-18 15:01:34,646] episode 973, reward -0.013286, avg reward -0.012513, total steps 124544, episode step 128\n",
|
|
"INFO:gym:episode 974, reward -0.051981, avg reward -0.013019, total steps 124672, episode step 128\n",
|
|
"[2018-02-18 15:01:36,551] episode 974, reward -0.051981, avg reward -0.013019, total steps 124672, episode step 128\n",
|
|
"INFO:gym:episode 975, reward -0.002108, avg reward -0.013020, total steps 124800, episode step 128\n",
|
|
"[2018-02-18 15:01:38,502] episode 975, reward -0.002108, avg reward -0.013020, total steps 124800, episode step 128\n",
|
|
"INFO:gym:episode 976, reward -0.001473, avg reward -0.011906, total steps 124928, episode step 128\n",
|
|
"[2018-02-18 15:01:40,738] episode 976, reward -0.001473, avg reward -0.011906, total steps 124928, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:episode 977, reward -0.007049, avg reward -0.011944, total steps 125056, episode step 128\n",
|
|
"[2018-02-18 15:01:43,119] episode 977, reward -0.007049, avg reward -0.011944, total steps 125056, episode step 128\n",
|
|
"INFO:gym:episode 978, reward -0.002130, avg reward -0.011840, total steps 125184, episode step 128\n",
|
|
"[2018-02-18 15:01:45,436] episode 978, reward -0.002130, avg reward -0.011840, total steps 125184, episode step 128\n",
|
|
"INFO:gym:episode 979, reward -0.013441, avg reward -0.011956, total steps 125312, episode step 128\n",
|
|
"[2018-02-18 15:01:47,728] episode 979, reward -0.013441, avg reward -0.011956, total steps 125312, episode step 128\n",
|
|
"INFO:gym:episode 980, reward -0.012824, avg reward -0.012069, total steps 125440, episode step 128\n",
|
|
"[2018-02-18 15:01:50,098] episode 980, reward -0.012824, avg reward -0.012069, total steps 125440, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:01:50,099] Testing...\n",
|
|
"INFO:gym:Avg reward -0.011679(0.000000)\n",
|
|
"[2018-02-18 15:01:50,468] Avg reward -0.011679(0.000000)\n",
|
|
"INFO:gym:episode 981, reward -0.020800, avg reward -0.012038, total steps 125568, episode step 128\n",
|
|
"[2018-02-18 15:01:52,961] episode 981, reward -0.020800, avg reward -0.012038, total steps 125568, episode step 128\n",
|
|
"INFO:gym:episode 982, reward -0.023247, avg reward -0.012208, total steps 125696, episode step 128\n",
|
|
"[2018-02-18 15:01:55,541] episode 982, reward -0.023247, avg reward -0.012208, total steps 125696, episode step 128\n",
|
|
"INFO:gym:episode 983, reward -0.040415, avg reward -0.012586, total steps 125824, episode step 128\n",
|
|
"[2018-02-18 15:01:58,181] episode 983, reward -0.040415, avg reward -0.012586, total steps 125824, episode step 128\n",
|
|
"INFO:gym:episode 984, reward -0.003655, avg reward -0.012353, total steps 125952, episode step 128\n",
|
|
"[2018-02-18 15:02:01,010] episode 984, reward -0.003655, avg reward -0.012353, total steps 125952, episode step 128\n",
|
|
"INFO:gym:episode 985, reward -0.002546, avg reward -0.012425, total steps 126080, episode step 128\n",
|
|
"[2018-02-18 15:02:03,795] episode 985, reward -0.002546, avg reward -0.012425, total steps 126080, episode step 128\n",
|
|
"INFO:gym:episode 986, reward -0.014597, avg reward -0.012321, total steps 126208, episode step 128\n",
|
|
"[2018-02-18 15:02:06,676] episode 986, reward -0.014597, avg reward -0.012321, total steps 126208, episode step 128\n",
|
|
"INFO:gym:episode 987, reward -0.018601, avg reward -0.012437, total steps 126336, episode step 128\n",
|
|
"[2018-02-18 15:02:09,629] episode 987, reward -0.018601, avg reward -0.012437, total steps 126336, episode step 128\n",
|
|
"INFO:gym:episode 988, reward -0.005238, avg reward -0.012279, total steps 126464, episode step 128\n",
|
|
"[2018-02-18 15:02:12,350] episode 988, reward -0.005238, avg reward -0.012279, total steps 126464, episode step 128\n",
|
|
"INFO:gym:episode 989, reward -0.002246, avg reward -0.012272, total steps 126592, episode step 128\n",
|
|
"[2018-02-18 15:02:15,288] episode 989, reward -0.002246, avg reward -0.012272, total steps 126592, episode step 128\n",
|
|
"INFO:gym:episode 990, reward -0.001995, avg reward -0.012295, total steps 126720, episode step 128\n",
|
|
"[2018-02-18 15:02:18,270] episode 990, reward -0.001995, avg reward -0.012295, total steps 126720, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:02:18,273] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001264(0.000000)\n",
|
|
"[2018-02-18 15:02:18,639] Avg reward -0.001264(0.000000)\n",
|
|
"INFO:gym:episode 991, reward -0.000564, avg reward -0.011785, total steps 126848, episode step 128\n",
|
|
"[2018-02-18 15:02:21,627] episode 991, reward -0.000564, avg reward -0.011785, total steps 126848, episode step 128\n",
|
|
"INFO:gym:episode 992, reward -0.000351, avg reward -0.011731, total steps 126976, episode step 128\n",
|
|
"[2018-02-18 15:02:24,820] episode 992, reward -0.000351, avg reward -0.011731, total steps 126976, episode step 128\n",
|
|
"INFO:gym:episode 993, reward -0.001719, avg reward -0.011688, total steps 127104, episode step 128\n",
|
|
"[2018-02-18 15:02:27,882] episode 993, reward -0.001719, avg reward -0.011688, total steps 127104, episode step 128\n",
|
|
"INFO:gym:episode 994, reward -0.001975, avg reward -0.011668, total steps 127232, episode step 128\n",
|
|
"[2018-02-18 15:02:31,015] episode 994, reward -0.001975, avg reward -0.011668, total steps 127232, episode step 128\n",
|
|
"INFO:gym:episode 995, reward -0.008877, avg reward -0.011301, total steps 127360, episode step 128\n",
|
|
"[2018-02-18 15:02:34,308] episode 995, reward -0.008877, avg reward -0.011301, total steps 127360, episode step 128\n",
|
|
"INFO:gym:episode 996, reward -0.006798, avg reward -0.011382, total steps 127488, episode step 128\n",
|
|
"[2018-02-18 15:02:37,918] episode 996, reward -0.006798, avg reward -0.011382, total steps 127488, episode step 128\n",
|
|
"INFO:gym:episode 997, reward -0.023928, avg reward -0.011539, total steps 127616, episode step 128\n",
|
|
"[2018-02-18 15:02:41,765] episode 997, reward -0.023928, avg reward -0.011539, total steps 127616, episode step 128\n",
|
|
"INFO:gym:episode 998, reward -0.040226, avg reward -0.011877, total steps 127744, episode step 128\n",
|
|
"[2018-02-18 15:02:45,556] episode 998, reward -0.040226, avg reward -0.011877, total steps 127744, episode step 128\n",
|
|
"INFO:gym:episode 999, reward -0.001834, avg reward -0.011890, total steps 127872, episode step 128\n",
|
|
"[2018-02-18 15:02:49,063] episode 999, reward -0.001834, avg reward -0.011890, total steps 127872, episode step 128\n",
|
|
"INFO:gym:episode 1000, reward -0.001759, avg reward -0.011875, total steps 128000, episode step 128\n",
|
|
"[2018-02-18 15:02:52,370] episode 1000, reward -0.001759, avg reward -0.011875, total steps 128000, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:02:52,376] Testing...\n",
|
|
"INFO:gym:Avg reward -0.034021(0.000000)\n",
|
|
"[2018-02-18 15:02:52,701] Avg reward -0.034021(0.000000)\n",
|
|
"INFO:gym:episode 1001, reward -0.001797, avg reward -0.011871, total steps 128128, episode step 128\n",
|
|
"[2018-02-18 15:02:56,089] episode 1001, reward -0.001797, avg reward -0.011871, total steps 128128, episode step 128\n",
|
|
"INFO:gym:episode 1002, reward -0.032254, avg reward -0.012174, total steps 128256, episode step 128\n",
|
|
"[2018-02-18 15:02:59,956] episode 1002, reward -0.032254, avg reward -0.012174, total steps 128256, episode step 128\n",
|
|
"INFO:gym:episode 1003, reward -0.006450, avg reward -0.012062, total steps 128384, episode step 128\n",
|
|
"[2018-02-18 15:03:04,250] episode 1003, reward -0.006450, avg reward -0.012062, total steps 128384, episode step 128\n",
|
|
"INFO:gym:episode 1004, reward -0.006001, avg reward -0.012024, total steps 128512, episode step 128\n",
|
|
"[2018-02-18 15:03:08,556] episode 1004, reward -0.006001, avg reward -0.012024, total steps 128512, episode step 128\n",
|
|
"INFO:gym:episode 1005, reward -0.015635, avg reward -0.012141, total steps 128640, episode step 128\n",
|
|
"[2018-02-18 15:03:12,791] episode 1005, reward -0.015635, avg reward -0.012141, total steps 128640, episode step 128\n",
|
|
"INFO:gym:episode 1006, reward -0.013544, avg reward -0.012271, total steps 128768, episode step 128\n",
|
|
"[2018-02-18 15:03:17,010] episode 1006, reward -0.013544, avg reward -0.012271, total steps 128768, episode step 128\n",
|
|
"INFO:gym:episode 1007, reward -0.001945, avg reward -0.012249, total steps 128896, episode step 128\n",
|
|
"[2018-02-18 15:03:21,314] episode 1007, reward -0.001945, avg reward -0.012249, total steps 128896, episode step 128\n",
|
|
"INFO:gym:episode 1008, reward -0.003312, avg reward -0.012263, total steps 129024, episode step 128\n",
|
|
"[2018-02-18 15:03:25,868] episode 1008, reward -0.003312, avg reward -0.012263, total steps 129024, episode step 128\n",
|
|
"INFO:gym:episode 1009, reward -0.001492, avg reward -0.012113, total steps 129152, episode step 128\n",
|
|
"[2018-02-18 15:03:30,585] episode 1009, reward -0.001492, avg reward -0.012113, total steps 129152, episode step 128\n",
|
|
"INFO:gym:episode 1010, reward -0.034866, avg reward -0.012411, total steps 129280, episode step 128\n",
|
|
"[2018-02-18 15:03:35,099] episode 1010, reward -0.034866, avg reward -0.012411, total steps 129280, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:03:35,100] Testing...\n",
|
|
"INFO:gym:Avg reward -0.003703(0.000000)\n",
|
|
"[2018-02-18 15:03:35,446] Avg reward -0.003703(0.000000)\n",
|
|
"INFO:gym:episode 1011, reward -0.007499, avg reward -0.012465, total steps 129408, episode step 128\n",
|
|
"[2018-02-18 15:03:39,774] episode 1011, reward -0.007499, avg reward -0.012465, total steps 129408, episode step 128\n",
|
|
"INFO:gym:episode 1012, reward -0.022788, avg reward -0.012677, total steps 129536, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:03:43,939] episode 1012, reward -0.022788, avg reward -0.012677, total steps 129536, episode step 128\n",
|
|
"INFO:gym:episode 1013, reward -0.002022, avg reward -0.012395, total steps 129664, episode step 128\n",
|
|
"[2018-02-18 15:03:47,950] episode 1013, reward -0.002022, avg reward -0.012395, total steps 129664, episode step 128\n",
|
|
"INFO:gym:episode 1014, reward -0.002735, avg reward -0.012213, total steps 129792, episode step 128\n",
|
|
"[2018-02-18 15:03:51,782] episode 1014, reward -0.002735, avg reward -0.012213, total steps 129792, episode step 128\n",
|
|
"INFO:gym:episode 1015, reward -0.002955, avg reward -0.012163, total steps 129920, episode step 128\n",
|
|
"[2018-02-18 15:03:55,680] episode 1015, reward -0.002955, avg reward -0.012163, total steps 129920, episode step 128\n",
|
|
"INFO:gym:episode 1016, reward 0.002047, avg reward -0.011494, total steps 130048, episode step 128\n",
|
|
"[2018-02-18 15:03:59,437] episode 1016, reward 0.002047, avg reward -0.011494, total steps 130048, episode step 128\n",
|
|
"INFO:gym:episode 1017, reward -0.001783, avg reward -0.011260, total steps 130176, episode step 128\n",
|
|
"[2018-02-18 15:04:03,031] episode 1017, reward -0.001783, avg reward -0.011260, total steps 130176, episode step 128\n",
|
|
"INFO:gym:episode 1018, reward -0.000169, avg reward -0.011157, total steps 130304, episode step 128\n",
|
|
"[2018-02-18 15:04:06,695] episode 1018, reward -0.000169, avg reward -0.011157, total steps 130304, episode step 128\n",
|
|
"INFO:gym:episode 1019, reward -0.006848, avg reward -0.011208, total steps 130432, episode step 128\n",
|
|
"[2018-02-18 15:04:10,569] episode 1019, reward -0.006848, avg reward -0.011208, total steps 130432, episode step 128\n",
|
|
"INFO:gym:episode 1020, reward -0.005581, avg reward -0.011126, total steps 130560, episode step 128\n",
|
|
"[2018-02-18 15:04:14,324] episode 1020, reward -0.005581, avg reward -0.011126, total steps 130560, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:04:14,325] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001558(0.000000)\n",
|
|
"[2018-02-18 15:04:14,781] Avg reward -0.001558(0.000000)\n",
|
|
"INFO:gym:episode 1021, reward -0.019369, avg reward -0.011299, total steps 130688, episode step 128\n",
|
|
"[2018-02-18 15:04:18,841] episode 1021, reward -0.019369, avg reward -0.011299, total steps 130688, episode step 128\n",
|
|
"INFO:gym:episode 1022, reward -0.003583, avg reward -0.011296, total steps 130816, episode step 128\n",
|
|
"[2018-02-18 15:04:22,856] episode 1022, reward -0.003583, avg reward -0.011296, total steps 130816, episode step 128\n",
|
|
"INFO:gym:episode 1023, reward -0.001763, avg reward -0.011297, total steps 130944, episode step 128\n",
|
|
"[2018-02-18 15:04:26,437] episode 1023, reward -0.001763, avg reward -0.011297, total steps 130944, episode step 128\n",
|
|
"INFO:gym:episode 1024, reward -0.003580, avg reward -0.010714, total steps 131072, episode step 128\n",
|
|
"[2018-02-18 15:04:30,080] episode 1024, reward -0.003580, avg reward -0.010714, total steps 131072, episode step 128\n",
|
|
"INFO:gym:episode 1025, reward -0.011526, avg reward -0.010822, total steps 131200, episode step 128\n",
|
|
"[2018-02-18 15:04:33,633] episode 1025, reward -0.011526, avg reward -0.010822, total steps 131200, episode step 128\n",
|
|
"INFO:gym:episode 1026, reward -0.026917, avg reward -0.011000, total steps 131328, episode step 128\n",
|
|
"[2018-02-18 15:04:37,227] episode 1026, reward -0.026917, avg reward -0.011000, total steps 131328, episode step 128\n",
|
|
"INFO:gym:episode 1027, reward -0.001765, avg reward -0.010913, total steps 131456, episode step 128\n",
|
|
"[2018-02-18 15:04:40,802] episode 1027, reward -0.001765, avg reward -0.010913, total steps 131456, episode step 128\n",
|
|
"INFO:gym:episode 1028, reward -0.010314, avg reward -0.010991, total steps 131584, episode step 128\n",
|
|
"[2018-02-18 15:04:44,328] episode 1028, reward -0.010314, avg reward -0.010991, total steps 131584, episode step 128\n",
|
|
"INFO:gym:episode 1029, reward -0.001779, avg reward -0.010979, total steps 131712, episode step 128\n",
|
|
"[2018-02-18 15:04:47,893] episode 1029, reward -0.001779, avg reward -0.010979, total steps 131712, episode step 128\n",
|
|
"INFO:gym:episode 1030, reward -0.006709, avg reward -0.010510, total steps 131840, episode step 128\n",
|
|
"[2018-02-18 15:04:51,460] episode 1030, reward -0.006709, avg reward -0.010510, total steps 131840, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:04:51,461] Testing...\n",
|
|
"INFO:gym:Avg reward -0.055940(0.000000)\n",
|
|
"[2018-02-18 15:04:51,814] Avg reward -0.055940(0.000000)\n",
|
|
"INFO:gym:episode 1031, reward -0.003817, avg reward -0.010534, total steps 131968, episode step 128\n",
|
|
"[2018-02-18 15:04:55,397] episode 1031, reward -0.003817, avg reward -0.010534, total steps 131968, episode step 128\n",
|
|
"INFO:gym:episode 1032, reward -0.001441, avg reward -0.010304, total steps 132096, episode step 128\n",
|
|
"[2018-02-18 15:04:59,023] episode 1032, reward -0.001441, avg reward -0.010304, total steps 132096, episode step 128\n",
|
|
"INFO:gym:episode 1033, reward -0.001760, avg reward -0.010298, total steps 132224, episode step 128\n",
|
|
"[2018-02-18 15:05:02,770] episode 1033, reward -0.001760, avg reward -0.010298, total steps 132224, episode step 128\n",
|
|
"INFO:gym:episode 1034, reward -0.005279, avg reward -0.010147, total steps 132352, episode step 128\n",
|
|
"[2018-02-18 15:05:06,300] episode 1034, reward -0.005279, avg reward -0.010147, total steps 132352, episode step 128\n",
|
|
"INFO:gym:episode 1035, reward -0.002594, avg reward -0.010153, total steps 132480, episode step 128\n",
|
|
"[2018-02-18 15:05:09,841] episode 1035, reward -0.002594, avg reward -0.010153, total steps 132480, episode step 128\n",
|
|
"INFO:gym:episode 1036, reward -0.006299, avg reward -0.010032, total steps 132608, episode step 128\n",
|
|
"[2018-02-18 15:05:13,420] episode 1036, reward -0.006299, avg reward -0.010032, total steps 132608, episode step 128\n",
|
|
"INFO:gym:episode 1037, reward -0.001756, avg reward -0.009782, total steps 132736, episode step 128\n",
|
|
"[2018-02-18 15:05:16,941] episode 1037, reward -0.001756, avg reward -0.009782, total steps 132736, episode step 128\n",
|
|
"INFO:gym:episode 1038, reward -0.008849, avg reward -0.009651, total steps 132864, episode step 128\n",
|
|
"[2018-02-18 15:05:20,545] episode 1038, reward -0.008849, avg reward -0.009651, total steps 132864, episode step 128\n",
|
|
"INFO:gym:episode 1039, reward -0.019209, avg reward -0.009787, total steps 132992, episode step 128\n",
|
|
"[2018-02-18 15:05:24,295] episode 1039, reward -0.019209, avg reward -0.009787, total steps 132992, episode step 128\n",
|
|
"INFO:gym:episode 1040, reward -0.004683, avg reward -0.009703, total steps 133120, episode step 128\n",
|
|
"[2018-02-18 15:05:28,027] episode 1040, reward -0.004683, avg reward -0.009703, total steps 133120, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:05:28,035] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002308(0.000000)\n",
|
|
"[2018-02-18 15:05:28,385] Avg reward -0.002308(0.000000)\n",
|
|
"INFO:gym:episode 1041, reward -0.020468, avg reward -0.009851, total steps 133248, episode step 128\n",
|
|
"[2018-02-18 15:05:32,304] episode 1041, reward -0.020468, avg reward -0.009851, total steps 133248, episode step 128\n",
|
|
"INFO:gym:episode 1042, reward -0.002042, avg reward -0.009854, total steps 133376, episode step 128\n",
|
|
"[2018-02-18 15:05:36,140] episode 1042, reward -0.002042, avg reward -0.009854, total steps 133376, episode step 128\n",
|
|
"INFO:gym:episode 1043, reward -0.002481, avg reward -0.009768, total steps 133504, episode step 128\n",
|
|
"[2018-02-18 15:05:40,104] episode 1043, reward -0.002481, avg reward -0.009768, total steps 133504, episode step 128\n",
|
|
"INFO:gym:episode 1044, reward 0.012040, avg reward -0.009546, total steps 133632, episode step 128\n",
|
|
"[2018-02-18 15:05:44,205] episode 1044, reward 0.012040, avg reward -0.009546, total steps 133632, episode step 128\n",
|
|
"INFO:gym:episode 1045, reward -0.005660, avg reward -0.009539, total steps 133760, episode step 128\n",
|
|
"[2018-02-18 15:05:48,888] episode 1045, reward -0.005660, avg reward -0.009539, total steps 133760, episode step 128\n",
|
|
"INFO:gym:episode 1046, reward -0.002052, avg reward -0.009571, total steps 133888, episode step 128\n",
|
|
"[2018-02-18 15:05:51,700] episode 1046, reward -0.002052, avg reward -0.009571, total steps 133888, episode step 128\n",
|
|
"INFO:gym:episode 1047, reward -0.008184, avg reward -0.009635, total steps 134016, episode step 128\n",
|
|
"[2018-02-18 15:05:53,531] episode 1047, reward -0.008184, avg reward -0.009635, total steps 134016, episode step 128\n",
|
|
"INFO:gym:episode 1048, reward -0.004755, avg reward -0.008894, total steps 134144, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:05:55,346] episode 1048, reward -0.004755, avg reward -0.008894, total steps 134144, episode step 128\n",
|
|
"INFO:gym:episode 1049, reward -0.046843, avg reward -0.009327, total steps 134272, episode step 128\n",
|
|
"[2018-02-18 15:05:57,194] episode 1049, reward -0.046843, avg reward -0.009327, total steps 134272, episode step 128\n",
|
|
"INFO:gym:episode 1050, reward -0.015920, avg reward -0.009468, total steps 134400, episode step 128\n",
|
|
"[2018-02-18 15:05:59,278] episode 1050, reward -0.015920, avg reward -0.009468, total steps 134400, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:05:59,280] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001897(0.000000)\n",
|
|
"[2018-02-18 15:05:59,597] Avg reward -0.001897(0.000000)\n",
|
|
"INFO:gym:episode 1051, reward -0.001559, avg reward -0.008934, total steps 134528, episode step 128\n",
|
|
"[2018-02-18 15:06:01,396] episode 1051, reward -0.001559, avg reward -0.008934, total steps 134528, episode step 128\n",
|
|
"INFO:gym:episode 1052, reward 0.013384, avg reward -0.008803, total steps 134656, episode step 128\n",
|
|
"[2018-02-18 15:06:03,198] episode 1052, reward 0.013384, avg reward -0.008803, total steps 134656, episode step 128\n",
|
|
"INFO:gym:episode 1053, reward -0.001754, avg reward -0.008804, total steps 134784, episode step 128\n",
|
|
"[2018-02-18 15:06:05,018] episode 1053, reward -0.001754, avg reward -0.008804, total steps 134784, episode step 128\n",
|
|
"INFO:gym:episode 1054, reward -0.007158, avg reward -0.008855, total steps 134912, episode step 128\n",
|
|
"[2018-02-18 15:06:06,801] episode 1054, reward -0.007158, avg reward -0.008855, total steps 134912, episode step 128\n",
|
|
"INFO:gym:episode 1055, reward -0.042005, avg reward -0.008825, total steps 135040, episode step 128\n",
|
|
"[2018-02-18 15:06:08,613] episode 1055, reward -0.042005, avg reward -0.008825, total steps 135040, episode step 128\n",
|
|
"INFO:gym:episode 1056, reward -0.021693, avg reward -0.008999, total steps 135168, episode step 128\n",
|
|
"[2018-02-18 15:06:10,505] episode 1056, reward -0.021693, avg reward -0.008999, total steps 135168, episode step 128\n",
|
|
"INFO:gym:episode 1057, reward -0.001095, avg reward -0.008993, total steps 135296, episode step 128\n",
|
|
"[2018-02-18 15:06:12,378] episode 1057, reward -0.001095, avg reward -0.008993, total steps 135296, episode step 128\n",
|
|
"INFO:gym:episode 1058, reward -0.004259, avg reward -0.009016, total steps 135424, episode step 128\n",
|
|
"[2018-02-18 15:06:14,240] episode 1058, reward -0.004259, avg reward -0.009016, total steps 135424, episode step 128\n",
|
|
"INFO:gym:episode 1059, reward -0.014957, avg reward -0.009140, total steps 135552, episode step 128\n",
|
|
"[2018-02-18 15:06:16,084] episode 1059, reward -0.014957, avg reward -0.009140, total steps 135552, episode step 128\n",
|
|
"INFO:gym:episode 1060, reward -0.003318, avg reward -0.009137, total steps 135680, episode step 128\n",
|
|
"[2018-02-18 15:06:17,946] episode 1060, reward -0.003318, avg reward -0.009137, total steps 135680, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:06:17,947] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001032(0.000000)\n",
|
|
"[2018-02-18 15:06:18,292] Avg reward -0.001032(0.000000)\n",
|
|
"INFO:gym:episode 1061, reward -0.015579, avg reward -0.009161, total steps 135808, episode step 128\n",
|
|
"[2018-02-18 15:06:20,257] episode 1061, reward -0.015579, avg reward -0.009161, total steps 135808, episode step 128\n",
|
|
"INFO:gym:episode 1062, reward -0.007778, avg reward -0.009209, total steps 135936, episode step 128\n",
|
|
"[2018-02-18 15:06:22,148] episode 1062, reward -0.007778, avg reward -0.009209, total steps 135936, episode step 128\n",
|
|
"INFO:gym:episode 1063, reward -0.012851, avg reward -0.009273, total steps 136064, episode step 128\n",
|
|
"[2018-02-18 15:06:24,130] episode 1063, reward -0.012851, avg reward -0.009273, total steps 136064, episode step 128\n",
|
|
"INFO:gym:episode 1064, reward -0.002902, avg reward -0.009166, total steps 136192, episode step 128\n",
|
|
"[2018-02-18 15:06:26,095] episode 1064, reward -0.002902, avg reward -0.009166, total steps 136192, episode step 128\n",
|
|
"INFO:gym:episode 1065, reward -0.000778, avg reward -0.009040, total steps 136320, episode step 128\n",
|
|
"[2018-02-18 15:06:28,218] episode 1065, reward -0.000778, avg reward -0.009040, total steps 136320, episode step 128\n",
|
|
"INFO:gym:episode 1066, reward -0.003527, avg reward -0.009038, total steps 136448, episode step 128\n",
|
|
"[2018-02-18 15:06:30,406] episode 1066, reward -0.003527, avg reward -0.009038, total steps 136448, episode step 128\n",
|
|
"INFO:gym:episode 1067, reward -0.025270, avg reward -0.009259, total steps 136576, episode step 128\n",
|
|
"[2018-02-18 15:06:32,589] episode 1067, reward -0.025270, avg reward -0.009259, total steps 136576, episode step 128\n",
|
|
"INFO:gym:episode 1068, reward -0.033655, avg reward -0.009458, total steps 136704, episode step 128\n",
|
|
"[2018-02-18 15:06:34,802] episode 1068, reward -0.033655, avg reward -0.009458, total steps 136704, episode step 128\n",
|
|
"INFO:gym:episode 1069, reward -0.009461, avg reward -0.009502, total steps 136832, episode step 128\n",
|
|
"[2018-02-18 15:06:37,119] episode 1069, reward -0.009461, avg reward -0.009502, total steps 136832, episode step 128\n",
|
|
"INFO:gym:episode 1070, reward -0.031114, avg reward -0.009781, total steps 136960, episode step 128\n",
|
|
"[2018-02-18 15:06:39,683] episode 1070, reward -0.031114, avg reward -0.009781, total steps 136960, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:06:39,684] Testing...\n",
|
|
"INFO:gym:Avg reward -0.012383(0.000000)\n",
|
|
"[2018-02-18 15:06:40,004] Avg reward -0.012383(0.000000)\n",
|
|
"INFO:gym:episode 1071, reward -0.005359, avg reward -0.009709, total steps 137088, episode step 128\n",
|
|
"[2018-02-18 15:06:42,662] episode 1071, reward -0.005359, avg reward -0.009709, total steps 137088, episode step 128\n",
|
|
"INFO:gym:episode 1072, reward -0.011979, avg reward -0.009773, total steps 137216, episode step 128\n",
|
|
"[2018-02-18 15:06:45,259] episode 1072, reward -0.011979, avg reward -0.009773, total steps 137216, episode step 128\n",
|
|
"INFO:gym:episode 1073, reward -0.003625, avg reward -0.009677, total steps 137344, episode step 128\n",
|
|
"[2018-02-18 15:06:47,936] episode 1073, reward -0.003625, avg reward -0.009677, total steps 137344, episode step 128\n",
|
|
"INFO:gym:episode 1074, reward -0.000435, avg reward -0.009161, total steps 137472, episode step 128\n",
|
|
"[2018-02-18 15:06:50,675] episode 1074, reward -0.000435, avg reward -0.009161, total steps 137472, episode step 128\n",
|
|
"INFO:gym:episode 1075, reward -0.048154, avg reward -0.009622, total steps 137600, episode step 128\n",
|
|
"[2018-02-18 15:06:53,812] episode 1075, reward -0.048154, avg reward -0.009622, total steps 137600, episode step 128\n",
|
|
"INFO:gym:episode 1076, reward -0.006769, avg reward -0.009675, total steps 137728, episode step 128\n",
|
|
"[2018-02-18 15:06:56,937] episode 1076, reward -0.006769, avg reward -0.009675, total steps 137728, episode step 128\n",
|
|
"INFO:gym:episode 1077, reward -0.004384, avg reward -0.009648, total steps 137856, episode step 128\n",
|
|
"[2018-02-18 15:07:00,039] episode 1077, reward -0.004384, avg reward -0.009648, total steps 137856, episode step 128\n",
|
|
"INFO:gym:episode 1078, reward -0.004920, avg reward -0.009676, total steps 137984, episode step 128\n",
|
|
"[2018-02-18 15:07:03,153] episode 1078, reward -0.004920, avg reward -0.009676, total steps 137984, episode step 128\n",
|
|
"INFO:gym:episode 1079, reward -0.002193, avg reward -0.009563, total steps 138112, episode step 128\n",
|
|
"[2018-02-18 15:07:06,216] episode 1079, reward -0.002193, avg reward -0.009563, total steps 138112, episode step 128\n",
|
|
"INFO:gym:episode 1080, reward -0.003274, avg reward -0.009468, total steps 138240, episode step 128\n",
|
|
"[2018-02-18 15:07:09,394] episode 1080, reward -0.003274, avg reward -0.009468, total steps 138240, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:07:09,404] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001738(0.000000)\n",
|
|
"[2018-02-18 15:07:09,767] Avg reward -0.001738(0.000000)\n",
|
|
"INFO:gym:episode 1081, reward -0.001747, avg reward -0.009277, total steps 138368, episode step 128\n",
|
|
"[2018-02-18 15:07:13,066] episode 1081, reward -0.001747, avg reward -0.009277, total steps 138368, episode step 128\n",
|
|
"INFO:gym:episode 1082, reward 0.010145, avg reward -0.008943, total steps 138496, episode step 128\n",
|
|
"[2018-02-18 15:07:16,483] episode 1082, reward 0.010145, avg reward -0.008943, total steps 138496, episode step 128\n",
|
|
"INFO:gym:episode 1083, reward -0.020383, avg reward -0.008743, total steps 138624, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:07:19,965] episode 1083, reward -0.020383, avg reward -0.008743, total steps 138624, episode step 128\n",
|
|
"INFO:gym:episode 1084, reward -0.006890, avg reward -0.008775, total steps 138752, episode step 128\n",
|
|
"[2018-02-18 15:07:23,558] episode 1084, reward -0.006890, avg reward -0.008775, total steps 138752, episode step 128\n",
|
|
"INFO:gym:episode 1085, reward -0.001222, avg reward -0.008762, total steps 138880, episode step 128\n",
|
|
"[2018-02-18 15:07:26,940] episode 1085, reward -0.001222, avg reward -0.008762, total steps 138880, episode step 128\n",
|
|
"INFO:gym:episode 1086, reward -0.006608, avg reward -0.008682, total steps 139008, episode step 128\n",
|
|
"[2018-02-18 15:07:30,155] episode 1086, reward -0.006608, avg reward -0.008682, total steps 139008, episode step 128\n",
|
|
"INFO:gym:episode 1087, reward -0.002571, avg reward -0.008522, total steps 139136, episode step 128\n",
|
|
"[2018-02-18 15:07:33,327] episode 1087, reward -0.002571, avg reward -0.008522, total steps 139136, episode step 128\n",
|
|
"INFO:gym:episode 1088, reward -0.036945, avg reward -0.008839, total steps 139264, episode step 128\n",
|
|
"[2018-02-18 15:07:36,610] episode 1088, reward -0.036945, avg reward -0.008839, total steps 139264, episode step 128\n",
|
|
"INFO:gym:episode 1089, reward -0.022921, avg reward -0.009046, total steps 139392, episode step 128\n",
|
|
"[2018-02-18 15:07:39,976] episode 1089, reward -0.022921, avg reward -0.009046, total steps 139392, episode step 128\n",
|
|
"INFO:gym:episode 1090, reward -0.003010, avg reward -0.009056, total steps 139520, episode step 128\n",
|
|
"[2018-02-18 15:07:43,349] episode 1090, reward -0.003010, avg reward -0.009056, total steps 139520, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:07:43,350] Testing...\n",
|
|
"INFO:gym:Avg reward -0.012365(0.000000)\n",
|
|
"[2018-02-18 15:07:43,679] Avg reward -0.012365(0.000000)\n",
|
|
"INFO:gym:episode 1091, reward -0.019775, avg reward -0.009248, total steps 139648, episode step 128\n",
|
|
"[2018-02-18 15:07:47,238] episode 1091, reward -0.019775, avg reward -0.009248, total steps 139648, episode step 128\n",
|
|
"INFO:gym:episode 1092, reward -0.012695, avg reward -0.009371, total steps 139776, episode step 128\n",
|
|
"[2018-02-18 15:07:50,853] episode 1092, reward -0.012695, avg reward -0.009371, total steps 139776, episode step 128\n",
|
|
"INFO:gym:episode 1093, reward -0.036249, avg reward -0.009717, total steps 139904, episode step 128\n",
|
|
"[2018-02-18 15:07:54,545] episode 1093, reward -0.036249, avg reward -0.009717, total steps 139904, episode step 128\n",
|
|
"INFO:gym:episode 1094, reward -0.040074, avg reward -0.010098, total steps 140032, episode step 128\n",
|
|
"[2018-02-18 15:07:58,310] episode 1094, reward -0.040074, avg reward -0.010098, total steps 140032, episode step 128\n",
|
|
"INFO:gym:episode 1095, reward -0.002301, avg reward -0.010032, total steps 140160, episode step 128\n",
|
|
"[2018-02-18 15:08:01,969] episode 1095, reward -0.002301, avg reward -0.010032, total steps 140160, episode step 128\n",
|
|
"INFO:gym:episode 1096, reward -0.021556, avg reward -0.010180, total steps 140288, episode step 128\n",
|
|
"[2018-02-18 15:08:05,691] episode 1096, reward -0.021556, avg reward -0.010180, total steps 140288, episode step 128\n",
|
|
"INFO:gym:episode 1097, reward -0.007784, avg reward -0.010018, total steps 140416, episode step 128\n",
|
|
"[2018-02-18 15:08:09,533] episode 1097, reward -0.007784, avg reward -0.010018, total steps 140416, episode step 128\n",
|
|
"INFO:gym:episode 1098, reward 0.112505, avg reward -0.008491, total steps 140544, episode step 128\n",
|
|
"[2018-02-18 15:08:13,630] episode 1098, reward 0.112505, avg reward -0.008491, total steps 140544, episode step 128\n",
|
|
"INFO:gym:episode 1099, reward -0.004088, avg reward -0.008513, total steps 140672, episode step 128\n",
|
|
"[2018-02-18 15:08:18,135] episode 1099, reward -0.004088, avg reward -0.008513, total steps 140672, episode step 128\n",
|
|
"INFO:gym:episode 1100, reward -0.024229, avg reward -0.008738, total steps 140800, episode step 128\n",
|
|
"[2018-02-18 15:08:22,407] episode 1100, reward -0.024229, avg reward -0.008738, total steps 140800, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:08:22,408] Testing...\n",
|
|
"INFO:gym:Avg reward -0.056547(0.000000)\n",
|
|
"[2018-02-18 15:08:22,743] Avg reward -0.056547(0.000000)\n",
|
|
"INFO:gym:episode 1101, reward -0.011492, avg reward -0.008835, total steps 140928, episode step 128\n",
|
|
"[2018-02-18 15:08:26,941] episode 1101, reward -0.011492, avg reward -0.008835, total steps 140928, episode step 128\n",
|
|
"INFO:gym:episode 1102, reward -0.025708, avg reward -0.008770, total steps 141056, episode step 128\n",
|
|
"[2018-02-18 15:08:30,999] episode 1102, reward -0.025708, avg reward -0.008770, total steps 141056, episode step 128\n",
|
|
"INFO:gym:episode 1103, reward -0.005848, avg reward -0.008764, total steps 141184, episode step 128\n",
|
|
"[2018-02-18 15:08:35,200] episode 1103, reward -0.005848, avg reward -0.008764, total steps 141184, episode step 128\n",
|
|
"INFO:gym:episode 1104, reward -0.003398, avg reward -0.008738, total steps 141312, episode step 128\n",
|
|
"[2018-02-18 15:08:39,464] episode 1104, reward -0.003398, avg reward -0.008738, total steps 141312, episode step 128\n",
|
|
"INFO:gym:episode 1105, reward -0.002152, avg reward -0.008603, total steps 141440, episode step 128\n",
|
|
"[2018-02-18 15:08:43,845] episode 1105, reward -0.002152, avg reward -0.008603, total steps 141440, episode step 128\n",
|
|
"INFO:gym:episode 1106, reward -0.003881, avg reward -0.008506, total steps 141568, episode step 128\n",
|
|
"[2018-02-18 15:08:48,028] episode 1106, reward -0.003881, avg reward -0.008506, total steps 141568, episode step 128\n",
|
|
"INFO:gym:episode 1107, reward -0.012256, avg reward -0.008609, total steps 141696, episode step 128\n",
|
|
"[2018-02-18 15:08:52,040] episode 1107, reward -0.012256, avg reward -0.008609, total steps 141696, episode step 128\n",
|
|
"INFO:gym:episode 1108, reward -0.002370, avg reward -0.008600, total steps 141824, episode step 128\n",
|
|
"[2018-02-18 15:08:56,067] episode 1108, reward -0.002370, avg reward -0.008600, total steps 141824, episode step 128\n",
|
|
"INFO:gym:episode 1109, reward 0.000284, avg reward -0.008582, total steps 141952, episode step 128\n",
|
|
"[2018-02-18 15:09:00,090] episode 1109, reward 0.000284, avg reward -0.008582, total steps 141952, episode step 128\n",
|
|
"INFO:gym:episode 1110, reward 0.004822, avg reward -0.008185, total steps 142080, episode step 128\n",
|
|
"[2018-02-18 15:09:04,023] episode 1110, reward 0.004822, avg reward -0.008185, total steps 142080, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:09:04,025] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001536(0.000000)\n",
|
|
"[2018-02-18 15:09:04,372] Avg reward -0.001536(0.000000)\n",
|
|
"INFO:gym:episode 1111, reward -0.004234, avg reward -0.008152, total steps 142208, episode step 128\n",
|
|
"[2018-02-18 15:09:08,497] episode 1111, reward -0.004234, avg reward -0.008152, total steps 142208, episode step 128\n",
|
|
"INFO:gym:episode 1112, reward -0.007472, avg reward -0.007999, total steps 142336, episode step 128\n",
|
|
"[2018-02-18 15:09:12,710] episode 1112, reward -0.007472, avg reward -0.007999, total steps 142336, episode step 128\n",
|
|
"INFO:gym:episode 1113, reward -0.031017, avg reward -0.008289, total steps 142464, episode step 128\n",
|
|
"[2018-02-18 15:09:17,074] episode 1113, reward -0.031017, avg reward -0.008289, total steps 142464, episode step 128\n",
|
|
"INFO:gym:episode 1114, reward -0.050927, avg reward -0.008771, total steps 142592, episode step 128\n",
|
|
"[2018-02-18 15:09:21,226] episode 1114, reward -0.050927, avg reward -0.008771, total steps 142592, episode step 128\n",
|
|
"INFO:gym:episode 1115, reward -0.021786, avg reward -0.008959, total steps 142720, episode step 128\n",
|
|
"[2018-02-18 15:09:25,266] episode 1115, reward -0.021786, avg reward -0.008959, total steps 142720, episode step 128\n",
|
|
"INFO:gym:episode 1116, reward -0.008469, avg reward -0.009065, total steps 142848, episode step 128\n",
|
|
"[2018-02-18 15:09:29,539] episode 1116, reward -0.008469, avg reward -0.009065, total steps 142848, episode step 128\n",
|
|
"INFO:gym:episode 1117, reward -0.016648, avg reward -0.009213, total steps 142976, episode step 128\n",
|
|
"[2018-02-18 15:09:33,933] episode 1117, reward -0.016648, avg reward -0.009213, total steps 142976, episode step 128\n",
|
|
"INFO:gym:episode 1118, reward -0.002747, avg reward -0.009239, total steps 143104, episode step 128\n",
|
|
"[2018-02-18 15:09:38,173] episode 1118, reward -0.002747, avg reward -0.009239, total steps 143104, episode step 128\n",
|
|
"INFO:gym:episode 1119, reward -0.001744, avg reward -0.009188, total steps 143232, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:09:42,151] episode 1119, reward -0.001744, avg reward -0.009188, total steps 143232, episode step 128\n",
|
|
"INFO:gym:episode 1120, reward -0.011613, avg reward -0.009248, total steps 143360, episode step 128\n",
|
|
"[2018-02-18 15:09:46,002] episode 1120, reward -0.011613, avg reward -0.009248, total steps 143360, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:09:46,008] Testing...\n",
|
|
"INFO:gym:Avg reward -0.005208(0.000000)\n",
|
|
"[2018-02-18 15:09:46,337] Avg reward -0.005208(0.000000)\n",
|
|
"INFO:gym:episode 1121, reward -0.001755, avg reward -0.009072, total steps 143488, episode step 128\n",
|
|
"[2018-02-18 15:09:50,406] episode 1121, reward -0.001755, avg reward -0.009072, total steps 143488, episode step 128\n",
|
|
"INFO:gym:episode 1122, reward -0.005559, avg reward -0.009092, total steps 143616, episode step 128\n",
|
|
"[2018-02-18 15:09:54,735] episode 1122, reward -0.005559, avg reward -0.009092, total steps 143616, episode step 128\n",
|
|
"INFO:gym:episode 1123, reward -0.001789, avg reward -0.009092, total steps 143744, episode step 128\n",
|
|
"[2018-02-18 15:09:58,739] episode 1123, reward -0.001789, avg reward -0.009092, total steps 143744, episode step 128\n",
|
|
"INFO:gym:episode 1124, reward -0.031896, avg reward -0.009375, total steps 143872, episode step 128\n",
|
|
"[2018-02-18 15:10:02,899] episode 1124, reward -0.031896, avg reward -0.009375, total steps 143872, episode step 128\n",
|
|
"INFO:gym:episode 1125, reward -0.004487, avg reward -0.009305, total steps 144000, episode step 128\n",
|
|
"[2018-02-18 15:10:06,985] episode 1125, reward -0.004487, avg reward -0.009305, total steps 144000, episode step 128\n",
|
|
"INFO:gym:episode 1126, reward -0.001976, avg reward -0.009056, total steps 144128, episode step 128\n",
|
|
"[2018-02-18 15:10:10,780] episode 1126, reward -0.001976, avg reward -0.009056, total steps 144128, episode step 128\n",
|
|
"INFO:gym:episode 1127, reward -0.001761, avg reward -0.009056, total steps 144256, episode step 128\n",
|
|
"[2018-02-18 15:10:14,245] episode 1127, reward -0.001761, avg reward -0.009056, total steps 144256, episode step 128\n",
|
|
"INFO:gym:episode 1128, reward -0.017449, avg reward -0.009127, total steps 144384, episode step 128\n",
|
|
"[2018-02-18 15:10:17,466] episode 1128, reward -0.017449, avg reward -0.009127, total steps 144384, episode step 128\n",
|
|
"INFO:gym:episode 1129, reward -0.021658, avg reward -0.009326, total steps 144512, episode step 128\n",
|
|
"[2018-02-18 15:10:20,623] episode 1129, reward -0.021658, avg reward -0.009326, total steps 144512, episode step 128\n",
|
|
"INFO:gym:episode 1130, reward -0.044521, avg reward -0.009704, total steps 144640, episode step 128\n",
|
|
"[2018-02-18 15:10:23,684] episode 1130, reward -0.044521, avg reward -0.009704, total steps 144640, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:10:23,686] Testing...\n",
|
|
"INFO:gym:Avg reward -0.005474(0.000000)\n",
|
|
"[2018-02-18 15:10:24,029] Avg reward -0.005474(0.000000)\n",
|
|
"INFO:gym:episode 1131, reward -0.009512, avg reward -0.009761, total steps 144768, episode step 128\n",
|
|
"[2018-02-18 15:10:27,727] episode 1131, reward -0.009512, avg reward -0.009761, total steps 144768, episode step 128\n",
|
|
"INFO:gym:episode 1132, reward -0.008794, avg reward -0.009834, total steps 144896, episode step 128\n",
|
|
"[2018-02-18 15:10:31,533] episode 1132, reward -0.008794, avg reward -0.009834, total steps 144896, episode step 128\n",
|
|
"INFO:gym:episode 1133, reward -0.032391, avg reward -0.010141, total steps 145024, episode step 128\n",
|
|
"[2018-02-18 15:10:34,519] episode 1133, reward -0.032391, avg reward -0.010141, total steps 145024, episode step 128\n",
|
|
"INFO:gym:episode 1134, reward -0.021898, avg reward -0.010307, total steps 145152, episode step 128\n",
|
|
"[2018-02-18 15:10:36,296] episode 1134, reward -0.021898, avg reward -0.010307, total steps 145152, episode step 128\n",
|
|
"INFO:gym:episode 1135, reward -0.003920, avg reward -0.010320, total steps 145280, episode step 128\n",
|
|
"[2018-02-18 15:10:38,089] episode 1135, reward -0.003920, avg reward -0.010320, total steps 145280, episode step 128\n",
|
|
"INFO:gym:episode 1136, reward -0.027342, avg reward -0.010530, total steps 145408, episode step 128\n",
|
|
"[2018-02-18 15:10:39,850] episode 1136, reward -0.027342, avg reward -0.010530, total steps 145408, episode step 128\n",
|
|
"INFO:gym:episode 1137, reward -0.002217, avg reward -0.010535, total steps 145536, episode step 128\n",
|
|
"[2018-02-18 15:10:41,628] episode 1137, reward -0.002217, avg reward -0.010535, total steps 145536, episode step 128\n",
|
|
"INFO:gym:episode 1138, reward 0.005921, avg reward -0.010387, total steps 145664, episode step 128\n",
|
|
"[2018-02-18 15:10:43,446] episode 1138, reward 0.005921, avg reward -0.010387, total steps 145664, episode step 128\n",
|
|
"INFO:gym:episode 1139, reward -0.009387, avg reward -0.010289, total steps 145792, episode step 128\n",
|
|
"[2018-02-18 15:10:45,285] episode 1139, reward -0.009387, avg reward -0.010289, total steps 145792, episode step 128\n",
|
|
"INFO:gym:episode 1140, reward -0.011806, avg reward -0.010360, total steps 145920, episode step 128\n",
|
|
"[2018-02-18 15:10:47,104] episode 1140, reward -0.011806, avg reward -0.010360, total steps 145920, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:10:47,108] Testing...\n",
|
|
"INFO:gym:Avg reward -0.022924(0.000000)\n",
|
|
"[2018-02-18 15:10:47,451] Avg reward -0.022924(0.000000)\n",
|
|
"INFO:gym:episode 1141, reward -0.006404, avg reward -0.010220, total steps 146048, episode step 128\n",
|
|
"[2018-02-18 15:10:49,375] episode 1141, reward -0.006404, avg reward -0.010220, total steps 146048, episode step 128\n",
|
|
"INFO:gym:episode 1142, reward -0.004104, avg reward -0.010240, total steps 146176, episode step 128\n",
|
|
"[2018-02-18 15:10:51,181] episode 1142, reward -0.004104, avg reward -0.010240, total steps 146176, episode step 128\n",
|
|
"INFO:gym:episode 1143, reward -0.005901, avg reward -0.010275, total steps 146304, episode step 128\n",
|
|
"[2018-02-18 15:10:52,995] episode 1143, reward -0.005901, avg reward -0.010275, total steps 146304, episode step 128\n",
|
|
"INFO:gym:episode 1144, reward -0.008555, avg reward -0.010481, total steps 146432, episode step 128\n",
|
|
"[2018-02-18 15:10:54,916] episode 1144, reward -0.008555, avg reward -0.010481, total steps 146432, episode step 128\n",
|
|
"INFO:gym:episode 1145, reward -0.036141, avg reward -0.010785, total steps 146560, episode step 128\n",
|
|
"[2018-02-18 15:10:57,026] episode 1145, reward -0.036141, avg reward -0.010785, total steps 146560, episode step 128\n",
|
|
"INFO:gym:episode 1146, reward -0.006602, avg reward -0.010831, total steps 146688, episode step 128\n",
|
|
"[2018-02-18 15:10:58,838] episode 1146, reward -0.006602, avg reward -0.010831, total steps 146688, episode step 128\n",
|
|
"INFO:gym:episode 1147, reward -0.008857, avg reward -0.010838, total steps 146816, episode step 128\n",
|
|
"[2018-02-18 15:11:00,637] episode 1147, reward -0.008857, avg reward -0.010838, total steps 146816, episode step 128\n",
|
|
"INFO:gym:episode 1148, reward -0.006124, avg reward -0.010851, total steps 146944, episode step 128\n",
|
|
"[2018-02-18 15:11:02,460] episode 1148, reward -0.006124, avg reward -0.010851, total steps 146944, episode step 128\n",
|
|
"INFO:gym:episode 1149, reward -0.008119, avg reward -0.010464, total steps 147072, episode step 128\n",
|
|
"[2018-02-18 15:11:04,260] episode 1149, reward -0.008119, avg reward -0.010464, total steps 147072, episode step 128\n",
|
|
"INFO:gym:episode 1150, reward -0.015014, avg reward -0.010455, total steps 147200, episode step 128\n",
|
|
"[2018-02-18 15:11:06,144] episode 1150, reward -0.015014, avg reward -0.010455, total steps 147200, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:11:06,148] Testing...\n",
|
|
"INFO:gym:Avg reward -0.003672(0.000000)\n",
|
|
"[2018-02-18 15:11:06,477] Avg reward -0.003672(0.000000)\n",
|
|
"INFO:gym:episode 1151, reward 0.000620, avg reward -0.010433, total steps 147328, episode step 128\n",
|
|
"[2018-02-18 15:11:08,559] episode 1151, reward 0.000620, avg reward -0.010433, total steps 147328, episode step 128\n",
|
|
"INFO:gym:episode 1152, reward -0.001902, avg reward -0.010586, total steps 147456, episode step 128\n",
|
|
"[2018-02-18 15:11:10,722] episode 1152, reward -0.001902, avg reward -0.010586, total steps 147456, episode step 128\n",
|
|
"INFO:gym:episode 1153, reward -0.023065, avg reward -0.010799, total steps 147584, episode step 128\n",
|
|
"[2018-02-18 15:11:12,986] episode 1153, reward -0.023065, avg reward -0.010799, total steps 147584, episode step 128\n",
|
|
"INFO:gym:episode 1154, reward -0.042824, avg reward -0.011156, total steps 147712, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:11:15,227] episode 1154, reward -0.042824, avg reward -0.011156, total steps 147712, episode step 128\n",
|
|
"INFO:gym:episode 1155, reward -0.001841, avg reward -0.010754, total steps 147840, episode step 128\n",
|
|
"[2018-02-18 15:11:17,525] episode 1155, reward -0.001841, avg reward -0.010754, total steps 147840, episode step 128\n",
|
|
"INFO:gym:episode 1156, reward 0.018874, avg reward -0.010348, total steps 147968, episode step 128\n",
|
|
"[2018-02-18 15:11:19,871] episode 1156, reward 0.018874, avg reward -0.010348, total steps 147968, episode step 128\n",
|
|
"INFO:gym:episode 1157, reward -0.001064, avg reward -0.010348, total steps 148096, episode step 128\n",
|
|
"[2018-02-18 15:11:22,383] episode 1157, reward -0.001064, avg reward -0.010348, total steps 148096, episode step 128\n",
|
|
"INFO:gym:episode 1158, reward -0.016383, avg reward -0.010469, total steps 148224, episode step 128\n",
|
|
"[2018-02-18 15:11:25,061] episode 1158, reward -0.016383, avg reward -0.010469, total steps 148224, episode step 128\n",
|
|
"INFO:gym:episode 1159, reward -0.002443, avg reward -0.010344, total steps 148352, episode step 128\n",
|
|
"[2018-02-18 15:11:27,703] episode 1159, reward -0.002443, avg reward -0.010344, total steps 148352, episode step 128\n",
|
|
"INFO:gym:episode 1160, reward -0.004615, avg reward -0.010357, total steps 148480, episode step 128\n",
|
|
"[2018-02-18 15:11:30,318] episode 1160, reward -0.004615, avg reward -0.010357, total steps 148480, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:11:30,327] Testing...\n",
|
|
"INFO:gym:Avg reward -0.007834(0.000000)\n",
|
|
"[2018-02-18 15:11:30,660] Avg reward -0.007834(0.000000)\n",
|
|
"INFO:gym:episode 1161, reward -0.010855, avg reward -0.010310, total steps 148608, episode step 128\n",
|
|
"[2018-02-18 15:11:33,171] episode 1161, reward -0.010855, avg reward -0.010310, total steps 148608, episode step 128\n",
|
|
"INFO:gym:episode 1162, reward -0.012270, avg reward -0.010355, total steps 148736, episode step 128\n",
|
|
"[2018-02-18 15:11:35,691] episode 1162, reward -0.012270, avg reward -0.010355, total steps 148736, episode step 128\n",
|
|
"INFO:gym:episode 1163, reward -0.018768, avg reward -0.010414, total steps 148864, episode step 128\n",
|
|
"[2018-02-18 15:11:38,460] episode 1163, reward -0.018768, avg reward -0.010414, total steps 148864, episode step 128\n",
|
|
"INFO:gym:episode 1164, reward -0.012900, avg reward -0.010514, total steps 148992, episode step 128\n",
|
|
"[2018-02-18 15:11:41,492] episode 1164, reward -0.012900, avg reward -0.010514, total steps 148992, episode step 128\n",
|
|
"INFO:gym:episode 1165, reward -0.001989, avg reward -0.010526, total steps 149120, episode step 128\n",
|
|
"[2018-02-18 15:11:44,768] episode 1165, reward -0.001989, avg reward -0.010526, total steps 149120, episode step 128\n",
|
|
"INFO:gym:episode 1166, reward -0.004054, avg reward -0.010531, total steps 149248, episode step 128\n",
|
|
"[2018-02-18 15:11:48,001] episode 1166, reward -0.004054, avg reward -0.010531, total steps 149248, episode step 128\n",
|
|
"INFO:gym:episode 1167, reward -0.002852, avg reward -0.010307, total steps 149376, episode step 128\n",
|
|
"[2018-02-18 15:11:51,256] episode 1167, reward -0.002852, avg reward -0.010307, total steps 149376, episode step 128\n",
|
|
"INFO:gym:episode 1168, reward -0.044136, avg reward -0.010412, total steps 149504, episode step 128\n",
|
|
"[2018-02-18 15:11:54,323] episode 1168, reward -0.044136, avg reward -0.010412, total steps 149504, episode step 128\n",
|
|
"INFO:gym:episode 1169, reward -0.017281, avg reward -0.010490, total steps 149632, episode step 128\n",
|
|
"[2018-02-18 15:11:57,696] episode 1169, reward -0.017281, avg reward -0.010490, total steps 149632, episode step 128\n",
|
|
"INFO:gym:episode 1170, reward -0.006751, avg reward -0.010247, total steps 149760, episode step 128\n",
|
|
"[2018-02-18 15:12:01,308] episode 1170, reward -0.006751, avg reward -0.010247, total steps 149760, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:12:01,313] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001871(0.000000)\n",
|
|
"[2018-02-18 15:12:01,650] Avg reward -0.001871(0.000000)\n",
|
|
"INFO:gym:episode 1171, reward -0.012438, avg reward -0.010317, total steps 149888, episode step 128\n",
|
|
"[2018-02-18 15:12:05,190] episode 1171, reward -0.012438, avg reward -0.010317, total steps 149888, episode step 128\n",
|
|
"INFO:gym:episode 1172, reward -0.011641, avg reward -0.010314, total steps 150016, episode step 128\n",
|
|
"[2018-02-18 15:12:08,712] episode 1172, reward -0.011641, avg reward -0.010314, total steps 150016, episode step 128\n",
|
|
"INFO:gym:episode 1173, reward -0.056458, avg reward -0.010842, total steps 150144, episode step 128\n",
|
|
"[2018-02-18 15:12:12,295] episode 1173, reward -0.056458, avg reward -0.010842, total steps 150144, episode step 128\n",
|
|
"INFO:gym:episode 1174, reward -0.001757, avg reward -0.010856, total steps 150272, episode step 128\n",
|
|
"[2018-02-18 15:12:15,856] episode 1174, reward -0.001757, avg reward -0.010856, total steps 150272, episode step 128\n",
|
|
"INFO:gym:episode 1175, reward -0.015874, avg reward -0.010533, total steps 150400, episode step 128\n",
|
|
"[2018-02-18 15:12:19,469] episode 1175, reward -0.015874, avg reward -0.010533, total steps 150400, episode step 128\n",
|
|
"INFO:gym:episode 1176, reward -0.005461, avg reward -0.010520, total steps 150528, episode step 128\n",
|
|
"[2018-02-18 15:12:23,241] episode 1176, reward -0.005461, avg reward -0.010520, total steps 150528, episode step 128\n",
|
|
"INFO:gym:episode 1177, reward -0.001464, avg reward -0.010491, total steps 150656, episode step 128\n",
|
|
"[2018-02-18 15:12:27,311] episode 1177, reward -0.001464, avg reward -0.010491, total steps 150656, episode step 128\n",
|
|
"INFO:gym:episode 1178, reward -0.008954, avg reward -0.010531, total steps 150784, episode step 128\n",
|
|
"[2018-02-18 15:12:31,448] episode 1178, reward -0.008954, avg reward -0.010531, total steps 150784, episode step 128\n",
|
|
"INFO:gym:episode 1179, reward -0.005284, avg reward -0.010562, total steps 150912, episode step 128\n",
|
|
"[2018-02-18 15:12:35,519] episode 1179, reward -0.005284, avg reward -0.010562, total steps 150912, episode step 128\n",
|
|
"INFO:gym:episode 1180, reward -0.003491, avg reward -0.010564, total steps 151040, episode step 128\n",
|
|
"[2018-02-18 15:12:39,486] episode 1180, reward -0.003491, avg reward -0.010564, total steps 151040, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:12:39,487] Testing...\n",
|
|
"INFO:gym:Avg reward -0.005490(0.000000)\n",
|
|
"[2018-02-18 15:12:39,820] Avg reward -0.005490(0.000000)\n",
|
|
"INFO:gym:episode 1181, reward -0.005150, avg reward -0.010598, total steps 151168, episode step 128\n",
|
|
"[2018-02-18 15:12:43,808] episode 1181, reward -0.005150, avg reward -0.010598, total steps 151168, episode step 128\n",
|
|
"INFO:gym:episode 1182, reward -0.005851, avg reward -0.010758, total steps 151296, episode step 128\n",
|
|
"[2018-02-18 15:12:47,575] episode 1182, reward -0.005851, avg reward -0.010758, total steps 151296, episode step 128\n",
|
|
"INFO:gym:episode 1183, reward -0.002893, avg reward -0.010583, total steps 151424, episode step 128\n",
|
|
"[2018-02-18 15:12:51,453] episode 1183, reward -0.002893, avg reward -0.010583, total steps 151424, episode step 128\n",
|
|
"INFO:gym:episode 1184, reward -0.008422, avg reward -0.010598, total steps 151552, episode step 128\n",
|
|
"[2018-02-18 15:12:55,393] episode 1184, reward -0.008422, avg reward -0.010598, total steps 151552, episode step 128\n",
|
|
"INFO:gym:episode 1185, reward -0.006560, avg reward -0.010652, total steps 151680, episode step 128\n",
|
|
"[2018-02-18 15:12:59,195] episode 1185, reward -0.006560, avg reward -0.010652, total steps 151680, episode step 128\n",
|
|
"INFO:gym:episode 1186, reward 0.001106, avg reward -0.010575, total steps 151808, episode step 128\n",
|
|
"[2018-02-18 15:13:02,913] episode 1186, reward 0.001106, avg reward -0.010575, total steps 151808, episode step 128\n",
|
|
"INFO:gym:episode 1187, reward 0.020893, avg reward -0.010340, total steps 151936, episode step 128\n",
|
|
"[2018-02-18 15:13:06,616] episode 1187, reward 0.020893, avg reward -0.010340, total steps 151936, episode step 128\n",
|
|
"INFO:gym:episode 1188, reward -0.002495, avg reward -0.009995, total steps 152064, episode step 128\n",
|
|
"[2018-02-18 15:13:10,528] episode 1188, reward -0.002495, avg reward -0.009995, total steps 152064, episode step 128\n",
|
|
"INFO:gym:episode 1189, reward -0.014070, avg reward -0.009907, total steps 152192, episode step 128\n",
|
|
"[2018-02-18 15:13:14,268] episode 1189, reward -0.014070, avg reward -0.009907, total steps 152192, episode step 128\n",
|
|
"INFO:gym:episode 1190, reward -0.002416, avg reward -0.009901, total steps 152320, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:13:18,066] episode 1190, reward -0.002416, avg reward -0.009901, total steps 152320, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:13:18,067] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002039(0.000000)\n",
|
|
"[2018-02-18 15:13:18,407] Avg reward -0.002039(0.000000)\n",
|
|
"INFO:gym:episode 1191, reward -0.001107, avg reward -0.009714, total steps 152448, episode step 128\n",
|
|
"[2018-02-18 15:13:22,420] episode 1191, reward -0.001107, avg reward -0.009714, total steps 152448, episode step 128\n",
|
|
"INFO:gym:episode 1192, reward -0.005647, avg reward -0.009644, total steps 152576, episode step 128\n",
|
|
"[2018-02-18 15:13:26,279] episode 1192, reward -0.005647, avg reward -0.009644, total steps 152576, episode step 128\n",
|
|
"INFO:gym:episode 1193, reward -0.003535, avg reward -0.009317, total steps 152704, episode step 128\n",
|
|
"[2018-02-18 15:13:30,060] episode 1193, reward -0.003535, avg reward -0.009317, total steps 152704, episode step 128\n",
|
|
"INFO:gym:episode 1194, reward -0.004130, avg reward -0.008957, total steps 152832, episode step 128\n",
|
|
"[2018-02-18 15:13:33,847] episode 1194, reward -0.004130, avg reward -0.008957, total steps 152832, episode step 128\n",
|
|
"INFO:gym:episode 1195, reward -0.004376, avg reward -0.008978, total steps 152960, episode step 128\n",
|
|
"[2018-02-18 15:13:37,568] episode 1195, reward -0.004376, avg reward -0.008978, total steps 152960, episode step 128\n",
|
|
"INFO:gym:episode 1196, reward -0.015423, avg reward -0.008917, total steps 153088, episode step 128\n",
|
|
"[2018-02-18 15:13:41,146] episode 1196, reward -0.015423, avg reward -0.008917, total steps 153088, episode step 128\n",
|
|
"INFO:gym:episode 1197, reward -0.002175, avg reward -0.008861, total steps 153216, episode step 128\n",
|
|
"[2018-02-18 15:13:44,682] episode 1197, reward -0.002175, avg reward -0.008861, total steps 153216, episode step 128\n",
|
|
"INFO:gym:episode 1198, reward -0.019535, avg reward -0.010181, total steps 153344, episode step 128\n",
|
|
"[2018-02-18 15:13:48,272] episode 1198, reward -0.019535, avg reward -0.010181, total steps 153344, episode step 128\n",
|
|
"INFO:gym:episode 1199, reward -0.009060, avg reward -0.010231, total steps 153472, episode step 128\n",
|
|
"[2018-02-18 15:13:51,813] episode 1199, reward -0.009060, avg reward -0.010231, total steps 153472, episode step 128\n",
|
|
"INFO:gym:episode 1200, reward -0.016554, avg reward -0.010154, total steps 153600, episode step 128\n",
|
|
"[2018-02-18 15:13:55,360] episode 1200, reward -0.016554, avg reward -0.010154, total steps 153600, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:13:55,367] Testing...\n",
|
|
"INFO:gym:Avg reward -0.018623(0.000000)\n",
|
|
"[2018-02-18 15:13:55,708] Avg reward -0.018623(0.000000)\n",
|
|
"INFO:gym:episode 1201, reward -0.035733, avg reward -0.010396, total steps 153728, episode step 128\n",
|
|
"[2018-02-18 15:13:59,308] episode 1201, reward -0.035733, avg reward -0.010396, total steps 153728, episode step 128\n",
|
|
"INFO:gym:episode 1202, reward -0.002220, avg reward -0.010161, total steps 153856, episode step 128\n",
|
|
"[2018-02-18 15:14:02,888] episode 1202, reward -0.002220, avg reward -0.010161, total steps 153856, episode step 128\n",
|
|
"INFO:gym:episode 1203, reward -0.002346, avg reward -0.010126, total steps 153984, episode step 128\n",
|
|
"[2018-02-18 15:14:06,466] episode 1203, reward -0.002346, avg reward -0.010126, total steps 153984, episode step 128\n",
|
|
"INFO:gym:episode 1204, reward -0.011487, avg reward -0.010207, total steps 154112, episode step 128\n",
|
|
"[2018-02-18 15:14:10,068] episode 1204, reward -0.011487, avg reward -0.010207, total steps 154112, episode step 128\n",
|
|
"INFO:gym:episode 1205, reward -0.001895, avg reward -0.010205, total steps 154240, episode step 128\n",
|
|
"[2018-02-18 15:14:13,990] episode 1205, reward -0.001895, avg reward -0.010205, total steps 154240, episode step 128\n",
|
|
"INFO:gym:episode 1206, reward -0.002536, avg reward -0.010191, total steps 154368, episode step 128\n",
|
|
"[2018-02-18 15:14:17,716] episode 1206, reward -0.002536, avg reward -0.010191, total steps 154368, episode step 128\n",
|
|
"INFO:gym:episode 1207, reward -0.011565, avg reward -0.010184, total steps 154496, episode step 128\n",
|
|
"[2018-02-18 15:14:21,490] episode 1207, reward -0.011565, avg reward -0.010184, total steps 154496, episode step 128\n",
|
|
"INFO:gym:episode 1208, reward 0.014660, avg reward -0.010014, total steps 154624, episode step 128\n",
|
|
"[2018-02-18 15:14:25,373] episode 1208, reward 0.014660, avg reward -0.010014, total steps 154624, episode step 128\n",
|
|
"INFO:gym:episode 1209, reward -0.007861, avg reward -0.010096, total steps 154752, episode step 128\n",
|
|
"[2018-02-18 15:14:29,288] episode 1209, reward -0.007861, avg reward -0.010096, total steps 154752, episode step 128\n",
|
|
"INFO:gym:episode 1210, reward -0.002309, avg reward -0.010167, total steps 154880, episode step 128\n",
|
|
"[2018-02-18 15:14:33,290] episode 1210, reward -0.002309, avg reward -0.010167, total steps 154880, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:14:33,291] Testing...\n",
|
|
"INFO:gym:Avg reward -0.018904(0.000000)\n",
|
|
"[2018-02-18 15:14:33,628] Avg reward -0.018904(0.000000)\n",
|
|
"INFO:gym:episode 1211, reward -0.002822, avg reward -0.010153, total steps 155008, episode step 128\n",
|
|
"[2018-02-18 15:14:37,458] episode 1211, reward -0.002822, avg reward -0.010153, total steps 155008, episode step 128\n",
|
|
"INFO:gym:episode 1212, reward -0.007726, avg reward -0.010155, total steps 155136, episode step 128\n",
|
|
"[2018-02-18 15:14:41,237] episode 1212, reward -0.007726, avg reward -0.010155, total steps 155136, episode step 128\n",
|
|
"INFO:gym:episode 1213, reward -0.001735, avg reward -0.009862, total steps 155264, episode step 128\n",
|
|
"[2018-02-18 15:14:44,957] episode 1213, reward -0.001735, avg reward -0.009862, total steps 155264, episode step 128\n",
|
|
"INFO:gym:episode 1214, reward -0.001757, avg reward -0.009371, total steps 155392, episode step 128\n",
|
|
"[2018-02-18 15:14:48,674] episode 1214, reward -0.001757, avg reward -0.009371, total steps 155392, episode step 128\n",
|
|
"INFO:gym:episode 1215, reward -0.006531, avg reward -0.009218, total steps 155520, episode step 128\n",
|
|
"[2018-02-18 15:14:52,304] episode 1215, reward -0.006531, avg reward -0.009218, total steps 155520, episode step 128\n",
|
|
"INFO:gym:episode 1216, reward -0.001951, avg reward -0.009153, total steps 155648, episode step 128\n",
|
|
"[2018-02-18 15:14:55,918] episode 1216, reward -0.001951, avg reward -0.009153, total steps 155648, episode step 128\n",
|
|
"INFO:gym:episode 1217, reward -0.003441, avg reward -0.009021, total steps 155776, episode step 128\n",
|
|
"[2018-02-18 15:14:59,612] episode 1217, reward -0.003441, avg reward -0.009021, total steps 155776, episode step 128\n",
|
|
"INFO:gym:episode 1218, reward -0.006192, avg reward -0.009055, total steps 155904, episode step 128\n",
|
|
"[2018-02-18 15:15:03,377] episode 1218, reward -0.006192, avg reward -0.009055, total steps 155904, episode step 128\n",
|
|
"INFO:gym:episode 1219, reward 0.014527, avg reward -0.008893, total steps 156032, episode step 128\n",
|
|
"[2018-02-18 15:15:07,497] episode 1219, reward 0.014527, avg reward -0.008893, total steps 156032, episode step 128\n",
|
|
"INFO:gym:episode 1220, reward -0.004133, avg reward -0.008818, total steps 156160, episode step 128\n",
|
|
"[2018-02-18 15:15:09,593] episode 1220, reward -0.004133, avg reward -0.008818, total steps 156160, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:15:09,594] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001038(0.000000)\n",
|
|
"[2018-02-18 15:15:09,924] Avg reward -0.001038(0.000000)\n",
|
|
"INFO:gym:episode 1221, reward -0.000998, avg reward -0.008810, total steps 156288, episode step 128\n",
|
|
"[2018-02-18 15:15:11,711] episode 1221, reward -0.000998, avg reward -0.008810, total steps 156288, episode step 128\n",
|
|
"INFO:gym:episode 1222, reward -0.003258, avg reward -0.008787, total steps 156416, episode step 128\n",
|
|
"[2018-02-18 15:15:13,575] episode 1222, reward -0.003258, avg reward -0.008787, total steps 156416, episode step 128\n",
|
|
"INFO:gym:episode 1223, reward -0.003424, avg reward -0.008804, total steps 156544, episode step 128\n",
|
|
"[2018-02-18 15:15:15,403] episode 1223, reward -0.003424, avg reward -0.008804, total steps 156544, episode step 128\n",
|
|
"INFO:gym:episode 1224, reward -0.001789, avg reward -0.008503, total steps 156672, episode step 128\n",
|
|
"[2018-02-18 15:15:17,284] episode 1224, reward -0.001789, avg reward -0.008503, total steps 156672, episode step 128\n",
|
|
"INFO:gym:episode 1225, reward -0.001506, avg reward -0.008473, total steps 156800, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:15:19,101] episode 1225, reward -0.001506, avg reward -0.008473, total steps 156800, episode step 128\n",
|
|
"INFO:gym:episode 1226, reward -0.019463, avg reward -0.008648, total steps 156928, episode step 128\n",
|
|
"[2018-02-18 15:15:20,925] episode 1226, reward -0.019463, avg reward -0.008648, total steps 156928, episode step 128\n",
|
|
"INFO:gym:episode 1227, reward -0.008413, avg reward -0.008714, total steps 157056, episode step 128\n",
|
|
"[2018-02-18 15:15:22,774] episode 1227, reward -0.008413, avg reward -0.008714, total steps 157056, episode step 128\n",
|
|
"INFO:gym:episode 1228, reward 0.000770, avg reward -0.008532, total steps 157184, episode step 128\n",
|
|
"[2018-02-18 15:15:24,680] episode 1228, reward 0.000770, avg reward -0.008532, total steps 157184, episode step 128\n",
|
|
"INFO:gym:episode 1229, reward -0.005515, avg reward -0.008371, total steps 157312, episode step 128\n",
|
|
"[2018-02-18 15:15:26,502] episode 1229, reward -0.005515, avg reward -0.008371, total steps 157312, episode step 128\n",
|
|
"INFO:gym:episode 1230, reward -0.005040, avg reward -0.007976, total steps 157440, episode step 128\n",
|
|
"[2018-02-18 15:15:28,304] episode 1230, reward -0.005040, avg reward -0.007976, total steps 157440, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:15:28,305] Testing...\n",
|
|
"INFO:gym:Avg reward -0.003655(0.000000)\n",
|
|
"[2018-02-18 15:15:28,633] Avg reward -0.003655(0.000000)\n",
|
|
"INFO:gym:episode 1231, reward -0.008498, avg reward -0.007966, total steps 157568, episode step 128\n",
|
|
"[2018-02-18 15:15:30,411] episode 1231, reward -0.008498, avg reward -0.007966, total steps 157568, episode step 128\n",
|
|
"INFO:gym:episode 1232, reward -0.001766, avg reward -0.007895, total steps 157696, episode step 128\n",
|
|
"[2018-02-18 15:15:32,159] episode 1232, reward -0.001766, avg reward -0.007895, total steps 157696, episode step 128\n",
|
|
"INFO:gym:episode 1233, reward -0.002279, avg reward -0.007594, total steps 157824, episode step 128\n",
|
|
"[2018-02-18 15:15:33,948] episode 1233, reward -0.002279, avg reward -0.007594, total steps 157824, episode step 128\n",
|
|
"INFO:gym:episode 1234, reward -0.001760, avg reward -0.007393, total steps 157952, episode step 128\n",
|
|
"[2018-02-18 15:15:35,738] episode 1234, reward -0.001760, avg reward -0.007393, total steps 157952, episode step 128\n",
|
|
"INFO:gym:episode 1235, reward -0.001790, avg reward -0.007372, total steps 158080, episode step 128\n",
|
|
"[2018-02-18 15:15:37,619] episode 1235, reward -0.001790, avg reward -0.007372, total steps 158080, episode step 128\n",
|
|
"INFO:gym:episode 1236, reward -0.002343, avg reward -0.007122, total steps 158208, episode step 128\n",
|
|
"[2018-02-18 15:15:39,542] episode 1236, reward -0.002343, avg reward -0.007122, total steps 158208, episode step 128\n",
|
|
"INFO:gym:episode 1237, reward -0.001735, avg reward -0.007117, total steps 158336, episode step 128\n",
|
|
"[2018-02-18 15:15:41,386] episode 1237, reward -0.001735, avg reward -0.007117, total steps 158336, episode step 128\n",
|
|
"INFO:gym:episode 1238, reward -0.026171, avg reward -0.007438, total steps 158464, episode step 128\n",
|
|
"[2018-02-18 15:15:43,232] episode 1238, reward -0.026171, avg reward -0.007438, total steps 158464, episode step 128\n",
|
|
"INFO:gym:episode 1239, reward -0.001852, avg reward -0.007362, total steps 158592, episode step 128\n",
|
|
"[2018-02-18 15:15:45,080] episode 1239, reward -0.001852, avg reward -0.007362, total steps 158592, episode step 128\n",
|
|
"INFO:gym:episode 1240, reward -0.012705, avg reward -0.007371, total steps 158720, episode step 128\n",
|
|
"[2018-02-18 15:15:46,978] episode 1240, reward -0.012705, avg reward -0.007371, total steps 158720, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:15:46,984] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002438(0.000000)\n",
|
|
"[2018-02-18 15:15:47,335] Avg reward -0.002438(0.000000)\n",
|
|
"INFO:gym:episode 1241, reward -0.010587, avg reward -0.007413, total steps 158848, episode step 128\n",
|
|
"[2018-02-18 15:15:49,372] episode 1241, reward -0.010587, avg reward -0.007413, total steps 158848, episode step 128\n",
|
|
"INFO:gym:episode 1242, reward -0.001840, avg reward -0.007390, total steps 158976, episode step 128\n",
|
|
"[2018-02-18 15:15:51,492] episode 1242, reward -0.001840, avg reward -0.007390, total steps 158976, episode step 128\n",
|
|
"INFO:gym:episode 1243, reward -0.031692, avg reward -0.007648, total steps 159104, episode step 128\n",
|
|
"[2018-02-18 15:15:53,617] episode 1243, reward -0.031692, avg reward -0.007648, total steps 159104, episode step 128\n",
|
|
"INFO:gym:episode 1244, reward -0.010049, avg reward -0.007663, total steps 159232, episode step 128\n",
|
|
"[2018-02-18 15:15:55,695] episode 1244, reward -0.010049, avg reward -0.007663, total steps 159232, episode step 128\n",
|
|
"INFO:gym:episode 1245, reward -0.005341, avg reward -0.007355, total steps 159360, episode step 128\n",
|
|
"[2018-02-18 15:15:57,879] episode 1245, reward -0.005341, avg reward -0.007355, total steps 159360, episode step 128\n",
|
|
"INFO:gym:episode 1246, reward -0.003064, avg reward -0.007320, total steps 159488, episode step 128\n",
|
|
"[2018-02-18 15:16:00,165] episode 1246, reward -0.003064, avg reward -0.007320, total steps 159488, episode step 128\n",
|
|
"INFO:gym:episode 1247, reward -0.019864, avg reward -0.007430, total steps 159616, episode step 128\n",
|
|
"[2018-02-18 15:16:02,584] episode 1247, reward -0.019864, avg reward -0.007430, total steps 159616, episode step 128\n",
|
|
"INFO:gym:episode 1248, reward -0.003477, avg reward -0.007404, total steps 159744, episode step 128\n",
|
|
"[2018-02-18 15:16:05,094] episode 1248, reward -0.003477, avg reward -0.007404, total steps 159744, episode step 128\n",
|
|
"INFO:gym:episode 1249, reward -0.006348, avg reward -0.007386, total steps 159872, episode step 128\n",
|
|
"[2018-02-18 15:16:07,640] episode 1249, reward -0.006348, avg reward -0.007386, total steps 159872, episode step 128\n",
|
|
"INFO:gym:episode 1250, reward -0.004015, avg reward -0.007276, total steps 160000, episode step 128\n",
|
|
"[2018-02-18 15:16:10,229] episode 1250, reward -0.004015, avg reward -0.007276, total steps 160000, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:16:10,232] Testing...\n",
|
|
"INFO:gym:Avg reward -0.000424(0.000000)\n",
|
|
"[2018-02-18 15:16:10,595] Avg reward -0.000424(0.000000)\n",
|
|
"INFO:gym:episode 1251, reward -0.002009, avg reward -0.007302, total steps 160128, episode step 128\n",
|
|
"[2018-02-18 15:16:13,251] episode 1251, reward -0.002009, avg reward -0.007302, total steps 160128, episode step 128\n",
|
|
"INFO:gym:episode 1252, reward -0.002527, avg reward -0.007308, total steps 160256, episode step 128\n",
|
|
"[2018-02-18 15:16:16,099] episode 1252, reward -0.002527, avg reward -0.007308, total steps 160256, episode step 128\n",
|
|
"INFO:gym:episode 1253, reward -0.029251, avg reward -0.007370, total steps 160384, episode step 128\n",
|
|
"[2018-02-18 15:16:19,138] episode 1253, reward -0.029251, avg reward -0.007370, total steps 160384, episode step 128\n",
|
|
"INFO:gym:episode 1254, reward -0.023524, avg reward -0.007177, total steps 160512, episode step 128\n",
|
|
"[2018-02-18 15:16:22,221] episode 1254, reward -0.023524, avg reward -0.007177, total steps 160512, episode step 128\n",
|
|
"INFO:gym:episode 1255, reward -0.011877, avg reward -0.007278, total steps 160640, episode step 128\n",
|
|
"[2018-02-18 15:16:25,456] episode 1255, reward -0.011877, avg reward -0.007278, total steps 160640, episode step 128\n",
|
|
"INFO:gym:episode 1256, reward -0.003918, avg reward -0.007506, total steps 160768, episode step 128\n",
|
|
"[2018-02-18 15:16:29,006] episode 1256, reward -0.003918, avg reward -0.007506, total steps 160768, episode step 128\n",
|
|
"INFO:gym:episode 1257, reward 0.006479, avg reward -0.007430, total steps 160896, episode step 128\n",
|
|
"[2018-02-18 15:16:32,626] episode 1257, reward 0.006479, avg reward -0.007430, total steps 160896, episode step 128\n",
|
|
"INFO:gym:episode 1258, reward -0.006845, avg reward -0.007335, total steps 161024, episode step 128\n",
|
|
"[2018-02-18 15:16:36,434] episode 1258, reward -0.006845, avg reward -0.007335, total steps 161024, episode step 128\n",
|
|
"INFO:gym:episode 1259, reward -0.004949, avg reward -0.007360, total steps 161152, episode step 128\n",
|
|
"[2018-02-18 15:16:40,279] episode 1259, reward -0.004949, avg reward -0.007360, total steps 161152, episode step 128\n",
|
|
"INFO:gym:episode 1260, reward -0.001754, avg reward -0.007331, total steps 161280, episode step 128\n",
|
|
"[2018-02-18 15:16:43,919] episode 1260, reward -0.001754, avg reward -0.007331, total steps 161280, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:16:43,921] Testing...\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"INFO:gym:Avg reward -0.009929(0.000000)\n",
|
|
"[2018-02-18 15:16:44,256] Avg reward -0.009929(0.000000)\n",
|
|
"INFO:gym:episode 1261, reward -0.009620, avg reward -0.007319, total steps 161408, episode step 128\n",
|
|
"[2018-02-18 15:16:47,988] episode 1261, reward -0.009620, avg reward -0.007319, total steps 161408, episode step 128\n",
|
|
"INFO:gym:episode 1262, reward -0.003981, avg reward -0.007236, total steps 161536, episode step 128\n",
|
|
"[2018-02-18 15:16:51,789] episode 1262, reward -0.003981, avg reward -0.007236, total steps 161536, episode step 128\n",
|
|
"INFO:gym:episode 1263, reward -0.007729, avg reward -0.007126, total steps 161664, episode step 128\n",
|
|
"[2018-02-18 15:16:55,681] episode 1263, reward -0.007729, avg reward -0.007126, total steps 161664, episode step 128\n",
|
|
"INFO:gym:episode 1264, reward -0.026418, avg reward -0.007261, total steps 161792, episode step 128\n",
|
|
"[2018-02-18 15:16:59,581] episode 1264, reward -0.026418, avg reward -0.007261, total steps 161792, episode step 128\n",
|
|
"INFO:gym:episode 1265, reward -0.009768, avg reward -0.007339, total steps 161920, episode step 128\n",
|
|
"[2018-02-18 15:17:03,619] episode 1265, reward -0.009768, avg reward -0.007339, total steps 161920, episode step 128\n",
|
|
"INFO:gym:episode 1266, reward -0.002166, avg reward -0.007320, total steps 162048, episode step 128\n",
|
|
"[2018-02-18 15:17:07,844] episode 1266, reward -0.002166, avg reward -0.007320, total steps 162048, episode step 128\n",
|
|
"INFO:gym:episode 1267, reward -0.003171, avg reward -0.007323, total steps 162176, episode step 128\n",
|
|
"[2018-02-18 15:17:11,825] episode 1267, reward -0.003171, avg reward -0.007323, total steps 162176, episode step 128\n",
|
|
"INFO:gym:episode 1268, reward -0.034169, avg reward -0.007223, total steps 162304, episode step 128\n",
|
|
"[2018-02-18 15:17:15,573] episode 1268, reward -0.034169, avg reward -0.007223, total steps 162304, episode step 128\n",
|
|
"INFO:gym:episode 1269, reward -0.002046, avg reward -0.007071, total steps 162432, episode step 128\n",
|
|
"[2018-02-18 15:17:19,475] episode 1269, reward -0.002046, avg reward -0.007071, total steps 162432, episode step 128\n",
|
|
"INFO:gym:episode 1270, reward 0.004402, avg reward -0.006959, total steps 162560, episode step 128\n",
|
|
"[2018-02-18 15:17:23,404] episode 1270, reward 0.004402, avg reward -0.006959, total steps 162560, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:17:23,405] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002367(0.000000)\n",
|
|
"[2018-02-18 15:17:23,721] Avg reward -0.002367(0.000000)\n",
|
|
"INFO:gym:episode 1271, reward -0.007678, avg reward -0.006912, total steps 162688, episode step 128\n",
|
|
"[2018-02-18 15:17:27,613] episode 1271, reward -0.007678, avg reward -0.006912, total steps 162688, episode step 128\n",
|
|
"INFO:gym:episode 1272, reward -0.002257, avg reward -0.006818, total steps 162816, episode step 128\n",
|
|
"[2018-02-18 15:17:31,455] episode 1272, reward -0.002257, avg reward -0.006818, total steps 162816, episode step 128\n",
|
|
"INFO:gym:episode 1273, reward -0.001762, avg reward -0.006271, total steps 162944, episode step 128\n",
|
|
"[2018-02-18 15:17:35,293] episode 1273, reward -0.001762, avg reward -0.006271, total steps 162944, episode step 128\n",
|
|
"INFO:gym:episode 1274, reward -0.006269, avg reward -0.006316, total steps 163072, episode step 128\n",
|
|
"[2018-02-18 15:17:39,102] episode 1274, reward -0.006269, avg reward -0.006316, total steps 163072, episode step 128\n",
|
|
"INFO:gym:episode 1275, reward -0.013955, avg reward -0.006297, total steps 163200, episode step 128\n",
|
|
"[2018-02-18 15:17:42,896] episode 1275, reward -0.013955, avg reward -0.006297, total steps 163200, episode step 128\n",
|
|
"INFO:gym:episode 1276, reward -0.013765, avg reward -0.006380, total steps 163328, episode step 128\n",
|
|
"[2018-02-18 15:17:46,689] episode 1276, reward -0.013765, avg reward -0.006380, total steps 163328, episode step 128\n",
|
|
"INFO:gym:episode 1277, reward -0.006824, avg reward -0.006433, total steps 163456, episode step 128\n",
|
|
"[2018-02-18 15:17:50,390] episode 1277, reward -0.006824, avg reward -0.006433, total steps 163456, episode step 128\n",
|
|
"INFO:gym:episode 1278, reward -0.004951, avg reward -0.006393, total steps 163584, episode step 128\n",
|
|
"[2018-02-18 15:17:54,100] episode 1278, reward -0.004951, avg reward -0.006393, total steps 163584, episode step 128\n",
|
|
"INFO:gym:episode 1279, reward -0.000930, avg reward -0.006350, total steps 163712, episode step 128\n",
|
|
"[2018-02-18 15:17:57,809] episode 1279, reward -0.000930, avg reward -0.006350, total steps 163712, episode step 128\n",
|
|
"INFO:gym:episode 1280, reward -0.002373, avg reward -0.006339, total steps 163840, episode step 128\n",
|
|
"[2018-02-18 15:18:01,522] episode 1280, reward -0.002373, avg reward -0.006339, total steps 163840, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:18:01,529] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002703(0.000000)\n",
|
|
"[2018-02-18 15:18:01,855] Avg reward -0.002703(0.000000)\n",
|
|
"INFO:gym:episode 1281, reward -0.002711, avg reward -0.006314, total steps 163968, episode step 128\n",
|
|
"[2018-02-18 15:18:05,453] episode 1281, reward -0.002711, avg reward -0.006314, total steps 163968, episode step 128\n",
|
|
"INFO:gym:episode 1282, reward -0.002061, avg reward -0.006276, total steps 164096, episode step 128\n",
|
|
"[2018-02-18 15:18:08,996] episode 1282, reward -0.002061, avg reward -0.006276, total steps 164096, episode step 128\n",
|
|
"INFO:gym:episode 1283, reward -0.021689, avg reward -0.006464, total steps 164224, episode step 128\n",
|
|
"[2018-02-18 15:18:12,512] episode 1283, reward -0.021689, avg reward -0.006464, total steps 164224, episode step 128\n",
|
|
"INFO:gym:episode 1284, reward -0.001774, avg reward -0.006398, total steps 164352, episode step 128\n",
|
|
"[2018-02-18 15:18:16,050] episode 1284, reward -0.001774, avg reward -0.006398, total steps 164352, episode step 128\n",
|
|
"INFO:gym:episode 1285, reward -0.009260, avg reward -0.006425, total steps 164480, episode step 128\n",
|
|
"[2018-02-18 15:18:19,579] episode 1285, reward -0.009260, avg reward -0.006425, total steps 164480, episode step 128\n",
|
|
"INFO:gym:episode 1286, reward -0.009791, avg reward -0.006534, total steps 164608, episode step 128\n",
|
|
"[2018-02-18 15:18:23,106] episode 1286, reward -0.009791, avg reward -0.006534, total steps 164608, episode step 128\n",
|
|
"INFO:gym:episode 1287, reward 0.000438, avg reward -0.006738, total steps 164736, episode step 128\n",
|
|
"[2018-02-18 15:18:26,635] episode 1287, reward 0.000438, avg reward -0.006738, total steps 164736, episode step 128\n",
|
|
"INFO:gym:episode 1288, reward -0.003513, avg reward -0.006749, total steps 164864, episode step 128\n",
|
|
"[2018-02-18 15:18:30,144] episode 1288, reward -0.003513, avg reward -0.006749, total steps 164864, episode step 128\n",
|
|
"INFO:gym:episode 1289, reward -0.014434, avg reward -0.006752, total steps 164992, episode step 128\n",
|
|
"[2018-02-18 15:18:33,812] episode 1289, reward -0.014434, avg reward -0.006752, total steps 164992, episode step 128\n",
|
|
"INFO:gym:episode 1290, reward -0.001971, avg reward -0.006748, total steps 165120, episode step 128\n",
|
|
"[2018-02-18 15:18:37,300] episode 1290, reward -0.001971, avg reward -0.006748, total steps 165120, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:18:37,301] Testing...\n",
|
|
"INFO:gym:Avg reward -0.007032(0.000000)\n",
|
|
"[2018-02-18 15:18:37,627] Avg reward -0.007032(0.000000)\n",
|
|
"INFO:gym:episode 1291, reward -0.008185, avg reward -0.006819, total steps 165248, episode step 128\n",
|
|
"[2018-02-18 15:18:41,117] episode 1291, reward -0.008185, avg reward -0.006819, total steps 165248, episode step 128\n",
|
|
"INFO:gym:episode 1292, reward -0.021015, avg reward -0.006972, total steps 165376, episode step 128\n",
|
|
"[2018-02-18 15:18:44,591] episode 1292, reward -0.021015, avg reward -0.006972, total steps 165376, episode step 128\n",
|
|
"INFO:gym:episode 1293, reward -0.030362, avg reward -0.007241, total steps 165504, episode step 128\n",
|
|
"[2018-02-18 15:18:48,113] episode 1293, reward -0.030362, avg reward -0.007241, total steps 165504, episode step 128\n",
|
|
"INFO:gym:episode 1294, reward -0.011842, avg reward -0.007318, total steps 165632, episode step 128\n",
|
|
"[2018-02-18 15:18:51,628] episode 1294, reward -0.011842, avg reward -0.007318, total steps 165632, episode step 128\n",
|
|
"INFO:gym:episode 1295, reward -0.001759, avg reward -0.007291, total steps 165760, episode step 128\n",
|
|
"[2018-02-18 15:18:55,208] episode 1295, reward -0.001759, avg reward -0.007291, total steps 165760, episode step 128\n",
|
|
"INFO:gym:episode 1296, reward 0.003634, avg reward -0.007101, total steps 165888, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:18:58,844] episode 1296, reward 0.003634, avg reward -0.007101, total steps 165888, episode step 128\n",
|
|
"INFO:gym:episode 1297, reward 0.000652, avg reward -0.007073, total steps 166016, episode step 128\n",
|
|
"[2018-02-18 15:19:02,377] episode 1297, reward 0.000652, avg reward -0.007073, total steps 166016, episode step 128\n",
|
|
"INFO:gym:episode 1298, reward -0.005123, avg reward -0.006929, total steps 166144, episode step 128\n",
|
|
"[2018-02-18 15:19:05,830] episode 1298, reward -0.005123, avg reward -0.006929, total steps 166144, episode step 128\n",
|
|
"INFO:gym:episode 1299, reward -0.010646, avg reward -0.006944, total steps 166272, episode step 128\n",
|
|
"[2018-02-18 15:19:09,303] episode 1299, reward -0.010646, avg reward -0.006944, total steps 166272, episode step 128\n",
|
|
"INFO:gym:episode 1300, reward -0.015001, avg reward -0.006929, total steps 166400, episode step 128\n",
|
|
"[2018-02-18 15:19:13,026] episode 1300, reward -0.015001, avg reward -0.006929, total steps 166400, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:19:13,027] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001765(0.000000)\n",
|
|
"[2018-02-18 15:19:13,345] Avg reward -0.001765(0.000000)\n",
|
|
"INFO:gym:episode 1301, reward -0.003689, avg reward -0.006608, total steps 166528, episode step 128\n",
|
|
"[2018-02-18 15:19:17,152] episode 1301, reward -0.003689, avg reward -0.006608, total steps 166528, episode step 128\n",
|
|
"INFO:gym:episode 1302, reward -0.010120, avg reward -0.006687, total steps 166656, episode step 128\n",
|
|
"[2018-02-18 15:19:21,099] episode 1302, reward -0.010120, avg reward -0.006687, total steps 166656, episode step 128\n",
|
|
"INFO:gym:episode 1303, reward -0.001996, avg reward -0.006684, total steps 166784, episode step 128\n",
|
|
"[2018-02-18 15:19:24,440] episode 1303, reward -0.001996, avg reward -0.006684, total steps 166784, episode step 128\n",
|
|
"INFO:gym:episode 1304, reward -0.002103, avg reward -0.006590, total steps 166912, episode step 128\n",
|
|
"[2018-02-18 15:19:26,283] episode 1304, reward -0.002103, avg reward -0.006590, total steps 166912, episode step 128\n",
|
|
"INFO:gym:episode 1305, reward 0.013936, avg reward -0.006432, total steps 167040, episode step 128\n",
|
|
"[2018-02-18 15:19:28,070] episode 1305, reward 0.013936, avg reward -0.006432, total steps 167040, episode step 128\n",
|
|
"INFO:gym:episode 1306, reward -0.003457, avg reward -0.006441, total steps 167168, episode step 128\n",
|
|
"[2018-02-18 15:19:29,815] episode 1306, reward -0.003457, avg reward -0.006441, total steps 167168, episode step 128\n",
|
|
"INFO:gym:episode 1307, reward -0.004201, avg reward -0.006367, total steps 167296, episode step 128\n",
|
|
"[2018-02-18 15:19:31,620] episode 1307, reward -0.004201, avg reward -0.006367, total steps 167296, episode step 128\n",
|
|
"INFO:gym:episode 1308, reward -0.004962, avg reward -0.006564, total steps 167424, episode step 128\n",
|
|
"[2018-02-18 15:19:33,374] episode 1308, reward -0.004962, avg reward -0.006564, total steps 167424, episode step 128\n",
|
|
"INFO:gym:episode 1309, reward -0.042775, avg reward -0.006913, total steps 167552, episode step 128\n",
|
|
"[2018-02-18 15:19:35,114] episode 1309, reward -0.042775, avg reward -0.006913, total steps 167552, episode step 128\n",
|
|
"INFO:gym:episode 1310, reward -0.011106, avg reward -0.007001, total steps 167680, episode step 128\n",
|
|
"[2018-02-18 15:19:36,885] episode 1310, reward -0.011106, avg reward -0.007001, total steps 167680, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:19:36,886] Testing...\n",
|
|
"INFO:gym:Avg reward -0.004387(0.000000)\n",
|
|
"[2018-02-18 15:19:37,211] Avg reward -0.004387(0.000000)\n",
|
|
"INFO:gym:episode 1311, reward -0.018028, avg reward -0.007153, total steps 167808, episode step 128\n",
|
|
"[2018-02-18 15:19:38,969] episode 1311, reward -0.018028, avg reward -0.007153, total steps 167808, episode step 128\n",
|
|
"INFO:gym:episode 1312, reward -0.031750, avg reward -0.007393, total steps 167936, episode step 128\n",
|
|
"[2018-02-18 15:19:40,757] episode 1312, reward -0.031750, avg reward -0.007393, total steps 167936, episode step 128\n",
|
|
"INFO:gym:episode 1313, reward -0.003144, avg reward -0.007407, total steps 168064, episode step 128\n",
|
|
"[2018-02-18 15:19:42,626] episode 1313, reward -0.003144, avg reward -0.007407, total steps 168064, episode step 128\n",
|
|
"INFO:gym:episode 1314, reward -0.032592, avg reward -0.007715, total steps 168192, episode step 128\n",
|
|
"[2018-02-18 15:19:44,458] episode 1314, reward -0.032592, avg reward -0.007715, total steps 168192, episode step 128\n",
|
|
"INFO:gym:episode 1315, reward -0.004628, avg reward -0.007696, total steps 168320, episode step 128\n",
|
|
"[2018-02-18 15:19:46,412] episode 1315, reward -0.004628, avg reward -0.007696, total steps 168320, episode step 128\n",
|
|
"INFO:gym:episode 1316, reward -0.015831, avg reward -0.007835, total steps 168448, episode step 128\n",
|
|
"[2018-02-18 15:19:48,210] episode 1316, reward -0.015831, avg reward -0.007835, total steps 168448, episode step 128\n",
|
|
"INFO:gym:episode 1317, reward -0.017619, avg reward -0.007977, total steps 168576, episode step 128\n",
|
|
"[2018-02-18 15:19:50,067] episode 1317, reward -0.017619, avg reward -0.007977, total steps 168576, episode step 128\n",
|
|
"INFO:gym:episode 1318, reward -0.001786, avg reward -0.007933, total steps 168704, episode step 128\n",
|
|
"[2018-02-18 15:19:51,909] episode 1318, reward -0.001786, avg reward -0.007933, total steps 168704, episode step 128\n",
|
|
"INFO:gym:episode 1319, reward -0.006831, avg reward -0.008147, total steps 168832, episode step 128\n",
|
|
"[2018-02-18 15:19:53,918] episode 1319, reward -0.006831, avg reward -0.008147, total steps 168832, episode step 128\n",
|
|
"INFO:gym:episode 1320, reward -0.004306, avg reward -0.008148, total steps 168960, episode step 128\n",
|
|
"[2018-02-18 15:19:55,717] episode 1320, reward -0.004306, avg reward -0.008148, total steps 168960, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:19:55,724] Testing...\n",
|
|
"INFO:gym:Avg reward 0.004051(0.000000)\n",
|
|
"[2018-02-18 15:19:56,068] Avg reward 0.004051(0.000000)\n",
|
|
"INFO:gym:episode 1321, reward 0.001588, avg reward -0.008122, total steps 169088, episode step 128\n",
|
|
"[2018-02-18 15:19:57,849] episode 1321, reward 0.001588, avg reward -0.008122, total steps 169088, episode step 128\n",
|
|
"INFO:gym:episode 1322, reward -0.017514, avg reward -0.008265, total steps 169216, episode step 128\n",
|
|
"[2018-02-18 15:19:59,601] episode 1322, reward -0.017514, avg reward -0.008265, total steps 169216, episode step 128\n",
|
|
"INFO:gym:episode 1323, reward -0.001998, avg reward -0.008251, total steps 169344, episode step 128\n",
|
|
"[2018-02-18 15:20:01,417] episode 1323, reward -0.001998, avg reward -0.008251, total steps 169344, episode step 128\n",
|
|
"INFO:gym:episode 1324, reward -0.001765, avg reward -0.008250, total steps 169472, episode step 128\n",
|
|
"[2018-02-18 15:20:03,253] episode 1324, reward -0.001765, avg reward -0.008250, total steps 169472, episode step 128\n",
|
|
"INFO:gym:episode 1325, reward -0.002318, avg reward -0.008259, total steps 169600, episode step 128\n",
|
|
"[2018-02-18 15:20:05,091] episode 1325, reward -0.002318, avg reward -0.008259, total steps 169600, episode step 128\n",
|
|
"INFO:gym:episode 1326, reward -0.032190, avg reward -0.008386, total steps 169728, episode step 128\n",
|
|
"[2018-02-18 15:20:06,870] episode 1326, reward -0.032190, avg reward -0.008386, total steps 169728, episode step 128\n",
|
|
"INFO:gym:episode 1327, reward -0.001924, avg reward -0.008321, total steps 169856, episode step 128\n",
|
|
"[2018-02-18 15:20:08,715] episode 1327, reward -0.001924, avg reward -0.008321, total steps 169856, episode step 128\n",
|
|
"INFO:gym:episode 1328, reward -0.001673, avg reward -0.008345, total steps 169984, episode step 128\n",
|
|
"[2018-02-18 15:20:10,536] episode 1328, reward -0.001673, avg reward -0.008345, total steps 169984, episode step 128\n",
|
|
"INFO:gym:episode 1329, reward -0.001250, avg reward -0.008303, total steps 170112, episode step 128\n",
|
|
"[2018-02-18 15:20:12,418] episode 1329, reward -0.001250, avg reward -0.008303, total steps 170112, episode step 128\n",
|
|
"INFO:gym:episode 1330, reward -0.002168, avg reward -0.008274, total steps 170240, episode step 128\n",
|
|
"[2018-02-18 15:20:14,498] episode 1330, reward -0.002168, avg reward -0.008274, total steps 170240, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:20:14,500] Testing...\n",
|
|
"INFO:gym:Avg reward -0.003994(0.000000)\n",
|
|
"[2018-02-18 15:20:14,828] Avg reward -0.003994(0.000000)\n",
|
|
"INFO:gym:episode 1331, reward -0.008253, avg reward -0.008272, total steps 170368, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:20:16,979] episode 1331, reward -0.008253, avg reward -0.008272, total steps 170368, episode step 128\n",
|
|
"INFO:gym:episode 1332, reward -0.002471, avg reward -0.008279, total steps 170496, episode step 128\n",
|
|
"[2018-02-18 15:20:19,209] episode 1332, reward -0.002471, avg reward -0.008279, total steps 170496, episode step 128\n",
|
|
"INFO:gym:episode 1333, reward -0.002206, avg reward -0.008278, total steps 170624, episode step 128\n",
|
|
"[2018-02-18 15:20:21,491] episode 1333, reward -0.002206, avg reward -0.008278, total steps 170624, episode step 128\n",
|
|
"INFO:gym:episode 1334, reward -0.000729, avg reward -0.008268, total steps 170752, episode step 128\n",
|
|
"[2018-02-18 15:20:23,734] episode 1334, reward -0.000729, avg reward -0.008268, total steps 170752, episode step 128\n",
|
|
"INFO:gym:episode 1335, reward -0.002010, avg reward -0.008270, total steps 170880, episode step 128\n",
|
|
"[2018-02-18 15:20:26,147] episode 1335, reward -0.002010, avg reward -0.008270, total steps 170880, episode step 128\n",
|
|
"INFO:gym:episode 1336, reward -0.001762, avg reward -0.008264, total steps 171008, episode step 128\n",
|
|
"[2018-02-18 15:20:28,515] episode 1336, reward -0.001762, avg reward -0.008264, total steps 171008, episode step 128\n",
|
|
"INFO:gym:episode 1337, reward -0.006919, avg reward -0.008316, total steps 171136, episode step 128\n",
|
|
"[2018-02-18 15:20:31,057] episode 1337, reward -0.006919, avg reward -0.008316, total steps 171136, episode step 128\n",
|
|
"INFO:gym:episode 1338, reward -0.002474, avg reward -0.008079, total steps 171264, episode step 128\n",
|
|
"[2018-02-18 15:20:33,739] episode 1338, reward -0.002474, avg reward -0.008079, total steps 171264, episode step 128\n",
|
|
"INFO:gym:episode 1339, reward -0.027778, avg reward -0.008338, total steps 171392, episode step 128\n",
|
|
"[2018-02-18 15:20:36,570] episode 1339, reward -0.027778, avg reward -0.008338, total steps 171392, episode step 128\n",
|
|
"INFO:gym:episode 1340, reward -0.002162, avg reward -0.008233, total steps 171520, episode step 128\n",
|
|
"[2018-02-18 15:20:39,523] episode 1340, reward -0.002162, avg reward -0.008233, total steps 171520, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:20:39,524] Testing...\n",
|
|
"INFO:gym:Avg reward -0.004028(0.000000)\n",
|
|
"[2018-02-18 15:20:39,861] Avg reward -0.004028(0.000000)\n",
|
|
"INFO:gym:episode 1341, reward -0.009927, avg reward -0.008226, total steps 171648, episode step 128\n",
|
|
"[2018-02-18 15:20:43,081] episode 1341, reward -0.009927, avg reward -0.008226, total steps 171648, episode step 128\n",
|
|
"INFO:gym:episode 1342, reward -0.008264, avg reward -0.008290, total steps 171776, episode step 128\n",
|
|
"[2018-02-18 15:20:46,606] episode 1342, reward -0.008264, avg reward -0.008290, total steps 171776, episode step 128\n",
|
|
"INFO:gym:episode 1343, reward -0.001917, avg reward -0.007993, total steps 171904, episode step 128\n",
|
|
"[2018-02-18 15:20:50,235] episode 1343, reward -0.001917, avg reward -0.007993, total steps 171904, episode step 128\n",
|
|
"INFO:gym:episode 1344, reward -0.024458, avg reward -0.008137, total steps 172032, episode step 128\n",
|
|
"[2018-02-18 15:20:53,781] episode 1344, reward -0.024458, avg reward -0.008137, total steps 172032, episode step 128\n",
|
|
"INFO:gym:episode 1345, reward -0.012299, avg reward -0.008206, total steps 172160, episode step 128\n",
|
|
"[2018-02-18 15:20:57,305] episode 1345, reward -0.012299, avg reward -0.008206, total steps 172160, episode step 128\n",
|
|
"INFO:gym:episode 1346, reward -0.001836, avg reward -0.008194, total steps 172288, episode step 128\n",
|
|
"[2018-02-18 15:21:00,909] episode 1346, reward -0.001836, avg reward -0.008194, total steps 172288, episode step 128\n",
|
|
"INFO:gym:episode 1347, reward -0.000687, avg reward -0.008002, total steps 172416, episode step 128\n",
|
|
"[2018-02-18 15:21:04,707] episode 1347, reward -0.000687, avg reward -0.008002, total steps 172416, episode step 128\n",
|
|
"INFO:gym:episode 1348, reward -0.001790, avg reward -0.007985, total steps 172544, episode step 128\n",
|
|
"[2018-02-18 15:21:08,490] episode 1348, reward -0.001790, avg reward -0.007985, total steps 172544, episode step 128\n",
|
|
"INFO:gym:episode 1349, reward -0.018585, avg reward -0.008108, total steps 172672, episode step 128\n",
|
|
"[2018-02-18 15:21:12,103] episode 1349, reward -0.018585, avg reward -0.008108, total steps 172672, episode step 128\n",
|
|
"INFO:gym:episode 1350, reward -0.003572, avg reward -0.008103, total steps 172800, episode step 128\n",
|
|
"[2018-02-18 15:21:15,813] episode 1350, reward -0.003572, avg reward -0.008103, total steps 172800, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:21:15,814] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001975(0.000000)\n",
|
|
"[2018-02-18 15:21:16,166] Avg reward -0.001975(0.000000)\n",
|
|
"INFO:gym:episode 1351, reward -0.002307, avg reward -0.008106, total steps 172928, episode step 128\n",
|
|
"[2018-02-18 15:21:19,757] episode 1351, reward -0.002307, avg reward -0.008106, total steps 172928, episode step 128\n",
|
|
"INFO:gym:episode 1352, reward -0.038061, avg reward -0.008462, total steps 173056, episode step 128\n",
|
|
"[2018-02-18 15:21:23,355] episode 1352, reward -0.038061, avg reward -0.008462, total steps 173056, episode step 128\n",
|
|
"INFO:gym:episode 1353, reward -0.001630, avg reward -0.008185, total steps 173184, episode step 128\n",
|
|
"[2018-02-18 15:21:27,087] episode 1353, reward -0.001630, avg reward -0.008185, total steps 173184, episode step 128\n",
|
|
"INFO:gym:episode 1354, reward -0.013828, avg reward -0.008088, total steps 173312, episode step 128\n",
|
|
"[2018-02-18 15:21:30,964] episode 1354, reward -0.013828, avg reward -0.008088, total steps 173312, episode step 128\n",
|
|
"INFO:gym:episode 1355, reward -0.007641, avg reward -0.008046, total steps 173440, episode step 128\n",
|
|
"[2018-02-18 15:21:34,928] episode 1355, reward -0.007641, avg reward -0.008046, total steps 173440, episode step 128\n",
|
|
"INFO:gym:episode 1356, reward -0.017155, avg reward -0.008178, total steps 173568, episode step 128\n",
|
|
"[2018-02-18 15:21:38,865] episode 1356, reward -0.017155, avg reward -0.008178, total steps 173568, episode step 128\n",
|
|
"INFO:gym:episode 1357, reward -0.022050, avg reward -0.008464, total steps 173696, episode step 128\n",
|
|
"[2018-02-18 15:21:42,877] episode 1357, reward -0.022050, avg reward -0.008464, total steps 173696, episode step 128\n",
|
|
"INFO:gym:episode 1358, reward -0.004789, avg reward -0.008443, total steps 173824, episode step 128\n",
|
|
"[2018-02-18 15:21:46,943] episode 1358, reward -0.004789, avg reward -0.008443, total steps 173824, episode step 128\n",
|
|
"INFO:gym:episode 1359, reward -0.007557, avg reward -0.008469, total steps 173952, episode step 128\n",
|
|
"[2018-02-18 15:21:50,917] episode 1359, reward -0.007557, avg reward -0.008469, total steps 173952, episode step 128\n",
|
|
"INFO:gym:episode 1360, reward -0.012302, avg reward -0.008575, total steps 174080, episode step 128\n",
|
|
"[2018-02-18 15:21:54,805] episode 1360, reward -0.012302, avg reward -0.008575, total steps 174080, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:21:54,812] Testing...\n",
|
|
"INFO:gym:Avg reward -0.022598(0.000000)\n",
|
|
"[2018-02-18 15:21:55,140] Avg reward -0.022598(0.000000)\n",
|
|
"INFO:gym:episode 1361, reward -0.001789, avg reward -0.008496, total steps 174208, episode step 128\n",
|
|
"[2018-02-18 15:21:59,037] episode 1361, reward -0.001789, avg reward -0.008496, total steps 174208, episode step 128\n",
|
|
"INFO:gym:episode 1362, reward -0.001760, avg reward -0.008474, total steps 174336, episode step 128\n",
|
|
"[2018-02-18 15:22:02,932] episode 1362, reward -0.001760, avg reward -0.008474, total steps 174336, episode step 128\n",
|
|
"INFO:gym:episode 1363, reward -0.006934, avg reward -0.008466, total steps 174464, episode step 128\n",
|
|
"[2018-02-18 15:22:06,827] episode 1363, reward -0.006934, avg reward -0.008466, total steps 174464, episode step 128\n",
|
|
"INFO:gym:episode 1364, reward -0.012666, avg reward -0.008329, total steps 174592, episode step 128\n",
|
|
"[2018-02-18 15:22:10,665] episode 1364, reward -0.012666, avg reward -0.008329, total steps 174592, episode step 128\n",
|
|
"INFO:gym:episode 1365, reward -0.004799, avg reward -0.008279, total steps 174720, episode step 128\n",
|
|
"[2018-02-18 15:22:14,439] episode 1365, reward -0.004799, avg reward -0.008279, total steps 174720, episode step 128\n",
|
|
"INFO:gym:episode 1366, reward -0.002803, avg reward -0.008285, total steps 174848, episode step 128\n",
|
|
"[2018-02-18 15:22:18,176] episode 1366, reward -0.002803, avg reward -0.008285, total steps 174848, episode step 128\n",
|
|
"INFO:gym:episode 1367, reward -0.052144, avg reward -0.008775, total steps 174976, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:22:21,849] episode 1367, reward -0.052144, avg reward -0.008775, total steps 174976, episode step 128\n",
|
|
"INFO:gym:episode 1368, reward -0.004507, avg reward -0.008479, total steps 175104, episode step 128\n",
|
|
"[2018-02-18 15:22:25,498] episode 1368, reward -0.004507, avg reward -0.008479, total steps 175104, episode step 128\n",
|
|
"INFO:gym:episode 1369, reward -0.016736, avg reward -0.008625, total steps 175232, episode step 128\n",
|
|
"[2018-02-18 15:22:29,156] episode 1369, reward -0.016736, avg reward -0.008625, total steps 175232, episode step 128\n",
|
|
"INFO:gym:episode 1370, reward -0.002033, avg reward -0.008690, total steps 175360, episode step 128\n",
|
|
"[2018-02-18 15:22:32,854] episode 1370, reward -0.002033, avg reward -0.008690, total steps 175360, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:22:32,855] Testing...\n",
|
|
"INFO:gym:Avg reward -0.004409(0.000000)\n",
|
|
"[2018-02-18 15:22:33,193] Avg reward -0.004409(0.000000)\n",
|
|
"INFO:gym:episode 1371, reward -0.002181, avg reward -0.008635, total steps 175488, episode step 128\n",
|
|
"[2018-02-18 15:22:36,987] episode 1371, reward -0.002181, avg reward -0.008635, total steps 175488, episode step 128\n",
|
|
"INFO:gym:episode 1372, reward -0.001871, avg reward -0.008631, total steps 175616, episode step 128\n",
|
|
"[2018-02-18 15:22:40,757] episode 1372, reward -0.001871, avg reward -0.008631, total steps 175616, episode step 128\n",
|
|
"INFO:gym:episode 1373, reward -0.009727, avg reward -0.008711, total steps 175744, episode step 128\n",
|
|
"[2018-02-18 15:22:44,653] episode 1373, reward -0.009727, avg reward -0.008711, total steps 175744, episode step 128\n",
|
|
"INFO:gym:episode 1374, reward -0.018488, avg reward -0.008833, total steps 175872, episode step 128\n",
|
|
"[2018-02-18 15:22:48,466] episode 1374, reward -0.018488, avg reward -0.008833, total steps 175872, episode step 128\n",
|
|
"INFO:gym:episode 1375, reward -0.007021, avg reward -0.008763, total steps 176000, episode step 128\n",
|
|
"[2018-02-18 15:22:52,305] episode 1375, reward -0.007021, avg reward -0.008763, total steps 176000, episode step 128\n",
|
|
"INFO:gym:episode 1376, reward -0.009343, avg reward -0.008719, total steps 176128, episode step 128\n",
|
|
"[2018-02-18 15:22:56,035] episode 1376, reward -0.009343, avg reward -0.008719, total steps 176128, episode step 128\n",
|
|
"INFO:gym:episode 1377, reward -0.016909, avg reward -0.008820, total steps 176256, episode step 128\n",
|
|
"[2018-02-18 15:22:59,653] episode 1377, reward -0.016909, avg reward -0.008820, total steps 176256, episode step 128\n",
|
|
"INFO:gym:episode 1378, reward -0.003780, avg reward -0.008808, total steps 176384, episode step 128\n",
|
|
"[2018-02-18 15:23:03,256] episode 1378, reward -0.003780, avg reward -0.008808, total steps 176384, episode step 128\n",
|
|
"INFO:gym:episode 1379, reward -0.012856, avg reward -0.008928, total steps 176512, episode step 128\n",
|
|
"[2018-02-18 15:23:06,808] episode 1379, reward -0.012856, avg reward -0.008928, total steps 176512, episode step 128\n",
|
|
"INFO:gym:episode 1380, reward -0.006931, avg reward -0.008973, total steps 176640, episode step 128\n",
|
|
"[2018-02-18 15:23:10,400] episode 1380, reward -0.006931, avg reward -0.008973, total steps 176640, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:23:10,401] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002730(0.000000)\n",
|
|
"[2018-02-18 15:23:10,732] Avg reward -0.002730(0.000000)\n",
|
|
"INFO:gym:episode 1381, reward 0.002540, avg reward -0.008921, total steps 176768, episode step 128\n",
|
|
"[2018-02-18 15:23:14,618] episode 1381, reward 0.002540, avg reward -0.008921, total steps 176768, episode step 128\n",
|
|
"INFO:gym:episode 1382, reward -0.002767, avg reward -0.008928, total steps 176896, episode step 128\n",
|
|
"[2018-02-18 15:23:18,827] episode 1382, reward -0.002767, avg reward -0.008928, total steps 176896, episode step 128\n",
|
|
"INFO:gym:episode 1383, reward -0.020853, avg reward -0.008919, total steps 177024, episode step 128\n",
|
|
"[2018-02-18 15:23:22,430] episode 1383, reward -0.020853, avg reward -0.008919, total steps 177024, episode step 128\n",
|
|
"INFO:gym:episode 1384, reward -0.001285, avg reward -0.008914, total steps 177152, episode step 128\n",
|
|
"[2018-02-18 15:23:26,195] episode 1384, reward -0.001285, avg reward -0.008914, total steps 177152, episode step 128\n",
|
|
"INFO:gym:episode 1385, reward 0.008739, avg reward -0.008734, total steps 177280, episode step 128\n",
|
|
"[2018-02-18 15:23:30,044] episode 1385, reward 0.008739, avg reward -0.008734, total steps 177280, episode step 128\n",
|
|
"INFO:gym:episode 1386, reward -0.001734, avg reward -0.008654, total steps 177408, episode step 128\n",
|
|
"[2018-02-18 15:23:33,184] episode 1386, reward -0.001734, avg reward -0.008654, total steps 177408, episode step 128\n",
|
|
"INFO:gym:episode 1387, reward -0.007320, avg reward -0.008731, total steps 177536, episode step 128\n",
|
|
"[2018-02-18 15:23:34,999] episode 1387, reward -0.007320, avg reward -0.008731, total steps 177536, episode step 128\n",
|
|
"INFO:gym:episode 1388, reward -0.002371, avg reward -0.008720, total steps 177664, episode step 128\n",
|
|
"[2018-02-18 15:23:36,802] episode 1388, reward -0.002371, avg reward -0.008720, total steps 177664, episode step 128\n",
|
|
"INFO:gym:episode 1389, reward -0.023136, avg reward -0.008807, total steps 177792, episode step 128\n",
|
|
"[2018-02-18 15:23:38,589] episode 1389, reward -0.023136, avg reward -0.008807, total steps 177792, episode step 128\n",
|
|
"INFO:gym:episode 1390, reward -0.002299, avg reward -0.008810, total steps 177920, episode step 128\n",
|
|
"[2018-02-18 15:23:40,380] episode 1390, reward -0.002299, avg reward -0.008810, total steps 177920, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:23:40,382] Testing...\n",
|
|
"INFO:gym:Avg reward -0.015781(0.000000)\n",
|
|
"[2018-02-18 15:23:40,708] Avg reward -0.015781(0.000000)\n",
|
|
"INFO:gym:episode 1391, reward -0.001755, avg reward -0.008746, total steps 178048, episode step 128\n",
|
|
"[2018-02-18 15:23:42,494] episode 1391, reward -0.001755, avg reward -0.008746, total steps 178048, episode step 128\n",
|
|
"INFO:gym:episode 1392, reward -0.001713, avg reward -0.008553, total steps 178176, episode step 128\n",
|
|
"[2018-02-18 15:23:44,305] episode 1392, reward -0.001713, avg reward -0.008553, total steps 178176, episode step 128\n",
|
|
"INFO:gym:episode 1393, reward -0.010174, avg reward -0.008351, total steps 178304, episode step 128\n",
|
|
"[2018-02-18 15:23:46,162] episode 1393, reward -0.010174, avg reward -0.008351, total steps 178304, episode step 128\n",
|
|
"INFO:gym:episode 1394, reward -0.004884, avg reward -0.008282, total steps 178432, episode step 128\n",
|
|
"[2018-02-18 15:23:47,982] episode 1394, reward -0.004884, avg reward -0.008282, total steps 178432, episode step 128\n",
|
|
"INFO:gym:episode 1395, reward -0.002982, avg reward -0.008294, total steps 178560, episode step 128\n",
|
|
"[2018-02-18 15:23:49,907] episode 1395, reward -0.002982, avg reward -0.008294, total steps 178560, episode step 128\n",
|
|
"INFO:gym:episode 1396, reward -0.029664, avg reward -0.008627, total steps 178688, episode step 128\n",
|
|
"[2018-02-18 15:23:51,840] episode 1396, reward -0.029664, avg reward -0.008627, total steps 178688, episode step 128\n",
|
|
"INFO:gym:episode 1397, reward -0.003321, avg reward -0.008667, total steps 178816, episode step 128\n",
|
|
"[2018-02-18 15:23:53,734] episode 1397, reward -0.003321, avg reward -0.008667, total steps 178816, episode step 128\n",
|
|
"INFO:gym:episode 1398, reward -0.003636, avg reward -0.008652, total steps 178944, episode step 128\n",
|
|
"[2018-02-18 15:23:55,659] episode 1398, reward -0.003636, avg reward -0.008652, total steps 178944, episode step 128\n",
|
|
"INFO:gym:episode 1399, reward -0.011149, avg reward -0.008657, total steps 179072, episode step 128\n",
|
|
"[2018-02-18 15:23:57,684] episode 1399, reward -0.011149, avg reward -0.008657, total steps 179072, episode step 128\n",
|
|
"INFO:gym:episode 1400, reward -0.007338, avg reward -0.008580, total steps 179200, episode step 128\n",
|
|
"[2018-02-18 15:23:59,514] episode 1400, reward -0.007338, avg reward -0.008580, total steps 179200, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:23:59,521] Testing...\n",
|
|
"INFO:gym:Avg reward -0.010035(0.000000)\n",
|
|
"[2018-02-18 15:23:59,867] Avg reward -0.010035(0.000000)\n",
|
|
"INFO:gym:episode 1401, reward -0.014249, avg reward -0.008686, total steps 179328, episode step 128\n",
|
|
"[2018-02-18 15:24:01,701] episode 1401, reward -0.014249, avg reward -0.008686, total steps 179328, episode step 128\n",
|
|
"INFO:gym:episode 1402, reward -0.014636, avg reward -0.008731, total steps 179456, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:24:03,606] episode 1402, reward -0.014636, avg reward -0.008731, total steps 179456, episode step 128\n",
|
|
"INFO:gym:episode 1403, reward -0.028699, avg reward -0.008998, total steps 179584, episode step 128\n",
|
|
"[2018-02-18 15:24:05,623] episode 1403, reward -0.028699, avg reward -0.008998, total steps 179584, episode step 128\n",
|
|
"INFO:gym:episode 1404, reward -0.010807, avg reward -0.009085, total steps 179712, episode step 128\n",
|
|
"[2018-02-18 15:24:07,810] episode 1404, reward -0.010807, avg reward -0.009085, total steps 179712, episode step 128\n",
|
|
"INFO:gym:episode 1405, reward -0.009254, avg reward -0.009317, total steps 179840, episode step 128\n",
|
|
"[2018-02-18 15:24:10,140] episode 1405, reward -0.009254, avg reward -0.009317, total steps 179840, episode step 128\n",
|
|
"INFO:gym:episode 1406, reward -0.001281, avg reward -0.009295, total steps 179968, episode step 128\n",
|
|
"[2018-02-18 15:24:12,746] episode 1406, reward -0.001281, avg reward -0.009295, total steps 179968, episode step 128\n",
|
|
"INFO:gym:episode 1407, reward -0.023557, avg reward -0.009489, total steps 180096, episode step 128\n",
|
|
"[2018-02-18 15:24:15,327] episode 1407, reward -0.023557, avg reward -0.009489, total steps 180096, episode step 128\n",
|
|
"INFO:gym:episode 1408, reward -0.001773, avg reward -0.009457, total steps 180224, episode step 128\n",
|
|
"[2018-02-18 15:24:18,040] episode 1408, reward -0.001773, avg reward -0.009457, total steps 180224, episode step 128\n",
|
|
"INFO:gym:episode 1409, reward -0.009301, avg reward -0.009122, total steps 180352, episode step 128\n",
|
|
"[2018-02-18 15:24:20,696] episode 1409, reward -0.009301, avg reward -0.009122, total steps 180352, episode step 128\n",
|
|
"INFO:gym:episode 1410, reward -0.016331, avg reward -0.009174, total steps 180480, episode step 128\n",
|
|
"[2018-02-18 15:24:23,378] episode 1410, reward -0.016331, avg reward -0.009174, total steps 180480, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:24:23,379] Testing...\n",
|
|
"INFO:gym:Avg reward -0.007140(0.000000)\n",
|
|
"[2018-02-18 15:24:23,706] Avg reward -0.007140(0.000000)\n",
|
|
"INFO:gym:episode 1411, reward -0.030733, avg reward -0.009301, total steps 180608, episode step 128\n",
|
|
"[2018-02-18 15:24:26,338] episode 1411, reward -0.030733, avg reward -0.009301, total steps 180608, episode step 128\n",
|
|
"INFO:gym:episode 1412, reward -0.015546, avg reward -0.009139, total steps 180736, episode step 128\n",
|
|
"[2018-02-18 15:24:28,927] episode 1412, reward -0.015546, avg reward -0.009139, total steps 180736, episode step 128\n",
|
|
"INFO:gym:episode 1413, reward 0.029803, avg reward -0.008810, total steps 180864, episode step 128\n",
|
|
"[2018-02-18 15:24:31,630] episode 1413, reward 0.029803, avg reward -0.008810, total steps 180864, episode step 128\n",
|
|
"INFO:gym:episode 1414, reward -0.002864, avg reward -0.008512, total steps 180992, episode step 128\n",
|
|
"[2018-02-18 15:24:34,453] episode 1414, reward -0.002864, avg reward -0.008512, total steps 180992, episode step 128\n",
|
|
"INFO:gym:episode 1415, reward -0.019378, avg reward -0.008660, total steps 181120, episode step 128\n",
|
|
"[2018-02-18 15:24:37,393] episode 1415, reward -0.019378, avg reward -0.008660, total steps 181120, episode step 128\n",
|
|
"INFO:gym:episode 1416, reward -0.003037, avg reward -0.008532, total steps 181248, episode step 128\n",
|
|
"[2018-02-18 15:24:40,657] episode 1416, reward -0.003037, avg reward -0.008532, total steps 181248, episode step 128\n",
|
|
"INFO:gym:episode 1417, reward -0.024062, avg reward -0.008596, total steps 181376, episode step 128\n",
|
|
"[2018-02-18 15:24:44,315] episode 1417, reward -0.024062, avg reward -0.008596, total steps 181376, episode step 128\n",
|
|
"INFO:gym:episode 1418, reward -0.003019, avg reward -0.008609, total steps 181504, episode step 128\n",
|
|
"[2018-02-18 15:24:47,867] episode 1418, reward -0.003019, avg reward -0.008609, total steps 181504, episode step 128\n",
|
|
"INFO:gym:episode 1419, reward -0.004578, avg reward -0.008586, total steps 181632, episode step 128\n",
|
|
"[2018-02-18 15:24:51,566] episode 1419, reward -0.004578, avg reward -0.008586, total steps 181632, episode step 128\n",
|
|
"INFO:gym:episode 1420, reward -0.001869, avg reward -0.008562, total steps 181760, episode step 128\n",
|
|
"[2018-02-18 15:24:55,226] episode 1420, reward -0.001869, avg reward -0.008562, total steps 181760, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:24:55,228] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001751(0.000000)\n",
|
|
"[2018-02-18 15:24:55,579] Avg reward -0.001751(0.000000)\n",
|
|
"INFO:gym:episode 1421, reward -0.005476, avg reward -0.008633, total steps 181888, episode step 128\n",
|
|
"[2018-02-18 15:24:59,111] episode 1421, reward -0.005476, avg reward -0.008633, total steps 181888, episode step 128\n",
|
|
"INFO:gym:episode 1422, reward -0.001937, avg reward -0.008477, total steps 182016, episode step 128\n",
|
|
"[2018-02-18 15:25:02,742] episode 1422, reward -0.001937, avg reward -0.008477, total steps 182016, episode step 128\n",
|
|
"INFO:gym:episode 1423, reward -0.014768, avg reward -0.008604, total steps 182144, episode step 128\n",
|
|
"[2018-02-18 15:25:06,491] episode 1423, reward -0.014768, avg reward -0.008604, total steps 182144, episode step 128\n",
|
|
"INFO:gym:episode 1424, reward -0.003881, avg reward -0.008626, total steps 182272, episode step 128\n",
|
|
"[2018-02-18 15:25:10,454] episode 1424, reward -0.003881, avg reward -0.008626, total steps 182272, episode step 128\n",
|
|
"INFO:gym:episode 1425, reward -0.001757, avg reward -0.008620, total steps 182400, episode step 128\n",
|
|
"[2018-02-18 15:25:14,432] episode 1425, reward -0.001757, avg reward -0.008620, total steps 182400, episode step 128\n",
|
|
"INFO:gym:episode 1426, reward -0.005420, avg reward -0.008352, total steps 182528, episode step 128\n",
|
|
"[2018-02-18 15:25:18,287] episode 1426, reward -0.005420, avg reward -0.008352, total steps 182528, episode step 128\n",
|
|
"INFO:gym:episode 1427, reward -0.004907, avg reward -0.008382, total steps 182656, episode step 128\n",
|
|
"[2018-02-18 15:25:21,719] episode 1427, reward -0.004907, avg reward -0.008382, total steps 182656, episode step 128\n",
|
|
"INFO:gym:episode 1428, reward -0.005712, avg reward -0.008423, total steps 182784, episode step 128\n",
|
|
"[2018-02-18 15:25:25,064] episode 1428, reward -0.005712, avg reward -0.008423, total steps 182784, episode step 128\n",
|
|
"INFO:gym:episode 1429, reward -0.001752, avg reward -0.008428, total steps 182912, episode step 128\n",
|
|
"[2018-02-18 15:25:28,479] episode 1429, reward -0.001752, avg reward -0.008428, total steps 182912, episode step 128\n",
|
|
"INFO:gym:episode 1430, reward -0.003457, avg reward -0.008440, total steps 183040, episode step 128\n",
|
|
"[2018-02-18 15:25:31,913] episode 1430, reward -0.003457, avg reward -0.008440, total steps 183040, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:25:31,918] Testing...\n",
|
|
"INFO:gym:Avg reward 0.003008(0.000000)\n",
|
|
"[2018-02-18 15:25:32,303] Avg reward 0.003008(0.000000)\n",
|
|
"INFO:gym:episode 1431, reward -0.008709, avg reward -0.008445, total steps 183168, episode step 128\n",
|
|
"[2018-02-18 15:25:35,784] episode 1431, reward -0.008709, avg reward -0.008445, total steps 183168, episode step 128\n",
|
|
"INFO:gym:episode 1432, reward -0.001757, avg reward -0.008438, total steps 183296, episode step 128\n",
|
|
"[2018-02-18 15:25:39,447] episode 1432, reward -0.001757, avg reward -0.008438, total steps 183296, episode step 128\n",
|
|
"INFO:gym:episode 1433, reward -0.012153, avg reward -0.008537, total steps 183424, episode step 128\n",
|
|
"[2018-02-18 15:25:43,400] episode 1433, reward -0.012153, avg reward -0.008537, total steps 183424, episode step 128\n",
|
|
"INFO:gym:episode 1434, reward -0.003802, avg reward -0.008568, total steps 183552, episode step 128\n",
|
|
"[2018-02-18 15:25:47,447] episode 1434, reward -0.003802, avg reward -0.008568, total steps 183552, episode step 128\n",
|
|
"INFO:gym:episode 1435, reward -0.003005, avg reward -0.008578, total steps 183680, episode step 128\n",
|
|
"[2018-02-18 15:25:51,527] episode 1435, reward -0.003005, avg reward -0.008578, total steps 183680, episode step 128\n",
|
|
"INFO:gym:episode 1436, reward -0.028985, avg reward -0.008850, total steps 183808, episode step 128\n",
|
|
"[2018-02-18 15:25:55,441] episode 1436, reward -0.028985, avg reward -0.008850, total steps 183808, episode step 128\n",
|
|
"INFO:gym:episode 1437, reward -0.010273, avg reward -0.008884, total steps 183936, episode step 128\n",
|
|
"[2018-02-18 15:25:59,305] episode 1437, reward -0.010273, avg reward -0.008884, total steps 183936, episode step 128\n",
|
|
"INFO:gym:episode 1438, reward -0.004079, avg reward -0.008900, total steps 184064, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:26:03,237] episode 1438, reward -0.004079, avg reward -0.008900, total steps 184064, episode step 128\n",
|
|
"INFO:gym:episode 1439, reward -0.002149, avg reward -0.008644, total steps 184192, episode step 128\n",
|
|
"[2018-02-18 15:26:07,156] episode 1439, reward -0.002149, avg reward -0.008644, total steps 184192, episode step 128\n",
|
|
"INFO:gym:episode 1440, reward -0.001740, avg reward -0.008639, total steps 184320, episode step 128\n",
|
|
"[2018-02-18 15:26:11,082] episode 1440, reward -0.001740, avg reward -0.008639, total steps 184320, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:26:11,090] Testing...\n",
|
|
"INFO:gym:Avg reward -0.004801(0.000000)\n",
|
|
"[2018-02-18 15:26:11,426] Avg reward -0.004801(0.000000)\n",
|
|
"INFO:gym:episode 1441, reward -0.001498, avg reward -0.008555, total steps 184448, episode step 128\n",
|
|
"[2018-02-18 15:26:15,115] episode 1441, reward -0.001498, avg reward -0.008555, total steps 184448, episode step 128\n",
|
|
"INFO:gym:episode 1442, reward -0.009778, avg reward -0.008570, total steps 184576, episode step 128\n",
|
|
"[2018-02-18 15:26:18,884] episode 1442, reward -0.009778, avg reward -0.008570, total steps 184576, episode step 128\n",
|
|
"INFO:gym:episode 1443, reward 0.032119, avg reward -0.008230, total steps 184704, episode step 128\n",
|
|
"[2018-02-18 15:26:22,546] episode 1443, reward 0.032119, avg reward -0.008230, total steps 184704, episode step 128\n",
|
|
"INFO:gym:episode 1444, reward -0.001771, avg reward -0.008003, total steps 184832, episode step 128\n",
|
|
"[2018-02-18 15:26:26,207] episode 1444, reward -0.001771, avg reward -0.008003, total steps 184832, episode step 128\n",
|
|
"INFO:gym:episode 1445, reward -0.010020, avg reward -0.007980, total steps 184960, episode step 128\n",
|
|
"[2018-02-18 15:26:29,828] episode 1445, reward -0.010020, avg reward -0.007980, total steps 184960, episode step 128\n",
|
|
"INFO:gym:episode 1446, reward -0.001740, avg reward -0.007979, total steps 185088, episode step 128\n",
|
|
"[2018-02-18 15:26:33,420] episode 1446, reward -0.001740, avg reward -0.007979, total steps 185088, episode step 128\n",
|
|
"INFO:gym:episode 1447, reward -0.008258, avg reward -0.008055, total steps 185216, episode step 128\n",
|
|
"[2018-02-18 15:26:37,021] episode 1447, reward -0.008258, avg reward -0.008055, total steps 185216, episode step 128\n",
|
|
"INFO:gym:episode 1448, reward -0.001810, avg reward -0.008055, total steps 185344, episode step 128\n",
|
|
"[2018-02-18 15:26:40,568] episode 1448, reward -0.001810, avg reward -0.008055, total steps 185344, episode step 128\n",
|
|
"INFO:gym:episode 1449, reward -0.002574, avg reward -0.007895, total steps 185472, episode step 128\n",
|
|
"[2018-02-18 15:26:44,102] episode 1449, reward -0.002574, avg reward -0.007895, total steps 185472, episode step 128\n",
|
|
"INFO:gym:episode 1450, reward -0.011457, avg reward -0.007974, total steps 185600, episode step 128\n",
|
|
"[2018-02-18 15:26:47,619] episode 1450, reward -0.011457, avg reward -0.007974, total steps 185600, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:26:47,620] Testing...\n",
|
|
"INFO:gym:Avg reward -0.004217(0.000000)\n",
|
|
"[2018-02-18 15:26:47,952] Avg reward -0.004217(0.000000)\n",
|
|
"INFO:gym:episode 1451, reward -0.002305, avg reward -0.007974, total steps 185728, episode step 128\n",
|
|
"[2018-02-18 15:26:51,534] episode 1451, reward -0.002305, avg reward -0.007974, total steps 185728, episode step 128\n",
|
|
"INFO:gym:episode 1452, reward -0.003629, avg reward -0.007629, total steps 185856, episode step 128\n",
|
|
"[2018-02-18 15:26:55,049] episode 1452, reward -0.003629, avg reward -0.007629, total steps 185856, episode step 128\n",
|
|
"INFO:gym:episode 1453, reward -0.002172, avg reward -0.007635, total steps 185984, episode step 128\n",
|
|
"[2018-02-18 15:26:58,634] episode 1453, reward -0.002172, avg reward -0.007635, total steps 185984, episode step 128\n",
|
|
"INFO:gym:episode 1454, reward -0.004269, avg reward -0.007539, total steps 186112, episode step 128\n",
|
|
"[2018-02-18 15:27:02,180] episode 1454, reward -0.004269, avg reward -0.007539, total steps 186112, episode step 128\n",
|
|
"INFO:gym:episode 1455, reward -0.005509, avg reward -0.007518, total steps 186240, episode step 128\n",
|
|
"[2018-02-18 15:27:05,968] episode 1455, reward -0.005509, avg reward -0.007518, total steps 186240, episode step 128\n",
|
|
"INFO:gym:episode 1456, reward -0.008510, avg reward -0.007432, total steps 186368, episode step 128\n",
|
|
"[2018-02-18 15:27:09,752] episode 1456, reward -0.008510, avg reward -0.007432, total steps 186368, episode step 128\n",
|
|
"INFO:gym:episode 1457, reward -0.016078, avg reward -0.007372, total steps 186496, episode step 128\n",
|
|
"[2018-02-18 15:27:13,458] episode 1457, reward -0.016078, avg reward -0.007372, total steps 186496, episode step 128\n",
|
|
"INFO:gym:episode 1458, reward -0.001793, avg reward -0.007342, total steps 186624, episode step 128\n",
|
|
"[2018-02-18 15:27:17,258] episode 1458, reward -0.001793, avg reward -0.007342, total steps 186624, episode step 128\n",
|
|
"INFO:gym:episode 1459, reward -0.005194, avg reward -0.007318, total steps 186752, episode step 128\n",
|
|
"[2018-02-18 15:27:21,211] episode 1459, reward -0.005194, avg reward -0.007318, total steps 186752, episode step 128\n",
|
|
"INFO:gym:episode 1460, reward -0.013397, avg reward -0.007329, total steps 186880, episode step 128\n",
|
|
"[2018-02-18 15:27:25,191] episode 1460, reward -0.013397, avg reward -0.007329, total steps 186880, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:27:25,192] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002260(0.000000)\n",
|
|
"[2018-02-18 15:27:25,545] Avg reward -0.002260(0.000000)\n",
|
|
"INFO:gym:episode 1461, reward -0.001798, avg reward -0.007329, total steps 187008, episode step 128\n",
|
|
"[2018-02-18 15:27:29,447] episode 1461, reward -0.001798, avg reward -0.007329, total steps 187008, episode step 128\n",
|
|
"INFO:gym:episode 1462, reward -0.001840, avg reward -0.007330, total steps 187136, episode step 128\n",
|
|
"[2018-02-18 15:27:33,356] episode 1462, reward -0.001840, avg reward -0.007330, total steps 187136, episode step 128\n",
|
|
"INFO:gym:episode 1463, reward -0.020312, avg reward -0.007464, total steps 187264, episode step 128\n",
|
|
"[2018-02-18 15:27:37,527] episode 1463, reward -0.020312, avg reward -0.007464, total steps 187264, episode step 128\n",
|
|
"INFO:gym:episode 1464, reward -0.004405, avg reward -0.007381, total steps 187392, episode step 128\n",
|
|
"[2018-02-18 15:27:41,249] episode 1464, reward -0.004405, avg reward -0.007381, total steps 187392, episode step 128\n",
|
|
"INFO:gym:episode 1465, reward -0.010743, avg reward -0.007441, total steps 187520, episode step 128\n",
|
|
"[2018-02-18 15:27:44,592] episode 1465, reward -0.010743, avg reward -0.007441, total steps 187520, episode step 128\n",
|
|
"INFO:gym:episode 1466, reward -0.005315, avg reward -0.007466, total steps 187648, episode step 128\n",
|
|
"[2018-02-18 15:27:48,083] episode 1466, reward -0.005315, avg reward -0.007466, total steps 187648, episode step 128\n",
|
|
"INFO:gym:episode 1467, reward -0.005053, avg reward -0.006995, total steps 187776, episode step 128\n",
|
|
"[2018-02-18 15:27:50,221] episode 1467, reward -0.005053, avg reward -0.006995, total steps 187776, episode step 128\n",
|
|
"INFO:gym:episode 1468, reward -0.001914, avg reward -0.006969, total steps 187904, episode step 128\n",
|
|
"[2018-02-18 15:27:52,028] episode 1468, reward -0.001914, avg reward -0.006969, total steps 187904, episode step 128\n",
|
|
"INFO:gym:episode 1469, reward -0.003926, avg reward -0.006841, total steps 188032, episode step 128\n",
|
|
"[2018-02-18 15:27:53,854] episode 1469, reward -0.003926, avg reward -0.006841, total steps 188032, episode step 128\n",
|
|
"INFO:gym:episode 1470, reward -0.004903, avg reward -0.006870, total steps 188160, episode step 128\n",
|
|
"[2018-02-18 15:27:55,675] episode 1470, reward -0.004903, avg reward -0.006870, total steps 188160, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:27:55,676] Testing...\n",
|
|
"INFO:gym:Avg reward -0.009962(0.000000)\n",
|
|
"[2018-02-18 15:27:56,005] Avg reward -0.009962(0.000000)\n",
|
|
"INFO:gym:episode 1471, reward -0.001788, avg reward -0.006866, total steps 188288, episode step 128\n",
|
|
"[2018-02-18 15:27:57,854] episode 1471, reward -0.001788, avg reward -0.006866, total steps 188288, episode step 128\n",
|
|
"INFO:gym:episode 1472, reward -0.003948, avg reward -0.006886, total steps 188416, episode step 128\n",
|
|
"[2018-02-18 15:27:59,675] episode 1472, reward -0.003948, avg reward -0.006886, total steps 188416, episode step 128\n",
|
|
"INFO:gym:episode 1473, reward -0.004030, avg reward -0.006829, total steps 188544, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:28:01,495] episode 1473, reward -0.004030, avg reward -0.006829, total steps 188544, episode step 128\n",
|
|
"INFO:gym:episode 1474, reward -0.014941, avg reward -0.006794, total steps 188672, episode step 128\n",
|
|
"[2018-02-18 15:28:03,231] episode 1474, reward -0.014941, avg reward -0.006794, total steps 188672, episode step 128\n",
|
|
"INFO:gym:episode 1475, reward -0.002075, avg reward -0.006744, total steps 188800, episode step 128\n",
|
|
"[2018-02-18 15:28:05,030] episode 1475, reward -0.002075, avg reward -0.006744, total steps 188800, episode step 128\n",
|
|
"INFO:gym:episode 1476, reward -0.001748, avg reward -0.006669, total steps 188928, episode step 128\n",
|
|
"[2018-02-18 15:28:06,846] episode 1476, reward -0.001748, avg reward -0.006669, total steps 188928, episode step 128\n",
|
|
"INFO:gym:episode 1477, reward -0.003168, avg reward -0.006531, total steps 189056, episode step 128\n",
|
|
"[2018-02-18 15:28:08,770] episode 1477, reward -0.003168, avg reward -0.006531, total steps 189056, episode step 128\n",
|
|
"INFO:gym:episode 1478, reward -0.058491, avg reward -0.007078, total steps 189184, episode step 128\n",
|
|
"[2018-02-18 15:28:10,614] episode 1478, reward -0.058491, avg reward -0.007078, total steps 189184, episode step 128\n",
|
|
"INFO:gym:episode 1479, reward -0.006698, avg reward -0.007017, total steps 189312, episode step 128\n",
|
|
"[2018-02-18 15:28:12,425] episode 1479, reward -0.006698, avg reward -0.007017, total steps 189312, episode step 128\n",
|
|
"INFO:gym:episode 1480, reward -0.002750, avg reward -0.006975, total steps 189440, episode step 128\n",
|
|
"[2018-02-18 15:28:14,267] episode 1480, reward -0.002750, avg reward -0.006975, total steps 189440, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:28:14,276] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002431(0.000000)\n",
|
|
"[2018-02-18 15:28:14,619] Avg reward -0.002431(0.000000)\n",
|
|
"INFO:gym:episode 1481, reward -0.016248, avg reward -0.007163, total steps 189568, episode step 128\n",
|
|
"[2018-02-18 15:28:16,463] episode 1481, reward -0.016248, avg reward -0.007163, total steps 189568, episode step 128\n",
|
|
"INFO:gym:episode 1482, reward 0.004174, avg reward -0.007093, total steps 189696, episode step 128\n",
|
|
"[2018-02-18 15:28:18,506] episode 1482, reward 0.004174, avg reward -0.007093, total steps 189696, episode step 128\n",
|
|
"INFO:gym:episode 1483, reward -0.002766, avg reward -0.006912, total steps 189824, episode step 128\n",
|
|
"[2018-02-18 15:28:20,630] episode 1483, reward -0.002766, avg reward -0.006912, total steps 189824, episode step 128\n",
|
|
"INFO:gym:episode 1484, reward -0.002969, avg reward -0.006929, total steps 189952, episode step 128\n",
|
|
"[2018-02-18 15:28:22,692] episode 1484, reward -0.002969, avg reward -0.006929, total steps 189952, episode step 128\n",
|
|
"INFO:gym:episode 1485, reward -0.002073, avg reward -0.007037, total steps 190080, episode step 128\n",
|
|
"[2018-02-18 15:28:24,815] episode 1485, reward -0.002073, avg reward -0.007037, total steps 190080, episode step 128\n",
|
|
"INFO:gym:episode 1486, reward -0.003708, avg reward -0.007057, total steps 190208, episode step 128\n",
|
|
"[2018-02-18 15:28:26,796] episode 1486, reward -0.003708, avg reward -0.007057, total steps 190208, episode step 128\n",
|
|
"INFO:gym:episode 1487, reward -0.001960, avg reward -0.007004, total steps 190336, episode step 128\n",
|
|
"[2018-02-18 15:28:28,758] episode 1487, reward -0.001960, avg reward -0.007004, total steps 190336, episode step 128\n",
|
|
"INFO:gym:episode 1488, reward -0.003880, avg reward -0.007019, total steps 190464, episode step 128\n",
|
|
"[2018-02-18 15:28:30,686] episode 1488, reward -0.003880, avg reward -0.007019, total steps 190464, episode step 128\n",
|
|
"INFO:gym:episode 1489, reward -0.002802, avg reward -0.006815, total steps 190592, episode step 128\n",
|
|
"[2018-02-18 15:28:32,594] episode 1489, reward -0.002802, avg reward -0.006815, total steps 190592, episode step 128\n",
|
|
"INFO:gym:episode 1490, reward -0.014440, avg reward -0.006937, total steps 190720, episode step 128\n",
|
|
"[2018-02-18 15:28:34,541] episode 1490, reward -0.014440, avg reward -0.006937, total steps 190720, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:28:34,543] Testing...\n",
|
|
"INFO:gym:Avg reward -0.003699(0.000000)\n",
|
|
"[2018-02-18 15:28:34,862] Avg reward -0.003699(0.000000)\n",
|
|
"INFO:gym:episode 1491, reward -0.054673, avg reward -0.007466, total steps 190848, episode step 128\n",
|
|
"[2018-02-18 15:28:36,882] episode 1491, reward -0.054673, avg reward -0.007466, total steps 190848, episode step 128\n",
|
|
"INFO:gym:episode 1492, reward -0.007220, avg reward -0.007521, total steps 190976, episode step 128\n",
|
|
"[2018-02-18 15:28:38,896] episode 1492, reward -0.007220, avg reward -0.007521, total steps 190976, episode step 128\n",
|
|
"INFO:gym:episode 1493, reward -0.001876, avg reward -0.007438, total steps 191104, episode step 128\n",
|
|
"[2018-02-18 15:28:41,023] episode 1493, reward -0.001876, avg reward -0.007438, total steps 191104, episode step 128\n",
|
|
"INFO:gym:episode 1494, reward -0.004304, avg reward -0.007432, total steps 191232, episode step 128\n",
|
|
"[2018-02-18 15:28:43,085] episode 1494, reward -0.004304, avg reward -0.007432, total steps 191232, episode step 128\n",
|
|
"INFO:gym:episode 1495, reward -0.001117, avg reward -0.007414, total steps 191360, episode step 128\n",
|
|
"[2018-02-18 15:28:45,191] episode 1495, reward -0.001117, avg reward -0.007414, total steps 191360, episode step 128\n",
|
|
"INFO:gym:episode 1496, reward -0.005650, avg reward -0.007173, total steps 191488, episode step 128\n",
|
|
"[2018-02-18 15:28:47,196] episode 1496, reward -0.005650, avg reward -0.007173, total steps 191488, episode step 128\n",
|
|
"INFO:gym:episode 1497, reward -0.006287, avg reward -0.007203, total steps 191616, episode step 128\n",
|
|
"[2018-02-18 15:28:49,190] episode 1497, reward -0.006287, avg reward -0.007203, total steps 191616, episode step 128\n",
|
|
"INFO:gym:episode 1498, reward -0.013255, avg reward -0.007299, total steps 191744, episode step 128\n",
|
|
"[2018-02-18 15:28:51,269] episode 1498, reward -0.013255, avg reward -0.007299, total steps 191744, episode step 128\n",
|
|
"INFO:gym:episode 1499, reward -0.001761, avg reward -0.007205, total steps 191872, episode step 128\n",
|
|
"[2018-02-18 15:28:53,455] episode 1499, reward -0.001761, avg reward -0.007205, total steps 191872, episode step 128\n",
|
|
"INFO:gym:episode 1500, reward -0.004512, avg reward -0.007177, total steps 192000, episode step 128\n",
|
|
"[2018-02-18 15:28:56,045] episode 1500, reward -0.004512, avg reward -0.007177, total steps 192000, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:28:56,049] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002324(0.000000)\n",
|
|
"[2018-02-18 15:28:56,383] Avg reward -0.002324(0.000000)\n",
|
|
"INFO:gym:episode 1501, reward -0.001743, avg reward -0.007052, total steps 192128, episode step 128\n",
|
|
"[2018-02-18 15:28:59,236] episode 1501, reward -0.001743, avg reward -0.007052, total steps 192128, episode step 128\n",
|
|
"INFO:gym:episode 1502, reward -0.049363, avg reward -0.007399, total steps 192256, episode step 128\n",
|
|
"[2018-02-18 15:29:02,146] episode 1502, reward -0.049363, avg reward -0.007399, total steps 192256, episode step 128\n",
|
|
"INFO:gym:episode 1503, reward 0.000781, avg reward -0.007104, total steps 192384, episode step 128\n",
|
|
"[2018-02-18 15:29:05,192] episode 1503, reward 0.000781, avg reward -0.007104, total steps 192384, episode step 128\n",
|
|
"INFO:gym:episode 1504, reward -0.002295, avg reward -0.007019, total steps 192512, episode step 128\n",
|
|
"[2018-02-18 15:29:08,279] episode 1504, reward -0.002295, avg reward -0.007019, total steps 192512, episode step 128\n",
|
|
"INFO:gym:episode 1505, reward -0.008375, avg reward -0.007011, total steps 192640, episode step 128\n",
|
|
"[2018-02-18 15:29:11,342] episode 1505, reward -0.008375, avg reward -0.007011, total steps 192640, episode step 128\n",
|
|
"INFO:gym:episode 1506, reward -0.001643, avg reward -0.007014, total steps 192768, episode step 128\n",
|
|
"[2018-02-18 15:29:14,544] episode 1506, reward -0.001643, avg reward -0.007014, total steps 192768, episode step 128\n",
|
|
"INFO:gym:episode 1507, reward -0.001871, avg reward -0.006797, total steps 192896, episode step 128\n",
|
|
"[2018-02-18 15:29:18,048] episode 1507, reward -0.001871, avg reward -0.006797, total steps 192896, episode step 128\n",
|
|
"INFO:gym:episode 1508, reward 0.002289, avg reward -0.006757, total steps 193024, episode step 128\n",
|
|
"[2018-02-18 15:29:21,894] episode 1508, reward 0.002289, avg reward -0.006757, total steps 193024, episode step 128\n",
|
|
"INFO:gym:episode 1509, reward -0.002263, avg reward -0.006686, total steps 193152, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:29:25,873] episode 1509, reward -0.002263, avg reward -0.006686, total steps 193152, episode step 128\n",
|
|
"INFO:gym:episode 1510, reward -0.001747, avg reward -0.006540, total steps 193280, episode step 128\n",
|
|
"[2018-02-18 15:29:29,771] episode 1510, reward -0.001747, avg reward -0.006540, total steps 193280, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:29:29,772] Testing...\n",
|
|
"INFO:gym:Avg reward -0.016787(0.000000)\n",
|
|
"[2018-02-18 15:29:30,102] Avg reward -0.016787(0.000000)\n",
|
|
"INFO:gym:episode 1511, reward -0.018995, avg reward -0.006423, total steps 193408, episode step 128\n",
|
|
"[2018-02-18 15:29:33,931] episode 1511, reward -0.018995, avg reward -0.006423, total steps 193408, episode step 128\n",
|
|
"INFO:gym:episode 1512, reward -0.004093, avg reward -0.006309, total steps 193536, episode step 128\n",
|
|
"[2018-02-18 15:29:37,802] episode 1512, reward -0.004093, avg reward -0.006309, total steps 193536, episode step 128\n",
|
|
"INFO:gym:episode 1513, reward -0.002469, avg reward -0.006631, total steps 193664, episode step 128\n",
|
|
"[2018-02-18 15:29:41,518] episode 1513, reward -0.002469, avg reward -0.006631, total steps 193664, episode step 128\n",
|
|
"INFO:gym:episode 1514, reward -0.006004, avg reward -0.006663, total steps 193792, episode step 128\n",
|
|
"[2018-02-18 15:29:45,198] episode 1514, reward -0.006004, avg reward -0.006663, total steps 193792, episode step 128\n",
|
|
"INFO:gym:episode 1515, reward -0.002529, avg reward -0.006494, total steps 193920, episode step 128\n",
|
|
"[2018-02-18 15:29:48,881] episode 1515, reward -0.002529, avg reward -0.006494, total steps 193920, episode step 128\n",
|
|
"INFO:gym:episode 1516, reward -0.005893, avg reward -0.006523, total steps 194048, episode step 128\n",
|
|
"[2018-02-18 15:29:52,656] episode 1516, reward -0.005893, avg reward -0.006523, total steps 194048, episode step 128\n",
|
|
"INFO:gym:episode 1517, reward -0.003721, avg reward -0.006319, total steps 194176, episode step 128\n",
|
|
"[2018-02-18 15:29:56,687] episode 1517, reward -0.003721, avg reward -0.006319, total steps 194176, episode step 128\n",
|
|
"INFO:gym:episode 1518, reward -0.003653, avg reward -0.006326, total steps 194304, episode step 128\n",
|
|
"[2018-02-18 15:30:00,780] episode 1518, reward -0.003653, avg reward -0.006326, total steps 194304, episode step 128\n",
|
|
"INFO:gym:episode 1519, reward 0.035997, avg reward -0.005920, total steps 194432, episode step 128\n",
|
|
"[2018-02-18 15:30:04,924] episode 1519, reward 0.035997, avg reward -0.005920, total steps 194432, episode step 128\n",
|
|
"INFO:gym:episode 1520, reward -0.006063, avg reward -0.005962, total steps 194560, episode step 128\n",
|
|
"[2018-02-18 15:30:09,050] episode 1520, reward -0.006063, avg reward -0.005962, total steps 194560, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:30:09,059] Testing...\n",
|
|
"INFO:gym:Avg reward -0.003460(0.000000)\n",
|
|
"[2018-02-18 15:30:09,389] Avg reward -0.003460(0.000000)\n",
|
|
"INFO:gym:episode 1521, reward -0.002024, avg reward -0.005927, total steps 194688, episode step 128\n",
|
|
"[2018-02-18 15:30:13,589] episode 1521, reward -0.002024, avg reward -0.005927, total steps 194688, episode step 128\n",
|
|
"INFO:gym:episode 1522, reward -0.002784, avg reward -0.005936, total steps 194816, episode step 128\n",
|
|
"[2018-02-18 15:30:17,660] episode 1522, reward -0.002784, avg reward -0.005936, total steps 194816, episode step 128\n",
|
|
"INFO:gym:episode 1523, reward -0.008663, avg reward -0.005875, total steps 194944, episode step 128\n",
|
|
"[2018-02-18 15:30:21,732] episode 1523, reward -0.008663, avg reward -0.005875, total steps 194944, episode step 128\n",
|
|
"INFO:gym:episode 1524, reward -0.002790, avg reward -0.005864, total steps 195072, episode step 128\n",
|
|
"[2018-02-18 15:30:25,788] episode 1524, reward -0.002790, avg reward -0.005864, total steps 195072, episode step 128\n",
|
|
"INFO:gym:episode 1525, reward -0.002751, avg reward -0.005874, total steps 195200, episode step 128\n",
|
|
"[2018-02-18 15:30:29,789] episode 1525, reward -0.002751, avg reward -0.005874, total steps 195200, episode step 128\n",
|
|
"INFO:gym:episode 1526, reward -0.002507, avg reward -0.005845, total steps 195328, episode step 128\n",
|
|
"[2018-02-18 15:30:33,699] episode 1526, reward -0.002507, avg reward -0.005845, total steps 195328, episode step 128\n",
|
|
"INFO:gym:episode 1527, reward -0.001201, avg reward -0.005808, total steps 195456, episode step 128\n",
|
|
"[2018-02-18 15:30:37,478] episode 1527, reward -0.001201, avg reward -0.005808, total steps 195456, episode step 128\n",
|
|
"INFO:gym:episode 1528, reward -0.001664, avg reward -0.005767, total steps 195584, episode step 128\n",
|
|
"[2018-02-18 15:30:41,188] episode 1528, reward -0.001664, avg reward -0.005767, total steps 195584, episode step 128\n",
|
|
"INFO:gym:episode 1529, reward -0.005008, avg reward -0.005800, total steps 195712, episode step 128\n",
|
|
"[2018-02-18 15:30:44,802] episode 1529, reward -0.005008, avg reward -0.005800, total steps 195712, episode step 128\n",
|
|
"INFO:gym:episode 1530, reward -0.001755, avg reward -0.005783, total steps 195840, episode step 128\n",
|
|
"[2018-02-18 15:30:48,443] episode 1530, reward -0.001755, avg reward -0.005783, total steps 195840, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:30:48,444] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001831(0.000000)\n",
|
|
"[2018-02-18 15:30:48,771] Avg reward -0.001831(0.000000)\n",
|
|
"INFO:gym:episode 1531, reward -0.006356, avg reward -0.005759, total steps 195968, episode step 128\n",
|
|
"[2018-02-18 15:30:52,376] episode 1531, reward -0.006356, avg reward -0.005759, total steps 195968, episode step 128\n",
|
|
"INFO:gym:episode 1532, reward -0.011894, avg reward -0.005861, total steps 196096, episode step 128\n",
|
|
"[2018-02-18 15:30:55,932] episode 1532, reward -0.011894, avg reward -0.005861, total steps 196096, episode step 128\n",
|
|
"INFO:gym:episode 1533, reward -0.015617, avg reward -0.005895, total steps 196224, episode step 128\n",
|
|
"[2018-02-18 15:30:59,530] episode 1533, reward -0.015617, avg reward -0.005895, total steps 196224, episode step 128\n",
|
|
"INFO:gym:episode 1534, reward -0.000999, avg reward -0.005867, total steps 196352, episode step 128\n",
|
|
"[2018-02-18 15:31:03,054] episode 1534, reward -0.000999, avg reward -0.005867, total steps 196352, episode step 128\n",
|
|
"INFO:gym:episode 1535, reward -0.007323, avg reward -0.005910, total steps 196480, episode step 128\n",
|
|
"[2018-02-18 15:31:06,572] episode 1535, reward -0.007323, avg reward -0.005910, total steps 196480, episode step 128\n",
|
|
"INFO:gym:episode 1536, reward -0.028828, avg reward -0.005909, total steps 196608, episode step 128\n",
|
|
"[2018-02-18 15:31:10,092] episode 1536, reward -0.028828, avg reward -0.005909, total steps 196608, episode step 128\n",
|
|
"INFO:gym:episode 1537, reward -0.007104, avg reward -0.005877, total steps 196736, episode step 128\n",
|
|
"[2018-02-18 15:31:13,598] episode 1537, reward -0.007104, avg reward -0.005877, total steps 196736, episode step 128\n",
|
|
"INFO:gym:episode 1538, reward -0.001751, avg reward -0.005854, total steps 196864, episode step 128\n",
|
|
"[2018-02-18 15:31:17,107] episode 1538, reward -0.001751, avg reward -0.005854, total steps 196864, episode step 128\n",
|
|
"INFO:gym:episode 1539, reward -0.002317, avg reward -0.005855, total steps 196992, episode step 128\n",
|
|
"[2018-02-18 15:31:20,697] episode 1539, reward -0.002317, avg reward -0.005855, total steps 196992, episode step 128\n",
|
|
"INFO:gym:episode 1540, reward -0.001761, avg reward -0.005856, total steps 197120, episode step 128\n",
|
|
"[2018-02-18 15:31:24,323] episode 1540, reward -0.001761, avg reward -0.005856, total steps 197120, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:31:24,324] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002179(0.000000)\n",
|
|
"[2018-02-18 15:31:24,644] Avg reward -0.002179(0.000000)\n",
|
|
"INFO:gym:episode 1541, reward -0.001805, avg reward -0.005859, total steps 197248, episode step 128\n",
|
|
"[2018-02-18 15:31:28,320] episode 1541, reward -0.001805, avg reward -0.005859, total steps 197248, episode step 128\n",
|
|
"INFO:gym:episode 1542, reward -0.004224, avg reward -0.005803, total steps 197376, episode step 128\n",
|
|
"[2018-02-18 15:31:31,840] episode 1542, reward -0.004224, avg reward -0.005803, total steps 197376, episode step 128\n",
|
|
"INFO:gym:episode 1543, reward -0.001639, avg reward -0.006141, total steps 197504, episode step 128\n",
|
|
"[2018-02-18 15:31:35,386] episode 1543, reward -0.001639, avg reward -0.006141, total steps 197504, episode step 128\n",
|
|
"INFO:gym:episode 1544, reward -0.012293, avg reward -0.006246, total steps 197632, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:31:38,916] episode 1544, reward -0.012293, avg reward -0.006246, total steps 197632, episode step 128\n",
|
|
"INFO:gym:episode 1545, reward -0.001702, avg reward -0.006163, total steps 197760, episode step 128\n",
|
|
"[2018-02-18 15:31:42,421] episode 1545, reward -0.001702, avg reward -0.006163, total steps 197760, episode step 128\n",
|
|
"INFO:gym:episode 1546, reward -0.041784, avg reward -0.006563, total steps 197888, episode step 128\n",
|
|
"[2018-02-18 15:31:45,968] episode 1546, reward -0.041784, avg reward -0.006563, total steps 197888, episode step 128\n",
|
|
"INFO:gym:episode 1547, reward 0.003386, avg reward -0.006447, total steps 198016, episode step 128\n",
|
|
"[2018-02-18 15:31:50,089] episode 1547, reward 0.003386, avg reward -0.006447, total steps 198016, episode step 128\n",
|
|
"INFO:gym:episode 1548, reward -0.007835, avg reward -0.006507, total steps 198144, episode step 128\n",
|
|
"[2018-02-18 15:31:53,879] episode 1548, reward -0.007835, avg reward -0.006507, total steps 198144, episode step 128\n",
|
|
"INFO:gym:episode 1549, reward -0.001766, avg reward -0.006499, total steps 198272, episode step 128\n",
|
|
"[2018-02-18 15:31:57,330] episode 1549, reward -0.001766, avg reward -0.006499, total steps 198272, episode step 128\n",
|
|
"INFO:gym:episode 1550, reward -0.001761, avg reward -0.006402, total steps 198400, episode step 128\n",
|
|
"[2018-02-18 15:32:01,008] episode 1550, reward -0.001761, avg reward -0.006402, total steps 198400, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:32:01,009] Testing...\n",
|
|
"INFO:gym:Avg reward -0.003510(0.000000)\n",
|
|
"[2018-02-18 15:32:01,344] Avg reward -0.003510(0.000000)\n",
|
|
"INFO:gym:episode 1551, reward -0.014736, avg reward -0.006526, total steps 198528, episode step 128\n",
|
|
"[2018-02-18 15:32:04,988] episode 1551, reward -0.014736, avg reward -0.006526, total steps 198528, episode step 128\n",
|
|
"INFO:gym:episode 1552, reward -0.001496, avg reward -0.006505, total steps 198656, episode step 128\n",
|
|
"[2018-02-18 15:32:08,885] episode 1552, reward -0.001496, avg reward -0.006505, total steps 198656, episode step 128\n",
|
|
"INFO:gym:episode 1553, reward -0.002988, avg reward -0.006513, total steps 198784, episode step 128\n",
|
|
"[2018-02-18 15:32:12,575] episode 1553, reward -0.002988, avg reward -0.006513, total steps 198784, episode step 128\n",
|
|
"INFO:gym:episode 1554, reward -0.015680, avg reward -0.006627, total steps 198912, episode step 128\n",
|
|
"[2018-02-18 15:32:15,980] episode 1554, reward -0.015680, avg reward -0.006627, total steps 198912, episode step 128\n",
|
|
"INFO:gym:episode 1555, reward -0.002223, avg reward -0.006594, total steps 199040, episode step 128\n",
|
|
"[2018-02-18 15:32:19,448] episode 1555, reward -0.002223, avg reward -0.006594, total steps 199040, episode step 128\n",
|
|
"INFO:gym:episode 1556, reward -0.016766, avg reward -0.006677, total steps 199168, episode step 128\n",
|
|
"[2018-02-18 15:32:22,914] episode 1556, reward -0.016766, avg reward -0.006677, total steps 199168, episode step 128\n",
|
|
"INFO:gym:episode 1557, reward -0.002042, avg reward -0.006537, total steps 199296, episode step 128\n",
|
|
"[2018-02-18 15:32:26,408] episode 1557, reward -0.002042, avg reward -0.006537, total steps 199296, episode step 128\n",
|
|
"INFO:gym:episode 1558, reward -0.009745, avg reward -0.006616, total steps 199424, episode step 128\n",
|
|
"[2018-02-18 15:32:30,030] episode 1558, reward -0.009745, avg reward -0.006616, total steps 199424, episode step 128\n",
|
|
"INFO:gym:episode 1559, reward 0.003125, avg reward -0.006533, total steps 199552, episode step 128\n",
|
|
"[2018-02-18 15:32:33,971] episode 1559, reward 0.003125, avg reward -0.006533, total steps 199552, episode step 128\n",
|
|
"INFO:gym:episode 1560, reward -0.001789, avg reward -0.006417, total steps 199680, episode step 128\n",
|
|
"[2018-02-18 15:32:36,769] episode 1560, reward -0.001789, avg reward -0.006417, total steps 199680, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:32:36,779] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001759(0.000000)\n",
|
|
"[2018-02-18 15:32:37,113] Avg reward -0.001759(0.000000)\n",
|
|
"INFO:gym:episode 1561, reward -0.002722, avg reward -0.006426, total steps 199808, episode step 128\n",
|
|
"[2018-02-18 15:32:38,990] episode 1561, reward -0.002722, avg reward -0.006426, total steps 199808, episode step 128\n",
|
|
"INFO:gym:episode 1562, reward -0.001777, avg reward -0.006425, total steps 199936, episode step 128\n",
|
|
"[2018-02-18 15:32:40,801] episode 1562, reward -0.001777, avg reward -0.006425, total steps 199936, episode step 128\n",
|
|
"INFO:gym:episode 1563, reward -0.008379, avg reward -0.006306, total steps 200064, episode step 128\n",
|
|
"[2018-02-18 15:32:42,616] episode 1563, reward -0.008379, avg reward -0.006306, total steps 200064, episode step 128\n",
|
|
"INFO:gym:episode 1564, reward -0.002990, avg reward -0.006292, total steps 200192, episode step 128\n",
|
|
"[2018-02-18 15:32:44,432] episode 1564, reward -0.002990, avg reward -0.006292, total steps 200192, episode step 128\n",
|
|
"INFO:gym:episode 1565, reward -0.014912, avg reward -0.006334, total steps 200320, episode step 128\n",
|
|
"[2018-02-18 15:32:46,229] episode 1565, reward -0.014912, avg reward -0.006334, total steps 200320, episode step 128\n",
|
|
"INFO:gym:episode 1566, reward -0.002804, avg reward -0.006309, total steps 200448, episode step 128\n",
|
|
"[2018-02-18 15:32:48,022] episode 1566, reward -0.002804, avg reward -0.006309, total steps 200448, episode step 128\n",
|
|
"INFO:gym:episode 1567, reward -0.001425, avg reward -0.006272, total steps 200576, episode step 128\n",
|
|
"[2018-02-18 15:32:49,841] episode 1567, reward -0.001425, avg reward -0.006272, total steps 200576, episode step 128\n",
|
|
"INFO:gym:episode 1568, reward -0.007011, avg reward -0.006323, total steps 200704, episode step 128\n",
|
|
"[2018-02-18 15:32:51,613] episode 1568, reward -0.007011, avg reward -0.006323, total steps 200704, episode step 128\n",
|
|
"INFO:gym:episode 1569, reward -0.009483, avg reward -0.006379, total steps 200832, episode step 128\n",
|
|
"[2018-02-18 15:32:53,367] episode 1569, reward -0.009483, avg reward -0.006379, total steps 200832, episode step 128\n",
|
|
"INFO:gym:episode 1570, reward -0.006128, avg reward -0.006391, total steps 200960, episode step 128\n",
|
|
"[2018-02-18 15:32:55,145] episode 1570, reward -0.006128, avg reward -0.006391, total steps 200960, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:32:55,146] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001764(0.000000)\n",
|
|
"[2018-02-18 15:32:55,476] Avg reward -0.001764(0.000000)\n",
|
|
"INFO:gym:episode 1571, reward -0.007433, avg reward -0.006447, total steps 201088, episode step 128\n",
|
|
"[2018-02-18 15:32:57,380] episode 1571, reward -0.007433, avg reward -0.006447, total steps 201088, episode step 128\n",
|
|
"INFO:gym:episode 1572, reward -0.001817, avg reward -0.006426, total steps 201216, episode step 128\n",
|
|
"[2018-02-18 15:32:59,276] episode 1572, reward -0.001817, avg reward -0.006426, total steps 201216, episode step 128\n",
|
|
"INFO:gym:episode 1573, reward -0.001932, avg reward -0.006405, total steps 201344, episode step 128\n",
|
|
"[2018-02-18 15:33:01,179] episode 1573, reward -0.001932, avg reward -0.006405, total steps 201344, episode step 128\n",
|
|
"INFO:gym:episode 1574, reward -0.008697, avg reward -0.006343, total steps 201472, episode step 128\n",
|
|
"[2018-02-18 15:33:03,266] episode 1574, reward -0.008697, avg reward -0.006343, total steps 201472, episode step 128\n",
|
|
"INFO:gym:episode 1575, reward -0.002752, avg reward -0.006350, total steps 201600, episode step 128\n",
|
|
"[2018-02-18 15:33:05,462] episode 1575, reward -0.002752, avg reward -0.006350, total steps 201600, episode step 128\n",
|
|
"INFO:gym:episode 1576, reward -0.008472, avg reward -0.006417, total steps 201728, episode step 128\n",
|
|
"[2018-02-18 15:33:07,449] episode 1576, reward -0.008472, avg reward -0.006417, total steps 201728, episode step 128\n",
|
|
"INFO:gym:episode 1577, reward -0.005941, avg reward -0.006444, total steps 201856, episode step 128\n",
|
|
"[2018-02-18 15:33:09,417] episode 1577, reward -0.005941, avg reward -0.006444, total steps 201856, episode step 128\n",
|
|
"INFO:gym:episode 1578, reward -0.013717, avg reward -0.005997, total steps 201984, episode step 128\n",
|
|
"[2018-02-18 15:33:11,527] episode 1578, reward -0.013717, avg reward -0.005997, total steps 201984, episode step 128\n",
|
|
"INFO:gym:episode 1579, reward -0.011392, avg reward -0.006044, total steps 202112, episode step 128\n",
|
|
"[2018-02-18 15:33:13,881] episode 1579, reward -0.011392, avg reward -0.006044, total steps 202112, episode step 128\n",
|
|
"INFO:gym:episode 1580, reward -0.001749, avg reward -0.006034, total steps 202240, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:33:16,451] episode 1580, reward -0.001749, avg reward -0.006034, total steps 202240, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:33:16,454] Testing...\n",
|
|
"INFO:gym:Avg reward -0.016712(0.000000)\n",
|
|
"[2018-02-18 15:33:16,797] Avg reward -0.016712(0.000000)\n",
|
|
"INFO:gym:episode 1581, reward -0.001365, avg reward -0.005885, total steps 202368, episode step 128\n",
|
|
"[2018-02-18 15:33:19,454] episode 1581, reward -0.001365, avg reward -0.005885, total steps 202368, episode step 128\n",
|
|
"INFO:gym:episode 1582, reward -0.001765, avg reward -0.005944, total steps 202496, episode step 128\n",
|
|
"[2018-02-18 15:33:22,404] episode 1582, reward -0.001765, avg reward -0.005944, total steps 202496, episode step 128\n",
|
|
"INFO:gym:episode 1583, reward -0.001756, avg reward -0.005934, total steps 202624, episode step 128\n",
|
|
"[2018-02-18 15:33:25,640] episode 1583, reward -0.001756, avg reward -0.005934, total steps 202624, episode step 128\n",
|
|
"INFO:gym:episode 1584, reward -0.001763, avg reward -0.005922, total steps 202752, episode step 128\n",
|
|
"[2018-02-18 15:33:28,947] episode 1584, reward -0.001763, avg reward -0.005922, total steps 202752, episode step 128\n",
|
|
"INFO:gym:episode 1585, reward -0.004747, avg reward -0.005949, total steps 202880, episode step 128\n",
|
|
"[2018-02-18 15:33:32,466] episode 1585, reward -0.004747, avg reward -0.005949, total steps 202880, episode step 128\n",
|
|
"INFO:gym:episode 1586, reward -0.002558, avg reward -0.005937, total steps 203008, episode step 128\n",
|
|
"[2018-02-18 15:33:36,320] episode 1586, reward -0.002558, avg reward -0.005937, total steps 203008, episode step 128\n",
|
|
"INFO:gym:episode 1587, reward 0.001495, avg reward -0.005903, total steps 203136, episode step 128\n",
|
|
"[2018-02-18 15:33:40,381] episode 1587, reward 0.001495, avg reward -0.005903, total steps 203136, episode step 128\n",
|
|
"INFO:gym:episode 1588, reward -0.004001, avg reward -0.005904, total steps 203264, episode step 128\n",
|
|
"[2018-02-18 15:33:44,571] episode 1588, reward -0.004001, avg reward -0.005904, total steps 203264, episode step 128\n",
|
|
"INFO:gym:episode 1589, reward -0.001953, avg reward -0.005896, total steps 203392, episode step 128\n",
|
|
"[2018-02-18 15:33:48,837] episode 1589, reward -0.001953, avg reward -0.005896, total steps 203392, episode step 128\n",
|
|
"INFO:gym:episode 1590, reward -0.001752, avg reward -0.005769, total steps 203520, episode step 128\n",
|
|
"[2018-02-18 15:33:53,244] episode 1590, reward -0.001752, avg reward -0.005769, total steps 203520, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:33:53,247] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001759(0.000000)\n",
|
|
"[2018-02-18 15:33:53,582] Avg reward -0.001759(0.000000)\n",
|
|
"INFO:gym:episode 1591, reward -0.006352, avg reward -0.005285, total steps 203648, episode step 128\n",
|
|
"[2018-02-18 15:33:57,943] episode 1591, reward -0.006352, avg reward -0.005285, total steps 203648, episode step 128\n",
|
|
"INFO:gym:episode 1592, reward -0.002397, avg reward -0.005237, total steps 203776, episode step 128\n",
|
|
"[2018-02-18 15:34:01,903] episode 1592, reward -0.002397, avg reward -0.005237, total steps 203776, episode step 128\n",
|
|
"INFO:gym:episode 1593, reward -0.002138, avg reward -0.005240, total steps 203904, episode step 128\n",
|
|
"[2018-02-18 15:34:05,714] episode 1593, reward -0.002138, avg reward -0.005240, total steps 203904, episode step 128\n",
|
|
"INFO:gym:episode 1594, reward -0.013401, avg reward -0.005331, total steps 204032, episode step 128\n",
|
|
"[2018-02-18 15:34:09,918] episode 1594, reward -0.013401, avg reward -0.005331, total steps 204032, episode step 128\n",
|
|
"INFO:gym:episode 1595, reward -0.003130, avg reward -0.005351, total steps 204160, episode step 128\n",
|
|
"[2018-02-18 15:34:14,140] episode 1595, reward -0.003130, avg reward -0.005351, total steps 204160, episode step 128\n",
|
|
"INFO:gym:episode 1596, reward -0.001509, avg reward -0.005310, total steps 204288, episode step 128\n",
|
|
"[2018-02-18 15:34:18,617] episode 1596, reward -0.001509, avg reward -0.005310, total steps 204288, episode step 128\n",
|
|
"INFO:gym:episode 1597, reward -0.008583, avg reward -0.005332, total steps 204416, episode step 128\n",
|
|
"[2018-02-18 15:34:22,982] episode 1597, reward -0.008583, avg reward -0.005332, total steps 204416, episode step 128\n",
|
|
"INFO:gym:episode 1598, reward -0.001760, avg reward -0.005218, total steps 204544, episode step 128\n",
|
|
"[2018-02-18 15:34:26,976] episode 1598, reward -0.001760, avg reward -0.005218, total steps 204544, episode step 128\n",
|
|
"INFO:gym:episode 1599, reward -0.008565, avg reward -0.005286, total steps 204672, episode step 128\n",
|
|
"[2018-02-18 15:34:30,894] episode 1599, reward -0.008565, avg reward -0.005286, total steps 204672, episode step 128\n",
|
|
"INFO:gym:episode 1600, reward -0.002682, avg reward -0.005267, total steps 204800, episode step 128\n",
|
|
"[2018-02-18 15:34:34,737] episode 1600, reward -0.002682, avg reward -0.005267, total steps 204800, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:34:34,745] Testing...\n",
|
|
"INFO:gym:Avg reward -0.012410(0.000000)\n",
|
|
"[2018-02-18 15:34:35,082] Avg reward -0.012410(0.000000)\n",
|
|
"INFO:gym:episode 1601, reward -0.001758, avg reward -0.005267, total steps 204928, episode step 128\n",
|
|
"[2018-02-18 15:34:39,094] episode 1601, reward -0.001758, avg reward -0.005267, total steps 204928, episode step 128\n",
|
|
"INFO:gym:episode 1602, reward -0.002119, avg reward -0.004795, total steps 205056, episode step 128\n",
|
|
"[2018-02-18 15:34:43,236] episode 1602, reward -0.002119, avg reward -0.004795, total steps 205056, episode step 128\n",
|
|
"INFO:gym:episode 1603, reward -0.000370, avg reward -0.004806, total steps 205184, episode step 128\n",
|
|
"[2018-02-18 15:34:47,173] episode 1603, reward -0.000370, avg reward -0.004806, total steps 205184, episode step 128\n",
|
|
"INFO:gym:episode 1604, reward -0.001631, avg reward -0.004800, total steps 205312, episode step 128\n",
|
|
"[2018-02-18 15:34:51,098] episode 1604, reward -0.001631, avg reward -0.004800, total steps 205312, episode step 128\n",
|
|
"INFO:gym:episode 1605, reward 0.004813, avg reward -0.004668, total steps 205440, episode step 128\n",
|
|
"[2018-02-18 15:34:55,292] episode 1605, reward 0.004813, avg reward -0.004668, total steps 205440, episode step 128\n",
|
|
"INFO:gym:episode 1606, reward -0.006087, avg reward -0.004712, total steps 205568, episode step 128\n",
|
|
"[2018-02-18 15:34:59,445] episode 1606, reward -0.006087, avg reward -0.004712, total steps 205568, episode step 128\n",
|
|
"INFO:gym:episode 1607, reward -0.009739, avg reward -0.004791, total steps 205696, episode step 128\n",
|
|
"[2018-02-18 15:35:03,771] episode 1607, reward -0.009739, avg reward -0.004791, total steps 205696, episode step 128\n",
|
|
"INFO:gym:episode 1608, reward -0.001808, avg reward -0.004832, total steps 205824, episode step 128\n",
|
|
"[2018-02-18 15:35:07,911] episode 1608, reward -0.001808, avg reward -0.004832, total steps 205824, episode step 128\n",
|
|
"INFO:gym:episode 1609, reward -0.001888, avg reward -0.004828, total steps 205952, episode step 128\n",
|
|
"[2018-02-18 15:35:12,058] episode 1609, reward -0.001888, avg reward -0.004828, total steps 205952, episode step 128\n",
|
|
"INFO:gym:episode 1610, reward -0.005636, avg reward -0.004867, total steps 206080, episode step 128\n",
|
|
"[2018-02-18 15:35:16,180] episode 1610, reward -0.005636, avg reward -0.004867, total steps 206080, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:35:16,183] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001752(0.000000)\n",
|
|
"[2018-02-18 15:35:16,520] Avg reward -0.001752(0.000000)\n",
|
|
"INFO:gym:episode 1611, reward -0.001797, avg reward -0.004695, total steps 206208, episode step 128\n",
|
|
"[2018-02-18 15:35:20,588] episode 1611, reward -0.001797, avg reward -0.004695, total steps 206208, episode step 128\n",
|
|
"INFO:gym:episode 1612, reward -0.000278, avg reward -0.004657, total steps 206336, episode step 128\n",
|
|
"[2018-02-18 15:35:24,659] episode 1612, reward -0.000278, avg reward -0.004657, total steps 206336, episode step 128\n",
|
|
"INFO:gym:episode 1613, reward -0.001749, avg reward -0.004650, total steps 206464, episode step 128\n",
|
|
"[2018-02-18 15:35:28,611] episode 1613, reward -0.001749, avg reward -0.004650, total steps 206464, episode step 128\n",
|
|
"INFO:gym:episode 1614, reward -0.001811, avg reward -0.004608, total steps 206592, episode step 128\n",
|
|
"[2018-02-18 15:35:32,429] episode 1614, reward -0.001811, avg reward -0.004608, total steps 206592, episode step 128\n",
|
|
"INFO:gym:episode 1615, reward -0.001756, avg reward -0.004600, total steps 206720, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:35:36,129] episode 1615, reward -0.001756, avg reward -0.004600, total steps 206720, episode step 128\n",
|
|
"INFO:gym:episode 1616, reward -0.004083, avg reward -0.004582, total steps 206848, episode step 128\n",
|
|
"[2018-02-18 15:35:39,825] episode 1616, reward -0.004083, avg reward -0.004582, total steps 206848, episode step 128\n",
|
|
"INFO:gym:episode 1617, reward -0.001754, avg reward -0.004562, total steps 206976, episode step 128\n",
|
|
"[2018-02-18 15:35:43,458] episode 1617, reward -0.001754, avg reward -0.004562, total steps 206976, episode step 128\n",
|
|
"INFO:gym:episode 1618, reward -0.008738, avg reward -0.004613, total steps 207104, episode step 128\n",
|
|
"[2018-02-18 15:35:47,059] episode 1618, reward -0.008738, avg reward -0.004613, total steps 207104, episode step 128\n",
|
|
"INFO:gym:episode 1619, reward -0.005833, avg reward -0.005032, total steps 207232, episode step 128\n",
|
|
"[2018-02-18 15:35:50,681] episode 1619, reward -0.005833, avg reward -0.005032, total steps 207232, episode step 128\n",
|
|
"INFO:gym:episode 1620, reward -0.007175, avg reward -0.005043, total steps 207360, episode step 128\n",
|
|
"[2018-02-18 15:35:54,269] episode 1620, reward -0.007175, avg reward -0.005043, total steps 207360, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:35:54,272] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002134(0.000000)\n",
|
|
"[2018-02-18 15:35:54,600] Avg reward -0.002134(0.000000)\n",
|
|
"INFO:gym:episode 1621, reward -0.002156, avg reward -0.005044, total steps 207488, episode step 128\n",
|
|
"[2018-02-18 15:35:58,176] episode 1621, reward -0.002156, avg reward -0.005044, total steps 207488, episode step 128\n",
|
|
"INFO:gym:episode 1622, reward -0.001889, avg reward -0.005035, total steps 207616, episode step 128\n",
|
|
"[2018-02-18 15:36:01,750] episode 1622, reward -0.001889, avg reward -0.005035, total steps 207616, episode step 128\n",
|
|
"INFO:gym:episode 1623, reward -0.005130, avg reward -0.005000, total steps 207744, episode step 128\n",
|
|
"[2018-02-18 15:36:05,334] episode 1623, reward -0.005130, avg reward -0.005000, total steps 207744, episode step 128\n",
|
|
"INFO:gym:episode 1624, reward -0.001765, avg reward -0.004989, total steps 207872, episode step 128\n",
|
|
"[2018-02-18 15:36:08,874] episode 1624, reward -0.001765, avg reward -0.004989, total steps 207872, episode step 128\n",
|
|
"INFO:gym:episode 1625, reward -0.006009, avg reward -0.005022, total steps 208000, episode step 128\n",
|
|
"[2018-02-18 15:36:12,432] episode 1625, reward -0.006009, avg reward -0.005022, total steps 208000, episode step 128\n",
|
|
"INFO:gym:episode 1626, reward -0.001754, avg reward -0.005015, total steps 208128, episode step 128\n",
|
|
"[2018-02-18 15:36:16,058] episode 1626, reward -0.001754, avg reward -0.005015, total steps 208128, episode step 128\n",
|
|
"INFO:gym:episode 1627, reward -0.008496, avg reward -0.005087, total steps 208256, episode step 128\n",
|
|
"[2018-02-18 15:36:19,648] episode 1627, reward -0.008496, avg reward -0.005087, total steps 208256, episode step 128\n",
|
|
"INFO:gym:episode 1628, reward -0.001759, avg reward -0.005088, total steps 208384, episode step 128\n",
|
|
"[2018-02-18 15:36:23,264] episode 1628, reward -0.001759, avg reward -0.005088, total steps 208384, episode step 128\n",
|
|
"INFO:gym:episode 1629, reward -0.004078, avg reward -0.005079, total steps 208512, episode step 128\n",
|
|
"[2018-02-18 15:36:26,830] episode 1629, reward -0.004078, avg reward -0.005079, total steps 208512, episode step 128\n",
|
|
"INFO:gym:episode 1630, reward -0.002081, avg reward -0.005082, total steps 208640, episode step 128\n",
|
|
"[2018-02-18 15:36:30,382] episode 1630, reward -0.002081, avg reward -0.005082, total steps 208640, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:36:30,384] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002757(0.000000)\n",
|
|
"[2018-02-18 15:36:30,716] Avg reward -0.002757(0.000000)\n",
|
|
"INFO:gym:episode 1631, reward -0.001754, avg reward -0.005036, total steps 208768, episode step 128\n",
|
|
"[2018-02-18 15:36:34,272] episode 1631, reward -0.001754, avg reward -0.005036, total steps 208768, episode step 128\n",
|
|
"INFO:gym:episode 1632, reward -0.003988, avg reward -0.004957, total steps 208896, episode step 128\n",
|
|
"[2018-02-18 15:36:37,840] episode 1632, reward -0.003988, avg reward -0.004957, total steps 208896, episode step 128\n",
|
|
"INFO:gym:episode 1633, reward -0.001397, avg reward -0.004815, total steps 209024, episode step 128\n",
|
|
"[2018-02-18 15:36:41,454] episode 1633, reward -0.001397, avg reward -0.004815, total steps 209024, episode step 128\n",
|
|
"INFO:gym:episode 1634, reward -0.003147, avg reward -0.004837, total steps 209152, episode step 128\n",
|
|
"[2018-02-18 15:36:45,011] episode 1634, reward -0.003147, avg reward -0.004837, total steps 209152, episode step 128\n",
|
|
"INFO:gym:episode 1635, reward -0.011187, avg reward -0.004875, total steps 209280, episode step 128\n",
|
|
"[2018-02-18 15:36:48,661] episode 1635, reward -0.011187, avg reward -0.004875, total steps 209280, episode step 128\n",
|
|
"INFO:gym:episode 1636, reward -0.001753, avg reward -0.004604, total steps 209408, episode step 128\n",
|
|
"[2018-02-18 15:36:52,163] episode 1636, reward -0.001753, avg reward -0.004604, total steps 209408, episode step 128\n",
|
|
"INFO:gym:episode 1637, reward -0.001878, avg reward -0.004552, total steps 209536, episode step 128\n",
|
|
"[2018-02-18 15:36:55,818] episode 1637, reward -0.001878, avg reward -0.004552, total steps 209536, episode step 128\n",
|
|
"INFO:gym:episode 1638, reward -0.004232, avg reward -0.004577, total steps 209664, episode step 128\n",
|
|
"[2018-02-18 15:36:59,714] episode 1638, reward -0.004232, avg reward -0.004577, total steps 209664, episode step 128\n",
|
|
"INFO:gym:episode 1639, reward -0.002563, avg reward -0.004580, total steps 209792, episode step 128\n",
|
|
"[2018-02-18 15:37:04,842] episode 1639, reward -0.002563, avg reward -0.004580, total steps 209792, episode step 128\n",
|
|
"INFO:gym:episode 1640, reward -0.000912, avg reward -0.004571, total steps 209920, episode step 128\n",
|
|
"[2018-02-18 15:37:09,619] episode 1640, reward -0.000912, avg reward -0.004571, total steps 209920, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:37:09,627] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001754(0.000000)\n",
|
|
"[2018-02-18 15:37:09,965] Avg reward -0.001754(0.000000)\n",
|
|
"INFO:gym:episode 1641, reward -0.001768, avg reward -0.004571, total steps 210048, episode step 128\n",
|
|
"[2018-02-18 15:37:12,138] episode 1641, reward -0.001768, avg reward -0.004571, total steps 210048, episode step 128\n",
|
|
"INFO:gym:episode 1642, reward -0.003179, avg reward -0.004560, total steps 210176, episode step 128\n",
|
|
"[2018-02-18 15:37:13,918] episode 1642, reward -0.003179, avg reward -0.004560, total steps 210176, episode step 128\n",
|
|
"INFO:gym:episode 1643, reward -0.002014, avg reward -0.004564, total steps 210304, episode step 128\n",
|
|
"[2018-02-18 15:37:15,715] episode 1643, reward -0.002014, avg reward -0.004564, total steps 210304, episode step 128\n",
|
|
"INFO:gym:episode 1644, reward -0.001813, avg reward -0.004459, total steps 210432, episode step 128\n",
|
|
"[2018-02-18 15:37:17,487] episode 1644, reward -0.001813, avg reward -0.004459, total steps 210432, episode step 128\n",
|
|
"INFO:gym:episode 1645, reward -0.027165, avg reward -0.004714, total steps 210560, episode step 128\n",
|
|
"[2018-02-18 15:37:19,264] episode 1645, reward -0.027165, avg reward -0.004714, total steps 210560, episode step 128\n",
|
|
"INFO:gym:episode 1646, reward -0.001913, avg reward -0.004315, total steps 210688, episode step 128\n",
|
|
"[2018-02-18 15:37:21,016] episode 1646, reward -0.001913, avg reward -0.004315, total steps 210688, episode step 128\n",
|
|
"INFO:gym:episode 1647, reward -0.001755, avg reward -0.004366, total steps 210816, episode step 128\n",
|
|
"[2018-02-18 15:37:22,788] episode 1647, reward -0.001755, avg reward -0.004366, total steps 210816, episode step 128\n",
|
|
"INFO:gym:episode 1648, reward -0.001785, avg reward -0.004306, total steps 210944, episode step 128\n",
|
|
"[2018-02-18 15:37:24,566] episode 1648, reward -0.001785, avg reward -0.004306, total steps 210944, episode step 128\n",
|
|
"INFO:gym:episode 1649, reward -0.005057, avg reward -0.004339, total steps 211072, episode step 128\n",
|
|
"[2018-02-18 15:37:26,318] episode 1649, reward -0.005057, avg reward -0.004339, total steps 211072, episode step 128\n",
|
|
"INFO:gym:episode 1650, reward -0.003028, avg reward -0.004352, total steps 211200, episode step 128\n",
|
|
"[2018-02-18 15:37:28,099] episode 1650, reward -0.003028, avg reward -0.004352, total steps 211200, episode step 128\n",
|
|
"INFO:gym:Testing...\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:37:28,100] Testing...\n",
|
|
"INFO:gym:Avg reward -0.004296(0.000000)\n",
|
|
"[2018-02-18 15:37:28,434] Avg reward -0.004296(0.000000)\n",
|
|
"INFO:gym:episode 1651, reward -0.012648, avg reward -0.004331, total steps 211328, episode step 128\n",
|
|
"[2018-02-18 15:37:30,258] episode 1651, reward -0.012648, avg reward -0.004331, total steps 211328, episode step 128\n",
|
|
"INFO:gym:episode 1652, reward -0.002411, avg reward -0.004340, total steps 211456, episode step 128\n",
|
|
"[2018-02-18 15:37:32,117] episode 1652, reward -0.002411, avg reward -0.004340, total steps 211456, episode step 128\n",
|
|
"INFO:gym:episode 1653, reward -0.002929, avg reward -0.004339, total steps 211584, episode step 128\n",
|
|
"[2018-02-18 15:37:33,955] episode 1653, reward -0.002929, avg reward -0.004339, total steps 211584, episode step 128\n",
|
|
"INFO:gym:episode 1654, reward -0.003449, avg reward -0.004217, total steps 211712, episode step 128\n",
|
|
"[2018-02-18 15:37:35,905] episode 1654, reward -0.003449, avg reward -0.004217, total steps 211712, episode step 128\n",
|
|
"INFO:gym:episode 1655, reward -0.002511, avg reward -0.004220, total steps 211840, episode step 128\n",
|
|
"[2018-02-18 15:37:37,821] episode 1655, reward -0.002511, avg reward -0.004220, total steps 211840, episode step 128\n",
|
|
"INFO:gym:episode 1656, reward -0.002193, avg reward -0.004074, total steps 211968, episode step 128\n",
|
|
"[2018-02-18 15:37:39,858] episode 1656, reward -0.002193, avg reward -0.004074, total steps 211968, episode step 128\n",
|
|
"INFO:gym:episode 1657, reward -0.002984, avg reward -0.004083, total steps 212096, episode step 128\n",
|
|
"[2018-02-18 15:37:41,958] episode 1657, reward -0.002984, avg reward -0.004083, total steps 212096, episode step 128\n",
|
|
"INFO:gym:episode 1658, reward -0.002652, avg reward -0.004013, total steps 212224, episode step 128\n",
|
|
"[2018-02-18 15:37:44,129] episode 1658, reward -0.002652, avg reward -0.004013, total steps 212224, episode step 128\n",
|
|
"INFO:gym:episode 1659, reward -0.002190, avg reward -0.004066, total steps 212352, episode step 128\n",
|
|
"[2018-02-18 15:37:46,119] episode 1659, reward -0.002190, avg reward -0.004066, total steps 212352, episode step 128\n",
|
|
"INFO:gym:episode 1660, reward -0.002296, avg reward -0.004071, total steps 212480, episode step 128\n",
|
|
"[2018-02-18 15:37:47,988] episode 1660, reward -0.002296, avg reward -0.004071, total steps 212480, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:37:47,989] Testing...\n",
|
|
"INFO:gym:Avg reward 0.001171(0.000000)\n",
|
|
"[2018-02-18 15:37:48,313] Avg reward 0.001171(0.000000)\n",
|
|
"INFO:gym:episode 1661, reward 0.000656, avg reward -0.004037, total steps 212608, episode step 128\n",
|
|
"[2018-02-18 15:37:50,247] episode 1661, reward 0.000656, avg reward -0.004037, total steps 212608, episode step 128\n",
|
|
"INFO:gym:episode 1662, reward -0.001474, avg reward -0.004034, total steps 212736, episode step 128\n",
|
|
"[2018-02-18 15:37:52,314] episode 1662, reward -0.001474, avg reward -0.004034, total steps 212736, episode step 128\n",
|
|
"INFO:gym:episode 1663, reward -0.001758, avg reward -0.003968, total steps 212864, episode step 128\n",
|
|
"[2018-02-18 15:37:54,549] episode 1663, reward -0.001758, avg reward -0.003968, total steps 212864, episode step 128\n",
|
|
"INFO:gym:episode 1664, reward -0.001762, avg reward -0.003955, total steps 212992, episode step 128\n",
|
|
"[2018-02-18 15:37:56,830] episode 1664, reward -0.001762, avg reward -0.003955, total steps 212992, episode step 128\n",
|
|
"INFO:gym:episode 1665, reward -0.005498, avg reward -0.003861, total steps 213120, episode step 128\n",
|
|
"[2018-02-18 15:37:59,301] episode 1665, reward -0.005498, avg reward -0.003861, total steps 213120, episode step 128\n",
|
|
"INFO:gym:episode 1666, reward -0.003043, avg reward -0.003864, total steps 213248, episode step 128\n",
|
|
"[2018-02-18 15:38:01,924] episode 1666, reward -0.003043, avg reward -0.003864, total steps 213248, episode step 128\n",
|
|
"INFO:gym:episode 1667, reward -0.006903, avg reward -0.003919, total steps 213376, episode step 128\n",
|
|
"[2018-02-18 15:38:04,692] episode 1667, reward -0.006903, avg reward -0.003919, total steps 213376, episode step 128\n",
|
|
"INFO:gym:episode 1668, reward -0.001954, avg reward -0.003868, total steps 213504, episode step 128\n",
|
|
"[2018-02-18 15:38:07,462] episode 1668, reward -0.001954, avg reward -0.003868, total steps 213504, episode step 128\n",
|
|
"INFO:gym:episode 1669, reward -0.001471, avg reward -0.003788, total steps 213632, episode step 128\n",
|
|
"[2018-02-18 15:38:10,285] episode 1669, reward -0.001471, avg reward -0.003788, total steps 213632, episode step 128\n",
|
|
"INFO:gym:episode 1670, reward -0.001760, avg reward -0.003744, total steps 213760, episode step 128\n",
|
|
"[2018-02-18 15:38:13,143] episode 1670, reward -0.001760, avg reward -0.003744, total steps 213760, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:38:13,145] Testing...\n",
|
|
"INFO:gym:Avg reward -0.011611(0.000000)\n",
|
|
"[2018-02-18 15:38:13,470] Avg reward -0.011611(0.000000)\n",
|
|
"INFO:gym:episode 1671, reward -0.001966, avg reward -0.003689, total steps 213888, episode step 128\n",
|
|
"[2018-02-18 15:38:16,229] episode 1671, reward -0.001966, avg reward -0.003689, total steps 213888, episode step 128\n",
|
|
"INFO:gym:episode 1672, reward -0.005131, avg reward -0.003723, total steps 214016, episode step 128\n",
|
|
"[2018-02-18 15:38:18,911] episode 1672, reward -0.005131, avg reward -0.003723, total steps 214016, episode step 128\n",
|
|
"INFO:gym:episode 1673, reward -0.001819, avg reward -0.003721, total steps 214144, episode step 128\n",
|
|
"[2018-02-18 15:38:21,565] episode 1673, reward -0.001819, avg reward -0.003721, total steps 214144, episode step 128\n",
|
|
"INFO:gym:episode 1674, reward -0.001762, avg reward -0.003652, total steps 214272, episode step 128\n",
|
|
"[2018-02-18 15:38:24,327] episode 1674, reward -0.001762, avg reward -0.003652, total steps 214272, episode step 128\n",
|
|
"INFO:gym:episode 1675, reward -0.003108, avg reward -0.003656, total steps 214400, episode step 128\n",
|
|
"[2018-02-18 15:38:27,343] episode 1675, reward -0.003108, avg reward -0.003656, total steps 214400, episode step 128\n",
|
|
"INFO:gym:episode 1676, reward -0.001615, avg reward -0.003587, total steps 214528, episode step 128\n",
|
|
"[2018-02-18 15:38:30,503] episode 1676, reward -0.001615, avg reward -0.003587, total steps 214528, episode step 128\n",
|
|
"INFO:gym:episode 1677, reward -0.001415, avg reward -0.003542, total steps 214656, episode step 128\n",
|
|
"[2018-02-18 15:38:33,791] episode 1677, reward -0.001415, avg reward -0.003542, total steps 214656, episode step 128\n",
|
|
"INFO:gym:episode 1678, reward -0.002809, avg reward -0.003433, total steps 214784, episode step 128\n",
|
|
"[2018-02-18 15:38:37,229] episode 1678, reward -0.002809, avg reward -0.003433, total steps 214784, episode step 128\n",
|
|
"INFO:gym:episode 1679, reward -0.001433, avg reward -0.003333, total steps 214912, episode step 128\n",
|
|
"[2018-02-18 15:38:40,786] episode 1679, reward -0.001433, avg reward -0.003333, total steps 214912, episode step 128\n",
|
|
"INFO:gym:episode 1680, reward -0.001761, avg reward -0.003333, total steps 215040, episode step 128\n",
|
|
"[2018-02-18 15:38:44,535] episode 1680, reward -0.001761, avg reward -0.003333, total steps 215040, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:38:44,543] Testing...\n",
|
|
"INFO:gym:Avg reward -0.005590(0.000000)\n",
|
|
"[2018-02-18 15:38:44,874] Avg reward -0.005590(0.000000)\n",
|
|
"INFO:gym:episode 1681, reward -0.002516, avg reward -0.003345, total steps 215168, episode step 128\n",
|
|
"[2018-02-18 15:38:48,615] episode 1681, reward -0.002516, avg reward -0.003345, total steps 215168, episode step 128\n",
|
|
"INFO:gym:episode 1682, reward -0.002796, avg reward -0.003355, total steps 215296, episode step 128\n",
|
|
"[2018-02-18 15:38:52,124] episode 1682, reward -0.002796, avg reward -0.003355, total steps 215296, episode step 128\n",
|
|
"INFO:gym:episode 1683, reward -0.006957, avg reward -0.003407, total steps 215424, episode step 128\n",
|
|
"[2018-02-18 15:38:55,524] episode 1683, reward -0.006957, avg reward -0.003407, total steps 215424, episode step 128\n",
|
|
"INFO:gym:episode 1684, reward -0.003930, avg reward -0.003429, total steps 215552, episode step 128\n",
|
|
"[2018-02-18 15:38:59,172] episode 1684, reward -0.003930, avg reward -0.003429, total steps 215552, episode step 128\n",
|
|
"INFO:gym:episode 1685, reward -0.002882, avg reward -0.003410, total steps 215680, episode step 128\n",
|
|
"[2018-02-18 15:39:03,196] episode 1685, reward -0.002882, avg reward -0.003410, total steps 215680, episode step 128\n",
|
|
"INFO:gym:episode 1686, reward -0.002071, avg reward -0.003405, total steps 215808, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:39:07,002] episode 1686, reward -0.002071, avg reward -0.003405, total steps 215808, episode step 128\n",
|
|
"INFO:gym:episode 1687, reward -0.002575, avg reward -0.003446, total steps 215936, episode step 128\n",
|
|
"[2018-02-18 15:39:10,833] episode 1687, reward -0.002575, avg reward -0.003446, total steps 215936, episode step 128\n",
|
|
"INFO:gym:episode 1688, reward -0.002690, avg reward -0.003433, total steps 216064, episode step 128\n",
|
|
"[2018-02-18 15:39:14,581] episode 1688, reward -0.002690, avg reward -0.003433, total steps 216064, episode step 128\n",
|
|
"INFO:gym:episode 1689, reward -0.002110, avg reward -0.003434, total steps 216192, episode step 128\n",
|
|
"[2018-02-18 15:39:18,476] episode 1689, reward -0.002110, avg reward -0.003434, total steps 216192, episode step 128\n",
|
|
"INFO:gym:episode 1690, reward -0.004412, avg reward -0.003461, total steps 216320, episode step 128\n",
|
|
"[2018-02-18 15:39:22,286] episode 1690, reward -0.004412, avg reward -0.003461, total steps 216320, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:39:22,287] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001764(0.000000)\n",
|
|
"[2018-02-18 15:39:22,623] Avg reward -0.001764(0.000000)\n",
|
|
"INFO:gym:episode 1691, reward -0.001760, avg reward -0.003415, total steps 216448, episode step 128\n",
|
|
"[2018-02-18 15:39:26,484] episode 1691, reward -0.001760, avg reward -0.003415, total steps 216448, episode step 128\n",
|
|
"INFO:gym:episode 1692, reward -0.008631, avg reward -0.003477, total steps 216576, episode step 128\n",
|
|
"[2018-02-18 15:39:30,458] episode 1692, reward -0.008631, avg reward -0.003477, total steps 216576, episode step 128\n",
|
|
"INFO:gym:episode 1693, reward -0.001915, avg reward -0.003475, total steps 216704, episode step 128\n",
|
|
"[2018-02-18 15:39:34,407] episode 1693, reward -0.001915, avg reward -0.003475, total steps 216704, episode step 128\n",
|
|
"INFO:gym:episode 1694, reward -0.001941, avg reward -0.003361, total steps 216832, episode step 128\n",
|
|
"[2018-02-18 15:39:38,298] episode 1694, reward -0.001941, avg reward -0.003361, total steps 216832, episode step 128\n",
|
|
"INFO:gym:episode 1695, reward -0.001762, avg reward -0.003347, total steps 216960, episode step 128\n",
|
|
"[2018-02-18 15:39:42,118] episode 1695, reward -0.001762, avg reward -0.003347, total steps 216960, episode step 128\n",
|
|
"INFO:gym:episode 1696, reward -0.002302, avg reward -0.003355, total steps 217088, episode step 128\n",
|
|
"[2018-02-18 15:39:45,987] episode 1696, reward -0.002302, avg reward -0.003355, total steps 217088, episode step 128\n",
|
|
"INFO:gym:episode 1697, reward -0.001749, avg reward -0.003287, total steps 217216, episode step 128\n",
|
|
"[2018-02-18 15:39:49,905] episode 1697, reward -0.001749, avg reward -0.003287, total steps 217216, episode step 128\n",
|
|
"INFO:gym:episode 1698, reward -0.001760, avg reward -0.003287, total steps 217344, episode step 128\n",
|
|
"[2018-02-18 15:39:53,692] episode 1698, reward -0.001760, avg reward -0.003287, total steps 217344, episode step 128\n",
|
|
"INFO:gym:episode 1699, reward -0.002511, avg reward -0.003226, total steps 217472, episode step 128\n",
|
|
"[2018-02-18 15:39:57,536] episode 1699, reward -0.002511, avg reward -0.003226, total steps 217472, episode step 128\n",
|
|
"INFO:gym:episode 1700, reward -0.001773, avg reward -0.003217, total steps 217600, episode step 128\n",
|
|
"[2018-02-18 15:40:01,281] episode 1700, reward -0.001773, avg reward -0.003217, total steps 217600, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:40:01,282] Testing...\n",
|
|
"INFO:gym:Avg reward -0.006909(0.000000)\n",
|
|
"[2018-02-18 15:40:01,647] Avg reward -0.006909(0.000000)\n",
|
|
"INFO:gym:episode 1701, reward -0.005421, avg reward -0.003254, total steps 217728, episode step 128\n",
|
|
"[2018-02-18 15:40:05,299] episode 1701, reward -0.005421, avg reward -0.003254, total steps 217728, episode step 128\n",
|
|
"INFO:gym:episode 1702, reward -0.001802, avg reward -0.003250, total steps 217856, episode step 128\n",
|
|
"[2018-02-18 15:40:08,864] episode 1702, reward -0.001802, avg reward -0.003250, total steps 217856, episode step 128\n",
|
|
"INFO:gym:episode 1703, reward -0.008219, avg reward -0.003329, total steps 217984, episode step 128\n",
|
|
"[2018-02-18 15:40:12,408] episode 1703, reward -0.008219, avg reward -0.003329, total steps 217984, episode step 128\n",
|
|
"INFO:gym:episode 1704, reward -0.003155, avg reward -0.003344, total steps 218112, episode step 128\n",
|
|
"[2018-02-18 15:40:16,004] episode 1704, reward -0.003155, avg reward -0.003344, total steps 218112, episode step 128\n",
|
|
"INFO:gym:episode 1705, reward -0.002316, avg reward -0.003415, total steps 218240, episode step 128\n",
|
|
"[2018-02-18 15:40:19,743] episode 1705, reward -0.002316, avg reward -0.003415, total steps 218240, episode step 128\n",
|
|
"INFO:gym:episode 1706, reward -0.009024, avg reward -0.003445, total steps 218368, episode step 128\n",
|
|
"[2018-02-18 15:40:23,331] episode 1706, reward -0.009024, avg reward -0.003445, total steps 218368, episode step 128\n",
|
|
"INFO:gym:episode 1707, reward -0.004909, avg reward -0.003396, total steps 218496, episode step 128\n",
|
|
"[2018-02-18 15:40:26,959] episode 1707, reward -0.004909, avg reward -0.003396, total steps 218496, episode step 128\n",
|
|
"INFO:gym:episode 1708, reward -0.000346, avg reward -0.003382, total steps 218624, episode step 128\n",
|
|
"[2018-02-18 15:40:30,489] episode 1708, reward -0.000346, avg reward -0.003382, total steps 218624, episode step 128\n",
|
|
"INFO:gym:episode 1709, reward -0.001751, avg reward -0.003380, total steps 218752, episode step 128\n",
|
|
"[2018-02-18 15:40:34,029] episode 1709, reward -0.001751, avg reward -0.003380, total steps 218752, episode step 128\n",
|
|
"INFO:gym:episode 1710, reward -0.002614, avg reward -0.003350, total steps 218880, episode step 128\n",
|
|
"[2018-02-18 15:40:37,532] episode 1710, reward -0.002614, avg reward -0.003350, total steps 218880, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:40:37,533] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002455(0.000000)\n",
|
|
"[2018-02-18 15:40:37,854] Avg reward -0.002455(0.000000)\n",
|
|
"INFO:gym:episode 1711, reward -0.001831, avg reward -0.003351, total steps 219008, episode step 128\n",
|
|
"[2018-02-18 15:40:41,375] episode 1711, reward -0.001831, avg reward -0.003351, total steps 219008, episode step 128\n",
|
|
"INFO:gym:episode 1712, reward -0.000622, avg reward -0.003354, total steps 219136, episode step 128\n",
|
|
"[2018-02-18 15:40:44,913] episode 1712, reward -0.000622, avg reward -0.003354, total steps 219136, episode step 128\n",
|
|
"INFO:gym:episode 1713, reward -0.002045, avg reward -0.003357, total steps 219264, episode step 128\n",
|
|
"[2018-02-18 15:40:48,426] episode 1713, reward -0.002045, avg reward -0.003357, total steps 219264, episode step 128\n",
|
|
"INFO:gym:episode 1714, reward -0.001698, avg reward -0.003356, total steps 219392, episode step 128\n",
|
|
"[2018-02-18 15:40:51,961] episode 1714, reward -0.001698, avg reward -0.003356, total steps 219392, episode step 128\n",
|
|
"INFO:gym:episode 1715, reward -0.003784, avg reward -0.003376, total steps 219520, episode step 128\n",
|
|
"[2018-02-18 15:40:55,501] episode 1715, reward -0.003784, avg reward -0.003376, total steps 219520, episode step 128\n",
|
|
"INFO:gym:episode 1716, reward -0.012321, avg reward -0.003459, total steps 219648, episode step 128\n",
|
|
"[2018-02-18 15:40:59,043] episode 1716, reward -0.012321, avg reward -0.003459, total steps 219648, episode step 128\n",
|
|
"INFO:gym:episode 1717, reward -0.001836, avg reward -0.003459, total steps 219776, episode step 128\n",
|
|
"[2018-02-18 15:41:02,557] episode 1717, reward -0.001836, avg reward -0.003459, total steps 219776, episode step 128\n",
|
|
"INFO:gym:episode 1718, reward -0.001769, avg reward -0.003390, total steps 219904, episode step 128\n",
|
|
"[2018-02-18 15:41:06,091] episode 1718, reward -0.001769, avg reward -0.003390, total steps 219904, episode step 128\n",
|
|
"INFO:gym:episode 1719, reward -0.005024, avg reward -0.003382, total steps 220032, episode step 128\n",
|
|
"[2018-02-18 15:41:10,043] episode 1719, reward -0.005024, avg reward -0.003382, total steps 220032, episode step 128\n",
|
|
"INFO:gym:episode 1720, reward -0.001751, avg reward -0.003327, total steps 220160, episode step 128\n",
|
|
"[2018-02-18 15:41:14,145] episode 1720, reward -0.001751, avg reward -0.003327, total steps 220160, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:41:14,154] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001792(0.000000)\n",
|
|
"[2018-02-18 15:41:14,489] Avg reward -0.001792(0.000000)\n",
|
|
"INFO:gym:episode 1721, reward -0.001769, avg reward -0.003323, total steps 220288, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:41:18,546] episode 1721, reward -0.001769, avg reward -0.003323, total steps 220288, episode step 128\n",
|
|
"INFO:gym:episode 1722, reward -0.001917, avg reward -0.003324, total steps 220416, episode step 128\n",
|
|
"[2018-02-18 15:41:22,258] episode 1722, reward -0.001917, avg reward -0.003324, total steps 220416, episode step 128\n",
|
|
"INFO:gym:episode 1723, reward -0.005797, avg reward -0.003330, total steps 220544, episode step 128\n",
|
|
"[2018-02-18 15:41:25,839] episode 1723, reward -0.005797, avg reward -0.003330, total steps 220544, episode step 128\n",
|
|
"INFO:gym:episode 1724, reward -0.001738, avg reward -0.003330, total steps 220672, episode step 128\n",
|
|
"[2018-02-18 15:41:29,474] episode 1724, reward -0.001738, avg reward -0.003330, total steps 220672, episode step 128\n",
|
|
"INFO:gym:episode 1725, reward -0.004765, avg reward -0.003318, total steps 220800, episode step 128\n",
|
|
"[2018-02-18 15:41:33,120] episode 1725, reward -0.004765, avg reward -0.003318, total steps 220800, episode step 128\n",
|
|
"INFO:gym:episode 1726, reward -0.001863, avg reward -0.003319, total steps 220928, episode step 128\n",
|
|
"[2018-02-18 15:41:37,496] episode 1726, reward -0.001863, avg reward -0.003319, total steps 220928, episode step 128\n",
|
|
"INFO:gym:episode 1727, reward -0.001746, avg reward -0.003251, total steps 221056, episode step 128\n",
|
|
"[2018-02-18 15:41:41,654] episode 1727, reward -0.001746, avg reward -0.003251, total steps 221056, episode step 128\n",
|
|
"INFO:gym:episode 1728, reward -0.005136, avg reward -0.003285, total steps 221184, episode step 128\n",
|
|
"[2018-02-18 15:41:45,138] episode 1728, reward -0.005136, avg reward -0.003285, total steps 221184, episode step 128\n",
|
|
"INFO:gym:episode 1729, reward -0.003364, avg reward -0.003278, total steps 221312, episode step 128\n",
|
|
"[2018-02-18 15:41:48,623] episode 1729, reward -0.003364, avg reward -0.003278, total steps 221312, episode step 128\n",
|
|
"INFO:gym:episode 1730, reward -0.006342, avg reward -0.003321, total steps 221440, episode step 128\n",
|
|
"[2018-02-18 15:41:52,209] episode 1730, reward -0.006342, avg reward -0.003321, total steps 221440, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:41:52,210] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001800(0.000000)\n",
|
|
"[2018-02-18 15:41:52,549] Avg reward -0.001800(0.000000)\n",
|
|
"INFO:gym:episode 1731, reward -0.002164, avg reward -0.003325, total steps 221568, episode step 128\n",
|
|
"[2018-02-18 15:41:56,257] episode 1731, reward -0.002164, avg reward -0.003325, total steps 221568, episode step 128\n",
|
|
"INFO:gym:episode 1732, reward -0.001754, avg reward -0.003302, total steps 221696, episode step 128\n",
|
|
"[2018-02-18 15:41:59,962] episode 1732, reward -0.001754, avg reward -0.003302, total steps 221696, episode step 128\n",
|
|
"INFO:gym:episode 1733, reward -0.001767, avg reward -0.003306, total steps 221824, episode step 128\n",
|
|
"[2018-02-18 15:42:03,389] episode 1733, reward -0.001767, avg reward -0.003306, total steps 221824, episode step 128\n",
|
|
"INFO:gym:episode 1734, reward -0.009631, avg reward -0.003371, total steps 221952, episode step 128\n",
|
|
"[2018-02-18 15:42:06,575] episode 1734, reward -0.009631, avg reward -0.003371, total steps 221952, episode step 128\n",
|
|
"INFO:gym:episode 1735, reward -0.002929, avg reward -0.003288, total steps 222080, episode step 128\n",
|
|
"[2018-02-18 15:42:10,941] episode 1735, reward -0.002929, avg reward -0.003288, total steps 222080, episode step 128\n",
|
|
"INFO:gym:episode 1736, reward -0.001839, avg reward -0.003289, total steps 222208, episode step 128\n",
|
|
"[2018-02-18 15:42:15,497] episode 1736, reward -0.001839, avg reward -0.003289, total steps 222208, episode step 128\n",
|
|
"INFO:gym:episode 1737, reward -0.000569, avg reward -0.003276, total steps 222336, episode step 128\n",
|
|
"[2018-02-18 15:42:19,129] episode 1737, reward -0.000569, avg reward -0.003276, total steps 222336, episode step 128\n",
|
|
"INFO:gym:episode 1738, reward -0.011249, avg reward -0.003346, total steps 222464, episode step 128\n",
|
|
"[2018-02-18 15:42:22,597] episode 1738, reward -0.011249, avg reward -0.003346, total steps 222464, episode step 128\n",
|
|
"INFO:gym:episode 1739, reward -0.001740, avg reward -0.003338, total steps 222592, episode step 128\n",
|
|
"[2018-02-18 15:42:26,310] episode 1739, reward -0.001740, avg reward -0.003338, total steps 222592, episode step 128\n",
|
|
"INFO:gym:episode 1740, reward -0.005455, avg reward -0.003383, total steps 222720, episode step 128\n",
|
|
"[2018-02-18 15:42:30,135] episode 1740, reward -0.005455, avg reward -0.003383, total steps 222720, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:42:30,136] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001798(0.000000)\n",
|
|
"[2018-02-18 15:42:30,481] Avg reward -0.001798(0.000000)\n",
|
|
"INFO:gym:episode 1741, reward -0.003904, avg reward -0.003405, total steps 222848, episode step 128\n",
|
|
"[2018-02-18 15:42:34,057] episode 1741, reward -0.003904, avg reward -0.003405, total steps 222848, episode step 128\n",
|
|
"INFO:gym:episode 1742, reward 0.010691, avg reward -0.003266, total steps 222976, episode step 128\n",
|
|
"[2018-02-18 15:42:37,597] episode 1742, reward 0.010691, avg reward -0.003266, total steps 222976, episode step 128\n",
|
|
"INFO:gym:episode 1743, reward -0.001787, avg reward -0.003264, total steps 223104, episode step 128\n",
|
|
"[2018-02-18 15:42:41,324] episode 1743, reward -0.001787, avg reward -0.003264, total steps 223104, episode step 128\n",
|
|
"INFO:gym:episode 1744, reward 0.003191, avg reward -0.003214, total steps 223232, episode step 128\n",
|
|
"[2018-02-18 15:42:44,051] episode 1744, reward 0.003191, avg reward -0.003214, total steps 223232, episode step 128\n",
|
|
"INFO:gym:episode 1745, reward -0.001771, avg reward -0.002960, total steps 223360, episode step 128\n",
|
|
"[2018-02-18 15:42:45,787] episode 1745, reward -0.001771, avg reward -0.002960, total steps 223360, episode step 128\n",
|
|
"INFO:gym:episode 1746, reward -0.001761, avg reward -0.002958, total steps 223488, episode step 128\n",
|
|
"[2018-02-18 15:42:47,501] episode 1746, reward -0.001761, avg reward -0.002958, total steps 223488, episode step 128\n",
|
|
"INFO:gym:episode 1747, reward -0.001985, avg reward -0.002961, total steps 223616, episode step 128\n",
|
|
"[2018-02-18 15:42:49,286] episode 1747, reward -0.001985, avg reward -0.002961, total steps 223616, episode step 128\n",
|
|
"INFO:gym:episode 1748, reward -0.000953, avg reward -0.002952, total steps 223744, episode step 128\n",
|
|
"[2018-02-18 15:42:51,040] episode 1748, reward -0.000953, avg reward -0.002952, total steps 223744, episode step 128\n",
|
|
"INFO:gym:episode 1749, reward -0.005856, avg reward -0.002960, total steps 223872, episode step 128\n",
|
|
"[2018-02-18 15:42:52,843] episode 1749, reward -0.005856, avg reward -0.002960, total steps 223872, episode step 128\n",
|
|
"INFO:gym:episode 1750, reward -0.017709, avg reward -0.003107, total steps 224000, episode step 128\n",
|
|
"[2018-02-18 15:42:54,706] episode 1750, reward -0.017709, avg reward -0.003107, total steps 224000, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:42:54,708] Testing...\n",
|
|
"INFO:gym:Avg reward -0.007114(0.000000)\n",
|
|
"[2018-02-18 15:42:55,023] Avg reward -0.007114(0.000000)\n",
|
|
"INFO:gym:episode 1751, reward -0.005733, avg reward -0.003038, total steps 224128, episode step 128\n",
|
|
"[2018-02-18 15:42:56,833] episode 1751, reward -0.005733, avg reward -0.003038, total steps 224128, episode step 128\n",
|
|
"INFO:gym:episode 1752, reward -0.004159, avg reward -0.003055, total steps 224256, episode step 128\n",
|
|
"[2018-02-18 15:42:58,748] episode 1752, reward -0.004159, avg reward -0.003055, total steps 224256, episode step 128\n",
|
|
"INFO:gym:episode 1753, reward -0.012938, avg reward -0.003155, total steps 224384, episode step 128\n",
|
|
"[2018-02-18 15:43:00,684] episode 1753, reward -0.012938, avg reward -0.003155, total steps 224384, episode step 128\n",
|
|
"INFO:gym:episode 1754, reward -0.001640, avg reward -0.003137, total steps 224512, episode step 128\n",
|
|
"[2018-02-18 15:43:02,555] episode 1754, reward -0.001640, avg reward -0.003137, total steps 224512, episode step 128\n",
|
|
"INFO:gym:episode 1755, reward -0.002546, avg reward -0.003138, total steps 224640, episode step 128\n",
|
|
"[2018-02-18 15:43:04,416] episode 1755, reward -0.002546, avg reward -0.003138, total steps 224640, episode step 128\n",
|
|
"INFO:gym:episode 1756, reward -0.001830, avg reward -0.003134, total steps 224768, episode step 128\n",
|
|
"[2018-02-18 15:43:06,227] episode 1756, reward -0.001830, avg reward -0.003134, total steps 224768, episode step 128\n",
|
|
"INFO:gym:episode 1757, reward -0.001758, avg reward -0.003122, total steps 224896, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:43:08,067] episode 1757, reward -0.001758, avg reward -0.003122, total steps 224896, episode step 128\n",
|
|
"INFO:gym:episode 1758, reward -0.001759, avg reward -0.003113, total steps 225024, episode step 128\n",
|
|
"[2018-02-18 15:43:10,074] episode 1758, reward -0.001759, avg reward -0.003113, total steps 225024, episode step 128\n",
|
|
"INFO:gym:episode 1759, reward -0.001863, avg reward -0.003110, total steps 225152, episode step 128\n",
|
|
"[2018-02-18 15:43:12,156] episode 1759, reward -0.001863, avg reward -0.003110, total steps 225152, episode step 128\n",
|
|
"INFO:gym:episode 1760, reward -0.002007, avg reward -0.003107, total steps 225280, episode step 128\n",
|
|
"[2018-02-18 15:43:14,201] episode 1760, reward -0.002007, avg reward -0.003107, total steps 225280, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:43:14,210] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001762(0.000000)\n",
|
|
"[2018-02-18 15:43:14,543] Avg reward -0.001762(0.000000)\n",
|
|
"INFO:gym:episode 1761, reward -0.001751, avg reward -0.003131, total steps 225408, episode step 128\n",
|
|
"[2018-02-18 15:43:16,556] episode 1761, reward -0.001751, avg reward -0.003131, total steps 225408, episode step 128\n",
|
|
"INFO:gym:episode 1762, reward 0.000796, avg reward -0.003108, total steps 225536, episode step 128\n",
|
|
"[2018-02-18 15:43:18,532] episode 1762, reward 0.000796, avg reward -0.003108, total steps 225536, episode step 128\n",
|
|
"INFO:gym:episode 1763, reward -0.012807, avg reward -0.003219, total steps 225664, episode step 128\n",
|
|
"[2018-02-18 15:43:20,610] episode 1763, reward -0.012807, avg reward -0.003219, total steps 225664, episode step 128\n",
|
|
"INFO:gym:episode 1764, reward -0.007858, avg reward -0.003280, total steps 225792, episode step 128\n",
|
|
"[2018-02-18 15:43:22,785] episode 1764, reward -0.007858, avg reward -0.003280, total steps 225792, episode step 128\n",
|
|
"INFO:gym:episode 1765, reward -0.005984, avg reward -0.003284, total steps 225920, episode step 128\n",
|
|
"[2018-02-18 15:43:25,101] episode 1765, reward -0.005984, avg reward -0.003284, total steps 225920, episode step 128\n",
|
|
"INFO:gym:episode 1766, reward -0.002531, avg reward -0.003279, total steps 226048, episode step 128\n",
|
|
"[2018-02-18 15:43:27,378] episode 1766, reward -0.002531, avg reward -0.003279, total steps 226048, episode step 128\n",
|
|
"INFO:gym:episode 1767, reward -0.006418, avg reward -0.003274, total steps 226176, episode step 128\n",
|
|
"[2018-02-18 15:43:29,719] episode 1767, reward -0.006418, avg reward -0.003274, total steps 226176, episode step 128\n",
|
|
"INFO:gym:episode 1768, reward -0.001104, avg reward -0.003266, total steps 226304, episode step 128\n",
|
|
"[2018-02-18 15:43:32,427] episode 1768, reward -0.001104, avg reward -0.003266, total steps 226304, episode step 128\n",
|
|
"INFO:gym:episode 1769, reward -0.004940, avg reward -0.003301, total steps 226432, episode step 128\n",
|
|
"[2018-02-18 15:43:34,949] episode 1769, reward -0.004940, avg reward -0.003301, total steps 226432, episode step 128\n",
|
|
"INFO:gym:episode 1770, reward -0.001863, avg reward -0.003302, total steps 226560, episode step 128\n",
|
|
"[2018-02-18 15:43:37,474] episode 1770, reward -0.001863, avg reward -0.003302, total steps 226560, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:43:37,475] Testing...\n",
|
|
"INFO:gym:Avg reward -0.005105(0.000000)\n",
|
|
"[2018-02-18 15:43:37,804] Avg reward -0.005105(0.000000)\n",
|
|
"INFO:gym:episode 1771, reward -0.005143, avg reward -0.003333, total steps 226688, episode step 128\n",
|
|
"[2018-02-18 15:43:40,233] episode 1771, reward -0.005143, avg reward -0.003333, total steps 226688, episode step 128\n",
|
|
"INFO:gym:episode 1772, reward -0.023829, avg reward -0.003520, total steps 226816, episode step 128\n",
|
|
"[2018-02-18 15:43:42,547] episode 1772, reward -0.023829, avg reward -0.003520, total steps 226816, episode step 128\n",
|
|
"INFO:gym:episode 1773, reward -0.001264, avg reward -0.003515, total steps 226944, episode step 128\n",
|
|
"[2018-02-18 15:43:45,009] episode 1773, reward -0.001264, avg reward -0.003515, total steps 226944, episode step 128\n",
|
|
"INFO:gym:episode 1774, reward -0.001885, avg reward -0.003516, total steps 227072, episode step 128\n",
|
|
"[2018-02-18 15:43:47,647] episode 1774, reward -0.001885, avg reward -0.003516, total steps 227072, episode step 128\n",
|
|
"INFO:gym:episode 1775, reward -0.001759, avg reward -0.003503, total steps 227200, episode step 128\n",
|
|
"[2018-02-18 15:43:50,370] episode 1775, reward -0.001759, avg reward -0.003503, total steps 227200, episode step 128\n",
|
|
"INFO:gym:episode 1776, reward -0.011304, avg reward -0.003600, total steps 227328, episode step 128\n",
|
|
"[2018-02-18 15:43:53,471] episode 1776, reward -0.011304, avg reward -0.003600, total steps 227328, episode step 128\n",
|
|
"INFO:gym:episode 1777, reward -0.004981, avg reward -0.003635, total steps 227456, episode step 128\n",
|
|
"[2018-02-18 15:43:56,780] episode 1777, reward -0.004981, avg reward -0.003635, total steps 227456, episode step 128\n",
|
|
"INFO:gym:episode 1778, reward -0.003031, avg reward -0.003637, total steps 227584, episode step 128\n",
|
|
"[2018-02-18 15:44:00,130] episode 1778, reward -0.003031, avg reward -0.003637, total steps 227584, episode step 128\n",
|
|
"INFO:gym:episode 1779, reward -0.001773, avg reward -0.003641, total steps 227712, episode step 128\n",
|
|
"[2018-02-18 15:44:03,401] episode 1779, reward -0.001773, avg reward -0.003641, total steps 227712, episode step 128\n",
|
|
"INFO:gym:episode 1780, reward -0.005750, avg reward -0.003681, total steps 227840, episode step 128\n",
|
|
"[2018-02-18 15:44:06,639] episode 1780, reward -0.005750, avg reward -0.003681, total steps 227840, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:44:06,640] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001767(0.000000)\n",
|
|
"[2018-02-18 15:44:06,964] Avg reward -0.001767(0.000000)\n",
|
|
"INFO:gym:episode 1781, reward -0.001823, avg reward -0.003674, total steps 227968, episode step 128\n",
|
|
"[2018-02-18 15:44:10,002] episode 1781, reward -0.001823, avg reward -0.003674, total steps 227968, episode step 128\n",
|
|
"INFO:gym:episode 1782, reward -0.001918, avg reward -0.003665, total steps 228096, episode step 128\n",
|
|
"[2018-02-18 15:44:13,173] episode 1782, reward -0.001918, avg reward -0.003665, total steps 228096, episode step 128\n",
|
|
"INFO:gym:episode 1783, reward -0.002043, avg reward -0.003616, total steps 228224, episode step 128\n",
|
|
"[2018-02-18 15:44:16,461] episode 1783, reward -0.002043, avg reward -0.003616, total steps 228224, episode step 128\n",
|
|
"INFO:gym:episode 1784, reward -0.004285, avg reward -0.003619, total steps 228352, episode step 128\n",
|
|
"[2018-02-18 15:44:19,850] episode 1784, reward -0.004285, avg reward -0.003619, total steps 228352, episode step 128\n",
|
|
"INFO:gym:episode 1785, reward -0.004809, avg reward -0.003639, total steps 228480, episode step 128\n",
|
|
"[2018-02-18 15:44:23,260] episode 1785, reward -0.004809, avg reward -0.003639, total steps 228480, episode step 128\n",
|
|
"INFO:gym:episode 1786, reward -0.015435, avg reward -0.003772, total steps 228608, episode step 128\n",
|
|
"[2018-02-18 15:44:26,683] episode 1786, reward -0.015435, avg reward -0.003772, total steps 228608, episode step 128\n",
|
|
"INFO:gym:episode 1787, reward -0.006138, avg reward -0.003808, total steps 228736, episode step 128\n",
|
|
"[2018-02-18 15:44:30,039] episode 1787, reward -0.006138, avg reward -0.003808, total steps 228736, episode step 128\n",
|
|
"INFO:gym:episode 1788, reward -0.001759, avg reward -0.003799, total steps 228864, episode step 128\n",
|
|
"[2018-02-18 15:44:33,338] episode 1788, reward -0.001759, avg reward -0.003799, total steps 228864, episode step 128\n",
|
|
"INFO:gym:episode 1789, reward -0.003713, avg reward -0.003815, total steps 228992, episode step 128\n",
|
|
"[2018-02-18 15:44:36,721] episode 1789, reward -0.003713, avg reward -0.003815, total steps 228992, episode step 128\n",
|
|
"INFO:gym:episode 1790, reward -0.001748, avg reward -0.003788, total steps 229120, episode step 128\n",
|
|
"[2018-02-18 15:44:40,229] episode 1790, reward -0.001748, avg reward -0.003788, total steps 229120, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:44:40,230] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001765(0.000000)\n",
|
|
"[2018-02-18 15:44:40,566] Avg reward -0.001765(0.000000)\n",
|
|
"INFO:gym:episode 1791, reward -0.001757, avg reward -0.003788, total steps 229248, episode step 128\n",
|
|
"[2018-02-18 15:44:44,352] episode 1791, reward -0.001757, avg reward -0.003788, total steps 229248, episode step 128\n",
|
|
"INFO:gym:episode 1792, reward -0.020232, avg reward -0.003904, total steps 229376, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:44:48,354] episode 1792, reward -0.020232, avg reward -0.003904, total steps 229376, episode step 128\n",
|
|
"INFO:gym:episode 1793, reward -0.002792, avg reward -0.003913, total steps 229504, episode step 128\n",
|
|
"[2018-02-18 15:44:52,572] episode 1793, reward -0.002792, avg reward -0.003913, total steps 229504, episode step 128\n",
|
|
"INFO:gym:episode 1794, reward -0.001659, avg reward -0.003910, total steps 229632, episode step 128\n",
|
|
"[2018-02-18 15:44:56,659] episode 1794, reward -0.001659, avg reward -0.003910, total steps 229632, episode step 128\n",
|
|
"INFO:gym:episode 1795, reward -0.004126, avg reward -0.003934, total steps 229760, episode step 128\n",
|
|
"[2018-02-18 15:45:00,736] episode 1795, reward -0.004126, avg reward -0.003934, total steps 229760, episode step 128\n",
|
|
"INFO:gym:episode 1796, reward -0.001574, avg reward -0.003926, total steps 229888, episode step 128\n",
|
|
"[2018-02-18 15:45:04,869] episode 1796, reward -0.001574, avg reward -0.003926, total steps 229888, episode step 128\n",
|
|
"INFO:gym:episode 1797, reward -0.012764, avg reward -0.004036, total steps 230016, episode step 128\n",
|
|
"[2018-02-18 15:45:08,952] episode 1797, reward -0.012764, avg reward -0.004036, total steps 230016, episode step 128\n",
|
|
"INFO:gym:episode 1798, reward -0.009493, avg reward -0.004114, total steps 230144, episode step 128\n",
|
|
"[2018-02-18 15:45:12,913] episode 1798, reward -0.009493, avg reward -0.004114, total steps 230144, episode step 128\n",
|
|
"INFO:gym:episode 1799, reward -0.012229, avg reward -0.004211, total steps 230272, episode step 128\n",
|
|
"[2018-02-18 15:45:16,840] episode 1799, reward -0.012229, avg reward -0.004211, total steps 230272, episode step 128\n",
|
|
"INFO:gym:episode 1800, reward -0.001753, avg reward -0.004211, total steps 230400, episode step 128\n",
|
|
"[2018-02-18 15:45:20,804] episode 1800, reward -0.001753, avg reward -0.004211, total steps 230400, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:45:20,812] Testing...\n",
|
|
"INFO:gym:Avg reward -0.004096(0.000000)\n",
|
|
"[2018-02-18 15:45:21,147] Avg reward -0.004096(0.000000)\n",
|
|
"INFO:gym:episode 1801, reward -0.011372, avg reward -0.004270, total steps 230528, episode step 128\n",
|
|
"[2018-02-18 15:45:25,016] episode 1801, reward -0.011372, avg reward -0.004270, total steps 230528, episode step 128\n",
|
|
"INFO:gym:episode 1802, reward -0.001920, avg reward -0.004271, total steps 230656, episode step 128\n",
|
|
"[2018-02-18 15:45:28,795] episode 1802, reward -0.001920, avg reward -0.004271, total steps 230656, episode step 128\n",
|
|
"INFO:gym:episode 1803, reward -0.001731, avg reward -0.004207, total steps 230784, episode step 128\n",
|
|
"[2018-02-18 15:45:32,500] episode 1803, reward -0.001731, avg reward -0.004207, total steps 230784, episode step 128\n",
|
|
"INFO:gym:episode 1804, reward -0.003639, avg reward -0.004211, total steps 230912, episode step 128\n",
|
|
"[2018-02-18 15:45:36,159] episode 1804, reward -0.003639, avg reward -0.004211, total steps 230912, episode step 128\n",
|
|
"INFO:gym:episode 1805, reward -0.002660, avg reward -0.004215, total steps 231040, episode step 128\n",
|
|
"[2018-02-18 15:45:39,858] episode 1805, reward -0.002660, avg reward -0.004215, total steps 231040, episode step 128\n",
|
|
"INFO:gym:episode 1806, reward -0.001838, avg reward -0.004143, total steps 231168, episode step 128\n",
|
|
"[2018-02-18 15:45:43,418] episode 1806, reward -0.001838, avg reward -0.004143, total steps 231168, episode step 128\n",
|
|
"INFO:gym:episode 1807, reward -0.001754, avg reward -0.004111, total steps 231296, episode step 128\n",
|
|
"[2018-02-18 15:45:47,110] episode 1807, reward -0.001754, avg reward -0.004111, total steps 231296, episode step 128\n",
|
|
"INFO:gym:episode 1808, reward -0.012185, avg reward -0.004230, total steps 231424, episode step 128\n",
|
|
"[2018-02-18 15:45:50,639] episode 1808, reward -0.012185, avg reward -0.004230, total steps 231424, episode step 128\n",
|
|
"INFO:gym:episode 1809, reward -0.002457, avg reward -0.004237, total steps 231552, episode step 128\n",
|
|
"[2018-02-18 15:45:54,127] episode 1809, reward -0.002457, avg reward -0.004237, total steps 231552, episode step 128\n",
|
|
"INFO:gym:episode 1810, reward -0.001530, avg reward -0.004226, total steps 231680, episode step 128\n",
|
|
"[2018-02-18 15:45:57,625] episode 1810, reward -0.001530, avg reward -0.004226, total steps 231680, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:45:57,627] Testing...\n",
|
|
"INFO:gym:Avg reward -0.006567(0.000000)\n",
|
|
"[2018-02-18 15:45:57,966] Avg reward -0.006567(0.000000)\n",
|
|
"INFO:gym:episode 1811, reward -0.001823, avg reward -0.004226, total steps 231808, episode step 128\n",
|
|
"[2018-02-18 15:46:01,518] episode 1811, reward -0.001823, avg reward -0.004226, total steps 231808, episode step 128\n",
|
|
"INFO:gym:episode 1812, reward -0.001771, avg reward -0.004237, total steps 231936, episode step 128\n",
|
|
"[2018-02-18 15:46:05,107] episode 1812, reward -0.001771, avg reward -0.004237, total steps 231936, episode step 128\n",
|
|
"INFO:gym:episode 1813, reward -0.001760, avg reward -0.004235, total steps 232064, episode step 128\n",
|
|
"[2018-02-18 15:46:09,118] episode 1813, reward -0.001760, avg reward -0.004235, total steps 232064, episode step 128\n",
|
|
"INFO:gym:episode 1814, reward -0.011308, avg reward -0.004331, total steps 232192, episode step 128\n",
|
|
"[2018-02-18 15:46:13,230] episode 1814, reward -0.011308, avg reward -0.004331, total steps 232192, episode step 128\n",
|
|
"INFO:gym:episode 1815, reward -0.010627, avg reward -0.004399, total steps 232320, episode step 128\n",
|
|
"[2018-02-18 15:46:17,668] episode 1815, reward -0.010627, avg reward -0.004399, total steps 232320, episode step 128\n",
|
|
"INFO:gym:episode 1816, reward -0.001763, avg reward -0.004294, total steps 232448, episode step 128\n",
|
|
"[2018-02-18 15:46:22,449] episode 1816, reward -0.001763, avg reward -0.004294, total steps 232448, episode step 128\n",
|
|
"INFO:gym:episode 1817, reward -0.001766, avg reward -0.004293, total steps 232576, episode step 128\n",
|
|
"[2018-02-18 15:46:27,134] episode 1817, reward -0.001766, avg reward -0.004293, total steps 232576, episode step 128\n",
|
|
"INFO:gym:episode 1818, reward -0.001778, avg reward -0.004293, total steps 232704, episode step 128\n",
|
|
"[2018-02-18 15:46:31,339] episode 1818, reward -0.001778, avg reward -0.004293, total steps 232704, episode step 128\n",
|
|
"INFO:gym:episode 1819, reward -0.001976, avg reward -0.004262, total steps 232832, episode step 128\n",
|
|
"[2018-02-18 15:46:35,450] episode 1819, reward -0.001976, avg reward -0.004262, total steps 232832, episode step 128\n",
|
|
"INFO:gym:episode 1820, reward 0.000710, avg reward -0.004238, total steps 232960, episode step 128\n",
|
|
"[2018-02-18 15:46:39,634] episode 1820, reward 0.000710, avg reward -0.004238, total steps 232960, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:46:39,636] Testing...\n",
|
|
"INFO:gym:Avg reward -0.007241(0.000000)\n",
|
|
"[2018-02-18 15:46:39,972] Avg reward -0.007241(0.000000)\n",
|
|
"INFO:gym:episode 1821, reward -0.003415, avg reward -0.004254, total steps 233088, episode step 128\n",
|
|
"[2018-02-18 15:46:43,862] episode 1821, reward -0.003415, avg reward -0.004254, total steps 233088, episode step 128\n",
|
|
"INFO:gym:episode 1822, reward -0.009203, avg reward -0.004327, total steps 233216, episode step 128\n",
|
|
"[2018-02-18 15:46:47,947] episode 1822, reward -0.009203, avg reward -0.004327, total steps 233216, episode step 128\n",
|
|
"INFO:gym:episode 1823, reward -0.001816, avg reward -0.004287, total steps 233344, episode step 128\n",
|
|
"[2018-02-18 15:46:52,076] episode 1823, reward -0.001816, avg reward -0.004287, total steps 233344, episode step 128\n",
|
|
"INFO:gym:episode 1824, reward -0.002106, avg reward -0.004291, total steps 233472, episode step 128\n",
|
|
"[2018-02-18 15:46:56,522] episode 1824, reward -0.002106, avg reward -0.004291, total steps 233472, episode step 128\n",
|
|
"INFO:gym:episode 1825, reward -0.001606, avg reward -0.004259, total steps 233600, episode step 128\n",
|
|
"[2018-02-18 15:47:00,887] episode 1825, reward -0.001606, avg reward -0.004259, total steps 233600, episode step 128\n",
|
|
"INFO:gym:episode 1826, reward -0.001452, avg reward -0.004255, total steps 233728, episode step 128\n",
|
|
"[2018-02-18 15:47:05,463] episode 1826, reward -0.001452, avg reward -0.004255, total steps 233728, episode step 128\n",
|
|
"INFO:gym:episode 1827, reward -0.002352, avg reward -0.004261, total steps 233856, episode step 128\n",
|
|
"[2018-02-18 15:47:09,815] episode 1827, reward -0.002352, avg reward -0.004261, total steps 233856, episode step 128\n",
|
|
"INFO:gym:episode 1828, reward -0.003404, avg reward -0.004244, total steps 233984, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:47:13,806] episode 1828, reward -0.003404, avg reward -0.004244, total steps 233984, episode step 128\n",
|
|
"INFO:gym:episode 1829, reward -0.008510, avg reward -0.004296, total steps 234112, episode step 128\n",
|
|
"[2018-02-18 15:47:17,436] episode 1829, reward -0.008510, avg reward -0.004296, total steps 234112, episode step 128\n",
|
|
"INFO:gym:episode 1830, reward -0.001752, avg reward -0.004250, total steps 234240, episode step 128\n",
|
|
"[2018-02-18 15:47:21,403] episode 1830, reward -0.001752, avg reward -0.004250, total steps 234240, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:47:21,405] Testing...\n",
|
|
"INFO:gym:Avg reward -0.000839(0.000000)\n",
|
|
"[2018-02-18 15:47:21,730] Avg reward -0.000839(0.000000)\n",
|
|
"INFO:gym:episode 1831, reward -0.008556, avg reward -0.004314, total steps 234368, episode step 128\n",
|
|
"[2018-02-18 15:47:25,517] episode 1831, reward -0.008556, avg reward -0.004314, total steps 234368, episode step 128\n",
|
|
"INFO:gym:episode 1832, reward -0.004330, avg reward -0.004339, total steps 234496, episode step 128\n",
|
|
"[2018-02-18 15:47:29,263] episode 1832, reward -0.004330, avg reward -0.004339, total steps 234496, episode step 128\n",
|
|
"INFO:gym:episode 1833, reward -0.001751, avg reward -0.004339, total steps 234624, episode step 128\n",
|
|
"[2018-02-18 15:47:33,025] episode 1833, reward -0.001751, avg reward -0.004339, total steps 234624, episode step 128\n",
|
|
"INFO:gym:episode 1834, reward -0.006466, avg reward -0.004308, total steps 234752, episode step 128\n",
|
|
"[2018-02-18 15:47:36,912] episode 1834, reward -0.006466, avg reward -0.004308, total steps 234752, episode step 128\n",
|
|
"INFO:gym:episode 1835, reward -0.001933, avg reward -0.004298, total steps 234880, episode step 128\n",
|
|
"[2018-02-18 15:47:40,686] episode 1835, reward -0.001933, avg reward -0.004298, total steps 234880, episode step 128\n",
|
|
"INFO:gym:episode 1836, reward -0.001756, avg reward -0.004297, total steps 235008, episode step 128\n",
|
|
"[2018-02-18 15:47:44,603] episode 1836, reward -0.001756, avg reward -0.004297, total steps 235008, episode step 128\n",
|
|
"INFO:gym:episode 1837, reward 0.002111, avg reward -0.004270, total steps 235136, episode step 128\n",
|
|
"[2018-02-18 15:47:48,772] episode 1837, reward 0.002111, avg reward -0.004270, total steps 235136, episode step 128\n",
|
|
"INFO:gym:episode 1838, reward -0.001734, avg reward -0.004175, total steps 235264, episode step 128\n",
|
|
"[2018-02-18 15:47:52,841] episode 1838, reward -0.001734, avg reward -0.004175, total steps 235264, episode step 128\n",
|
|
"INFO:gym:episode 1839, reward -0.001761, avg reward -0.004175, total steps 235392, episode step 128\n",
|
|
"[2018-02-18 15:47:56,895] episode 1839, reward -0.001761, avg reward -0.004175, total steps 235392, episode step 128\n",
|
|
"INFO:gym:episode 1840, reward -0.003909, avg reward -0.004160, total steps 235520, episode step 128\n",
|
|
"[2018-02-18 15:48:00,793] episode 1840, reward -0.003909, avg reward -0.004160, total steps 235520, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:48:00,803] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001753(0.000000)\n",
|
|
"[2018-02-18 15:48:01,137] Avg reward -0.001753(0.000000)\n",
|
|
"INFO:gym:episode 1841, reward -0.004607, avg reward -0.004167, total steps 235648, episode step 128\n",
|
|
"[2018-02-18 15:48:04,706] episode 1841, reward -0.004607, avg reward -0.004167, total steps 235648, episode step 128\n",
|
|
"INFO:gym:episode 1842, reward -0.003781, avg reward -0.004311, total steps 235776, episode step 128\n",
|
|
"[2018-02-18 15:48:07,927] episode 1842, reward -0.003781, avg reward -0.004311, total steps 235776, episode step 128\n",
|
|
"INFO:gym:episode 1843, reward 0.001548, avg reward -0.004278, total steps 235904, episode step 128\n",
|
|
"[2018-02-18 15:48:11,993] episode 1843, reward 0.001548, avg reward -0.004278, total steps 235904, episode step 128\n",
|
|
"INFO:gym:episode 1844, reward -0.002658, avg reward -0.004336, total steps 236032, episode step 128\n",
|
|
"[2018-02-18 15:48:16,002] episode 1844, reward -0.002658, avg reward -0.004336, total steps 236032, episode step 128\n",
|
|
"INFO:gym:episode 1845, reward -0.002083, avg reward -0.004340, total steps 236160, episode step 128\n",
|
|
"[2018-02-18 15:48:19,776] episode 1845, reward -0.002083, avg reward -0.004340, total steps 236160, episode step 128\n",
|
|
"INFO:gym:episode 1846, reward -0.001764, avg reward -0.004340, total steps 236288, episode step 128\n",
|
|
"[2018-02-18 15:48:23,582] episode 1846, reward -0.001764, avg reward -0.004340, total steps 236288, episode step 128\n",
|
|
"INFO:gym:episode 1847, reward 0.005145, avg reward -0.004268, total steps 236416, episode step 128\n",
|
|
"[2018-02-18 15:48:27,834] episode 1847, reward 0.005145, avg reward -0.004268, total steps 236416, episode step 128\n",
|
|
"INFO:gym:episode 1848, reward -0.001781, avg reward -0.004277, total steps 236544, episode step 128\n",
|
|
"[2018-02-18 15:48:29,934] episode 1848, reward -0.001781, avg reward -0.004277, total steps 236544, episode step 128\n",
|
|
"INFO:gym:episode 1849, reward -0.001764, avg reward -0.004236, total steps 236672, episode step 128\n",
|
|
"[2018-02-18 15:48:31,728] episode 1849, reward -0.001764, avg reward -0.004236, total steps 236672, episode step 128\n",
|
|
"INFO:gym:episode 1850, reward -0.003783, avg reward -0.004096, total steps 236800, episode step 128\n",
|
|
"[2018-02-18 15:48:33,517] episode 1850, reward -0.003783, avg reward -0.004096, total steps 236800, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:48:33,518] Testing...\n",
|
|
"INFO:gym:Avg reward -0.007167(0.000000)\n",
|
|
"[2018-02-18 15:48:33,840] Avg reward -0.007167(0.000000)\n",
|
|
"INFO:gym:episode 1851, reward -0.006164, avg reward -0.004101, total steps 236928, episode step 128\n",
|
|
"[2018-02-18 15:48:35,652] episode 1851, reward -0.006164, avg reward -0.004101, total steps 236928, episode step 128\n",
|
|
"INFO:gym:episode 1852, reward -0.006185, avg reward -0.004121, total steps 237056, episode step 128\n",
|
|
"[2018-02-18 15:48:37,416] episode 1852, reward -0.006185, avg reward -0.004121, total steps 237056, episode step 128\n",
|
|
"INFO:gym:episode 1853, reward -0.001846, avg reward -0.004010, total steps 237184, episode step 128\n",
|
|
"[2018-02-18 15:48:39,191] episode 1853, reward -0.001846, avg reward -0.004010, total steps 237184, episode step 128\n",
|
|
"INFO:gym:episode 1854, reward -0.001957, avg reward -0.004013, total steps 237312, episode step 128\n",
|
|
"[2018-02-18 15:48:40,967] episode 1854, reward -0.001957, avg reward -0.004013, total steps 237312, episode step 128\n",
|
|
"INFO:gym:episode 1855, reward -0.003255, avg reward -0.004020, total steps 237440, episode step 128\n",
|
|
"[2018-02-18 15:48:42,810] episode 1855, reward -0.003255, avg reward -0.004020, total steps 237440, episode step 128\n",
|
|
"INFO:gym:episode 1856, reward -0.001943, avg reward -0.004021, total steps 237568, episode step 128\n",
|
|
"[2018-02-18 15:48:44,736] episode 1856, reward -0.001943, avg reward -0.004021, total steps 237568, episode step 128\n",
|
|
"INFO:gym:episode 1857, reward -0.002250, avg reward -0.004026, total steps 237696, episode step 128\n",
|
|
"[2018-02-18 15:48:46,683] episode 1857, reward -0.002250, avg reward -0.004026, total steps 237696, episode step 128\n",
|
|
"INFO:gym:episode 1858, reward 0.000976, avg reward -0.003999, total steps 237824, episode step 128\n",
|
|
"[2018-02-18 15:48:48,530] episode 1858, reward 0.000976, avg reward -0.003999, total steps 237824, episode step 128\n",
|
|
"INFO:gym:episode 1859, reward -0.001763, avg reward -0.003998, total steps 237952, episode step 128\n",
|
|
"[2018-02-18 15:48:50,374] episode 1859, reward -0.001763, avg reward -0.003998, total steps 237952, episode step 128\n",
|
|
"INFO:gym:episode 1860, reward -0.001683, avg reward -0.003995, total steps 238080, episode step 128\n",
|
|
"[2018-02-18 15:48:52,203] episode 1860, reward -0.001683, avg reward -0.003995, total steps 238080, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:48:52,204] Testing...\n",
|
|
"INFO:gym:Avg reward -0.015878(0.000000)\n",
|
|
"[2018-02-18 15:48:52,568] Avg reward -0.015878(0.000000)\n",
|
|
"INFO:gym:episode 1861, reward -0.002011, avg reward -0.003997, total steps 238208, episode step 128\n",
|
|
"[2018-02-18 15:48:54,442] episode 1861, reward -0.002011, avg reward -0.003997, total steps 238208, episode step 128\n",
|
|
"INFO:gym:episode 1862, reward -0.002132, avg reward -0.004027, total steps 238336, episode step 128\n",
|
|
"[2018-02-18 15:48:56,369] episode 1862, reward -0.002132, avg reward -0.004027, total steps 238336, episode step 128\n",
|
|
"INFO:gym:episode 1863, reward -0.000887, avg reward -0.003907, total steps 238464, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:48:58,468] episode 1863, reward -0.000887, avg reward -0.003907, total steps 238464, episode step 128\n",
|
|
"INFO:gym:episode 1864, reward -0.002853, avg reward -0.003857, total steps 238592, episode step 128\n",
|
|
"[2018-02-18 15:49:00,663] episode 1864, reward -0.002853, avg reward -0.003857, total steps 238592, episode step 128\n",
|
|
"INFO:gym:episode 1865, reward -0.003359, avg reward -0.003831, total steps 238720, episode step 128\n",
|
|
"[2018-02-18 15:49:02,979] episode 1865, reward -0.003359, avg reward -0.003831, total steps 238720, episode step 128\n",
|
|
"INFO:gym:episode 1866, reward 0.003663, avg reward -0.003769, total steps 238848, episode step 128\n",
|
|
"[2018-02-18 15:49:05,347] episode 1866, reward 0.003663, avg reward -0.003769, total steps 238848, episode step 128\n",
|
|
"INFO:gym:episode 1867, reward 0.023251, avg reward -0.003473, total steps 238976, episode step 128\n",
|
|
"[2018-02-18 15:49:07,696] episode 1867, reward 0.023251, avg reward -0.003473, total steps 238976, episode step 128\n",
|
|
"INFO:gym:episode 1868, reward -0.001966, avg reward -0.003481, total steps 239104, episode step 128\n",
|
|
"[2018-02-18 15:49:10,123] episode 1868, reward -0.001966, avg reward -0.003481, total steps 239104, episode step 128\n",
|
|
"INFO:gym:episode 1869, reward -0.001765, avg reward -0.003449, total steps 239232, episode step 128\n",
|
|
"[2018-02-18 15:49:12,495] episode 1869, reward -0.001765, avg reward -0.003449, total steps 239232, episode step 128\n",
|
|
"INFO:gym:episode 1870, reward -0.001592, avg reward -0.003447, total steps 239360, episode step 128\n",
|
|
"[2018-02-18 15:49:15,051] episode 1870, reward -0.001592, avg reward -0.003447, total steps 239360, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:49:15,055] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001759(0.000000)\n",
|
|
"[2018-02-18 15:49:15,415] Avg reward -0.001759(0.000000)\n",
|
|
"INFO:gym:episode 1871, reward -0.001758, avg reward -0.003413, total steps 239488, episode step 128\n",
|
|
"[2018-02-18 15:49:18,187] episode 1871, reward -0.001758, avg reward -0.003413, total steps 239488, episode step 128\n",
|
|
"INFO:gym:episode 1872, reward -0.001832, avg reward -0.003193, total steps 239616, episode step 128\n",
|
|
"[2018-02-18 15:49:21,161] episode 1872, reward -0.001832, avg reward -0.003193, total steps 239616, episode step 128\n",
|
|
"INFO:gym:episode 1873, reward -0.001195, avg reward -0.003192, total steps 239744, episode step 128\n",
|
|
"[2018-02-18 15:49:24,441] episode 1873, reward -0.001195, avg reward -0.003192, total steps 239744, episode step 128\n",
|
|
"INFO:gym:episode 1874, reward -0.001711, avg reward -0.003190, total steps 239872, episode step 128\n",
|
|
"[2018-02-18 15:49:27,726] episode 1874, reward -0.001711, avg reward -0.003190, total steps 239872, episode step 128\n",
|
|
"INFO:gym:episode 1875, reward -0.002399, avg reward -0.003197, total steps 240000, episode step 128\n",
|
|
"[2018-02-18 15:49:30,914] episode 1875, reward -0.002399, avg reward -0.003197, total steps 240000, episode step 128\n",
|
|
"INFO:gym:episode 1876, reward -0.004526, avg reward -0.003129, total steps 240128, episode step 128\n",
|
|
"[2018-02-18 15:49:33,972] episode 1876, reward -0.004526, avg reward -0.003129, total steps 240128, episode step 128\n",
|
|
"INFO:gym:episode 1877, reward -0.001154, avg reward -0.003091, total steps 240256, episode step 128\n",
|
|
"[2018-02-18 15:49:37,177] episode 1877, reward -0.001154, avg reward -0.003091, total steps 240256, episode step 128\n",
|
|
"INFO:gym:episode 1878, reward -0.001802, avg reward -0.003078, total steps 240384, episode step 128\n",
|
|
"[2018-02-18 15:49:40,570] episode 1878, reward -0.001802, avg reward -0.003078, total steps 240384, episode step 128\n",
|
|
"INFO:gym:episode 1879, reward -0.001761, avg reward -0.003078, total steps 240512, episode step 128\n",
|
|
"[2018-02-18 15:49:44,278] episode 1879, reward -0.001761, avg reward -0.003078, total steps 240512, episode step 128\n",
|
|
"INFO:gym:episode 1880, reward -0.003834, avg reward -0.003059, total steps 240640, episode step 128\n",
|
|
"[2018-02-18 15:49:48,353] episode 1880, reward -0.003834, avg reward -0.003059, total steps 240640, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:49:48,362] Testing...\n",
|
|
"INFO:gym:Avg reward -0.004608(0.000000)\n",
|
|
"[2018-02-18 15:49:48,723] Avg reward -0.004608(0.000000)\n",
|
|
"INFO:gym:episode 1881, reward -0.004508, avg reward -0.003086, total steps 240768, episode step 128\n",
|
|
"[2018-02-18 15:49:52,720] episode 1881, reward -0.004508, avg reward -0.003086, total steps 240768, episode step 128\n",
|
|
"INFO:gym:episode 1882, reward -0.004014, avg reward -0.003107, total steps 240896, episode step 128\n",
|
|
"[2018-02-18 15:49:56,705] episode 1882, reward -0.004014, avg reward -0.003107, total steps 240896, episode step 128\n",
|
|
"INFO:gym:episode 1883, reward -0.002468, avg reward -0.003111, total steps 241024, episode step 128\n",
|
|
"[2018-02-18 15:50:00,293] episode 1883, reward -0.002468, avg reward -0.003111, total steps 241024, episode step 128\n",
|
|
"INFO:gym:episode 1884, reward -0.007608, avg reward -0.003144, total steps 241152, episode step 128\n",
|
|
"[2018-02-18 15:50:03,620] episode 1884, reward -0.007608, avg reward -0.003144, total steps 241152, episode step 128\n",
|
|
"INFO:gym:episode 1885, reward -0.006496, avg reward -0.003161, total steps 241280, episode step 128\n",
|
|
"[2018-02-18 15:50:06,928] episode 1885, reward -0.006496, avg reward -0.003161, total steps 241280, episode step 128\n",
|
|
"INFO:gym:episode 1886, reward -0.010470, avg reward -0.003112, total steps 241408, episode step 128\n",
|
|
"[2018-02-18 15:50:10,210] episode 1886, reward -0.010470, avg reward -0.003112, total steps 241408, episode step 128\n",
|
|
"INFO:gym:episode 1887, reward -0.001785, avg reward -0.003068, total steps 241536, episode step 128\n",
|
|
"[2018-02-18 15:50:13,744] episode 1887, reward -0.001785, avg reward -0.003068, total steps 241536, episode step 128\n",
|
|
"INFO:gym:episode 1888, reward -0.005419, avg reward -0.003105, total steps 241664, episode step 128\n",
|
|
"[2018-02-18 15:50:17,549] episode 1888, reward -0.005419, avg reward -0.003105, total steps 241664, episode step 128\n",
|
|
"INFO:gym:episode 1889, reward -0.001866, avg reward -0.003086, total steps 241792, episode step 128\n",
|
|
"[2018-02-18 15:50:21,331] episode 1889, reward -0.001866, avg reward -0.003086, total steps 241792, episode step 128\n",
|
|
"INFO:gym:episode 1890, reward -0.002385, avg reward -0.003093, total steps 241920, episode step 128\n",
|
|
"[2018-02-18 15:50:25,033] episode 1890, reward -0.002385, avg reward -0.003093, total steps 241920, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:50:25,034] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002927(0.000000)\n",
|
|
"[2018-02-18 15:50:25,364] Avg reward -0.002927(0.000000)\n",
|
|
"INFO:gym:episode 1891, reward -0.001861, avg reward -0.003094, total steps 242048, episode step 128\n",
|
|
"[2018-02-18 15:50:29,100] episode 1891, reward -0.001861, avg reward -0.003094, total steps 242048, episode step 128\n",
|
|
"INFO:gym:episode 1892, reward -0.001970, avg reward -0.002911, total steps 242176, episode step 128\n",
|
|
"[2018-02-18 15:50:32,943] episode 1892, reward -0.001970, avg reward -0.002911, total steps 242176, episode step 128\n",
|
|
"INFO:gym:episode 1893, reward -0.001739, avg reward -0.002901, total steps 242304, episode step 128\n",
|
|
"[2018-02-18 15:50:36,802] episode 1893, reward -0.001739, avg reward -0.002901, total steps 242304, episode step 128\n",
|
|
"INFO:gym:episode 1894, reward -0.003145, avg reward -0.002915, total steps 242432, episode step 128\n",
|
|
"[2018-02-18 15:50:40,853] episode 1894, reward -0.003145, avg reward -0.002915, total steps 242432, episode step 128\n",
|
|
"INFO:gym:episode 1895, reward -0.003284, avg reward -0.002907, total steps 242560, episode step 128\n",
|
|
"[2018-02-18 15:50:45,056] episode 1895, reward -0.003284, avg reward -0.002907, total steps 242560, episode step 128\n",
|
|
"INFO:gym:episode 1896, reward -0.008538, avg reward -0.002977, total steps 242688, episode step 128\n",
|
|
"[2018-02-18 15:50:49,316] episode 1896, reward -0.008538, avg reward -0.002977, total steps 242688, episode step 128\n",
|
|
"INFO:gym:episode 1897, reward -0.002167, avg reward -0.002871, total steps 242816, episode step 128\n",
|
|
"[2018-02-18 15:50:53,678] episode 1897, reward -0.002167, avg reward -0.002871, total steps 242816, episode step 128\n",
|
|
"INFO:gym:episode 1898, reward -0.005143, avg reward -0.002827, total steps 242944, episode step 128\n",
|
|
"[2018-02-18 15:50:58,009] episode 1898, reward -0.005143, avg reward -0.002827, total steps 242944, episode step 128\n",
|
|
"INFO:gym:episode 1899, reward -0.001761, avg reward -0.002722, total steps 243072, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:51:02,406] episode 1899, reward -0.001761, avg reward -0.002722, total steps 243072, episode step 128\n",
|
|
"INFO:gym:episode 1900, reward -0.002111, avg reward -0.002726, total steps 243200, episode step 128\n",
|
|
"[2018-02-18 15:51:06,889] episode 1900, reward -0.002111, avg reward -0.002726, total steps 243200, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:51:06,892] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001817(0.000000)\n",
|
|
"[2018-02-18 15:51:07,418] Avg reward -0.001817(0.000000)\n",
|
|
"INFO:gym:episode 1901, reward -0.003405, avg reward -0.002646, total steps 243328, episode step 128\n",
|
|
"[2018-02-18 15:51:11,614] episode 1901, reward -0.003405, avg reward -0.002646, total steps 243328, episode step 128\n",
|
|
"INFO:gym:episode 1902, reward -0.006763, avg reward -0.002695, total steps 243456, episode step 128\n",
|
|
"[2018-02-18 15:51:15,454] episode 1902, reward -0.006763, avg reward -0.002695, total steps 243456, episode step 128\n",
|
|
"INFO:gym:episode 1903, reward -0.001908, avg reward -0.002697, total steps 243584, episode step 128\n",
|
|
"[2018-02-18 15:51:19,171] episode 1903, reward -0.001908, avg reward -0.002697, total steps 243584, episode step 128\n",
|
|
"INFO:gym:episode 1904, reward -0.003017, avg reward -0.002690, total steps 243712, episode step 128\n",
|
|
"[2018-02-18 15:51:22,855] episode 1904, reward -0.003017, avg reward -0.002690, total steps 243712, episode step 128\n",
|
|
"INFO:gym:episode 1905, reward -0.003583, avg reward -0.002700, total steps 243840, episode step 128\n",
|
|
"[2018-02-18 15:51:26,467] episode 1905, reward -0.003583, avg reward -0.002700, total steps 243840, episode step 128\n",
|
|
"INFO:gym:episode 1906, reward -0.004737, avg reward -0.002729, total steps 243968, episode step 128\n",
|
|
"[2018-02-18 15:51:30,064] episode 1906, reward -0.004737, avg reward -0.002729, total steps 243968, episode step 128\n",
|
|
"INFO:gym:episode 1907, reward -0.003312, avg reward -0.002744, total steps 244096, episode step 128\n",
|
|
"[2018-02-18 15:51:33,600] episode 1907, reward -0.003312, avg reward -0.002744, total steps 244096, episode step 128\n",
|
|
"INFO:gym:episode 1908, reward -0.001549, avg reward -0.002638, total steps 244224, episode step 128\n",
|
|
"[2018-02-18 15:51:37,130] episode 1908, reward -0.001549, avg reward -0.002638, total steps 244224, episode step 128\n",
|
|
"INFO:gym:episode 1909, reward -0.001758, avg reward -0.002631, total steps 244352, episode step 128\n",
|
|
"[2018-02-18 15:51:40,666] episode 1909, reward -0.001758, avg reward -0.002631, total steps 244352, episode step 128\n",
|
|
"INFO:gym:episode 1910, reward -0.001762, avg reward -0.002633, total steps 244480, episode step 128\n",
|
|
"[2018-02-18 15:51:44,184] episode 1910, reward -0.001762, avg reward -0.002633, total steps 244480, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:51:44,185] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001786(0.000000)\n",
|
|
"[2018-02-18 15:51:44,525] Avg reward -0.001786(0.000000)\n",
|
|
"INFO:gym:episode 1911, reward -0.003073, avg reward -0.002646, total steps 244608, episode step 128\n",
|
|
"[2018-02-18 15:51:48,068] episode 1911, reward -0.003073, avg reward -0.002646, total steps 244608, episode step 128\n",
|
|
"INFO:gym:episode 1912, reward -0.001649, avg reward -0.002644, total steps 244736, episode step 128\n",
|
|
"[2018-02-18 15:51:51,583] episode 1912, reward -0.001649, avg reward -0.002644, total steps 244736, episode step 128\n",
|
|
"INFO:gym:episode 1913, reward -0.002065, avg reward -0.002647, total steps 244864, episode step 128\n",
|
|
"[2018-02-18 15:51:55,141] episode 1913, reward -0.002065, avg reward -0.002647, total steps 244864, episode step 128\n",
|
|
"INFO:gym:episode 1914, reward -0.003931, avg reward -0.002574, total steps 244992, episode step 128\n",
|
|
"[2018-02-18 15:51:58,670] episode 1914, reward -0.003931, avg reward -0.002574, total steps 244992, episode step 128\n",
|
|
"INFO:gym:episode 1915, reward -0.001685, avg reward -0.002484, total steps 245120, episode step 128\n",
|
|
"[2018-02-18 15:52:02,226] episode 1915, reward -0.001685, avg reward -0.002484, total steps 245120, episode step 128\n",
|
|
"INFO:gym:episode 1916, reward -0.001761, avg reward -0.002484, total steps 245248, episode step 128\n",
|
|
"[2018-02-18 15:52:05,781] episode 1916, reward -0.001761, avg reward -0.002484, total steps 245248, episode step 128\n",
|
|
"INFO:gym:episode 1917, reward -0.012656, avg reward -0.002593, total steps 245376, episode step 128\n",
|
|
"[2018-02-18 15:52:09,303] episode 1917, reward -0.012656, avg reward -0.002593, total steps 245376, episode step 128\n",
|
|
"INFO:gym:episode 1918, reward -0.001231, avg reward -0.002588, total steps 245504, episode step 128\n",
|
|
"[2018-02-18 15:52:12,826] episode 1918, reward -0.001231, avg reward -0.002588, total steps 245504, episode step 128\n",
|
|
"INFO:gym:episode 1919, reward -0.001807, avg reward -0.002586, total steps 245632, episode step 128\n",
|
|
"[2018-02-18 15:52:16,346] episode 1919, reward -0.001807, avg reward -0.002586, total steps 245632, episode step 128\n",
|
|
"INFO:gym:episode 1920, reward -0.005217, avg reward -0.002645, total steps 245760, episode step 128\n",
|
|
"[2018-02-18 15:52:19,944] episode 1920, reward -0.005217, avg reward -0.002645, total steps 245760, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:52:19,953] Testing...\n",
|
|
"INFO:gym:Avg reward -0.005900(0.000000)\n",
|
|
"[2018-02-18 15:52:20,297] Avg reward -0.005900(0.000000)\n",
|
|
"INFO:gym:episode 1921, reward -0.001799, avg reward -0.002629, total steps 245888, episode step 128\n",
|
|
"[2018-02-18 15:52:23,875] episode 1921, reward -0.001799, avg reward -0.002629, total steps 245888, episode step 128\n",
|
|
"INFO:gym:episode 1922, reward -0.001747, avg reward -0.002555, total steps 246016, episode step 128\n",
|
|
"[2018-02-18 15:52:27,593] episode 1922, reward -0.001747, avg reward -0.002555, total steps 246016, episode step 128\n",
|
|
"INFO:gym:episode 1923, reward -0.001751, avg reward -0.002554, total steps 246144, episode step 128\n",
|
|
"[2018-02-18 15:52:31,746] episode 1923, reward -0.001751, avg reward -0.002554, total steps 246144, episode step 128\n",
|
|
"INFO:gym:episode 1924, reward 0.007498, avg reward -0.002458, total steps 246272, episode step 128\n",
|
|
"[2018-02-18 15:52:35,721] episode 1924, reward 0.007498, avg reward -0.002458, total steps 246272, episode step 128\n",
|
|
"INFO:gym:episode 1925, reward -0.002265, avg reward -0.002464, total steps 246400, episode step 128\n",
|
|
"[2018-02-18 15:52:39,056] episode 1925, reward -0.002265, avg reward -0.002464, total steps 246400, episode step 128\n",
|
|
"INFO:gym:episode 1926, reward -0.002614, avg reward -0.002476, total steps 246528, episode step 128\n",
|
|
"[2018-02-18 15:52:42,604] episode 1926, reward -0.002614, avg reward -0.002476, total steps 246528, episode step 128\n",
|
|
"INFO:gym:episode 1927, reward -0.002214, avg reward -0.002475, total steps 246656, episode step 128\n",
|
|
"[2018-02-18 15:52:46,415] episode 1927, reward -0.002214, avg reward -0.002475, total steps 246656, episode step 128\n",
|
|
"INFO:gym:episode 1928, reward -0.001766, avg reward -0.002458, total steps 246784, episode step 128\n",
|
|
"[2018-02-18 15:52:50,456] episode 1928, reward -0.001766, avg reward -0.002458, total steps 246784, episode step 128\n",
|
|
"INFO:gym:episode 1929, reward -0.001783, avg reward -0.002391, total steps 246912, episode step 128\n",
|
|
"[2018-02-18 15:52:54,139] episode 1929, reward -0.001783, avg reward -0.002391, total steps 246912, episode step 128\n",
|
|
"INFO:gym:episode 1930, reward -0.001813, avg reward -0.002392, total steps 247040, episode step 128\n",
|
|
"[2018-02-18 15:52:57,665] episode 1930, reward -0.001813, avg reward -0.002392, total steps 247040, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:52:57,666] Testing...\n",
|
|
"INFO:gym:Avg reward -0.002857(0.000000)\n",
|
|
"[2018-02-18 15:52:58,016] Avg reward -0.002857(0.000000)\n",
|
|
"INFO:gym:episode 1931, reward -0.002896, avg reward -0.002335, total steps 247168, episode step 128\n",
|
|
"[2018-02-18 15:53:01,794] episode 1931, reward -0.002896, avg reward -0.002335, total steps 247168, episode step 128\n",
|
|
"INFO:gym:episode 1932, reward -0.000609, avg reward -0.002298, total steps 247296, episode step 128\n",
|
|
"[2018-02-18 15:53:05,350] episode 1932, reward -0.000609, avg reward -0.002298, total steps 247296, episode step 128\n",
|
|
"INFO:gym:episode 1933, reward -0.001758, avg reward -0.002298, total steps 247424, episode step 128\n",
|
|
"[2018-02-18 15:53:08,661] episode 1933, reward -0.001758, avg reward -0.002298, total steps 247424, episode step 128\n",
|
|
"INFO:gym:episode 1934, reward -0.001650, avg reward -0.002250, total steps 247552, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:53:11,723] episode 1934, reward -0.001650, avg reward -0.002250, total steps 247552, episode step 128\n",
|
|
"INFO:gym:episode 1935, reward -0.005776, avg reward -0.002288, total steps 247680, episode step 128\n",
|
|
"[2018-02-18 15:53:15,017] episode 1935, reward -0.005776, avg reward -0.002288, total steps 247680, episode step 128\n",
|
|
"INFO:gym:episode 1936, reward -0.001783, avg reward -0.002288, total steps 247808, episode step 128\n",
|
|
"[2018-02-18 15:53:18,858] episode 1936, reward -0.001783, avg reward -0.002288, total steps 247808, episode step 128\n",
|
|
"INFO:gym:episode 1937, reward -0.001756, avg reward -0.002327, total steps 247936, episode step 128\n",
|
|
"[2018-02-18 15:53:22,743] episode 1937, reward -0.001756, avg reward -0.002327, total steps 247936, episode step 128\n",
|
|
"INFO:gym:episode 1938, reward -0.003362, avg reward -0.002343, total steps 248064, episode step 128\n",
|
|
"[2018-02-18 15:53:26,703] episode 1938, reward -0.003362, avg reward -0.002343, total steps 248064, episode step 128\n",
|
|
"INFO:gym:episode 1939, reward -0.002725, avg reward -0.002353, total steps 248192, episode step 128\n",
|
|
"[2018-02-18 15:53:30,671] episode 1939, reward -0.002725, avg reward -0.002353, total steps 248192, episode step 128\n",
|
|
"INFO:gym:episode 1940, reward -0.000946, avg reward -0.002323, total steps 248320, episode step 128\n",
|
|
"[2018-02-18 15:53:34,340] episode 1940, reward -0.000946, avg reward -0.002323, total steps 248320, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:53:34,341] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001764(0.000000)\n",
|
|
"[2018-02-18 15:53:34,675] Avg reward -0.001764(0.000000)\n",
|
|
"INFO:gym:episode 1941, reward -0.001764, avg reward -0.002295, total steps 248448, episode step 128\n",
|
|
"[2018-02-18 15:53:38,279] episode 1941, reward -0.001764, avg reward -0.002295, total steps 248448, episode step 128\n",
|
|
"INFO:gym:episode 1942, reward -0.002046, avg reward -0.002278, total steps 248576, episode step 128\n",
|
|
"[2018-02-18 15:53:41,830] episode 1942, reward -0.002046, avg reward -0.002278, total steps 248576, episode step 128\n",
|
|
"INFO:gym:episode 1943, reward -0.017247, avg reward -0.002466, total steps 248704, episode step 128\n",
|
|
"[2018-02-18 15:53:45,412] episode 1943, reward -0.017247, avg reward -0.002466, total steps 248704, episode step 128\n",
|
|
"INFO:gym:episode 1944, reward -0.001759, avg reward -0.002457, total steps 248832, episode step 128\n",
|
|
"[2018-02-18 15:53:49,155] episode 1944, reward -0.001759, avg reward -0.002457, total steps 248832, episode step 128\n",
|
|
"INFO:gym:episode 1945, reward -0.001757, avg reward -0.002453, total steps 248960, episode step 128\n",
|
|
"[2018-02-18 15:53:53,143] episode 1945, reward -0.001757, avg reward -0.002453, total steps 248960, episode step 128\n",
|
|
"INFO:gym:episode 1946, reward -0.002200, avg reward -0.002458, total steps 249088, episode step 128\n",
|
|
"[2018-02-18 15:53:57,204] episode 1946, reward -0.002200, avg reward -0.002458, total steps 249088, episode step 128\n",
|
|
"INFO:gym:episode 1947, reward -0.001627, avg reward -0.002525, total steps 249216, episode step 128\n",
|
|
"[2018-02-18 15:54:01,735] episode 1947, reward -0.001627, avg reward -0.002525, total steps 249216, episode step 128\n",
|
|
"INFO:gym:episode 1948, reward -0.007235, avg reward -0.002580, total steps 249344, episode step 128\n",
|
|
"[2018-02-18 15:54:05,439] episode 1948, reward -0.007235, avg reward -0.002580, total steps 249344, episode step 128\n",
|
|
"INFO:gym:episode 1949, reward -0.001728, avg reward -0.002580, total steps 249472, episode step 128\n",
|
|
"[2018-02-18 15:54:07,509] episode 1949, reward -0.001728, avg reward -0.002580, total steps 249472, episode step 128\n",
|
|
"INFO:gym:episode 1950, reward -0.001758, avg reward -0.002559, total steps 249600, episode step 128\n",
|
|
"[2018-02-18 15:54:09,345] episode 1950, reward -0.001758, avg reward -0.002559, total steps 249600, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:54:09,346] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001824(0.000000)\n",
|
|
"[2018-02-18 15:54:09,709] Avg reward -0.001824(0.000000)\n",
|
|
"INFO:gym:episode 1951, reward -0.001756, avg reward -0.002515, total steps 249728, episode step 128\n",
|
|
"[2018-02-18 15:54:11,545] episode 1951, reward -0.001756, avg reward -0.002515, total steps 249728, episode step 128\n",
|
|
"INFO:gym:episode 1952, reward -0.001758, avg reward -0.002471, total steps 249856, episode step 128\n",
|
|
"[2018-02-18 15:54:13,396] episode 1952, reward -0.001758, avg reward -0.002471, total steps 249856, episode step 128\n",
|
|
"INFO:gym:episode 1953, reward -0.001816, avg reward -0.002471, total steps 249984, episode step 128\n",
|
|
"[2018-02-18 15:54:15,210] episode 1953, reward -0.001816, avg reward -0.002471, total steps 249984, episode step 128\n",
|
|
"INFO:gym:episode 1954, reward -0.004562, avg reward -0.002497, total steps 250112, episode step 128\n",
|
|
"[2018-02-18 15:54:17,021] episode 1954, reward -0.004562, avg reward -0.002497, total steps 250112, episode step 128\n",
|
|
"INFO:gym:episode 1955, reward -0.001812, avg reward -0.002482, total steps 250240, episode step 128\n",
|
|
"[2018-02-18 15:54:18,783] episode 1955, reward -0.001812, avg reward -0.002482, total steps 250240, episode step 128\n",
|
|
"INFO:gym:episode 1956, reward -0.001887, avg reward -0.002482, total steps 250368, episode step 128\n",
|
|
"[2018-02-18 15:54:20,573] episode 1956, reward -0.001887, avg reward -0.002482, total steps 250368, episode step 128\n",
|
|
"INFO:gym:episode 1957, reward -0.006762, avg reward -0.002527, total steps 250496, episode step 128\n",
|
|
"[2018-02-18 15:54:22,316] episode 1957, reward -0.006762, avg reward -0.002527, total steps 250496, episode step 128\n",
|
|
"INFO:gym:episode 1958, reward -0.002011, avg reward -0.002557, total steps 250624, episode step 128\n",
|
|
"[2018-02-18 15:54:24,086] episode 1958, reward -0.002011, avg reward -0.002557, total steps 250624, episode step 128\n",
|
|
"INFO:gym:episode 1959, reward -0.003291, avg reward -0.002572, total steps 250752, episode step 128\n",
|
|
"[2018-02-18 15:54:25,884] episode 1959, reward -0.003291, avg reward -0.002572, total steps 250752, episode step 128\n",
|
|
"INFO:gym:episode 1960, reward -0.014930, avg reward -0.002705, total steps 250880, episode step 128\n",
|
|
"[2018-02-18 15:54:27,625] episode 1960, reward -0.014930, avg reward -0.002705, total steps 250880, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:54:27,635] Testing...\n",
|
|
"INFO:gym:Avg reward -0.003897(0.000000)\n",
|
|
"[2018-02-18 15:54:27,965] Avg reward -0.003897(0.000000)\n",
|
|
"INFO:gym:episode 1961, reward -0.001761, avg reward -0.002702, total steps 251008, episode step 128\n",
|
|
"[2018-02-18 15:54:29,778] episode 1961, reward -0.001761, avg reward -0.002702, total steps 251008, episode step 128\n",
|
|
"INFO:gym:episode 1962, reward -0.002745, avg reward -0.002708, total steps 251136, episode step 128\n",
|
|
"[2018-02-18 15:54:31,634] episode 1962, reward -0.002745, avg reward -0.002708, total steps 251136, episode step 128\n",
|
|
"INFO:gym:episode 1963, reward 0.000059, avg reward -0.002699, total steps 251264, episode step 128\n",
|
|
"[2018-02-18 15:54:33,475] episode 1963, reward 0.000059, avg reward -0.002699, total steps 251264, episode step 128\n",
|
|
"INFO:gym:episode 1964, reward -0.001765, avg reward -0.002688, total steps 251392, episode step 128\n",
|
|
"[2018-02-18 15:54:35,299] episode 1964, reward -0.001765, avg reward -0.002688, total steps 251392, episode step 128\n",
|
|
"INFO:gym:episode 1965, reward -0.002038, avg reward -0.002675, total steps 251520, episode step 128\n",
|
|
"[2018-02-18 15:54:37,104] episode 1965, reward -0.002038, avg reward -0.002675, total steps 251520, episode step 128\n",
|
|
"INFO:gym:episode 1966, reward -0.002075, avg reward -0.002732, total steps 251648, episode step 128\n",
|
|
"[2018-02-18 15:54:38,921] episode 1966, reward -0.002075, avg reward -0.002732, total steps 251648, episode step 128\n",
|
|
"INFO:gym:episode 1967, reward -0.010110, avg reward -0.003066, total steps 251776, episode step 128\n",
|
|
"[2018-02-18 15:54:40,811] episode 1967, reward -0.010110, avg reward -0.003066, total steps 251776, episode step 128\n",
|
|
"INFO:gym:episode 1968, reward -0.011376, avg reward -0.003160, total steps 251904, episode step 128\n",
|
|
"[2018-02-18 15:54:42,805] episode 1968, reward -0.011376, avg reward -0.003160, total steps 251904, episode step 128\n",
|
|
"INFO:gym:episode 1969, reward -0.006848, avg reward -0.003211, total steps 252032, episode step 128\n",
|
|
"[2018-02-18 15:54:44,643] episode 1969, reward -0.006848, avg reward -0.003211, total steps 252032, episode step 128\n",
|
|
"INFO:gym:episode 1970, reward -0.001946, avg reward -0.003214, total steps 252160, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[2018-02-18 15:54:46,504] episode 1970, reward -0.001946, avg reward -0.003214, total steps 252160, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:54:46,505] Testing...\n",
|
|
"INFO:gym:Avg reward -0.001074(0.000000)\n",
|
|
"[2018-02-18 15:54:46,838] Avg reward -0.001074(0.000000)\n",
|
|
"INFO:gym:episode 1971, reward -0.001850, avg reward -0.003215, total steps 252288, episode step 128\n",
|
|
"[2018-02-18 15:54:48,612] episode 1971, reward -0.001850, avg reward -0.003215, total steps 252288, episode step 128\n",
|
|
"INFO:gym:episode 1972, reward -0.001762, avg reward -0.003214, total steps 252416, episode step 128\n",
|
|
"[2018-02-18 15:54:50,441] episode 1972, reward -0.001762, avg reward -0.003214, total steps 252416, episode step 128\n",
|
|
"INFO:gym:episode 1973, reward -0.001757, avg reward -0.003220, total steps 252544, episode step 128\n",
|
|
"[2018-02-18 15:54:52,317] episode 1973, reward -0.001757, avg reward -0.003220, total steps 252544, episode step 128\n",
|
|
"INFO:gym:episode 1974, reward -0.016900, avg reward -0.003372, total steps 252672, episode step 128\n",
|
|
"[2018-02-18 15:54:54,247] episode 1974, reward -0.016900, avg reward -0.003372, total steps 252672, episode step 128\n",
|
|
"INFO:gym:episode 1975, reward -0.001754, avg reward -0.003365, total steps 252800, episode step 128\n",
|
|
"[2018-02-18 15:54:56,459] episode 1975, reward -0.001754, avg reward -0.003365, total steps 252800, episode step 128\n",
|
|
"INFO:gym:episode 1976, reward -0.001750, avg reward -0.003338, total steps 252928, episode step 128\n",
|
|
"[2018-02-18 15:54:58,920] episode 1976, reward -0.001750, avg reward -0.003338, total steps 252928, episode step 128\n",
|
|
"INFO:gym:episode 1977, reward -0.001933, avg reward -0.003345, total steps 253056, episode step 128\n",
|
|
"[2018-02-18 15:55:01,501] episode 1977, reward -0.001933, avg reward -0.003345, total steps 253056, episode step 128\n",
|
|
"INFO:gym:episode 1978, reward -0.009300, avg reward -0.003420, total steps 253184, episode step 128\n",
|
|
"[2018-02-18 15:55:04,069] episode 1978, reward -0.009300, avg reward -0.003420, total steps 253184, episode step 128\n",
|
|
"INFO:gym:episode 1979, reward -0.002713, avg reward -0.003430, total steps 253312, episode step 128\n",
|
|
"[2018-02-18 15:55:06,699] episode 1979, reward -0.002713, avg reward -0.003430, total steps 253312, episode step 128\n",
|
|
"INFO:gym:episode 1980, reward -0.003400, avg reward -0.003426, total steps 253440, episode step 128\n",
|
|
"[2018-02-18 15:55:09,415] episode 1980, reward -0.003400, avg reward -0.003426, total steps 253440, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:55:09,419] Testing...\n",
|
|
"INFO:gym:Avg reward -0.007340(0.000000)\n",
|
|
"[2018-02-18 15:55:09,742] Avg reward -0.007340(0.000000)\n",
|
|
"INFO:gym:episode 1981, reward -0.002724, avg reward -0.003408, total steps 253568, episode step 128\n",
|
|
"[2018-02-18 15:55:12,398] episode 1981, reward -0.002724, avg reward -0.003408, total steps 253568, episode step 128\n",
|
|
"INFO:gym:episode 1982, reward -0.001556, avg reward -0.003383, total steps 253696, episode step 128\n",
|
|
"[2018-02-18 15:55:15,176] episode 1982, reward -0.001556, avg reward -0.003383, total steps 253696, episode step 128\n",
|
|
"INFO:gym:episode 1983, reward -0.001865, avg reward -0.003377, total steps 253824, episode step 128\n",
|
|
"[2018-02-18 15:55:18,370] episode 1983, reward -0.001865, avg reward -0.003377, total steps 253824, episode step 128\n",
|
|
"INFO:gym:episode 1984, reward -0.023191, avg reward -0.003533, total steps 253952, episode step 128\n",
|
|
"[2018-02-18 15:55:21,852] episode 1984, reward -0.023191, avg reward -0.003533, total steps 253952, episode step 128\n",
|
|
"INFO:gym:episode 1985, reward -0.000750, avg reward -0.003475, total steps 254080, episode step 128\n",
|
|
"[2018-02-18 15:55:25,653] episode 1985, reward -0.000750, avg reward -0.003475, total steps 254080, episode step 128\n",
|
|
"INFO:gym:episode 1986, reward -0.002097, avg reward -0.003392, total steps 254208, episode step 128\n",
|
|
"[2018-02-18 15:55:29,613] episode 1986, reward -0.002097, avg reward -0.003392, total steps 254208, episode step 128\n",
|
|
"INFO:gym:episode 1987, reward -0.007798, avg reward -0.003452, total steps 254336, episode step 128\n",
|
|
"[2018-02-18 15:55:33,522] episode 1987, reward -0.007798, avg reward -0.003452, total steps 254336, episode step 128\n",
|
|
"INFO:gym:episode 1988, reward -0.003364, avg reward -0.003431, total steps 254464, episode step 128\n",
|
|
"[2018-02-18 15:55:37,340] episode 1988, reward -0.003364, avg reward -0.003431, total steps 254464, episode step 128\n",
|
|
"INFO:gym:episode 1989, reward -0.001755, avg reward -0.003430, total steps 254592, episode step 128\n",
|
|
"[2018-02-18 15:55:40,939] episode 1989, reward -0.001755, avg reward -0.003430, total steps 254592, episode step 128\n",
|
|
"INFO:gym:episode 1990, reward -0.001901, avg reward -0.003425, total steps 254720, episode step 128\n",
|
|
"[2018-02-18 15:55:44,474] episode 1990, reward -0.001901, avg reward -0.003425, total steps 254720, episode step 128\n",
|
|
"INFO:gym:Testing...\n",
|
|
"[2018-02-18 15:55:44,475] Testing...\n",
|
|
"INFO:gym:Avg reward -0.007075(0.000000)\n",
|
|
"[2018-02-18 15:55:44,804] Avg reward -0.007075(0.000000)\n",
|
|
"INFO:gym:episode 1991, reward -0.003617, avg reward -0.003443, total steps 254848, episode step 128\n",
|
|
"[2018-02-18 15:55:48,821] episode 1991, reward -0.003617, avg reward -0.003443, total steps 254848, episode step 128\n",
|
|
"INFO:gym:episode 1992, reward -0.002410, avg reward -0.003447, total steps 254976, episode step 128\n",
|
|
"[2018-02-18 15:55:52,583] episode 1992, reward -0.002410, avg reward -0.003447, total steps 254976, episode step 128\n",
|
|
"INFO:gym:episode 1993, reward -0.001713, avg reward -0.003447, total steps 255104, episode step 128\n",
|
|
"[2018-02-18 15:55:56,609] episode 1993, reward -0.001713, avg reward -0.003447, total steps 255104, episode step 128\n",
|
|
"INFO:gym:episode 1994, reward -0.003316, avg reward -0.003449, total steps 255232, episode step 128\n",
|
|
"[2018-02-18 15:56:00,570] episode 1994, reward -0.003316, avg reward -0.003449, total steps 255232, episode step 128\n",
|
|
"INFO:gym:episode 1995, reward 0.003917, avg reward -0.003377, total steps 255360, episode step 128\n",
|
|
"[2018-02-18 15:56:04,935] episode 1995, reward 0.003917, avg reward -0.003377, total steps 255360, episode step 128\n",
|
|
"INFO:gym:episode 1996, reward -0.007876, avg reward -0.003370, total steps 255488, episode step 128\n",
|
|
"[2018-02-18 15:56:08,929] episode 1996, reward -0.007876, avg reward -0.003370, total steps 255488, episode step 128\n",
|
|
"INFO:gym:episode 1997, reward 0.003828, avg reward -0.003310, total steps 255616, episode step 128\n",
|
|
"[2018-02-18 15:56:12,827] episode 1997, reward 0.003828, avg reward -0.003310, total steps 255616, episode step 128\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"data/DDPGAgent-ddpg-20180218_06-06-08-model-PortfolioEnv.bin\n"
|
|
]
|
|
},
|
|
{
|
|
"ename": "KeyboardInterrupt",
|
|
"evalue": "",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
|
|
"\u001b[0;32m<ipython-input-16-f1acf6bc6501>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0msave_ddpg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0magent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mraise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
|
"\u001b[0;32m<ipython-input-16-f1acf6bc6501>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0magent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtask\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_plot\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0magent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtask\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_plot2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mrun_episodes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0magent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0msave_ddpg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0magent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/media/oldhome/wassname/Documents/projects/rl-portfolio-gh/rl-portfolio-management-gh/DeepRL/utils/misc.py\u001b[0m in \u001b[0;36mrun_episodes\u001b[0;34m(agent)\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0mep\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 22\u001b[0;31m \u001b[0mreward\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstep\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0magent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mepisode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 23\u001b[0m \u001b[0mrewards\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreward\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0msteps\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m<ipython-input-11-d6d5b6125f0a>\u001b[0m in \u001b[0;36mepisode\u001b[0;34m(self, deterministic, video_recorder)\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0mcritic\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzero_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 92\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcritic_opt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzero_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 93\u001b[0;31m \u001b[0mcritic_loss\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 94\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mconfig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgradient_clip\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 95\u001b[0m \u001b[0mgrad_critic\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclip_grad_norm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mworker_network\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparameters\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgradient_clip\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m~/.pyenv/versions/3.5.3/envs/jupyter3/lib/python3.5/site-packages/torch/autograd/variable.py\u001b[0m in \u001b[0;36mbackward\u001b[0;34m(self, gradient, retain_graph, create_graph, retain_variables)\u001b[0m\n\u001b[1;32m 165\u001b[0m \u001b[0mVariable\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 166\u001b[0m \"\"\"\n\u001b[0;32m--> 167\u001b[0;31m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mautograd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgradient\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mretain_graph\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcreate_graph\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mretain_variables\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 168\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 169\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mregister_hook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m~/.pyenv/versions/3.5.3/envs/jupyter3/lib/python3.5/site-packages/torch/autograd/__init__.py\u001b[0m in \u001b[0;36mbackward\u001b[0;34m(variables, grad_variables, retain_graph, create_graph, retain_variables)\u001b[0m\n\u001b[1;32m 97\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 98\u001b[0m Variable._execution_engine.run_backward(\n\u001b[0;32m---> 99\u001b[0;31m variables, grad_variables, retain_graph)\n\u001b[0m\u001b[1;32m 100\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 101\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"from main import run_episodes\n",
|
|
"agent.task._plot = agent.task._plot2 = None\n",
|
|
"try: \n",
|
|
" run_episodes(agent)\n",
|
|
"except KeyboardInterrupt as e:\n",
|
|
" save_ddpg(agent)\n",
|
|
" raise(e)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# History"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 17,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T07:56:16.462355Z",
|
|
"start_time": "2018-02-18T07:56:16.094057Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"application/javascript": [
|
|
"/* Put everything inside the global mpl namespace */\n",
|
|
"window.mpl = {};\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.get_websocket_type = function() {\n",
|
|
" if (typeof(WebSocket) !== 'undefined') {\n",
|
|
" return WebSocket;\n",
|
|
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
|
" return MozWebSocket;\n",
|
|
" } else {\n",
|
|
" alert('Your browser does not have WebSocket support.' +\n",
|
|
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
|
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
|
" 'have to enable WebSockets in about:config.');\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
|
" this.id = figure_id;\n",
|
|
"\n",
|
|
" this.ws = websocket;\n",
|
|
"\n",
|
|
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
|
"\n",
|
|
" if (!this.supports_binary) {\n",
|
|
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
|
" if (warnings) {\n",
|
|
" warnings.style.display = 'block';\n",
|
|
" warnings.textContent = (\n",
|
|
" \"This browser does not support binary websocket messages. \" +\n",
|
|
" \"Performance may be slow.\");\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj = new Image();\n",
|
|
"\n",
|
|
" this.context = undefined;\n",
|
|
" this.message = undefined;\n",
|
|
" this.canvas = undefined;\n",
|
|
" this.rubberband_canvas = undefined;\n",
|
|
" this.rubberband_context = undefined;\n",
|
|
" this.format_dropdown = undefined;\n",
|
|
"\n",
|
|
" this.image_mode = 'full';\n",
|
|
"\n",
|
|
" this.root = $('<div/>');\n",
|
|
" this._root_extra_style(this.root)\n",
|
|
" this.root.attr('style', 'display: inline-block');\n",
|
|
"\n",
|
|
" $(parent_element).append(this.root);\n",
|
|
"\n",
|
|
" this._init_header(this);\n",
|
|
" this._init_canvas(this);\n",
|
|
" this._init_toolbar(this);\n",
|
|
"\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" this.waiting = false;\n",
|
|
"\n",
|
|
" this.ws.onopen = function () {\n",
|
|
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
|
" fig.send_message(\"send_image_mode\", {});\n",
|
|
" if (mpl.ratio != 1) {\n",
|
|
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
|
" }\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj.onload = function() {\n",
|
|
" if (fig.image_mode == 'full') {\n",
|
|
" // Full images could contain transparency (where diff images\n",
|
|
" // almost always do), so we need to clear the canvas so that\n",
|
|
" // there is no ghosting.\n",
|
|
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
" }\n",
|
|
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
|
" };\n",
|
|
"\n",
|
|
" this.imageObj.onunload = function() {\n",
|
|
" fig.ws.close();\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
|
"\n",
|
|
" this.ondownload = ondownload;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_header = function() {\n",
|
|
" var titlebar = $(\n",
|
|
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
|
" 'ui-helper-clearfix\"/>');\n",
|
|
" var titletext = $(\n",
|
|
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
|
" 'text-align: center; padding: 3px;\"/>');\n",
|
|
" titlebar.append(titletext)\n",
|
|
" this.root.append(titlebar);\n",
|
|
" this.header = titletext[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_canvas = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var canvas_div = $('<div/>');\n",
|
|
"\n",
|
|
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
|
"\n",
|
|
" function canvas_keyboard_event(event) {\n",
|
|
" return fig.key_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
|
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
|
" this.canvas_div = canvas_div\n",
|
|
" this._canvas_extra_style(canvas_div)\n",
|
|
" this.root.append(canvas_div);\n",
|
|
"\n",
|
|
" var canvas = $('<canvas/>');\n",
|
|
" canvas.addClass('mpl-canvas');\n",
|
|
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
|
"\n",
|
|
" this.canvas = canvas[0];\n",
|
|
" this.context = canvas[0].getContext(\"2d\");\n",
|
|
"\n",
|
|
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
|
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
|
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
|
"\tthis.context.msBackingStorePixelRatio ||\n",
|
|
"\tthis.context.oBackingStorePixelRatio ||\n",
|
|
"\tthis.context.backingStorePixelRatio || 1;\n",
|
|
"\n",
|
|
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
|
"\n",
|
|
" var rubberband = $('<canvas/>');\n",
|
|
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
|
"\n",
|
|
" var pass_mouse_events = true;\n",
|
|
"\n",
|
|
" canvas_div.resizable({\n",
|
|
" start: function(event, ui) {\n",
|
|
" pass_mouse_events = false;\n",
|
|
" },\n",
|
|
" resize: function(event, ui) {\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" stop: function(event, ui) {\n",
|
|
" pass_mouse_events = true;\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" });\n",
|
|
"\n",
|
|
" function mouse_event_fn(event) {\n",
|
|
" if (pass_mouse_events)\n",
|
|
" return fig.mouse_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
|
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
|
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
|
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
|
"\n",
|
|
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
|
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
|
"\n",
|
|
" canvas_div.on(\"wheel\", function (event) {\n",
|
|
" event = event.originalEvent;\n",
|
|
" event['data'] = 'scroll'\n",
|
|
" if (event.deltaY < 0) {\n",
|
|
" event.step = 1;\n",
|
|
" } else {\n",
|
|
" event.step = -1;\n",
|
|
" }\n",
|
|
" mouse_event_fn(event);\n",
|
|
" });\n",
|
|
"\n",
|
|
" canvas_div.append(canvas);\n",
|
|
" canvas_div.append(rubberband);\n",
|
|
"\n",
|
|
" this.rubberband = rubberband;\n",
|
|
" this.rubberband_canvas = rubberband[0];\n",
|
|
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
|
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
|
"\n",
|
|
" this._resize_canvas = function(width, height) {\n",
|
|
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
|
" // canvas in synch.\n",
|
|
" canvas_div.css('width', width)\n",
|
|
" canvas_div.css('height', height)\n",
|
|
"\n",
|
|
" canvas.attr('width', width * mpl.ratio);\n",
|
|
" canvas.attr('height', height * mpl.ratio);\n",
|
|
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
|
"\n",
|
|
" rubberband.attr('width', width);\n",
|
|
" rubberband.attr('height', height);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
|
" // upon first draw.\n",
|
|
" this._resize_canvas(600, 600);\n",
|
|
"\n",
|
|
" // Disable right mouse context menu.\n",
|
|
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
|
" return false;\n",
|
|
" });\n",
|
|
"\n",
|
|
" function set_focus () {\n",
|
|
" canvas.focus();\n",
|
|
" canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" window.setTimeout(set_focus, 100);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>')\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) {\n",
|
|
" // put a spacer in here.\n",
|
|
" continue;\n",
|
|
" }\n",
|
|
" var button = $('<button/>');\n",
|
|
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
|
" 'ui-button-icon-only');\n",
|
|
" button.attr('role', 'button');\n",
|
|
" button.attr('aria-disabled', 'false');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
"\n",
|
|
" var icon_img = $('<span/>');\n",
|
|
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
|
" icon_img.addClass(image);\n",
|
|
" icon_img.addClass('ui-corner-all');\n",
|
|
"\n",
|
|
" var tooltip_span = $('<span/>');\n",
|
|
" tooltip_span.addClass('ui-button-text');\n",
|
|
" tooltip_span.html(tooltip);\n",
|
|
"\n",
|
|
" button.append(icon_img);\n",
|
|
" button.append(tooltip_span);\n",
|
|
"\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fmt_picker_span = $('<span/>');\n",
|
|
"\n",
|
|
" var fmt_picker = $('<select/>');\n",
|
|
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
|
" fmt_picker_span.append(fmt_picker);\n",
|
|
" nav_element.append(fmt_picker_span);\n",
|
|
" this.format_dropdown = fmt_picker[0];\n",
|
|
"\n",
|
|
" for (var ind in mpl.extensions) {\n",
|
|
" var fmt = mpl.extensions[ind];\n",
|
|
" var option = $(\n",
|
|
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
|
" fmt_picker.append(option)\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add hover states to the ui-buttons\n",
|
|
" $( \".ui-button\" ).hover(\n",
|
|
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
|
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
|
" );\n",
|
|
"\n",
|
|
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
|
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
|
" // which will in turn request a refresh of the image.\n",
|
|
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
|
" properties['type'] = type;\n",
|
|
" properties['figure_id'] = this.id;\n",
|
|
" this.ws.send(JSON.stringify(properties));\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_draw_message = function() {\n",
|
|
" if (!this.waiting) {\n",
|
|
" this.waiting = true;\n",
|
|
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" var format_dropdown = fig.format_dropdown;\n",
|
|
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
|
" fig.ondownload(fig, format);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
|
" var size = msg['size'];\n",
|
|
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
|
" fig._resize_canvas(size[0], size[1]);\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
|
" var x0 = msg['x0'] / mpl.ratio;\n",
|
|
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
|
" var x1 = msg['x1'] / mpl.ratio;\n",
|
|
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
|
" x0 = Math.floor(x0) + 0.5;\n",
|
|
" y0 = Math.floor(y0) + 0.5;\n",
|
|
" x1 = Math.floor(x1) + 0.5;\n",
|
|
" y1 = Math.floor(y1) + 0.5;\n",
|
|
" var min_x = Math.min(x0, x1);\n",
|
|
" var min_y = Math.min(y0, y1);\n",
|
|
" var width = Math.abs(x1 - x0);\n",
|
|
" var height = Math.abs(y1 - y0);\n",
|
|
"\n",
|
|
" fig.rubberband_context.clearRect(\n",
|
|
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
"\n",
|
|
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
|
" // Updates the figure title.\n",
|
|
" fig.header.textContent = msg['label'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
|
" var cursor = msg['cursor'];\n",
|
|
" switch(cursor)\n",
|
|
" {\n",
|
|
" case 0:\n",
|
|
" cursor = 'pointer';\n",
|
|
" break;\n",
|
|
" case 1:\n",
|
|
" cursor = 'default';\n",
|
|
" break;\n",
|
|
" case 2:\n",
|
|
" cursor = 'crosshair';\n",
|
|
" break;\n",
|
|
" case 3:\n",
|
|
" cursor = 'move';\n",
|
|
" break;\n",
|
|
" }\n",
|
|
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
|
" fig.message.textContent = msg['message'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
|
" // Request the server to send over a new figure.\n",
|
|
" fig.send_draw_message();\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
|
" fig.image_mode = msg['mode'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Called whenever the canvas gets updated.\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"// A function to construct a web socket function for onmessage handling.\n",
|
|
"// Called in the figure constructor.\n",
|
|
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
|
" return function socket_on_message(evt) {\n",
|
|
" if (evt.data instanceof Blob) {\n",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = \"image/png\";\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data);\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
|
" fig.imageObj.src = evt.data;\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var msg = JSON.parse(evt.data);\n",
|
|
" var msg_type = msg['type'];\n",
|
|
"\n",
|
|
" // Call the \"handle_{type}\" callback, which takes\n",
|
|
" // the figure and JSON message as its only arguments.\n",
|
|
" try {\n",
|
|
" var callback = fig[\"handle_\" + msg_type];\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (callback) {\n",
|
|
" try {\n",
|
|
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
|
" callback(fig, msg);\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
|
" }\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
|
"mpl.findpos = function(e) {\n",
|
|
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
|
" var targ;\n",
|
|
" if (!e)\n",
|
|
" e = window.event;\n",
|
|
" if (e.target)\n",
|
|
" targ = e.target;\n",
|
|
" else if (e.srcElement)\n",
|
|
" targ = e.srcElement;\n",
|
|
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
|
" targ = targ.parentNode;\n",
|
|
"\n",
|
|
" // jQuery normalizes the pageX and pageY\n",
|
|
" // pageX,Y are the mouse positions relative to the document\n",
|
|
" // offset() returns the position of the element relative to the document\n",
|
|
" var x = e.pageX - $(targ).offset().left;\n",
|
|
" var y = e.pageY - $(targ).offset().top;\n",
|
|
"\n",
|
|
" return {\"x\": x, \"y\": y};\n",
|
|
"};\n",
|
|
"\n",
|
|
"/*\n",
|
|
" * return a copy of an object with only non-object keys\n",
|
|
" * we need this to avoid circular references\n",
|
|
" * http://stackoverflow.com/a/24161582/3208463\n",
|
|
" */\n",
|
|
"function simpleKeys (original) {\n",
|
|
" return Object.keys(original).reduce(function (obj, key) {\n",
|
|
" if (typeof original[key] !== 'object')\n",
|
|
" obj[key] = original[key]\n",
|
|
" return obj;\n",
|
|
" }, {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
|
" var canvas_pos = mpl.findpos(event)\n",
|
|
"\n",
|
|
" if (name === 'button_press')\n",
|
|
" {\n",
|
|
" this.canvas.focus();\n",
|
|
" this.canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" var x = canvas_pos.x * mpl.ratio;\n",
|
|
" var y = canvas_pos.y * mpl.ratio;\n",
|
|
"\n",
|
|
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
|
" step: event.step,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
"\n",
|
|
" /* This prevents the web browser from automatically changing to\n",
|
|
" * the text insertion cursor when the button is pressed. We want\n",
|
|
" * to control all of the cursor setting manually through the\n",
|
|
" * 'cursor' event from matplotlib */\n",
|
|
" event.preventDefault();\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" // Handle any extra behaviour associated with a key event\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
|
"\n",
|
|
" // Prevent repeat events\n",
|
|
" if (name == 'key_press')\n",
|
|
" {\n",
|
|
" if (event.which === this._key)\n",
|
|
" return;\n",
|
|
" else\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" if (name == 'key_release')\n",
|
|
" this._key = null;\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which != 17)\n",
|
|
" value += \"ctrl+\";\n",
|
|
" if (event.altKey && event.which != 18)\n",
|
|
" value += \"alt+\";\n",
|
|
" if (event.shiftKey && event.which != 16)\n",
|
|
" value += \"shift+\";\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, {key: value,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
|
" if (name == 'download') {\n",
|
|
" this.handle_save(this, null);\n",
|
|
" } else {\n",
|
|
" this.send_message(\"toolbar_button\", {name: name});\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
|
" this.message.textContent = tooltip;\n",
|
|
"};\n",
|
|
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
|
"\n",
|
|
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
|
"\n",
|
|
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
|
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
|
" // object with the appropriate methods. Currently this is a non binary\n",
|
|
" // socket, so there is still some room for performance tuning.\n",
|
|
" var ws = {};\n",
|
|
"\n",
|
|
" ws.close = function() {\n",
|
|
" comm.close()\n",
|
|
" };\n",
|
|
" ws.send = function(m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function(msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data'])\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = $(\"#\" + id);\n",
|
|
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
|
"\n",
|
|
" function ondownload(figure, format) {\n",
|
|
" window.open(figure.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fig = new mpl.figure(id, ws_proxy,\n",
|
|
" ondownload,\n",
|
|
" element.get(0));\n",
|
|
"\n",
|
|
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
|
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
|
" ws_proxy.onopen();\n",
|
|
"\n",
|
|
" fig.parent_element = element.get(0);\n",
|
|
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
|
" if (!fig.cell_info) {\n",
|
|
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var output_index = fig.cell_info[2]\n",
|
|
" var cell = fig.cell_info[0];\n",
|
|
"\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
|
" var width = fig.canvas.width/mpl.ratio\n",
|
|
" fig.root.unbind('remove')\n",
|
|
"\n",
|
|
" // Update the output cell to use the data from the current canvas.\n",
|
|
" fig.push_to_output();\n",
|
|
" var dataURL = fig.canvas.toDataURL();\n",
|
|
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
|
" // the notebook keyboard shortcuts fail.\n",
|
|
" IPython.keyboard_manager.enable()\n",
|
|
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
|
" fig.close_ws(fig, msg);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
|
" fig.send_message('closing', msg);\n",
|
|
" // fig.ws.close()\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
|
" // Turn the data on the canvas into data in the output cell.\n",
|
|
" var width = this.canvas.width/mpl.ratio\n",
|
|
" var dataURL = this.canvas.toDataURL();\n",
|
|
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Tell IPython that the notebook contents must change.\n",
|
|
" IPython.notebook.set_dirty(true);\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
" var fig = this;\n",
|
|
" // Wait a second, then push the new image to the DOM so\n",
|
|
" // that it is saved nicely (might be nice to debounce this).\n",
|
|
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>')\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) { continue; };\n",
|
|
"\n",
|
|
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add the status bar.\n",
|
|
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"\n",
|
|
" // Add the close button to the window.\n",
|
|
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
|
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
|
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
|
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
|
" buttongrp.append(button);\n",
|
|
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
|
" titlebar.prepend(buttongrp);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
|
" var fig = this\n",
|
|
" el.on(\"remove\", function(){\n",
|
|
"\tfig.close_ws(fig, {});\n",
|
|
" });\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
|
" // this is important to make the div 'focusable\n",
|
|
" el.attr('tabindex', 0)\n",
|
|
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
|
" // off when our div gets focus\n",
|
|
"\n",
|
|
" // location in version 3\n",
|
|
" if (IPython.notebook.keyboard_manager) {\n",
|
|
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
" else {\n",
|
|
" // location in version 2\n",
|
|
" IPython.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" var manager = IPython.notebook.keyboard_manager;\n",
|
|
" if (!manager)\n",
|
|
" manager = IPython.keyboard_manager;\n",
|
|
"\n",
|
|
" // Check for shift+enter\n",
|
|
" if (event.shiftKey && event.which == 13) {\n",
|
|
" this.canvas_div.blur();\n",
|
|
" event.shiftKey = false;\n",
|
|
" // Send a \"J\" for go to next cell\n",
|
|
" event.which = 74;\n",
|
|
" event.keyCode = 74;\n",
|
|
" manager.command_mode();\n",
|
|
" manager.handle_keydown(event);\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" fig.ondownload(fig, null);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.find_output_cell = function(html_output) {\n",
|
|
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
|
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
|
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
|
" // our purposes (turning an active figure into a static one), is too late.\n",
|
|
" var cells = IPython.notebook.get_cells();\n",
|
|
" var ncells = cells.length;\n",
|
|
" for (var i=0; i<ncells; i++) {\n",
|
|
" var cell = cells[i];\n",
|
|
" if (cell.cell_type === 'code'){\n",
|
|
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
|
" var data = cell.output_area.outputs[j];\n",
|
|
" if (data.data) {\n",
|
|
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
|
" data = data.data;\n",
|
|
" }\n",
|
|
" if (data['text/html'] == html_output) {\n",
|
|
" return [cell, data, j];\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"// Register the function which deals with the matplotlib target/channel.\n",
|
|
"// The kernel may be null if the page has been refreshed.\n",
|
|
"if (IPython.notebook.kernel != null) {\n",
|
|
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
|
"}\n"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.Javascript object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsAAAAIQCAYAAACPEdjAAAAdW0lEQVR4Xu3WQQEAAAgCMelf2iA3GzB8sHMECBAgQIAAAQIEQgILZRWVAAECBAgQIECAwBnAnoAAAQIECBAgQCAlYACn6haWAAECBAgQIEDAAPYDBAgQIECAAAECKQEDOFW3sAQIECBAgAABAgawHyBAgAABAgQIEEgJGMCpuoUlQIAAAQIECBAwgP0AAQIECBAgQIBASsAATtUtLAECBAgQIECAgAHsBwgQIECAAAECBFICBnCqbmEJECBAgAABAgQMYD9AgAABAgQIECCQEjCAU3ULS4AAAQIECBAgYAD7AQIECBAgQIAAgZSAAZyqW1gCBAgQIECAAAED2A8QIECAAAECBAikBAzgVN3CEiBAgAABAgQIGMB+gAABAgQIECBAICVgAKfqFpYAAQIECBAgQMAA9gMECBAgQIAAAQIpAQM4VbewBAgQIECAAAECBrAfIECAAAECBAgQSAkYwKm6hSVAgAABAgQIEDCA/QABAgQIECBAgEBKwABO1S0sAQIECBAgQICAAewHCBAgQIAAAQIEUgIGcKpuYQkQIECAAAECBAxgP0CAAAECBAgQIJASMIBTdQtLgAABAgQIECBgAPsBAgQIECBAgACBlIABnKpbWAIECBAgQIAAAQPYDxAgQIAAAQIECKQEDOBU3cISIECAAAECBAgYwH6AAAECBAgQIEAgJWAAp+oWlgABAgQIECBAwAD2AwQIECBAgAABAikBAzhVt7AECBAgQIAAAQIGsB8gQIAAAQIECBBICRjAqbqFJUCAAAECBAgQMID9AAECBAgQIECAQErAAE7VLSwBAgQIECBAgIAB7AcIECBAgAABAgRSAgZwqm5hCRAgQIAAAQIEDGA/QIAAAQIECBAgkBIwgFN1C0uAAAECBAgQIGAA+wECBAgQIECAAIGUgAGcqltYAgQIECBAgAABA9gPECBAgAABAgQIpAQM4FTdwhIgQIAAAQIECBjAfoAAAQIECBAgQCAlYACn6haWAAECBAgQIEDAAPYDBAgQIECAAAECKQEDOFW3sAQIECBAgAABAgawHyBAgAABAgQIEEgJGMCpuoUlQIAAAQIECBAwgP0AAQIECBAgQIBASsAATtUtLAECBAgQIECAgAHsBwgQIECAAAECBFICBnCqbmEJECBAgAABAgQMYD9AgAABAgQIECCQEjCAU3ULS4AAAQIECBAgYAD7AQIECBAgQIAAgZSAAZyqW1gCBAgQIECAAAED2A8QIECAAAECBAikBAzgVN3CEiBAgAABAgQIGMB+gAABAgQIECBAICVgAKfqFpYAAQIECBAgQMAA9gMECBAgQIAAAQIpAQM4VbewBAgQIECAAAECBrAfIECAAAECBAgQSAkYwKm6hSVAgAABAgQIEDCA/QABAgQIECBAgEBKwABO1S0sAQIECBAgQICAAewHCBAgQIAAAQIEUgIGcKpuYQkQIECAAAECBAxgP0CAAAECBAgQIJASMIBTdQtLgAABAgQIECBgAPsBAgQIECBAgACBlIABnKpbWAIECBAgQIAAAQPYDxAgQIAAAQIECKQEDOBU3cISIECAAAECBAgYwH6AAAECBAgQIEAgJWAAp+oWlgABAgQIECBAwAD2AwQIECBAgAABAikBAzhVt7AECBAgQIAAAQIGsB8gQIAAAQIECBBICRjAqbqFJUCAAAECBAgQMID9AAECBAgQIECAQErAAE7VLSwBAgQIECBAgIAB7AcIECBAgAABAgRSAgZwqm5hCRAgQIAAAQIEDGA/QIAAAQIECBAgkBIwgFN1C0uAAAECBAgQIGAA+wECBAgQIECAAIGUgAGcqltYAgQIECBAgAABA9gPECBAgAABAgQIpAQM4FTdwhIgQIAAAQIECBjAfoAAAQIECBAgQCAlYACn6haWAAECBAgQIEDAAPYDBAgQIECAAAECKQEDOFW3sAQIECBAgAABAgawHyBAgAABAgQIEEgJGMCpuoUlQIAAAQIECBAwgP0AAQIECBAgQIBASsAATtUtLAECBAgQIECAgAHsBwgQIECAAAECBFICBnCqbmEJECBAgAABAgQMYD9AgAABAgQIECCQEjCAU3ULS4AAAQIECBAgYAD7AQIECBAgQIAAgZSAAZyqW1gCBAgQIECAAAED2A8QIECAAAECBAikBAzgVN3CEiBAgAABAgQIGMB+gAABAgQIECBAICVgAKfqFpYAAQIECBAgQMAA9gMECBAgQIAAAQIpAQM4VbewBAgQIECAAAECBrAfIECAAAECBAgQSAkYwKm6hSVAgAABAgQIEDCA/QABAgQIECBAgEBKwABO1S0sAQIECBAgQICAAewHCBAgQIAAAQIEUgIGcKpuYQkQIECAAAECBAxgP0CAAAECBAgQIJASMIBTdQtLgAABAgQIECBgAPsBAgQIECBAgACBlIABnKpbWAIECBAgQIAAAQPYDxAgQIAAAQIECKQEDOBU3cISIECAAAECBAgYwH6AAAECBAgQIEAgJWAAp+oWlgABAgQIECBAwAD2AwQIECBAgAABAikBAzhVt7AECBAgQIAAAQIGsB8gQIAAAQIECBBICRjAqbqFJUCAAAECBAgQMID9AAECBAgQIECAQErAAE7VLSwBAgQIECBAgIAB7AcIECBAgAABAgRSAgZwqm5hCRAgQIAAAQIEDGA/QIAAAQIECBAgkBIwgFN1C0uAAAECBAgQIGAA+wECBAgQIECAAIGUgAGcqltYAgQIECBAgAABA9gPECBAgAABAgQIpAQM4FTdwhIgQIAAAQIECBjAfoAAAQIECBAgQCAlYACn6haWAAECBAgQIEDAAPYDBAgQIECAAAECKQEDOFW3sAQIECBAgAABAgawHyBAgAABAgQIEEgJGMCpuoUlQIAAAQIECBAwgP0AAQIECBAgQIBASsAATtUtLAECBAgQIECAgAHsBwgQIECAAAECBFICBnCqbmEJECBAgAABAgQMYD9AgAABAgQIECCQEjCAU3ULS4AAAQIECBAgYAD7AQIECBAgQIAAgZSAAZyqW1gCBAgQIECAAAED2A8QIECAAAECBAikBAzgVN3CEiBAgAABAgQIGMB+gAABAgQIECBAICVgAKfqFpYAAQIECBAgQMAA9gMECBAgQIAAAQIpAQM4VbewBAgQIECAAAECBrAfIECAAAECBAgQSAkYwKm6hSVAgAABAgQIEDCA/QABAgQIECBAgEBKwABO1S0sAQIECBAgQICAAewHCBAgQIAAAQIEUgIGcKpuYQkQIECAAAECBAxgP0CAAAECBAgQIJASMIBTdQtLgAABAgQIECBgAPsBAgQIECBAgACBlIABnKpbWAIECBAgQIAAAQPYDxAgQIAAAQIECKQEDOBU3cISIECAAAECBAgYwH6AAAECBAgQIEAgJWAAp+oWlgABAgQIECBAwAD2AwQIECBAgAABAikBAzhVt7AECBAgQIAAAQIGsB8gQIAAAQIECBBICRjAqbqFJUCAAAECBAgQMID9AAECBAgQIECAQErAAE7VLSwBAgQIECBAgIAB7AcIECBAgAABAgRSAgZwqm5hCRAgQIAAAQIEDGA/QIAAAQIECBAgkBIwgFN1C0uAAAECBAgQIGAA+wECBAgQIECAAIGUgAGcqltYAgQIECBAgAABA9gPECBAgAABAgQIpAQM4FTdwhIgQIAAAQIECBjAfoAAAQIECBAgQCAlYACn6haWAAECBAgQIEDAAPYDBAgQIECAAAECKQEDOFW3sAQIECBAgAABAgawHyBAgAABAgQIEEgJGMCpuoUlQIAAAQIECBAwgP0AAQIECBAgQIBASsAATtUtLAECBAgQIECAgAHsBwgQIECAAAECBFICBnCqbmEJECBAgAABAgQMYD9AgAABAgQIECCQEjCAU3ULS4AAAQIECBAgYAD7AQIECBAgQIAAgZSAAZyqW1gCBAgQIECAAAED2A8QIECAAAECBAikBAzgVN3CEiBAgAABAgQIGMB+gAABAgQIECBAICVgAKfqFpYAAQIECBAgQMAA9gMECBAgQIAAAQIpAQM4VbewBAgQIECAAAECBrAfIECAAAECBAgQSAkYwKm6hSVAgAABAgQIEDCA/QABAgQIECBAgEBKwABO1S0sAQIECBAgQICAAewHCBAgQIAAAQIEUgIGcKpuYQkQIECAAAECBAxgP0CAAAECBAgQIJASMIBTdQtLgAABAgQIECBgAPsBAgQIECBAgACBlIABnKpbWAIECBAgQIAAAQPYDxAgQIAAAQIECKQEDOBU3cISIECAAAECBAgYwH6AAAECBAgQIEAgJWAAp+oWlgABAgQIECBAwAD2AwQIECBAgAABAikBAzhVt7AECBAgQIAAAQIGsB8gQIAAAQIECBBICRjAqbqFJUCAAAECBAgQMID9AAECBAgQIECAQErAAE7VLSwBAgQIECBAgIAB7AcIECBAgAABAgRSAgZwqm5hCRAgQIAAAQIEDGA/QIAAAQIECBAgkBIwgFN1C0uAAAECBAgQIGAA+wECBAgQIECAAIGUgAGcqltYAgQIECBAgAABA9gPECBAgAABAgQIpAQM4FTdwhIgQIAAAQIECBjAfoAAAQIECBAgQCAlYACn6haWAAECBAgQIEDAAPYDBAgQIECAAAECKQEDOFW3sAQIECBAgAABAgawHyBAgAABAgQIEEgJGMCpuoUlQIAAAQIECBAwgP0AAQIECBAgQIBASsAATtUtLAECBAgQIECAgAHsBwgQIECAAAECBFICBnCqbmEJECBAgAABAgQMYD9AgAABAgQIECCQEjCAU3ULS4AAAQIECBAgYAD7AQIECBAgQIAAgZSAAZyqW1gCBAgQIECAAAED2A8QIECAAAECBAikBAzgVN3CEiBAgAABAgQIGMB+gAABAgQIECBAICVgAKfqFpYAAQIECBAgQMAA9gMECBAgQIAAAQIpAQM4VbewBAgQIECAAAECBrAfIECAAAECBAgQSAkYwKm6hSVAgAABAgQIEDCA/QABAgQIECBAgEBKwABO1S0sAQIECBAgQICAAewHCBAgQIAAAQIEUgIGcKpuYQkQIECAAAECBAxgP0CAAAECBAgQIJASMIBTdQtLgAABAgQIECBgAPsBAgQIECBAgACBlIABnKpbWAIECBAgQIAAAQPYDxAgQIAAAQIECKQEDOBU3cISIECAAAECBAgYwH6AAAECBAgQIEAgJWAAp+oWlgABAgQIECBAwAD2AwQIECBAgAABAikBAzhVt7AECBAgQIAAAQIGsB8gQIAAAQIECBBICRjAqbqFJUCAAAECBAgQMID9AAECBAgQIECAQErAAE7VLSwBAgQIECBAgIAB7AcIECBAgAABAgRSAgZwqm5hCRAgQIAAAQIEDGA/QIAAAQIECBAgkBIwgFN1C0uAAAECBAgQIGAA+wECBAgQIECAAIGUgAGcqltYAgQIECBAgAABA9gPECBAgAABAgQIpAQM4FTdwhIgQIAAAQIECBjAfoAAAQIECBAgQCAlYACn6haWAAECBAgQIEDAAPYDBAgQIECAAAECKQEDOFW3sAQIECBAgAABAgawHyBAgAABAgQIEEgJGMCpuoUlQIAAAQIECBAwgP0AAQIECBAgQIBASsAATtUtLAECBAgQIECAgAHsBwgQIECAAAECBFICBnCqbmEJECBAgAABAgQMYD9AgAABAgQIECCQEjCAU3ULS4AAAQIECBAgYAD7AQIECBAgQIAAgZSAAZyqW1gCBAgQIECAAAED2A8QIECAAAECBAikBAzgVN3CEiBAgAABAgQIGMB+gAABAgQIECBAICVgAKfqFpYAAQIECBAgQMAA9gMECBAgQIAAAQIpAQM4VbewBAgQIECAAAECBrAfIECAAAECBAgQSAkYwKm6hSVAgAABAgQIEDCA/QABAgQIECBAgEBKwABO1S0sAQIECBAgQICAAewHCBAgQIAAAQIEUgIGcKpuYQkQIECAAAECBAxgP0CAAAECBAgQIJASMIBTdQtLgAABAgQIECBgAPsBAgQIECBAgACBlIABnKpbWAIECBAgQIAAAQPYDxAgQIAAAQIECKQEDOBU3cISIECAAAECBAgYwH6AAAECBAgQIEAgJWAAp+oWlgABAgQIECBAwAD2AwQIECBAgAABAikBAzhVt7AECBAgQIAAAQIGsB8gQIAAAQIECBBICRjAqbqFJUCAAAECBAgQMID9AAECBAgQIECAQErAAE7VLSwBAgQIECBAgIAB7AcIECBAgAABAgRSAgZwqm5hCRAgQIAAAQIEDGA/QIAAAQIECBAgkBIwgFN1C0uAAAECBAgQIGAA+wECBAgQIECAAIGUgAGcqltYAgQIECBAgAABA9gPECBAgAABAgQIpAQM4FTdwhIgQIAAAQIECBjAfoAAAQIECBAgQCAlYACn6haWAAECBAgQIEDAAPYDBAgQIECAAAECKQEDOFW3sAQIECBAgAABAgawHyBAgAABAgQIEEgJGMCpuoUlQIAAAQIECBAwgP0AAQIECBAgQIBASsAATtUtLAECBAgQIECAgAHsBwgQIECAAAECBFICBnCqbmEJECBAgAABAgQMYD9AgAABAgQIECCQEjCAU3ULS4AAAQIECBAgYAD7AQIECBAgQIAAgZSAAZyqW1gCBAgQIECAAAED2A8QIECAAAECBAikBAzgVN3CEiBAgAABAgQIGMB+gAABAgQIECBAICVgAKfqFpYAAQIECBAgQMAA9gMECBAgQIAAAQIpAQM4VbewBAgQIECAAAECBrAfIECAAAECBAgQSAkYwKm6hSVAgAABAgQIEDCA/QABAgQIECBAgEBKwABO1S0sAQIECBAgQICAAewHCBAgQIAAAQIEUgIGcKpuYQkQIECAAAECBAxgP0CAAAECBAgQIJASMIBTdQtLgAABAgQIECBgAPsBAgQIECBAgACBlIABnKpbWAIECBAgQIAAAQPYDxAgQIAAAQIECKQEDOBU3cISIECAAAECBAgYwH6AAAECBAgQIEAgJWAAp+oWlgABAgQIECBAwAD2AwQIECBAgAABAikBAzhVt7AECBAgQIAAAQIGsB8gQIAAAQIECBBICRjAqbqFJUCAAAECBAgQMID9AAECBAgQIECAQErAAE7VLSwBAgQIECBAgIAB7AcIECBAgAABAgRSAgZwqm5hCRAgQIAAAQIEDGA/QIAAAQIECBAgkBIwgFN1C0uAAAECBAgQIGAA+wECBAgQIECAAIGUgAGcqltYAgQIECBAgAABA9gPECBAgAABAgQIpAQM4FTdwhIgQIAAAQIECBjAfoAAAQIECBAgQCAlYACn6haWAAECBAgQIEDAAPYDBAgQIECAAAECKQEDOFW3sAQIECBAgAABAgawHyBAgAABAgQIEEgJGMCpuoUlQIAAAQIECBAwgP0AAQIECBAgQIBASsAATtUtLAECBAgQIECAgAHsBwgQIECAAAECBFICBnCqbmEJECBAgAABAgQMYD9AgAABAgQIECCQEjCAU3ULS4AAAQIECBAgYAD7AQIECBAgQIAAgZSAAZyqW1gCBAgQIECAAAED2A8QIECAAAECBAikBAzgVN3CEiBAgAABAgQIGMB+gAABAgQIECBAICVgAKfqFpYAAQIECBAgQMAA9gMECBAgQIAAAQIpAQM4VbewBAgQIECAAAECBrAfIECAAAECBAgQSAkYwKm6hSVAgAABAgQIEDCA/QABAgQIECBAgEBKwABO1S0sAQIECBAgQICAAewHCBAgQIAAAQIEUgIGcKpuYQkQIECAAAECBAxgP0CAAAECBAgQIJASMIBTdQtLgAABAgQIECBgAPsBAgQIECBAgACBlIABnKpbWAIECBAgQIAAAQPYDxAgQIAAAQIECKQEDOBU3cISIECAAAECBAgYwH6AAAECBAgQIEAgJWAAp+oWlgABAgQIECBAwAD2AwQIECBAgAABAikBAzhVt7AECBAgQIAAAQIGsB8gQIAAAQIECBBICRjAqbqFJUCAAAECBAgQMID9AAECBAgQIECAQErAAE7VLSwBAgQIECBAgIAB7AcIECBAgAABAgRSAgZwqm5hCRAgQIAAAQIEDGA/QIAAAQIECBAgkBIwgFN1C0uAAAECBAgQIGAA+wECBAgQIECAAIGUgAGcqltYAgQIECBAgAABA9gPECBAgAABAgQIpAQM4FTdwhIgQIAAAQIECBjAfoAAAQIECBAgQCAlYACn6haWAAECBAgQIEDAAPYDBAgQIECAAAECKQEDOFW3sAQIECBAgAABAgawHyBAgAABAgQIEEgJGMCpuoUlQIAAAQIECBAwgP0AAQIECBAgQIBASsAATtUtLAECBAgQIECAgAHsBwgQIECAAAECBFICBnCqbmEJECBAgAABAgQMYD9AgAABAgQIECCQEjCAU3ULS4AAAQIECBAgYAD7AQIECBAgQIAAgZSAAZyqW1gCBAgQIECAAAED2A8QIECAAAECBAikBAzgVN3CEiBAgAABAgQIGMB+gAABAgQIECBAICVgAKfqFpYAAQIECBAgQMAA9gMECBAgQIAAAQIpAQM4VbewBAgQIECAAAECBrAfIECAAAECBAgQSAkYwKm6hSVAgAABAgQIEDCA/QABAgQIECBAgEBKwABO1S0sAQIECBAgQICAAewHCBAgQIAAAQIEUgIGcKpuYQkQIECAAAECBAxgP0CAAAECBAgQIJASMIBTdQtLgAABAgQIECBgAPsBAgQIECBAgACBlIABnKpbWAIECBAgQIAAAQPYDxAgQIAAAQIECKQEDOBU3cISIECAAAECBAgYwH6AAAECBAgQIEAgJWAAp+oWlgABAgQIECBAwAD2AwQIECBAgAABAikBAzhVt7AECBAgQIAAAQIGsB8gQIAAAQIECBBICRjAqbqFJUCAAAECBAgQMID9AAECBAgQIECAQErAAE7VLSwBAgQIECBAgIAB7AcIECBAgAABAgRSAgZwqm5hCRAgQIAAAQIEDGA/QIAAAQIECBAgkBIwgFN1C0uAAAECBAgQIGAA+wECBAgQIECAAIGUgAGcqltYAgQIECBAgAABA9gPECBAgAABAgQIpAQM4FTdwhIgQIAAAQIECBjAfoAAAQIECBAgQCAlYACn6haWAAECBAgQIEDAAPYDBAgQIECAAAECKQEDOFW3sAQIECBAgAABAgawHyBAgAABAgQIEEgJGMCpuoUlQIAAAQIECBAwgP0AAQIECBAgQIBASsAATtUtLAECBAgQIECAgAHsBwgQIECAAAECBFICBnCqbmEJECBAgAABAgQMYD9AgAABAgQIECCQEjCAU3ULS4AAAQIECBAgYAD7AQIECBAgQIAAgZSAAZyqW1gCBAgQIECAAAED2A8QIECAAAECBAikBAzgVN3CEiBAgAABAgQIGMB+gAABAgQIECBAICVgAKfqFpYAAQIECBAgQMAA9gMECBAgQIAAAQIpAQM4VbewBAgQIECAAAECBrAfIECAAAECBAgQSAkYwKm6hSVAgAABAgQIEDCA/QABAgQIECBAgEBKwABO1S0sAQIECBAgQICAAewHCBAgQIAAAQIEUgIGcKpuYQkQIECAAAECBAxgP0CAAAECBAgQIJASMIBTdQtLgAABAgQIECBgAPsBAgQIECBAgACBlIABnKpbWAIECBAgQIAAAQPYDxAgQIAAAQIECKQEDOBU3cISIECAAAECBAgYwH6AAAECBAgQIEAgJWAAp+oWlgABAgQIECBAwAD2AwQIECBAgAABAikBAzhVt7AECBAgQIAAAQIGsB8gQIAAAQIECBBICRjAqbqFJUCAAAECBAgQMID9AAECBAgQIECAQErAAE7VLSwBAgQIECBAgIAB7AcIECBAgAABAgRSAgZwqm5hCRAgQIAAAQIEDGA/QIAAAQIECBAgkBIwgFN1C0uAAAECBAgQIGAA+wECBAgQIECAAIGUgAGcqltYAgQIECBAgACBBwy9AhHX8cpEAAAAAElFTkSuQmCC\" width=\"639.9999861283738\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<matplotlib.axes._subplots.AxesSubplot at 0x7fd2cb201198>"
|
|
]
|
|
},
|
|
"execution_count": 17,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"# plot rewards\n",
|
|
"plt.figure()\n",
|
|
"df_online, df = load_stats_ddpg(agent)\n",
|
|
"sns.regplot(x=\"step\", y=\"rewards\", data=df_online, order=1)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 19,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T07:56:23.350929Z",
|
|
"start_time": "2018-02-18T07:56:23.316549Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"(1.0116689, 0.9972954897680569)"
|
|
]
|
|
},
|
|
"execution_count": 19,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"# monthly growth\n",
|
|
"portfolio_return = (1+df_online.rewards[-100:].mean())\n",
|
|
"\n",
|
|
"returns = task.unwrapped.src.data[0,:,:1]\n",
|
|
"market_return = (1+returns).mean()\n",
|
|
"market_return, portfolio_return"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T03:29:04.356761Z",
|
|
"start_time": "2018-02-18T03:29:04.327173Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"start_time": "2017-10-30T00:20:53.430Z"
|
|
}
|
|
},
|
|
"source": [
|
|
"# Test"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T03:37:21.522568Z",
|
|
"start_time": "2018-02-18T03:37:21.454751Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T07:56:24.491787Z",
|
|
"start_time": "2018-02-18T07:56:24.390618Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def test_algo(env, algo, seed=0):\n",
|
|
" \"\"\"\n",
|
|
" Runs and algo from https://github.com/Marigold/universal-portfolios on env\n",
|
|
" \n",
|
|
" https://github.com/Marigold/universal-portfolios/commit/e8970a82427522ef11b1c3cbf681e18b5fe8169c\n",
|
|
" \"\"\"\n",
|
|
" env.seed(0)\n",
|
|
" np.random.seed(0)\n",
|
|
"\n",
|
|
" state = env.reset()\n",
|
|
" for i in range(env.unwrapped.sim.steps):\n",
|
|
" \n",
|
|
" history= pd.DataFrame(state[0,:,:], columns=env.unwrapped.src.asset_names)\n",
|
|
" # MPT wants a cash column, and it should be first\n",
|
|
" history['CASH']=1\n",
|
|
" history=history[['CASH'] + env.unwrapped.src.asset_names]\n",
|
|
"# cols = list(history.columns)\n",
|
|
"# cols[0]='CASH'\n",
|
|
"# history.columns = cols\n",
|
|
" \n",
|
|
" x=history.iloc[-1]\n",
|
|
" \n",
|
|
" last_b = env.unwrapped.sim.w0#[1:]\n",
|
|
"\n",
|
|
" algo.init_step(history)\n",
|
|
" # some don't want history\n",
|
|
" try:\n",
|
|
" action = algo.step(x, last_b, history)\n",
|
|
" except TypeError:\n",
|
|
" action = algo.step(x, last_b)\n",
|
|
" \n",
|
|
" # might by dataframe\n",
|
|
" action = getattr(action, 'value', action)\n",
|
|
" \n",
|
|
" # For upt\n",
|
|
" if isinstance(action, np.matrixlib.defmatrix.matrix):\n",
|
|
" action = np.array(action.tolist()).T[0]\n",
|
|
" \n",
|
|
" \n",
|
|
"\n",
|
|
" state, reward, done, info = env.step(action)\n",
|
|
"\n",
|
|
" if done:\n",
|
|
" break \n",
|
|
" df = pd.DataFrame(env.unwrapped.infos)\n",
|
|
" df.index = pd.to_datetime(df['date']*1e9)\n",
|
|
" return df['portfolio_value'], df"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 21,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T07:56:25.669367Z",
|
|
"start_time": "2018-02-18T07:56:24.530860Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"application/javascript": [
|
|
"/* Put everything inside the global mpl namespace */\n",
|
|
"window.mpl = {};\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.get_websocket_type = function() {\n",
|
|
" if (typeof(WebSocket) !== 'undefined') {\n",
|
|
" return WebSocket;\n",
|
|
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
|
" return MozWebSocket;\n",
|
|
" } else {\n",
|
|
" alert('Your browser does not have WebSocket support.' +\n",
|
|
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
|
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
|
" 'have to enable WebSockets in about:config.');\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
|
" this.id = figure_id;\n",
|
|
"\n",
|
|
" this.ws = websocket;\n",
|
|
"\n",
|
|
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
|
"\n",
|
|
" if (!this.supports_binary) {\n",
|
|
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
|
" if (warnings) {\n",
|
|
" warnings.style.display = 'block';\n",
|
|
" warnings.textContent = (\n",
|
|
" \"This browser does not support binary websocket messages. \" +\n",
|
|
" \"Performance may be slow.\");\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj = new Image();\n",
|
|
"\n",
|
|
" this.context = undefined;\n",
|
|
" this.message = undefined;\n",
|
|
" this.canvas = undefined;\n",
|
|
" this.rubberband_canvas = undefined;\n",
|
|
" this.rubberband_context = undefined;\n",
|
|
" this.format_dropdown = undefined;\n",
|
|
"\n",
|
|
" this.image_mode = 'full';\n",
|
|
"\n",
|
|
" this.root = $('<div/>');\n",
|
|
" this._root_extra_style(this.root)\n",
|
|
" this.root.attr('style', 'display: inline-block');\n",
|
|
"\n",
|
|
" $(parent_element).append(this.root);\n",
|
|
"\n",
|
|
" this._init_header(this);\n",
|
|
" this._init_canvas(this);\n",
|
|
" this._init_toolbar(this);\n",
|
|
"\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" this.waiting = false;\n",
|
|
"\n",
|
|
" this.ws.onopen = function () {\n",
|
|
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
|
" fig.send_message(\"send_image_mode\", {});\n",
|
|
" if (mpl.ratio != 1) {\n",
|
|
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
|
" }\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj.onload = function() {\n",
|
|
" if (fig.image_mode == 'full') {\n",
|
|
" // Full images could contain transparency (where diff images\n",
|
|
" // almost always do), so we need to clear the canvas so that\n",
|
|
" // there is no ghosting.\n",
|
|
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
" }\n",
|
|
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
|
" };\n",
|
|
"\n",
|
|
" this.imageObj.onunload = function() {\n",
|
|
" fig.ws.close();\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
|
"\n",
|
|
" this.ondownload = ondownload;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_header = function() {\n",
|
|
" var titlebar = $(\n",
|
|
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
|
" 'ui-helper-clearfix\"/>');\n",
|
|
" var titletext = $(\n",
|
|
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
|
" 'text-align: center; padding: 3px;\"/>');\n",
|
|
" titlebar.append(titletext)\n",
|
|
" this.root.append(titlebar);\n",
|
|
" this.header = titletext[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_canvas = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var canvas_div = $('<div/>');\n",
|
|
"\n",
|
|
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
|
"\n",
|
|
" function canvas_keyboard_event(event) {\n",
|
|
" return fig.key_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
|
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
|
" this.canvas_div = canvas_div\n",
|
|
" this._canvas_extra_style(canvas_div)\n",
|
|
" this.root.append(canvas_div);\n",
|
|
"\n",
|
|
" var canvas = $('<canvas/>');\n",
|
|
" canvas.addClass('mpl-canvas');\n",
|
|
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
|
"\n",
|
|
" this.canvas = canvas[0];\n",
|
|
" this.context = canvas[0].getContext(\"2d\");\n",
|
|
"\n",
|
|
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
|
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
|
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
|
"\tthis.context.msBackingStorePixelRatio ||\n",
|
|
"\tthis.context.oBackingStorePixelRatio ||\n",
|
|
"\tthis.context.backingStorePixelRatio || 1;\n",
|
|
"\n",
|
|
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
|
"\n",
|
|
" var rubberband = $('<canvas/>');\n",
|
|
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
|
"\n",
|
|
" var pass_mouse_events = true;\n",
|
|
"\n",
|
|
" canvas_div.resizable({\n",
|
|
" start: function(event, ui) {\n",
|
|
" pass_mouse_events = false;\n",
|
|
" },\n",
|
|
" resize: function(event, ui) {\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" stop: function(event, ui) {\n",
|
|
" pass_mouse_events = true;\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" });\n",
|
|
"\n",
|
|
" function mouse_event_fn(event) {\n",
|
|
" if (pass_mouse_events)\n",
|
|
" return fig.mouse_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
|
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
|
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
|
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
|
"\n",
|
|
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
|
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
|
"\n",
|
|
" canvas_div.on(\"wheel\", function (event) {\n",
|
|
" event = event.originalEvent;\n",
|
|
" event['data'] = 'scroll'\n",
|
|
" if (event.deltaY < 0) {\n",
|
|
" event.step = 1;\n",
|
|
" } else {\n",
|
|
" event.step = -1;\n",
|
|
" }\n",
|
|
" mouse_event_fn(event);\n",
|
|
" });\n",
|
|
"\n",
|
|
" canvas_div.append(canvas);\n",
|
|
" canvas_div.append(rubberband);\n",
|
|
"\n",
|
|
" this.rubberband = rubberband;\n",
|
|
" this.rubberband_canvas = rubberband[0];\n",
|
|
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
|
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
|
"\n",
|
|
" this._resize_canvas = function(width, height) {\n",
|
|
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
|
" // canvas in synch.\n",
|
|
" canvas_div.css('width', width)\n",
|
|
" canvas_div.css('height', height)\n",
|
|
"\n",
|
|
" canvas.attr('width', width * mpl.ratio);\n",
|
|
" canvas.attr('height', height * mpl.ratio);\n",
|
|
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
|
"\n",
|
|
" rubberband.attr('width', width);\n",
|
|
" rubberband.attr('height', height);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
|
" // upon first draw.\n",
|
|
" this._resize_canvas(600, 600);\n",
|
|
"\n",
|
|
" // Disable right mouse context menu.\n",
|
|
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
|
" return false;\n",
|
|
" });\n",
|
|
"\n",
|
|
" function set_focus () {\n",
|
|
" canvas.focus();\n",
|
|
" canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" window.setTimeout(set_focus, 100);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>')\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) {\n",
|
|
" // put a spacer in here.\n",
|
|
" continue;\n",
|
|
" }\n",
|
|
" var button = $('<button/>');\n",
|
|
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
|
" 'ui-button-icon-only');\n",
|
|
" button.attr('role', 'button');\n",
|
|
" button.attr('aria-disabled', 'false');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
"\n",
|
|
" var icon_img = $('<span/>');\n",
|
|
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
|
" icon_img.addClass(image);\n",
|
|
" icon_img.addClass('ui-corner-all');\n",
|
|
"\n",
|
|
" var tooltip_span = $('<span/>');\n",
|
|
" tooltip_span.addClass('ui-button-text');\n",
|
|
" tooltip_span.html(tooltip);\n",
|
|
"\n",
|
|
" button.append(icon_img);\n",
|
|
" button.append(tooltip_span);\n",
|
|
"\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fmt_picker_span = $('<span/>');\n",
|
|
"\n",
|
|
" var fmt_picker = $('<select/>');\n",
|
|
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
|
" fmt_picker_span.append(fmt_picker);\n",
|
|
" nav_element.append(fmt_picker_span);\n",
|
|
" this.format_dropdown = fmt_picker[0];\n",
|
|
"\n",
|
|
" for (var ind in mpl.extensions) {\n",
|
|
" var fmt = mpl.extensions[ind];\n",
|
|
" var option = $(\n",
|
|
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
|
" fmt_picker.append(option)\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add hover states to the ui-buttons\n",
|
|
" $( \".ui-button\" ).hover(\n",
|
|
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
|
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
|
" );\n",
|
|
"\n",
|
|
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
|
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
|
" // which will in turn request a refresh of the image.\n",
|
|
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
|
" properties['type'] = type;\n",
|
|
" properties['figure_id'] = this.id;\n",
|
|
" this.ws.send(JSON.stringify(properties));\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_draw_message = function() {\n",
|
|
" if (!this.waiting) {\n",
|
|
" this.waiting = true;\n",
|
|
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" var format_dropdown = fig.format_dropdown;\n",
|
|
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
|
" fig.ondownload(fig, format);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
|
" var size = msg['size'];\n",
|
|
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
|
" fig._resize_canvas(size[0], size[1]);\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
|
" var x0 = msg['x0'] / mpl.ratio;\n",
|
|
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
|
" var x1 = msg['x1'] / mpl.ratio;\n",
|
|
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
|
" x0 = Math.floor(x0) + 0.5;\n",
|
|
" y0 = Math.floor(y0) + 0.5;\n",
|
|
" x1 = Math.floor(x1) + 0.5;\n",
|
|
" y1 = Math.floor(y1) + 0.5;\n",
|
|
" var min_x = Math.min(x0, x1);\n",
|
|
" var min_y = Math.min(y0, y1);\n",
|
|
" var width = Math.abs(x1 - x0);\n",
|
|
" var height = Math.abs(y1 - y0);\n",
|
|
"\n",
|
|
" fig.rubberband_context.clearRect(\n",
|
|
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
"\n",
|
|
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
|
" // Updates the figure title.\n",
|
|
" fig.header.textContent = msg['label'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
|
" var cursor = msg['cursor'];\n",
|
|
" switch(cursor)\n",
|
|
" {\n",
|
|
" case 0:\n",
|
|
" cursor = 'pointer';\n",
|
|
" break;\n",
|
|
" case 1:\n",
|
|
" cursor = 'default';\n",
|
|
" break;\n",
|
|
" case 2:\n",
|
|
" cursor = 'crosshair';\n",
|
|
" break;\n",
|
|
" case 3:\n",
|
|
" cursor = 'move';\n",
|
|
" break;\n",
|
|
" }\n",
|
|
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
|
" fig.message.textContent = msg['message'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
|
" // Request the server to send over a new figure.\n",
|
|
" fig.send_draw_message();\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
|
" fig.image_mode = msg['mode'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Called whenever the canvas gets updated.\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"// A function to construct a web socket function for onmessage handling.\n",
|
|
"// Called in the figure constructor.\n",
|
|
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
|
" return function socket_on_message(evt) {\n",
|
|
" if (evt.data instanceof Blob) {\n",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = \"image/png\";\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data);\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
|
" fig.imageObj.src = evt.data;\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var msg = JSON.parse(evt.data);\n",
|
|
" var msg_type = msg['type'];\n",
|
|
"\n",
|
|
" // Call the \"handle_{type}\" callback, which takes\n",
|
|
" // the figure and JSON message as its only arguments.\n",
|
|
" try {\n",
|
|
" var callback = fig[\"handle_\" + msg_type];\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (callback) {\n",
|
|
" try {\n",
|
|
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
|
" callback(fig, msg);\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
|
" }\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
|
"mpl.findpos = function(e) {\n",
|
|
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
|
" var targ;\n",
|
|
" if (!e)\n",
|
|
" e = window.event;\n",
|
|
" if (e.target)\n",
|
|
" targ = e.target;\n",
|
|
" else if (e.srcElement)\n",
|
|
" targ = e.srcElement;\n",
|
|
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
|
" targ = targ.parentNode;\n",
|
|
"\n",
|
|
" // jQuery normalizes the pageX and pageY\n",
|
|
" // pageX,Y are the mouse positions relative to the document\n",
|
|
" // offset() returns the position of the element relative to the document\n",
|
|
" var x = e.pageX - $(targ).offset().left;\n",
|
|
" var y = e.pageY - $(targ).offset().top;\n",
|
|
"\n",
|
|
" return {\"x\": x, \"y\": y};\n",
|
|
"};\n",
|
|
"\n",
|
|
"/*\n",
|
|
" * return a copy of an object with only non-object keys\n",
|
|
" * we need this to avoid circular references\n",
|
|
" * http://stackoverflow.com/a/24161582/3208463\n",
|
|
" */\n",
|
|
"function simpleKeys (original) {\n",
|
|
" return Object.keys(original).reduce(function (obj, key) {\n",
|
|
" if (typeof original[key] !== 'object')\n",
|
|
" obj[key] = original[key]\n",
|
|
" return obj;\n",
|
|
" }, {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
|
" var canvas_pos = mpl.findpos(event)\n",
|
|
"\n",
|
|
" if (name === 'button_press')\n",
|
|
" {\n",
|
|
" this.canvas.focus();\n",
|
|
" this.canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" var x = canvas_pos.x * mpl.ratio;\n",
|
|
" var y = canvas_pos.y * mpl.ratio;\n",
|
|
"\n",
|
|
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
|
" step: event.step,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
"\n",
|
|
" /* This prevents the web browser from automatically changing to\n",
|
|
" * the text insertion cursor when the button is pressed. We want\n",
|
|
" * to control all of the cursor setting manually through the\n",
|
|
" * 'cursor' event from matplotlib */\n",
|
|
" event.preventDefault();\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" // Handle any extra behaviour associated with a key event\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
|
"\n",
|
|
" // Prevent repeat events\n",
|
|
" if (name == 'key_press')\n",
|
|
" {\n",
|
|
" if (event.which === this._key)\n",
|
|
" return;\n",
|
|
" else\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" if (name == 'key_release')\n",
|
|
" this._key = null;\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which != 17)\n",
|
|
" value += \"ctrl+\";\n",
|
|
" if (event.altKey && event.which != 18)\n",
|
|
" value += \"alt+\";\n",
|
|
" if (event.shiftKey && event.which != 16)\n",
|
|
" value += \"shift+\";\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, {key: value,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
|
" if (name == 'download') {\n",
|
|
" this.handle_save(this, null);\n",
|
|
" } else {\n",
|
|
" this.send_message(\"toolbar_button\", {name: name});\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
|
" this.message.textContent = tooltip;\n",
|
|
"};\n",
|
|
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
|
"\n",
|
|
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
|
"\n",
|
|
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
|
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
|
" // object with the appropriate methods. Currently this is a non binary\n",
|
|
" // socket, so there is still some room for performance tuning.\n",
|
|
" var ws = {};\n",
|
|
"\n",
|
|
" ws.close = function() {\n",
|
|
" comm.close()\n",
|
|
" };\n",
|
|
" ws.send = function(m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function(msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data'])\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = $(\"#\" + id);\n",
|
|
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
|
"\n",
|
|
" function ondownload(figure, format) {\n",
|
|
" window.open(figure.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fig = new mpl.figure(id, ws_proxy,\n",
|
|
" ondownload,\n",
|
|
" element.get(0));\n",
|
|
"\n",
|
|
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
|
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
|
" ws_proxy.onopen();\n",
|
|
"\n",
|
|
" fig.parent_element = element.get(0);\n",
|
|
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
|
" if (!fig.cell_info) {\n",
|
|
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var output_index = fig.cell_info[2]\n",
|
|
" var cell = fig.cell_info[0];\n",
|
|
"\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
|
" var width = fig.canvas.width/mpl.ratio\n",
|
|
" fig.root.unbind('remove')\n",
|
|
"\n",
|
|
" // Update the output cell to use the data from the current canvas.\n",
|
|
" fig.push_to_output();\n",
|
|
" var dataURL = fig.canvas.toDataURL();\n",
|
|
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
|
" // the notebook keyboard shortcuts fail.\n",
|
|
" IPython.keyboard_manager.enable()\n",
|
|
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
|
" fig.close_ws(fig, msg);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
|
" fig.send_message('closing', msg);\n",
|
|
" // fig.ws.close()\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
|
" // Turn the data on the canvas into data in the output cell.\n",
|
|
" var width = this.canvas.width/mpl.ratio\n",
|
|
" var dataURL = this.canvas.toDataURL();\n",
|
|
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Tell IPython that the notebook contents must change.\n",
|
|
" IPython.notebook.set_dirty(true);\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
" var fig = this;\n",
|
|
" // Wait a second, then push the new image to the DOM so\n",
|
|
" // that it is saved nicely (might be nice to debounce this).\n",
|
|
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>')\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) { continue; };\n",
|
|
"\n",
|
|
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add the status bar.\n",
|
|
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"\n",
|
|
" // Add the close button to the window.\n",
|
|
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
|
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
|
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
|
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
|
" buttongrp.append(button);\n",
|
|
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
|
" titlebar.prepend(buttongrp);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
|
" var fig = this\n",
|
|
" el.on(\"remove\", function(){\n",
|
|
"\tfig.close_ws(fig, {});\n",
|
|
" });\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
|
" // this is important to make the div 'focusable\n",
|
|
" el.attr('tabindex', 0)\n",
|
|
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
|
" // off when our div gets focus\n",
|
|
"\n",
|
|
" // location in version 3\n",
|
|
" if (IPython.notebook.keyboard_manager) {\n",
|
|
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
" else {\n",
|
|
" // location in version 2\n",
|
|
" IPython.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" var manager = IPython.notebook.keyboard_manager;\n",
|
|
" if (!manager)\n",
|
|
" manager = IPython.keyboard_manager;\n",
|
|
"\n",
|
|
" // Check for shift+enter\n",
|
|
" if (event.shiftKey && event.which == 13) {\n",
|
|
" this.canvas_div.blur();\n",
|
|
" event.shiftKey = false;\n",
|
|
" // Send a \"J\" for go to next cell\n",
|
|
" event.which = 74;\n",
|
|
" event.keyCode = 74;\n",
|
|
" manager.command_mode();\n",
|
|
" manager.handle_keydown(event);\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" fig.ondownload(fig, null);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.find_output_cell = function(html_output) {\n",
|
|
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
|
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
|
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
|
" // our purposes (turning an active figure into a static one), is too late.\n",
|
|
" var cells = IPython.notebook.get_cells();\n",
|
|
" var ncells = cells.length;\n",
|
|
" for (var i=0; i<ncells; i++) {\n",
|
|
" var cell = cells[i];\n",
|
|
" if (cell.cell_type === 'code'){\n",
|
|
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
|
" var data = cell.output_area.outputs[j];\n",
|
|
" if (data.data) {\n",
|
|
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
|
" data = data.data;\n",
|
|
" }\n",
|
|
" if (data['text/html'] == html_output) {\n",
|
|
" return [cell, data, j];\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"// Register the function which deals with the matplotlib target/channel.\n",
|
|
"// The kernel may be null if the page has been refreshed.\n",
|
|
"if (IPython.notebook.kernel != null) {\n",
|
|
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
|
"}\n"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.Javascript object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<img src=\"data:image/png;base64,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\" width=\"639.9999861283738\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"application/javascript": [
|
|
"/* Put everything inside the global mpl namespace */\n",
|
|
"window.mpl = {};\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.get_websocket_type = function() {\n",
|
|
" if (typeof(WebSocket) !== 'undefined') {\n",
|
|
" return WebSocket;\n",
|
|
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
|
" return MozWebSocket;\n",
|
|
" } else {\n",
|
|
" alert('Your browser does not have WebSocket support.' +\n",
|
|
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
|
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
|
" 'have to enable WebSockets in about:config.');\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
|
" this.id = figure_id;\n",
|
|
"\n",
|
|
" this.ws = websocket;\n",
|
|
"\n",
|
|
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
|
"\n",
|
|
" if (!this.supports_binary) {\n",
|
|
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
|
" if (warnings) {\n",
|
|
" warnings.style.display = 'block';\n",
|
|
" warnings.textContent = (\n",
|
|
" \"This browser does not support binary websocket messages. \" +\n",
|
|
" \"Performance may be slow.\");\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj = new Image();\n",
|
|
"\n",
|
|
" this.context = undefined;\n",
|
|
" this.message = undefined;\n",
|
|
" this.canvas = undefined;\n",
|
|
" this.rubberband_canvas = undefined;\n",
|
|
" this.rubberband_context = undefined;\n",
|
|
" this.format_dropdown = undefined;\n",
|
|
"\n",
|
|
" this.image_mode = 'full';\n",
|
|
"\n",
|
|
" this.root = $('<div/>');\n",
|
|
" this._root_extra_style(this.root)\n",
|
|
" this.root.attr('style', 'display: inline-block');\n",
|
|
"\n",
|
|
" $(parent_element).append(this.root);\n",
|
|
"\n",
|
|
" this._init_header(this);\n",
|
|
" this._init_canvas(this);\n",
|
|
" this._init_toolbar(this);\n",
|
|
"\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" this.waiting = false;\n",
|
|
"\n",
|
|
" this.ws.onopen = function () {\n",
|
|
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
|
" fig.send_message(\"send_image_mode\", {});\n",
|
|
" if (mpl.ratio != 1) {\n",
|
|
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
|
" }\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj.onload = function() {\n",
|
|
" if (fig.image_mode == 'full') {\n",
|
|
" // Full images could contain transparency (where diff images\n",
|
|
" // almost always do), so we need to clear the canvas so that\n",
|
|
" // there is no ghosting.\n",
|
|
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
" }\n",
|
|
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
|
" };\n",
|
|
"\n",
|
|
" this.imageObj.onunload = function() {\n",
|
|
" fig.ws.close();\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
|
"\n",
|
|
" this.ondownload = ondownload;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_header = function() {\n",
|
|
" var titlebar = $(\n",
|
|
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
|
" 'ui-helper-clearfix\"/>');\n",
|
|
" var titletext = $(\n",
|
|
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
|
" 'text-align: center; padding: 3px;\"/>');\n",
|
|
" titlebar.append(titletext)\n",
|
|
" this.root.append(titlebar);\n",
|
|
" this.header = titletext[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_canvas = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var canvas_div = $('<div/>');\n",
|
|
"\n",
|
|
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
|
"\n",
|
|
" function canvas_keyboard_event(event) {\n",
|
|
" return fig.key_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
|
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
|
" this.canvas_div = canvas_div\n",
|
|
" this._canvas_extra_style(canvas_div)\n",
|
|
" this.root.append(canvas_div);\n",
|
|
"\n",
|
|
" var canvas = $('<canvas/>');\n",
|
|
" canvas.addClass('mpl-canvas');\n",
|
|
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
|
"\n",
|
|
" this.canvas = canvas[0];\n",
|
|
" this.context = canvas[0].getContext(\"2d\");\n",
|
|
"\n",
|
|
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
|
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
|
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
|
"\tthis.context.msBackingStorePixelRatio ||\n",
|
|
"\tthis.context.oBackingStorePixelRatio ||\n",
|
|
"\tthis.context.backingStorePixelRatio || 1;\n",
|
|
"\n",
|
|
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
|
"\n",
|
|
" var rubberband = $('<canvas/>');\n",
|
|
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
|
"\n",
|
|
" var pass_mouse_events = true;\n",
|
|
"\n",
|
|
" canvas_div.resizable({\n",
|
|
" start: function(event, ui) {\n",
|
|
" pass_mouse_events = false;\n",
|
|
" },\n",
|
|
" resize: function(event, ui) {\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" stop: function(event, ui) {\n",
|
|
" pass_mouse_events = true;\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" });\n",
|
|
"\n",
|
|
" function mouse_event_fn(event) {\n",
|
|
" if (pass_mouse_events)\n",
|
|
" return fig.mouse_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
|
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
|
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
|
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
|
"\n",
|
|
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
|
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
|
"\n",
|
|
" canvas_div.on(\"wheel\", function (event) {\n",
|
|
" event = event.originalEvent;\n",
|
|
" event['data'] = 'scroll'\n",
|
|
" if (event.deltaY < 0) {\n",
|
|
" event.step = 1;\n",
|
|
" } else {\n",
|
|
" event.step = -1;\n",
|
|
" }\n",
|
|
" mouse_event_fn(event);\n",
|
|
" });\n",
|
|
"\n",
|
|
" canvas_div.append(canvas);\n",
|
|
" canvas_div.append(rubberband);\n",
|
|
"\n",
|
|
" this.rubberband = rubberband;\n",
|
|
" this.rubberband_canvas = rubberband[0];\n",
|
|
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
|
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
|
"\n",
|
|
" this._resize_canvas = function(width, height) {\n",
|
|
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
|
" // canvas in synch.\n",
|
|
" canvas_div.css('width', width)\n",
|
|
" canvas_div.css('height', height)\n",
|
|
"\n",
|
|
" canvas.attr('width', width * mpl.ratio);\n",
|
|
" canvas.attr('height', height * mpl.ratio);\n",
|
|
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
|
"\n",
|
|
" rubberband.attr('width', width);\n",
|
|
" rubberband.attr('height', height);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
|
" // upon first draw.\n",
|
|
" this._resize_canvas(600, 600);\n",
|
|
"\n",
|
|
" // Disable right mouse context menu.\n",
|
|
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
|
" return false;\n",
|
|
" });\n",
|
|
"\n",
|
|
" function set_focus () {\n",
|
|
" canvas.focus();\n",
|
|
" canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" window.setTimeout(set_focus, 100);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>')\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) {\n",
|
|
" // put a spacer in here.\n",
|
|
" continue;\n",
|
|
" }\n",
|
|
" var button = $('<button/>');\n",
|
|
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
|
" 'ui-button-icon-only');\n",
|
|
" button.attr('role', 'button');\n",
|
|
" button.attr('aria-disabled', 'false');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
"\n",
|
|
" var icon_img = $('<span/>');\n",
|
|
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
|
" icon_img.addClass(image);\n",
|
|
" icon_img.addClass('ui-corner-all');\n",
|
|
"\n",
|
|
" var tooltip_span = $('<span/>');\n",
|
|
" tooltip_span.addClass('ui-button-text');\n",
|
|
" tooltip_span.html(tooltip);\n",
|
|
"\n",
|
|
" button.append(icon_img);\n",
|
|
" button.append(tooltip_span);\n",
|
|
"\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fmt_picker_span = $('<span/>');\n",
|
|
"\n",
|
|
" var fmt_picker = $('<select/>');\n",
|
|
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
|
" fmt_picker_span.append(fmt_picker);\n",
|
|
" nav_element.append(fmt_picker_span);\n",
|
|
" this.format_dropdown = fmt_picker[0];\n",
|
|
"\n",
|
|
" for (var ind in mpl.extensions) {\n",
|
|
" var fmt = mpl.extensions[ind];\n",
|
|
" var option = $(\n",
|
|
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
|
" fmt_picker.append(option)\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add hover states to the ui-buttons\n",
|
|
" $( \".ui-button\" ).hover(\n",
|
|
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
|
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
|
" );\n",
|
|
"\n",
|
|
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
|
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
|
" // which will in turn request a refresh of the image.\n",
|
|
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
|
" properties['type'] = type;\n",
|
|
" properties['figure_id'] = this.id;\n",
|
|
" this.ws.send(JSON.stringify(properties));\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_draw_message = function() {\n",
|
|
" if (!this.waiting) {\n",
|
|
" this.waiting = true;\n",
|
|
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" var format_dropdown = fig.format_dropdown;\n",
|
|
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
|
" fig.ondownload(fig, format);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
|
" var size = msg['size'];\n",
|
|
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
|
" fig._resize_canvas(size[0], size[1]);\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
|
" var x0 = msg['x0'] / mpl.ratio;\n",
|
|
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
|
" var x1 = msg['x1'] / mpl.ratio;\n",
|
|
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
|
" x0 = Math.floor(x0) + 0.5;\n",
|
|
" y0 = Math.floor(y0) + 0.5;\n",
|
|
" x1 = Math.floor(x1) + 0.5;\n",
|
|
" y1 = Math.floor(y1) + 0.5;\n",
|
|
" var min_x = Math.min(x0, x1);\n",
|
|
" var min_y = Math.min(y0, y1);\n",
|
|
" var width = Math.abs(x1 - x0);\n",
|
|
" var height = Math.abs(y1 - y0);\n",
|
|
"\n",
|
|
" fig.rubberband_context.clearRect(\n",
|
|
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
"\n",
|
|
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
|
" // Updates the figure title.\n",
|
|
" fig.header.textContent = msg['label'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
|
" var cursor = msg['cursor'];\n",
|
|
" switch(cursor)\n",
|
|
" {\n",
|
|
" case 0:\n",
|
|
" cursor = 'pointer';\n",
|
|
" break;\n",
|
|
" case 1:\n",
|
|
" cursor = 'default';\n",
|
|
" break;\n",
|
|
" case 2:\n",
|
|
" cursor = 'crosshair';\n",
|
|
" break;\n",
|
|
" case 3:\n",
|
|
" cursor = 'move';\n",
|
|
" break;\n",
|
|
" }\n",
|
|
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
|
" fig.message.textContent = msg['message'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
|
" // Request the server to send over a new figure.\n",
|
|
" fig.send_draw_message();\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
|
" fig.image_mode = msg['mode'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Called whenever the canvas gets updated.\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"// A function to construct a web socket function for onmessage handling.\n",
|
|
"// Called in the figure constructor.\n",
|
|
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
|
" return function socket_on_message(evt) {\n",
|
|
" if (evt.data instanceof Blob) {\n",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = \"image/png\";\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data);\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
|
" fig.imageObj.src = evt.data;\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var msg = JSON.parse(evt.data);\n",
|
|
" var msg_type = msg['type'];\n",
|
|
"\n",
|
|
" // Call the \"handle_{type}\" callback, which takes\n",
|
|
" // the figure and JSON message as its only arguments.\n",
|
|
" try {\n",
|
|
" var callback = fig[\"handle_\" + msg_type];\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (callback) {\n",
|
|
" try {\n",
|
|
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
|
" callback(fig, msg);\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
|
" }\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
|
"mpl.findpos = function(e) {\n",
|
|
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
|
" var targ;\n",
|
|
" if (!e)\n",
|
|
" e = window.event;\n",
|
|
" if (e.target)\n",
|
|
" targ = e.target;\n",
|
|
" else if (e.srcElement)\n",
|
|
" targ = e.srcElement;\n",
|
|
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
|
" targ = targ.parentNode;\n",
|
|
"\n",
|
|
" // jQuery normalizes the pageX and pageY\n",
|
|
" // pageX,Y are the mouse positions relative to the document\n",
|
|
" // offset() returns the position of the element relative to the document\n",
|
|
" var x = e.pageX - $(targ).offset().left;\n",
|
|
" var y = e.pageY - $(targ).offset().top;\n",
|
|
"\n",
|
|
" return {\"x\": x, \"y\": y};\n",
|
|
"};\n",
|
|
"\n",
|
|
"/*\n",
|
|
" * return a copy of an object with only non-object keys\n",
|
|
" * we need this to avoid circular references\n",
|
|
" * http://stackoverflow.com/a/24161582/3208463\n",
|
|
" */\n",
|
|
"function simpleKeys (original) {\n",
|
|
" return Object.keys(original).reduce(function (obj, key) {\n",
|
|
" if (typeof original[key] !== 'object')\n",
|
|
" obj[key] = original[key]\n",
|
|
" return obj;\n",
|
|
" }, {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
|
" var canvas_pos = mpl.findpos(event)\n",
|
|
"\n",
|
|
" if (name === 'button_press')\n",
|
|
" {\n",
|
|
" this.canvas.focus();\n",
|
|
" this.canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" var x = canvas_pos.x * mpl.ratio;\n",
|
|
" var y = canvas_pos.y * mpl.ratio;\n",
|
|
"\n",
|
|
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
|
" step: event.step,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
"\n",
|
|
" /* This prevents the web browser from automatically changing to\n",
|
|
" * the text insertion cursor when the button is pressed. We want\n",
|
|
" * to control all of the cursor setting manually through the\n",
|
|
" * 'cursor' event from matplotlib */\n",
|
|
" event.preventDefault();\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" // Handle any extra behaviour associated with a key event\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
|
"\n",
|
|
" // Prevent repeat events\n",
|
|
" if (name == 'key_press')\n",
|
|
" {\n",
|
|
" if (event.which === this._key)\n",
|
|
" return;\n",
|
|
" else\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" if (name == 'key_release')\n",
|
|
" this._key = null;\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which != 17)\n",
|
|
" value += \"ctrl+\";\n",
|
|
" if (event.altKey && event.which != 18)\n",
|
|
" value += \"alt+\";\n",
|
|
" if (event.shiftKey && event.which != 16)\n",
|
|
" value += \"shift+\";\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, {key: value,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
|
" if (name == 'download') {\n",
|
|
" this.handle_save(this, null);\n",
|
|
" } else {\n",
|
|
" this.send_message(\"toolbar_button\", {name: name});\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
|
" this.message.textContent = tooltip;\n",
|
|
"};\n",
|
|
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
|
"\n",
|
|
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
|
"\n",
|
|
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
|
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
|
" // object with the appropriate methods. Currently this is a non binary\n",
|
|
" // socket, so there is still some room for performance tuning.\n",
|
|
" var ws = {};\n",
|
|
"\n",
|
|
" ws.close = function() {\n",
|
|
" comm.close()\n",
|
|
" };\n",
|
|
" ws.send = function(m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function(msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data'])\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = $(\"#\" + id);\n",
|
|
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
|
"\n",
|
|
" function ondownload(figure, format) {\n",
|
|
" window.open(figure.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fig = new mpl.figure(id, ws_proxy,\n",
|
|
" ondownload,\n",
|
|
" element.get(0));\n",
|
|
"\n",
|
|
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
|
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
|
" ws_proxy.onopen();\n",
|
|
"\n",
|
|
" fig.parent_element = element.get(0);\n",
|
|
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
|
" if (!fig.cell_info) {\n",
|
|
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var output_index = fig.cell_info[2]\n",
|
|
" var cell = fig.cell_info[0];\n",
|
|
"\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
|
" var width = fig.canvas.width/mpl.ratio\n",
|
|
" fig.root.unbind('remove')\n",
|
|
"\n",
|
|
" // Update the output cell to use the data from the current canvas.\n",
|
|
" fig.push_to_output();\n",
|
|
" var dataURL = fig.canvas.toDataURL();\n",
|
|
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
|
" // the notebook keyboard shortcuts fail.\n",
|
|
" IPython.keyboard_manager.enable()\n",
|
|
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
|
" fig.close_ws(fig, msg);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
|
" fig.send_message('closing', msg);\n",
|
|
" // fig.ws.close()\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
|
" // Turn the data on the canvas into data in the output cell.\n",
|
|
" var width = this.canvas.width/mpl.ratio\n",
|
|
" var dataURL = this.canvas.toDataURL();\n",
|
|
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Tell IPython that the notebook contents must change.\n",
|
|
" IPython.notebook.set_dirty(true);\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
" var fig = this;\n",
|
|
" // Wait a second, then push the new image to the DOM so\n",
|
|
" // that it is saved nicely (might be nice to debounce this).\n",
|
|
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>')\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) { continue; };\n",
|
|
"\n",
|
|
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add the status bar.\n",
|
|
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"\n",
|
|
" // Add the close button to the window.\n",
|
|
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
|
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
|
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
|
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
|
" buttongrp.append(button);\n",
|
|
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
|
" titlebar.prepend(buttongrp);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
|
" var fig = this\n",
|
|
" el.on(\"remove\", function(){\n",
|
|
"\tfig.close_ws(fig, {});\n",
|
|
" });\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
|
" // this is important to make the div 'focusable\n",
|
|
" el.attr('tabindex', 0)\n",
|
|
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
|
" // off when our div gets focus\n",
|
|
"\n",
|
|
" // location in version 3\n",
|
|
" if (IPython.notebook.keyboard_manager) {\n",
|
|
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
" else {\n",
|
|
" // location in version 2\n",
|
|
" IPython.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" var manager = IPython.notebook.keyboard_manager;\n",
|
|
" if (!manager)\n",
|
|
" manager = IPython.keyboard_manager;\n",
|
|
"\n",
|
|
" // Check for shift+enter\n",
|
|
" if (event.shiftKey && event.which == 13) {\n",
|
|
" this.canvas_div.blur();\n",
|
|
" event.shiftKey = false;\n",
|
|
" // Send a \"J\" for go to next cell\n",
|
|
" event.which = 74;\n",
|
|
" event.keyCode = 74;\n",
|
|
" manager.command_mode();\n",
|
|
" manager.handle_keydown(event);\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" fig.ondownload(fig, null);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.find_output_cell = function(html_output) {\n",
|
|
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
|
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
|
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
|
" // our purposes (turning an active figure into a static one), is too late.\n",
|
|
" var cells = IPython.notebook.get_cells();\n",
|
|
" var ncells = cells.length;\n",
|
|
" for (var i=0; i<ncells; i++) {\n",
|
|
" var cell = cells[i];\n",
|
|
" if (cell.cell_type === 'code'){\n",
|
|
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
|
" var data = cell.output_area.outputs[j];\n",
|
|
" if (data.data) {\n",
|
|
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
|
" data = data.data;\n",
|
|
" }\n",
|
|
" if (data['text/html'] == html_output) {\n",
|
|
" return [cell, data, j];\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"// Register the function which deals with the matplotlib target/channel.\n",
|
|
"// The kernel may be null if the page has been refreshed.\n",
|
|
"if (IPython.notebook.kernel != null) {\n",
|
|
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
|
"}\n"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.Javascript object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsAAAAIQCAYAAACPEdjAAAAgAElEQVR4XuzdCZhcVZ3+8fdUpyUYxaCAMsiion9wxUFGRx3FjXFDQ1K3gokLIsQZBmfElXUIcd/QUUBAxciWpE4ZEUZxnEEjKuLCiAqO4rgLCIEEFUygkzr/59feyhRFV/epk77dVXW/93l8JN3n3Lr1Oae73/71uec6cSCAAAIIIIAAAgggUCIBV6L3yltFAAEEEEAAAQQQQEAEYCYBAggggAACCCCAQKkECMClGm7eLAIIIIAAAggggAABmDmAAAIIIIAAAgggUCoBAnCphps3iwACCCCAAAIIIEAAZg4ggAACCCCAAAIIlEqAAFyq4ebNIoAAAggggAACCBCAmQMIIIAAAggggAACpRIgAJdquHmzCCCAAAIIIIAAAgRg5gACCCCAAAIIIIBAqQQIwKUabt4sAggggAACCCCAAAGYOYAAAggggAACCCBQKgECcKmGmzeLAAIIIIAAAgggQABmDiCAAAIIIIAAAgiUSoAAXKrh5s0igAACCCCAAAIIEICZAwgggAACCCCAAAKlEiAAl2q4ebMIIIAAAggggAACBGDmAAIIIIAAAggggECpBAjApRpu3iwCCCCAAAIIIIAAAZg5gAACCCCAAAIIIFAqAQJwqYabN4sAAggggAACCCBAAGYOIIAAAggggAACCJRKgABcquHmzSKAAAIIIIAAAggQgJkDCCCAAAIIIIAAAqUSIACXarh5swgggAACCCCAAAIEYOYAAggggAACCCCAQKkECMClGm7eLAIIIIAAAggggAABmDmAAAIIIIAAAgggUCoBAnCphps3iwACCCCAAAIIIEAAZg4ggAACCCCAAAIIlEqAAFyq4ebNIoAAAggggAACCBCAmQMIIIAAAggggAACpRIgAJdquHmzCCCAAAIIIIAAAgRg5gACCCCAAAIIIIBAqQQIwKUabt4sAggggAACCCCAAAGYOYAAAggggAACCCBQKgECcKmGmzeLAAIIIIAAAgggQABmDiCAQJkEjpD0aUmfkWT/vb3HwZK+Kulrkuy/ORBAAAEEBkCAADwAg8QlIoDAtAn0SwDeR9IvJf1akv03BwIIIIDADAoQgGcQm5dCAIFZF3iQpN0l/UHSzdNwNakVYALwNOBzCgQQQCBVgACcKkc/BBBA4C/L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\" width=\"639.9999861283738\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"application/javascript": [
|
|
"/* Put everything inside the global mpl namespace */\n",
|
|
"window.mpl = {};\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.get_websocket_type = function() {\n",
|
|
" if (typeof(WebSocket) !== 'undefined') {\n",
|
|
" return WebSocket;\n",
|
|
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
|
" return MozWebSocket;\n",
|
|
" } else {\n",
|
|
" alert('Your browser does not have WebSocket support.' +\n",
|
|
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
|
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
|
" 'have to enable WebSockets in about:config.');\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
|
" this.id = figure_id;\n",
|
|
"\n",
|
|
" this.ws = websocket;\n",
|
|
"\n",
|
|
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
|
"\n",
|
|
" if (!this.supports_binary) {\n",
|
|
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
|
" if (warnings) {\n",
|
|
" warnings.style.display = 'block';\n",
|
|
" warnings.textContent = (\n",
|
|
" \"This browser does not support binary websocket messages. \" +\n",
|
|
" \"Performance may be slow.\");\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj = new Image();\n",
|
|
"\n",
|
|
" this.context = undefined;\n",
|
|
" this.message = undefined;\n",
|
|
" this.canvas = undefined;\n",
|
|
" this.rubberband_canvas = undefined;\n",
|
|
" this.rubberband_context = undefined;\n",
|
|
" this.format_dropdown = undefined;\n",
|
|
"\n",
|
|
" this.image_mode = 'full';\n",
|
|
"\n",
|
|
" this.root = $('<div/>');\n",
|
|
" this._root_extra_style(this.root)\n",
|
|
" this.root.attr('style', 'display: inline-block');\n",
|
|
"\n",
|
|
" $(parent_element).append(this.root);\n",
|
|
"\n",
|
|
" this._init_header(this);\n",
|
|
" this._init_canvas(this);\n",
|
|
" this._init_toolbar(this);\n",
|
|
"\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" this.waiting = false;\n",
|
|
"\n",
|
|
" this.ws.onopen = function () {\n",
|
|
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
|
" fig.send_message(\"send_image_mode\", {});\n",
|
|
" if (mpl.ratio != 1) {\n",
|
|
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
|
" }\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj.onload = function() {\n",
|
|
" if (fig.image_mode == 'full') {\n",
|
|
" // Full images could contain transparency (where diff images\n",
|
|
" // almost always do), so we need to clear the canvas so that\n",
|
|
" // there is no ghosting.\n",
|
|
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
" }\n",
|
|
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
|
" };\n",
|
|
"\n",
|
|
" this.imageObj.onunload = function() {\n",
|
|
" fig.ws.close();\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
|
"\n",
|
|
" this.ondownload = ondownload;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_header = function() {\n",
|
|
" var titlebar = $(\n",
|
|
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
|
" 'ui-helper-clearfix\"/>');\n",
|
|
" var titletext = $(\n",
|
|
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
|
" 'text-align: center; padding: 3px;\"/>');\n",
|
|
" titlebar.append(titletext)\n",
|
|
" this.root.append(titlebar);\n",
|
|
" this.header = titletext[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_canvas = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var canvas_div = $('<div/>');\n",
|
|
"\n",
|
|
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
|
"\n",
|
|
" function canvas_keyboard_event(event) {\n",
|
|
" return fig.key_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
|
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
|
" this.canvas_div = canvas_div\n",
|
|
" this._canvas_extra_style(canvas_div)\n",
|
|
" this.root.append(canvas_div);\n",
|
|
"\n",
|
|
" var canvas = $('<canvas/>');\n",
|
|
" canvas.addClass('mpl-canvas');\n",
|
|
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
|
"\n",
|
|
" this.canvas = canvas[0];\n",
|
|
" this.context = canvas[0].getContext(\"2d\");\n",
|
|
"\n",
|
|
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
|
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
|
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
|
"\tthis.context.msBackingStorePixelRatio ||\n",
|
|
"\tthis.context.oBackingStorePixelRatio ||\n",
|
|
"\tthis.context.backingStorePixelRatio || 1;\n",
|
|
"\n",
|
|
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
|
"\n",
|
|
" var rubberband = $('<canvas/>');\n",
|
|
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
|
"\n",
|
|
" var pass_mouse_events = true;\n",
|
|
"\n",
|
|
" canvas_div.resizable({\n",
|
|
" start: function(event, ui) {\n",
|
|
" pass_mouse_events = false;\n",
|
|
" },\n",
|
|
" resize: function(event, ui) {\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" stop: function(event, ui) {\n",
|
|
" pass_mouse_events = true;\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" });\n",
|
|
"\n",
|
|
" function mouse_event_fn(event) {\n",
|
|
" if (pass_mouse_events)\n",
|
|
" return fig.mouse_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
|
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
|
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
|
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
|
"\n",
|
|
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
|
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
|
"\n",
|
|
" canvas_div.on(\"wheel\", function (event) {\n",
|
|
" event = event.originalEvent;\n",
|
|
" event['data'] = 'scroll'\n",
|
|
" if (event.deltaY < 0) {\n",
|
|
" event.step = 1;\n",
|
|
" } else {\n",
|
|
" event.step = -1;\n",
|
|
" }\n",
|
|
" mouse_event_fn(event);\n",
|
|
" });\n",
|
|
"\n",
|
|
" canvas_div.append(canvas);\n",
|
|
" canvas_div.append(rubberband);\n",
|
|
"\n",
|
|
" this.rubberband = rubberband;\n",
|
|
" this.rubberband_canvas = rubberband[0];\n",
|
|
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
|
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
|
"\n",
|
|
" this._resize_canvas = function(width, height) {\n",
|
|
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
|
" // canvas in synch.\n",
|
|
" canvas_div.css('width', width)\n",
|
|
" canvas_div.css('height', height)\n",
|
|
"\n",
|
|
" canvas.attr('width', width * mpl.ratio);\n",
|
|
" canvas.attr('height', height * mpl.ratio);\n",
|
|
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
|
"\n",
|
|
" rubberband.attr('width', width);\n",
|
|
" rubberband.attr('height', height);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
|
" // upon first draw.\n",
|
|
" this._resize_canvas(600, 600);\n",
|
|
"\n",
|
|
" // Disable right mouse context menu.\n",
|
|
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
|
" return false;\n",
|
|
" });\n",
|
|
"\n",
|
|
" function set_focus () {\n",
|
|
" canvas.focus();\n",
|
|
" canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" window.setTimeout(set_focus, 100);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>')\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) {\n",
|
|
" // put a spacer in here.\n",
|
|
" continue;\n",
|
|
" }\n",
|
|
" var button = $('<button/>');\n",
|
|
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
|
" 'ui-button-icon-only');\n",
|
|
" button.attr('role', 'button');\n",
|
|
" button.attr('aria-disabled', 'false');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
"\n",
|
|
" var icon_img = $('<span/>');\n",
|
|
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
|
" icon_img.addClass(image);\n",
|
|
" icon_img.addClass('ui-corner-all');\n",
|
|
"\n",
|
|
" var tooltip_span = $('<span/>');\n",
|
|
" tooltip_span.addClass('ui-button-text');\n",
|
|
" tooltip_span.html(tooltip);\n",
|
|
"\n",
|
|
" button.append(icon_img);\n",
|
|
" button.append(tooltip_span);\n",
|
|
"\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fmt_picker_span = $('<span/>');\n",
|
|
"\n",
|
|
" var fmt_picker = $('<select/>');\n",
|
|
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
|
" fmt_picker_span.append(fmt_picker);\n",
|
|
" nav_element.append(fmt_picker_span);\n",
|
|
" this.format_dropdown = fmt_picker[0];\n",
|
|
"\n",
|
|
" for (var ind in mpl.extensions) {\n",
|
|
" var fmt = mpl.extensions[ind];\n",
|
|
" var option = $(\n",
|
|
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
|
" fmt_picker.append(option)\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add hover states to the ui-buttons\n",
|
|
" $( \".ui-button\" ).hover(\n",
|
|
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
|
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
|
" );\n",
|
|
"\n",
|
|
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
|
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
|
" // which will in turn request a refresh of the image.\n",
|
|
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
|
" properties['type'] = type;\n",
|
|
" properties['figure_id'] = this.id;\n",
|
|
" this.ws.send(JSON.stringify(properties));\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_draw_message = function() {\n",
|
|
" if (!this.waiting) {\n",
|
|
" this.waiting = true;\n",
|
|
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" var format_dropdown = fig.format_dropdown;\n",
|
|
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
|
" fig.ondownload(fig, format);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
|
" var size = msg['size'];\n",
|
|
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
|
" fig._resize_canvas(size[0], size[1]);\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
|
" var x0 = msg['x0'] / mpl.ratio;\n",
|
|
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
|
" var x1 = msg['x1'] / mpl.ratio;\n",
|
|
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
|
" x0 = Math.floor(x0) + 0.5;\n",
|
|
" y0 = Math.floor(y0) + 0.5;\n",
|
|
" x1 = Math.floor(x1) + 0.5;\n",
|
|
" y1 = Math.floor(y1) + 0.5;\n",
|
|
" var min_x = Math.min(x0, x1);\n",
|
|
" var min_y = Math.min(y0, y1);\n",
|
|
" var width = Math.abs(x1 - x0);\n",
|
|
" var height = Math.abs(y1 - y0);\n",
|
|
"\n",
|
|
" fig.rubberband_context.clearRect(\n",
|
|
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
"\n",
|
|
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
|
" // Updates the figure title.\n",
|
|
" fig.header.textContent = msg['label'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
|
" var cursor = msg['cursor'];\n",
|
|
" switch(cursor)\n",
|
|
" {\n",
|
|
" case 0:\n",
|
|
" cursor = 'pointer';\n",
|
|
" break;\n",
|
|
" case 1:\n",
|
|
" cursor = 'default';\n",
|
|
" break;\n",
|
|
" case 2:\n",
|
|
" cursor = 'crosshair';\n",
|
|
" break;\n",
|
|
" case 3:\n",
|
|
" cursor = 'move';\n",
|
|
" break;\n",
|
|
" }\n",
|
|
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
|
" fig.message.textContent = msg['message'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
|
" // Request the server to send over a new figure.\n",
|
|
" fig.send_draw_message();\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
|
" fig.image_mode = msg['mode'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Called whenever the canvas gets updated.\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"// A function to construct a web socket function for onmessage handling.\n",
|
|
"// Called in the figure constructor.\n",
|
|
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
|
" return function socket_on_message(evt) {\n",
|
|
" if (evt.data instanceof Blob) {\n",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = \"image/png\";\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data);\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
|
" fig.imageObj.src = evt.data;\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var msg = JSON.parse(evt.data);\n",
|
|
" var msg_type = msg['type'];\n",
|
|
"\n",
|
|
" // Call the \"handle_{type}\" callback, which takes\n",
|
|
" // the figure and JSON message as its only arguments.\n",
|
|
" try {\n",
|
|
" var callback = fig[\"handle_\" + msg_type];\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (callback) {\n",
|
|
" try {\n",
|
|
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
|
" callback(fig, msg);\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
|
" }\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
|
"mpl.findpos = function(e) {\n",
|
|
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
|
" var targ;\n",
|
|
" if (!e)\n",
|
|
" e = window.event;\n",
|
|
" if (e.target)\n",
|
|
" targ = e.target;\n",
|
|
" else if (e.srcElement)\n",
|
|
" targ = e.srcElement;\n",
|
|
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
|
" targ = targ.parentNode;\n",
|
|
"\n",
|
|
" // jQuery normalizes the pageX and pageY\n",
|
|
" // pageX,Y are the mouse positions relative to the document\n",
|
|
" // offset() returns the position of the element relative to the document\n",
|
|
" var x = e.pageX - $(targ).offset().left;\n",
|
|
" var y = e.pageY - $(targ).offset().top;\n",
|
|
"\n",
|
|
" return {\"x\": x, \"y\": y};\n",
|
|
"};\n",
|
|
"\n",
|
|
"/*\n",
|
|
" * return a copy of an object with only non-object keys\n",
|
|
" * we need this to avoid circular references\n",
|
|
" * http://stackoverflow.com/a/24161582/3208463\n",
|
|
" */\n",
|
|
"function simpleKeys (original) {\n",
|
|
" return Object.keys(original).reduce(function (obj, key) {\n",
|
|
" if (typeof original[key] !== 'object')\n",
|
|
" obj[key] = original[key]\n",
|
|
" return obj;\n",
|
|
" }, {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
|
" var canvas_pos = mpl.findpos(event)\n",
|
|
"\n",
|
|
" if (name === 'button_press')\n",
|
|
" {\n",
|
|
" this.canvas.focus();\n",
|
|
" this.canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" var x = canvas_pos.x * mpl.ratio;\n",
|
|
" var y = canvas_pos.y * mpl.ratio;\n",
|
|
"\n",
|
|
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
|
" step: event.step,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
"\n",
|
|
" /* This prevents the web browser from automatically changing to\n",
|
|
" * the text insertion cursor when the button is pressed. We want\n",
|
|
" * to control all of the cursor setting manually through the\n",
|
|
" * 'cursor' event from matplotlib */\n",
|
|
" event.preventDefault();\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" // Handle any extra behaviour associated with a key event\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
|
"\n",
|
|
" // Prevent repeat events\n",
|
|
" if (name == 'key_press')\n",
|
|
" {\n",
|
|
" if (event.which === this._key)\n",
|
|
" return;\n",
|
|
" else\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" if (name == 'key_release')\n",
|
|
" this._key = null;\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which != 17)\n",
|
|
" value += \"ctrl+\";\n",
|
|
" if (event.altKey && event.which != 18)\n",
|
|
" value += \"alt+\";\n",
|
|
" if (event.shiftKey && event.which != 16)\n",
|
|
" value += \"shift+\";\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, {key: value,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
|
" if (name == 'download') {\n",
|
|
" this.handle_save(this, null);\n",
|
|
" } else {\n",
|
|
" this.send_message(\"toolbar_button\", {name: name});\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
|
" this.message.textContent = tooltip;\n",
|
|
"};\n",
|
|
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
|
"\n",
|
|
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
|
"\n",
|
|
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
|
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
|
" // object with the appropriate methods. Currently this is a non binary\n",
|
|
" // socket, so there is still some room for performance tuning.\n",
|
|
" var ws = {};\n",
|
|
"\n",
|
|
" ws.close = function() {\n",
|
|
" comm.close()\n",
|
|
" };\n",
|
|
" ws.send = function(m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function(msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data'])\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = $(\"#\" + id);\n",
|
|
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
|
"\n",
|
|
" function ondownload(figure, format) {\n",
|
|
" window.open(figure.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fig = new mpl.figure(id, ws_proxy,\n",
|
|
" ondownload,\n",
|
|
" element.get(0));\n",
|
|
"\n",
|
|
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
|
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
|
" ws_proxy.onopen();\n",
|
|
"\n",
|
|
" fig.parent_element = element.get(0);\n",
|
|
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
|
" if (!fig.cell_info) {\n",
|
|
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var output_index = fig.cell_info[2]\n",
|
|
" var cell = fig.cell_info[0];\n",
|
|
"\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
|
" var width = fig.canvas.width/mpl.ratio\n",
|
|
" fig.root.unbind('remove')\n",
|
|
"\n",
|
|
" // Update the output cell to use the data from the current canvas.\n",
|
|
" fig.push_to_output();\n",
|
|
" var dataURL = fig.canvas.toDataURL();\n",
|
|
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
|
" // the notebook keyboard shortcuts fail.\n",
|
|
" IPython.keyboard_manager.enable()\n",
|
|
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
|
" fig.close_ws(fig, msg);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
|
" fig.send_message('closing', msg);\n",
|
|
" // fig.ws.close()\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
|
" // Turn the data on the canvas into data in the output cell.\n",
|
|
" var width = this.canvas.width/mpl.ratio\n",
|
|
" var dataURL = this.canvas.toDataURL();\n",
|
|
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Tell IPython that the notebook contents must change.\n",
|
|
" IPython.notebook.set_dirty(true);\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
" var fig = this;\n",
|
|
" // Wait a second, then push the new image to the DOM so\n",
|
|
" // that it is saved nicely (might be nice to debounce this).\n",
|
|
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>')\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) { continue; };\n",
|
|
"\n",
|
|
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add the status bar.\n",
|
|
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"\n",
|
|
" // Add the close button to the window.\n",
|
|
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
|
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
|
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
|
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
|
" buttongrp.append(button);\n",
|
|
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
|
" titlebar.prepend(buttongrp);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
|
" var fig = this\n",
|
|
" el.on(\"remove\", function(){\n",
|
|
"\tfig.close_ws(fig, {});\n",
|
|
" });\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
|
" // this is important to make the div 'focusable\n",
|
|
" el.attr('tabindex', 0)\n",
|
|
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
|
" // off when our div gets focus\n",
|
|
"\n",
|
|
" // location in version 3\n",
|
|
" if (IPython.notebook.keyboard_manager) {\n",
|
|
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
" else {\n",
|
|
" // location in version 2\n",
|
|
" IPython.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" var manager = IPython.notebook.keyboard_manager;\n",
|
|
" if (!manager)\n",
|
|
" manager = IPython.keyboard_manager;\n",
|
|
"\n",
|
|
" // Check for shift+enter\n",
|
|
" if (event.shiftKey && event.which == 13) {\n",
|
|
" this.canvas_div.blur();\n",
|
|
" event.shiftKey = false;\n",
|
|
" // Send a \"J\" for go to next cell\n",
|
|
" event.which = 74;\n",
|
|
" event.keyCode = 74;\n",
|
|
" manager.command_mode();\n",
|
|
" manager.handle_keydown(event);\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" fig.ondownload(fig, null);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.find_output_cell = function(html_output) {\n",
|
|
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
|
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
|
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
|
" // our purposes (turning an active figure into a static one), is too late.\n",
|
|
" var cells = IPython.notebook.get_cells();\n",
|
|
" var ncells = cells.length;\n",
|
|
" for (var i=0; i<ncells; i++) {\n",
|
|
" var cell = cells[i];\n",
|
|
" if (cell.cell_type === 'code'){\n",
|
|
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
|
" var data = cell.output_area.outputs[j];\n",
|
|
" if (data.data) {\n",
|
|
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
|
" data = data.data;\n",
|
|
" }\n",
|
|
" if (data['text/html'] == html_output) {\n",
|
|
" return [cell, data, j];\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"// Register the function which deals with the matplotlib target/channel.\n",
|
|
"// The kernel may be null if the page has been refreshed.\n",
|
|
"if (IPython.notebook.kernel != null) {\n",
|
|
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
|
"}\n"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.Javascript object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<img src=\"data:image/png;base64,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\" width=\"639.9999861283738\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# use test env\n",
|
|
"df_test = pd.read_hdf('./data/poloniex_30m.hf',key='test')\n",
|
|
"test_steps=5000\n",
|
|
"env_test = task_fn_test()\n",
|
|
"agent.task = env_test\n",
|
|
"agent.config.max_episode_length = test_steps\n",
|
|
"agent.task.reset()\n",
|
|
"np.random.seed(0)\n",
|
|
"\n",
|
|
"# run in deterministic mode, no training, no exploration\n",
|
|
"agent.episode(True)\n",
|
|
"agent.task.render('notebook')\n",
|
|
"agent.task.render('notebook', True)\n",
|
|
"\n",
|
|
"df = pd.DataFrame(agent.task.unwrapped.infos)\n",
|
|
"df.index = pd.to_datetime(df['date']*1e9)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T04:01:49.504199Z",
|
|
"start_time": "2018-02-18T04:01:49.467708Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T03:34:12.858016Z",
|
|
"start_time": "2018-02-18T03:34:12.772885Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 22,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T07:56:29.025682Z",
|
|
"start_time": "2018-02-18T07:56:25.704036Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/home/wassname/.pyenv/versions/3.5.3/envs/jupyter3/lib/python3.5/site-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.\n",
|
|
" from pandas.core import datetools\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"ONS\n",
|
|
"BestSoFar\n",
|
|
"RMR\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"application/javascript": [
|
|
"/* Put everything inside the global mpl namespace */\n",
|
|
"window.mpl = {};\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.get_websocket_type = function() {\n",
|
|
" if (typeof(WebSocket) !== 'undefined') {\n",
|
|
" return WebSocket;\n",
|
|
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
|
" return MozWebSocket;\n",
|
|
" } else {\n",
|
|
" alert('Your browser does not have WebSocket support.' +\n",
|
|
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
|
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
|
" 'have to enable WebSockets in about:config.');\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
|
" this.id = figure_id;\n",
|
|
"\n",
|
|
" this.ws = websocket;\n",
|
|
"\n",
|
|
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
|
"\n",
|
|
" if (!this.supports_binary) {\n",
|
|
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
|
" if (warnings) {\n",
|
|
" warnings.style.display = 'block';\n",
|
|
" warnings.textContent = (\n",
|
|
" \"This browser does not support binary websocket messages. \" +\n",
|
|
" \"Performance may be slow.\");\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj = new Image();\n",
|
|
"\n",
|
|
" this.context = undefined;\n",
|
|
" this.message = undefined;\n",
|
|
" this.canvas = undefined;\n",
|
|
" this.rubberband_canvas = undefined;\n",
|
|
" this.rubberband_context = undefined;\n",
|
|
" this.format_dropdown = undefined;\n",
|
|
"\n",
|
|
" this.image_mode = 'full';\n",
|
|
"\n",
|
|
" this.root = $('<div/>');\n",
|
|
" this._root_extra_style(this.root)\n",
|
|
" this.root.attr('style', 'display: inline-block');\n",
|
|
"\n",
|
|
" $(parent_element).append(this.root);\n",
|
|
"\n",
|
|
" this._init_header(this);\n",
|
|
" this._init_canvas(this);\n",
|
|
" this._init_toolbar(this);\n",
|
|
"\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" this.waiting = false;\n",
|
|
"\n",
|
|
" this.ws.onopen = function () {\n",
|
|
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
|
" fig.send_message(\"send_image_mode\", {});\n",
|
|
" if (mpl.ratio != 1) {\n",
|
|
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
|
" }\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj.onload = function() {\n",
|
|
" if (fig.image_mode == 'full') {\n",
|
|
" // Full images could contain transparency (where diff images\n",
|
|
" // almost always do), so we need to clear the canvas so that\n",
|
|
" // there is no ghosting.\n",
|
|
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
" }\n",
|
|
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
|
" };\n",
|
|
"\n",
|
|
" this.imageObj.onunload = function() {\n",
|
|
" fig.ws.close();\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
|
"\n",
|
|
" this.ondownload = ondownload;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_header = function() {\n",
|
|
" var titlebar = $(\n",
|
|
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
|
" 'ui-helper-clearfix\"/>');\n",
|
|
" var titletext = $(\n",
|
|
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
|
" 'text-align: center; padding: 3px;\"/>');\n",
|
|
" titlebar.append(titletext)\n",
|
|
" this.root.append(titlebar);\n",
|
|
" this.header = titletext[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_canvas = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var canvas_div = $('<div/>');\n",
|
|
"\n",
|
|
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
|
"\n",
|
|
" function canvas_keyboard_event(event) {\n",
|
|
" return fig.key_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
|
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
|
" this.canvas_div = canvas_div\n",
|
|
" this._canvas_extra_style(canvas_div)\n",
|
|
" this.root.append(canvas_div);\n",
|
|
"\n",
|
|
" var canvas = $('<canvas/>');\n",
|
|
" canvas.addClass('mpl-canvas');\n",
|
|
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
|
"\n",
|
|
" this.canvas = canvas[0];\n",
|
|
" this.context = canvas[0].getContext(\"2d\");\n",
|
|
"\n",
|
|
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
|
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
|
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
|
"\tthis.context.msBackingStorePixelRatio ||\n",
|
|
"\tthis.context.oBackingStorePixelRatio ||\n",
|
|
"\tthis.context.backingStorePixelRatio || 1;\n",
|
|
"\n",
|
|
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
|
"\n",
|
|
" var rubberband = $('<canvas/>');\n",
|
|
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
|
"\n",
|
|
" var pass_mouse_events = true;\n",
|
|
"\n",
|
|
" canvas_div.resizable({\n",
|
|
" start: function(event, ui) {\n",
|
|
" pass_mouse_events = false;\n",
|
|
" },\n",
|
|
" resize: function(event, ui) {\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" stop: function(event, ui) {\n",
|
|
" pass_mouse_events = true;\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" });\n",
|
|
"\n",
|
|
" function mouse_event_fn(event) {\n",
|
|
" if (pass_mouse_events)\n",
|
|
" return fig.mouse_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
|
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
|
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
|
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
|
"\n",
|
|
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
|
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
|
"\n",
|
|
" canvas_div.on(\"wheel\", function (event) {\n",
|
|
" event = event.originalEvent;\n",
|
|
" event['data'] = 'scroll'\n",
|
|
" if (event.deltaY < 0) {\n",
|
|
" event.step = 1;\n",
|
|
" } else {\n",
|
|
" event.step = -1;\n",
|
|
" }\n",
|
|
" mouse_event_fn(event);\n",
|
|
" });\n",
|
|
"\n",
|
|
" canvas_div.append(canvas);\n",
|
|
" canvas_div.append(rubberband);\n",
|
|
"\n",
|
|
" this.rubberband = rubberband;\n",
|
|
" this.rubberband_canvas = rubberband[0];\n",
|
|
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
|
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
|
"\n",
|
|
" this._resize_canvas = function(width, height) {\n",
|
|
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
|
" // canvas in synch.\n",
|
|
" canvas_div.css('width', width)\n",
|
|
" canvas_div.css('height', height)\n",
|
|
"\n",
|
|
" canvas.attr('width', width * mpl.ratio);\n",
|
|
" canvas.attr('height', height * mpl.ratio);\n",
|
|
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
|
"\n",
|
|
" rubberband.attr('width', width);\n",
|
|
" rubberband.attr('height', height);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
|
" // upon first draw.\n",
|
|
" this._resize_canvas(600, 600);\n",
|
|
"\n",
|
|
" // Disable right mouse context menu.\n",
|
|
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
|
" return false;\n",
|
|
" });\n",
|
|
"\n",
|
|
" function set_focus () {\n",
|
|
" canvas.focus();\n",
|
|
" canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" window.setTimeout(set_focus, 100);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>')\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) {\n",
|
|
" // put a spacer in here.\n",
|
|
" continue;\n",
|
|
" }\n",
|
|
" var button = $('<button/>');\n",
|
|
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
|
" 'ui-button-icon-only');\n",
|
|
" button.attr('role', 'button');\n",
|
|
" button.attr('aria-disabled', 'false');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
"\n",
|
|
" var icon_img = $('<span/>');\n",
|
|
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
|
" icon_img.addClass(image);\n",
|
|
" icon_img.addClass('ui-corner-all');\n",
|
|
"\n",
|
|
" var tooltip_span = $('<span/>');\n",
|
|
" tooltip_span.addClass('ui-button-text');\n",
|
|
" tooltip_span.html(tooltip);\n",
|
|
"\n",
|
|
" button.append(icon_img);\n",
|
|
" button.append(tooltip_span);\n",
|
|
"\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fmt_picker_span = $('<span/>');\n",
|
|
"\n",
|
|
" var fmt_picker = $('<select/>');\n",
|
|
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
|
" fmt_picker_span.append(fmt_picker);\n",
|
|
" nav_element.append(fmt_picker_span);\n",
|
|
" this.format_dropdown = fmt_picker[0];\n",
|
|
"\n",
|
|
" for (var ind in mpl.extensions) {\n",
|
|
" var fmt = mpl.extensions[ind];\n",
|
|
" var option = $(\n",
|
|
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
|
" fmt_picker.append(option)\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add hover states to the ui-buttons\n",
|
|
" $( \".ui-button\" ).hover(\n",
|
|
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
|
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
|
" );\n",
|
|
"\n",
|
|
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
|
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
|
" // which will in turn request a refresh of the image.\n",
|
|
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
|
" properties['type'] = type;\n",
|
|
" properties['figure_id'] = this.id;\n",
|
|
" this.ws.send(JSON.stringify(properties));\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_draw_message = function() {\n",
|
|
" if (!this.waiting) {\n",
|
|
" this.waiting = true;\n",
|
|
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" var format_dropdown = fig.format_dropdown;\n",
|
|
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
|
" fig.ondownload(fig, format);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
|
" var size = msg['size'];\n",
|
|
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
|
" fig._resize_canvas(size[0], size[1]);\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
|
" var x0 = msg['x0'] / mpl.ratio;\n",
|
|
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
|
" var x1 = msg['x1'] / mpl.ratio;\n",
|
|
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
|
" x0 = Math.floor(x0) + 0.5;\n",
|
|
" y0 = Math.floor(y0) + 0.5;\n",
|
|
" x1 = Math.floor(x1) + 0.5;\n",
|
|
" y1 = Math.floor(y1) + 0.5;\n",
|
|
" var min_x = Math.min(x0, x1);\n",
|
|
" var min_y = Math.min(y0, y1);\n",
|
|
" var width = Math.abs(x1 - x0);\n",
|
|
" var height = Math.abs(y1 - y0);\n",
|
|
"\n",
|
|
" fig.rubberband_context.clearRect(\n",
|
|
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
"\n",
|
|
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
|
" // Updates the figure title.\n",
|
|
" fig.header.textContent = msg['label'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
|
" var cursor = msg['cursor'];\n",
|
|
" switch(cursor)\n",
|
|
" {\n",
|
|
" case 0:\n",
|
|
" cursor = 'pointer';\n",
|
|
" break;\n",
|
|
" case 1:\n",
|
|
" cursor = 'default';\n",
|
|
" break;\n",
|
|
" case 2:\n",
|
|
" cursor = 'crosshair';\n",
|
|
" break;\n",
|
|
" case 3:\n",
|
|
" cursor = 'move';\n",
|
|
" break;\n",
|
|
" }\n",
|
|
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
|
" fig.message.textContent = msg['message'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
|
" // Request the server to send over a new figure.\n",
|
|
" fig.send_draw_message();\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
|
" fig.image_mode = msg['mode'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Called whenever the canvas gets updated.\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"// A function to construct a web socket function for onmessage handling.\n",
|
|
"// Called in the figure constructor.\n",
|
|
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
|
" return function socket_on_message(evt) {\n",
|
|
" if (evt.data instanceof Blob) {\n",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = \"image/png\";\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data);\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
|
" fig.imageObj.src = evt.data;\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var msg = JSON.parse(evt.data);\n",
|
|
" var msg_type = msg['type'];\n",
|
|
"\n",
|
|
" // Call the \"handle_{type}\" callback, which takes\n",
|
|
" // the figure and JSON message as its only arguments.\n",
|
|
" try {\n",
|
|
" var callback = fig[\"handle_\" + msg_type];\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (callback) {\n",
|
|
" try {\n",
|
|
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
|
" callback(fig, msg);\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
|
" }\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
|
"mpl.findpos = function(e) {\n",
|
|
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
|
" var targ;\n",
|
|
" if (!e)\n",
|
|
" e = window.event;\n",
|
|
" if (e.target)\n",
|
|
" targ = e.target;\n",
|
|
" else if (e.srcElement)\n",
|
|
" targ = e.srcElement;\n",
|
|
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
|
" targ = targ.parentNode;\n",
|
|
"\n",
|
|
" // jQuery normalizes the pageX and pageY\n",
|
|
" // pageX,Y are the mouse positions relative to the document\n",
|
|
" // offset() returns the position of the element relative to the document\n",
|
|
" var x = e.pageX - $(targ).offset().left;\n",
|
|
" var y = e.pageY - $(targ).offset().top;\n",
|
|
"\n",
|
|
" return {\"x\": x, \"y\": y};\n",
|
|
"};\n",
|
|
"\n",
|
|
"/*\n",
|
|
" * return a copy of an object with only non-object keys\n",
|
|
" * we need this to avoid circular references\n",
|
|
" * http://stackoverflow.com/a/24161582/3208463\n",
|
|
" */\n",
|
|
"function simpleKeys (original) {\n",
|
|
" return Object.keys(original).reduce(function (obj, key) {\n",
|
|
" if (typeof original[key] !== 'object')\n",
|
|
" obj[key] = original[key]\n",
|
|
" return obj;\n",
|
|
" }, {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
|
" var canvas_pos = mpl.findpos(event)\n",
|
|
"\n",
|
|
" if (name === 'button_press')\n",
|
|
" {\n",
|
|
" this.canvas.focus();\n",
|
|
" this.canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" var x = canvas_pos.x * mpl.ratio;\n",
|
|
" var y = canvas_pos.y * mpl.ratio;\n",
|
|
"\n",
|
|
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
|
" step: event.step,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
"\n",
|
|
" /* This prevents the web browser from automatically changing to\n",
|
|
" * the text insertion cursor when the button is pressed. We want\n",
|
|
" * to control all of the cursor setting manually through the\n",
|
|
" * 'cursor' event from matplotlib */\n",
|
|
" event.preventDefault();\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" // Handle any extra behaviour associated with a key event\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
|
"\n",
|
|
" // Prevent repeat events\n",
|
|
" if (name == 'key_press')\n",
|
|
" {\n",
|
|
" if (event.which === this._key)\n",
|
|
" return;\n",
|
|
" else\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" if (name == 'key_release')\n",
|
|
" this._key = null;\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which != 17)\n",
|
|
" value += \"ctrl+\";\n",
|
|
" if (event.altKey && event.which != 18)\n",
|
|
" value += \"alt+\";\n",
|
|
" if (event.shiftKey && event.which != 16)\n",
|
|
" value += \"shift+\";\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, {key: value,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
|
" if (name == 'download') {\n",
|
|
" this.handle_save(this, null);\n",
|
|
" } else {\n",
|
|
" this.send_message(\"toolbar_button\", {name: name});\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
|
" this.message.textContent = tooltip;\n",
|
|
"};\n",
|
|
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
|
"\n",
|
|
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
|
"\n",
|
|
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
|
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
|
" // object with the appropriate methods. Currently this is a non binary\n",
|
|
" // socket, so there is still some room for performance tuning.\n",
|
|
" var ws = {};\n",
|
|
"\n",
|
|
" ws.close = function() {\n",
|
|
" comm.close()\n",
|
|
" };\n",
|
|
" ws.send = function(m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function(msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data'])\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = $(\"#\" + id);\n",
|
|
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
|
"\n",
|
|
" function ondownload(figure, format) {\n",
|
|
" window.open(figure.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fig = new mpl.figure(id, ws_proxy,\n",
|
|
" ondownload,\n",
|
|
" element.get(0));\n",
|
|
"\n",
|
|
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
|
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
|
" ws_proxy.onopen();\n",
|
|
"\n",
|
|
" fig.parent_element = element.get(0);\n",
|
|
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
|
" if (!fig.cell_info) {\n",
|
|
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var output_index = fig.cell_info[2]\n",
|
|
" var cell = fig.cell_info[0];\n",
|
|
"\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
|
" var width = fig.canvas.width/mpl.ratio\n",
|
|
" fig.root.unbind('remove')\n",
|
|
"\n",
|
|
" // Update the output cell to use the data from the current canvas.\n",
|
|
" fig.push_to_output();\n",
|
|
" var dataURL = fig.canvas.toDataURL();\n",
|
|
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
|
" // the notebook keyboard shortcuts fail.\n",
|
|
" IPython.keyboard_manager.enable()\n",
|
|
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
|
" fig.close_ws(fig, msg);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
|
" fig.send_message('closing', msg);\n",
|
|
" // fig.ws.close()\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
|
" // Turn the data on the canvas into data in the output cell.\n",
|
|
" var width = this.canvas.width/mpl.ratio\n",
|
|
" var dataURL = this.canvas.toDataURL();\n",
|
|
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Tell IPython that the notebook contents must change.\n",
|
|
" IPython.notebook.set_dirty(true);\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
" var fig = this;\n",
|
|
" // Wait a second, then push the new image to the DOM so\n",
|
|
" // that it is saved nicely (might be nice to debounce this).\n",
|
|
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>')\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) { continue; };\n",
|
|
"\n",
|
|
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add the status bar.\n",
|
|
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"\n",
|
|
" // Add the close button to the window.\n",
|
|
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
|
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
|
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
|
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
|
" buttongrp.append(button);\n",
|
|
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
|
" titlebar.prepend(buttongrp);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
|
" var fig = this\n",
|
|
" el.on(\"remove\", function(){\n",
|
|
"\tfig.close_ws(fig, {});\n",
|
|
" });\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
|
" // this is important to make the div 'focusable\n",
|
|
" el.attr('tabindex', 0)\n",
|
|
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
|
" // off when our div gets focus\n",
|
|
"\n",
|
|
" // location in version 3\n",
|
|
" if (IPython.notebook.keyboard_manager) {\n",
|
|
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
" else {\n",
|
|
" // location in version 2\n",
|
|
" IPython.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" var manager = IPython.notebook.keyboard_manager;\n",
|
|
" if (!manager)\n",
|
|
" manager = IPython.keyboard_manager;\n",
|
|
"\n",
|
|
" // Check for shift+enter\n",
|
|
" if (event.shiftKey && event.which == 13) {\n",
|
|
" this.canvas_div.blur();\n",
|
|
" event.shiftKey = false;\n",
|
|
" // Send a \"J\" for go to next cell\n",
|
|
" event.which = 74;\n",
|
|
" event.keyCode = 74;\n",
|
|
" manager.command_mode();\n",
|
|
" manager.handle_keydown(event);\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" fig.ondownload(fig, null);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.find_output_cell = function(html_output) {\n",
|
|
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
|
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
|
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
|
" // our purposes (turning an active figure into a static one), is too late.\n",
|
|
" var cells = IPython.notebook.get_cells();\n",
|
|
" var ncells = cells.length;\n",
|
|
" for (var i=0; i<ncells; i++) {\n",
|
|
" var cell = cells[i];\n",
|
|
" if (cell.cell_type === 'code'){\n",
|
|
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
|
" var data = cell.output_area.outputs[j];\n",
|
|
" if (data.data) {\n",
|
|
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
|
" data = data.data;\n",
|
|
" }\n",
|
|
" if (data['text/html'] == html_output) {\n",
|
|
" return [cell, data, j];\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"// Register the function which deals with the matplotlib target/channel.\n",
|
|
"// The kernel may be null if the page has been refreshed.\n",
|
|
"if (IPython.notebook.kernel != null) {\n",
|
|
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
|
"}\n"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.Javascript object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<img src=\"data:image/png;base64,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XakI4Isvvhj/+te/cM011+Cmm27CypUr7VCF6dOn48ADD7RxxeNxW6Q+8cQT+Prrr7Hzzjvj7LPPxtSpU5tx3nnnnbjnnnsQiURw3XXXYfHixfjVr36FG2+8cTvkb775pi2KU8vQoUOxYMEC+0ePPvoo7rvvPqxevRo77LADJk2ahAsvvBDim1KchEA4mXNbayHJ5aWXXmpRbe7cuTjttNPwyiuvYPjw4dBa4/HHH7fDG4wx9i721VdfjQMOOKC5XboAbk3AH3vssRg1ahR+97vfNbd9++23cdttt+Gdd95BWVkZfvKTn+D666/HoEGDXC9lhkC4Q0cB7I6bo1YUwI4weVpp0ecN+GjNJuzYqwuO2r0vvm5oxIv/3nY73I927o3d+m87GMdSugQogEvXtrl8slISwCLqJARB4mr79euHu+++Gx999BFee+01W2iJ4Lr//vtx0UUXYfTo0fj73/+OBx54wBbMp59+uo1VBPDvf/97DBkyxBbHsrMrfUmc71lnnYUrr7wShx56qF1X4nwlZEH6GzZsGERsdu3a1f659HvttdfijDPOwDHHHAMRgNKv9CHC2qkAdjLnttbDvHnzMGXKFLz44osYMWJEc9Xzzz8fy5cvx1//+tfm566oqMCuu+6KxsZGPPXUU3j22WchTL///e/bddwKYHl2y7Jw9NFH45RTTsHGjRtx++2323HPzzzzjOvlTAHsDh0FsDtujlpRADvC5GklifWVmN8B3ctx7PC++NvHdajb3IR+3crw0z368QCcp/T90TkFsD/s4PdZpIsIE48BGzcUfto9ekIFvrvFsr0JifiUXUzZlTz88MPt6vX19TjooIPsnc5f/vKX+OEPf2j/e9VVVzV3d9555+HVV1+1dyaDwaAtgO+44w57F/jkk09urtdWDHD6jmcsFsP++++PI444wu4nWW655RZ7R3jRokW2+GtvB3jt2rWO5twWm6amJruPyZMn2+JdioR07LfffvYfCuecc852zWXXWf4TwSrhHUlebgXwxIkTIfMQUa0Sh6/lDxPp/+GHH7Z3g90UCmA31AAKYHfcHLWiAHaEydNKS2s34Z0vGtCrSxAjKrrj7c8b7PGO3r0vvteL+X89he+TzimAfWIIn09jOwHcUA/z0rMFn7U6+kSoXs7PKogAluwLS5YsaTF32XGVDA4ifH/xi1/YO577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\" width=\"639.9999861283738\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<matplotlib.axes._subplots.AxesSubplot at 0x7fd25806be10>"
|
|
]
|
|
},
|
|
"execution_count": 22,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"from universal import algos\n",
|
|
"env = task.unwrapped\n",
|
|
"price_cols = [col for col in df.columns if col.startswith('price')]\n",
|
|
"for col in price_cols:\n",
|
|
" df[col]=df[col].cumprod()\n",
|
|
"\n",
|
|
"df = df[price_cols + ['portfolio_value']]\n",
|
|
" \n",
|
|
"algo_dict=dict(\n",
|
|
" # Pick the same is in https://arxiv.org/pdf/1706.10059.pdf\n",
|
|
" # Benchmarks\n",
|
|
"# UCRP=algos.UP(),\n",
|
|
" \n",
|
|
" # Follow the winner\n",
|
|
" BestSoFar=algos.BestSoFar(cov_window=env_test.unwrapped.src.window_length-1),\n",
|
|
"# UniversalPortfolio=algos.UP(eval_points=1000),\n",
|
|
" ONS=algos.ONS(),\n",
|
|
" \n",
|
|
" # Follow the loser\n",
|
|
"# OnlineMovingAverageReversion=algos.OLMAR(window=env.src.window_length-1, eps=10), \n",
|
|
" RMR=algos.RMR(window=env_test.unwrapped.src.window_length-1, eps=10),\n",
|
|
"# PassiveAggressiveMeanReversion=algos.PAMR(),\n",
|
|
" \n",
|
|
" # Pattern matching\n",
|
|
" # CorrelationDrivenNonparametricLearning=algos.CORN(window=30),\n",
|
|
")\n",
|
|
"for name, algo in algo_dict.items():\n",
|
|
" print(name)\n",
|
|
" perf, _ = test_algo(env_test, algo)\n",
|
|
" perf.index=df.index\n",
|
|
" df[name]=perf\n",
|
|
"\n",
|
|
"# put portfolio value at end so we plot it on top and can therefore see it\n",
|
|
"cols = list(df.columns.drop('portfolio_value'))+['portfolio_value']\n",
|
|
"df=df[cols]\n",
|
|
"\n",
|
|
"\n",
|
|
"df.plot(alpha=0.5)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-02-18T03:53:15.784969Z",
|
|
"start_time": "2018-02-18T03:53:15.660001Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "jupyter3",
|
|
"language": "python",
|
|
"name": "jupyter3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.5.3"
|
|
},
|
|
"toc": {
|
|
"colors": {
|
|
"hover_highlight": "#DAA520",
|
|
"navigate_num": "#000000",
|
|
"navigate_text": "#333333",
|
|
"running_highlight": "#FF0000",
|
|
"selected_highlight": "#FFD700",
|
|
"sidebar_border": "#EEEEEE",
|
|
"wrapper_background": "#FFFFFF"
|
|
},
|
|
"moveMenuLeft": true,
|
|
"nav_menu": {
|
|
"height": "70px",
|
|
"width": "252px"
|
|
},
|
|
"navigate_menu": true,
|
|
"number_sections": true,
|
|
"sideBar": true,
|
|
"threshold": 4,
|
|
"toc_cell": false,
|
|
"toc_section_display": "block",
|
|
"toc_window_display": true,
|
|
"widenNotebook": false
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|