diff --git a/README.md b/README.md index 119cfaa..ed85629 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # EPPO -Official implementation of Overcoming Non-stationary Dynamics with Evidential Proximal Policy Optimization +Evidential Proximal Policy Optimization, modified for use with Google Colab. An implementation of vanilla PPO has been added in the interest of supporting experiments. ## Cite If you use EPPO, please cite: diff --git a/evidential_proximal_policy_optimization.ipynb b/evidential_proximal_policy_optimization.ipynb index 551be77..e595726 100644 --- a/evidential_proximal_policy_optimization.ipynb +++ b/evidential_proximal_policy_optimization.ipynb @@ -1,1107 +1,1591 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Installing the required libraries\n", - "```bash\n", - "conda create -n eppo python=3.12 -y\n", - "conda activate eppo\n", - "\n", - "pip install gymnasium torch numpy scipy seaborn tqdm imageio \n", - "pip install gymnasium['mujoco']\n", - "```\n" - ] + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "collapsed_sections": [ + "MZnBZePLPluq" + ] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Libraries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import torch.nn as nn\n", - "import numpy as np\n", - "import gymnasium as gym\n", - "import itertools\n", - "import time\n", - "import copy\n", - "from gymnasium.wrappers import RescaleAction\n", - "from typing import Optional\n", - "from torch.distributions import Normal\n", - "from tqdm import tqdm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Hperparameters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# common parameters\n", - "max_steps = 500_000\n", - "learning_rate = 3e-4\n", - "learn_frequency = 2047 # it is 2048 but we are using 0 based index\n", - "batch_size = 256\n", - "max_iter = 10\n", - "act_actor = \"relu\"\n", - "act_critic = \"relu\"\n", - "depth_actor = 3\n", - "depth_critic = 3\n", - "width_actor = 256\n", - "width_critic = 256\n", - "gamma = 0.99\n", - "no_norm_actor = False\n", - "no_norm_critic = False\n", - "eval_frequency = 20_000\n", - "eval_episodes = 10\n", - "buffer_size = 2048\n", - "\n", - "# ppo related\n", - "clip_param = 0.2\n", - "gae_lambda = 0.95\n", - "max_grad_norm = 0.5\n", - "\n", - "# eppo related\n", - "regularization_coeff = 0.01\n", - "radius = 0.01\n", - "seed = 1\n", - "exploration_types = [\"mean\", \"cor\", \"ind\"]\n", - "exploration_type = exploration_types[0]\n", - "\n", - "# experiment related\n", - "environments = [\"ant\", \"halfcheetah\"]\n", - "strategies = {\n", - " \"ant\": [\"back_one\", \"front_one\", \"back_two\", \"front_two\", \"parallel\", \"cross\"],\n", - " \"halfcheetah\": [\"back_one\", \"front_one\", \"cross_v1\", \"cross_v2\"],\n", - "}\n", - "environment = environments[1]\n", - "strategy = strategies[environment][0]\n", - "exp_name = f\"{environment}_{strategy}\"\n", - "\n", - "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Environment" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# ParalyzeActionWrapper\n", - "class ParalyzeActionWrapper(gym.ActionWrapper):\n", - " def __init__(self, env, joint_idxs, paralyzed_ratio=0.0):\n", - " super().__init__(env)\n", - " self.paralyzed_ratio = paralyzed_ratio\n", - " self.joint_idxs = joint_idxs\n", - " self.coeff = np.ones(self.action_space.shape)\n", - " self.coeff[joint_idxs] = paralyzed_ratio\n", - "\n", - " def step(self, action):\n", - " action = action * self.coeff\n", - " return self.env.step(action)\n", - "\n", - "class SinglePrecision(gym.ObservationWrapper):\n", - "\n", - " def __init__(self, env):\n", - " super().__init__(env)\n", - "\n", - " if isinstance(self.observation_space, gym.spaces.Box):\n", - " obs_space = self.observation_space\n", - " self.observation_space = gym.spaces.Box(obs_space.low, obs_space.high, obs_space.shape)\n", - " elif isinstance(self.observation_space, gym.spaces.Dict):\n", - " obs_spaces = copy.copy(self.observation_space.spaces)\n", - " for k, v in obs_spaces.items():\n", - " obs_spaces[k] = gym.spaces.Box(v.low, v.high, v.shape)\n", - " self.observation_space = gym.spaces.Dict(obs_spaces)\n", - " else:\n", - " raise NotImplementedError\n", - "\n", - " def observation(self, observation: np.ndarray) -> np.ndarray:\n", - " if isinstance(observation, np.ndarray):\n", - " return observation.astype(np.float32)\n", - " elif isinstance(observation, dict):\n", - " observation = copy.copy(observation)\n", - " for k, v in observation.items():\n", - " observation[k] = v.astype(np.float32)\n", - " return observation\n", - "\n", - "\n", - "def get_idx_to_paralyze(exp_name):\n", - " if \"ant\" in exp_name:\n", - " if \"front_one\" in exp_name: # front left joints\n", - " return [2, 3]\n", - " elif \"front_two\" in exp_name: # front left and right joints\n", - " return [2, 3, 4, 5]\n", - " elif \"back_one\" in exp_name: # back left joints\n", - " return [6, 7]\n", - " elif \"back_two\" in exp_name: # back left and right joints\n", - " return [0, 1, 6, 7]\n", - " elif \"parallel\" in exp_name: # left front and back joints\n", - " return [2, 3, 6, 7]\n", - " elif \"cross\" in exp_name: # left front and right back joints\n", - " return [2, 3, 0, 1]\n", - " elif \"halfcheetah\" in exp_name:\n", - " if \"front_one\" in exp_name:\n", - " return [5]\n", - " elif \"back_one\" in exp_name:\n", - " return [2]\n", - " elif \"cross_v1\" in exp_name:\n", - " return [2, 4]\n", - " elif \"cross_v2\" in exp_name:\n", - " return [1, 5]\n", - " else:\n", - " raise ValueError(f\"Unknown experiment: {exp_name}\")\n", - "\n", - "\n", - "def make_env(\n", - " exp_name: str,\n", - " seed: int,\n", - " idxs: Optional[list] = None,\n", - " paralyzed_ratio: Optional[float] = 0.0,\n", - ") -> gym.Env:\n", - "\n", - " if \"ant\" in exp_name:\n", - " env_name = \"Ant-v5\"\n", - " elif \"halfcheetah\" in exp_name:\n", - " env_name = \"HalfCheetah-v5\"\n", - " else:\n", - " raise NotImplementedError(f\"Environment {exp_name} not implemented\")\n", - "\n", - " env = gym.make(env_name)\n", - " env = RescaleAction(env, -1.0, 1.0)\n", - " env = SinglePrecision(env)\n", - " env = ParalyzeActionWrapper(env, idxs, paralyzed_ratio)\n", - "\n", - " env.reset(seed=seed)\n", - " env.action_space.seed(seed)\n", - " env.observation_space.seed(seed)\n", - " np.random.seed(seed)\n", - " torch.manual_seed(seed)\n", - " return env" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Experimenter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def totorch(x, dtype=torch.float32, device=\"cuda\"):\n", - " return torch.as_tensor(x, dtype=dtype, device=device)\n", - "\n", - "\n", - "def tonumpy(x):\n", - " return x.data.cpu().numpy()\n", - "\n", - "\n", - "class ExperienceMemoryTorch:\n", - " \"\"\"Fixed-size buffer to store experience tuples.\"\"\"\n", - "\n", - " field_names = [\"state\", \"action\", \"reward\", \"next_state\", \"terminated\", \"step\"]\n", - "\n", - " def __init__(self, device, buffer_size, dims):\n", - " self.device = device\n", - " self.buffer_size = buffer_size\n", - " self.dims = dims\n", - " self.reset()\n", - "\n", - " def reset(self, buffer_size=None):\n", - " if buffer_size is not None:\n", - " self.buffer_size = buffer_size\n", - " self.data_size = 0\n", - " self.pointer = 0\n", - " self.memory = {\n", - " field: torch.empty(self.dims[field], device=self.device)\n", - " for field in self.field_names\n", - " }\n", - "\n", - " def add(self, state, action, reward, next_state, terminated, step):\n", - " for field, value in zip(\n", - " self.field_names, [state, action, reward, next_state, terminated, step]\n", - " ):\n", - " self.memory[field][self.pointer] = value\n", - " self.pointer = (self.pointer + 1) % self.buffer_size\n", - " self.data_size = min(self.data_size + 1, self.buffer_size)\n", - "\n", - " def sample_by_index(self, index):\n", - " return tuple(self.memory[field][index] for field in self.field_names)\n", - "\n", - " def sample_all(self):\n", - " return self.sample_by_index(range(self.data_size))\n", - "\n", - " def __len__(self):\n", - " return self.data_size\n", - "\n", - " @property\n", - " def size(self):\n", - " return self.data_size\n", - "\n", - "\n", - "class ParalysisExpriment(object):\n", - " def __init__(\n", - " self,\n", - " agent,\n", - " exp_name,\n", - " seed,\n", - " max_steps,\n", - " eval_frequency,\n", - " device,\n", - " learn_frequency,\n", - " eval_episodes,\n", - " max_iter,\n", - " gamma,\n", - " ):\n", - " self.exp_name = exp_name\n", - " self.seed = seed\n", - " self.max_steps = max_steps\n", - " self.eval_frequency = eval_frequency\n", - " self.device = device\n", - " self.learn_frequency = learn_frequency\n", - " self.eval_episodes = eval_episodes\n", - " self.max_iter = max_iter\n", - " self.gamma = gamma\n", - "\n", - " self.idx_to_paralyze = get_idx_to_paralyze(self.exp_name)\n", - " self.prepare_tasks()\n", - "\n", - " self.agent = agent\n", - " \n", - " self.AULCS = []\n", - " self.FINAL_RETURNS = []\n", - "\n", - " def prepare_tasks(self):\n", - " task_order = [1.0, 0.75, 0.5, 0.25, 0.0, 0.25, 0.5, 0.75, 1.0]\n", - " self.n_tasks = len(task_order)\n", - "\n", - " self.tasks = {\n", - " task_id: {\"task\": coeff, \"idxs\": self.idx_to_paralyze}\n", - " for task_id, coeff in enumerate(task_order)\n", - " }\n", - " task_names = [task_info[\"task\"] for task_info in self.tasks.values()]\n", - " print(f\"Tasks: {task_names}\")\n", - "\n", - " def set_task(self, task_id, task_info):\n", - " task = task_info[\"task\"]\n", - "\n", - " self.env = make_env(\n", - " exp_name=self.exp_name,\n", - " seed=self.seed,\n", - " idxs=task_info[\"idxs\"],\n", - " paralyzed_ratio=task,\n", - " )\n", - "\n", - " self.eval_env = make_env(\n", - " exp_name=self.exp_name,\n", - " seed=self.seed + 100,\n", - " idxs=task_info[\"idxs\"],\n", - " paralyzed_ratio=task,\n", - " )\n", - "\n", - " return task\n", - "\n", - " def train(self):\n", - " time_start = time.time()\n", - "\n", - " information_dict = {\n", - " \"episode_rewards\": torch.zeros(self.max_steps * (self.n_tasks + 1)),\n", - " \"episode_steps\": torch.zeros(self.max_steps * (self.n_tasks + 1)),\n", - " \"step_rewards\": np.empty((2 * self.max_steps * self.n_tasks), dtype=object),\n", - " }\n", - "\n", - " r_cum = np.zeros(1)\n", - " episode = 0\n", - " e_step = 0\n", - " for task_id, task_info in self.tasks.items():\n", - " # task starts\n", - " task = self.set_task(task_id, task_info)\n", - " print(f\"Starting to task {task_id}: {task}\")\n", - "\n", - " r_cum = np.zeros(1)\n", - " s, _ = self.env.reset()\n", - " s = totorch(s, device=self.device)\n", - " for step in tqdm(\n", - " range(task_id * self.max_steps, (task_id + 1) * self.max_steps),\n", - " leave=True,\n", - " disable=True,\n", - " ):\n", - " e_step += 1\n", - "\n", - " if step % self.eval_frequency == 0:\n", - " self.eval(step)\n", - "\n", - " a = self.agent.select_action(s).clip(-1.0, 1.0)\n", - "\n", - " sp, r, done, truncated, info = self.env.step(tonumpy(a))\n", - " sp = totorch(sp, device=self.device)\n", - "\n", - " self.agent.store_transition(s, a, r, sp, done, truncated, step + 1)\n", - "\n", - " information_dict[\"step_rewards\"][step] = (\n", - " episode,\n", - " step,\n", - " r,\n", - " )\n", - "\n", - " s = sp # Update state\n", - " r_cum += r # Update cumulative reward\n", - "\n", - " if (step % self.learn_frequency) == 0:\n", - " # print(\"Learning at step: \", step)\n", - " self.agent.learn(max_iter=self.max_iter)\n", - "\n", - " if done or truncated:\n", - "\n", - " information_dict[\"episode_rewards\"][episode] = r_cum.item()\n", - " information_dict[\"episode_steps\"][episode] = step\n", - " if episode % 10 == 0:\n", - " print(\n", - " f\"Episode: {episode + 1:4d}\\tN-steps: {step:7d}\\tReward: {r_cum.item():10.3f}\"\n", - " )\n", - " s, _ = self.env.reset()\n", - " s = totorch(s, device=self.device)\n", - " r_cum = np.zeros(1)\n", - " episode += 1\n", - " e_step = 0\n", - "\n", - " # task finishes\n", - " self.eval(step, final=True)\n", - " self.agent.end_task()\n", - "\n", - " time_end = time.time()\n", - " print(f\"Training time: {time_end - time_start:.2f} seconds\")\n", - " \n", - " print(f\"AULC: {np.mean(self.AULCS)}\")\n", - " print(f\"Final Return: {np.mean(self.FINAL_RETURNS)}\")\n", - "\n", - " @torch.no_grad()\n", - " def eval(self, n_step, final=False):\n", - " self.agent.eval()\n", - " results = torch.zeros(self.eval_episodes)\n", - " collect_infos = {}\n", - " for episode in range(self.eval_episodes):\n", - " collect_infos[episode] = []\n", - " s, info = self.eval_env.reset()\n", - " s = totorch(s, device=self.device)\n", - " step = 0\n", - " a = self.agent.select_action(s, is_training=False)\n", - " done = False\n", - "\n", - " while not done:\n", - " a = self.agent.select_action(s, is_training=False)\n", - "\n", - " sp, r, term, trunc, info = self.eval_env.step(tonumpy(a))\n", - " collect_infos[episode].append(info)\n", - "\n", - " done = term or trunc\n", - " s = totorch(sp, device=self.device)\n", - " results[episode] += r\n", - " step += 1\n", - "\n", - " print(f\"EVALUATION\\tN-steps: {n_step:7d}\\tMean_Reward: {results.mean():10.3f}\")\n", - " self.AULCS.append(results.mean())\n", - " if final:\n", - " self.FINAL_RETURNS.append(results.mean())\n", - "\n", - " self.agent.train()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Networks" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_activation(act):\n", - " if act == \"relu\":\n", - " return nn.ReLU\n", - " elif act == \"tanh\":\n", - " return nn.Tanh\n", - " else:\n", - " raise NotImplementedError(f\"{act} is not implemented\")\n", - "\n", - "\n", - "def create_net(d_in, d_out, depth, width, act=\"crelu\", has_norm=True, n_elements=1):\n", - " assert depth > 0, \"Need at least one layer\"\n", - "\n", - " act = get_activation(act)\n", - "\n", - " if depth == 1:\n", - " arch = nn.Linear(d_in, d_out)\n", - " elif depth == 2:\n", - " arch = nn.Sequential(\n", - " nn.Linear(d_in, width),\n", - " (\n", - " nn.LayerNorm(width, elementwise_affine=False)\n", - " if has_norm\n", - " else nn.Identity()\n", - " ),\n", - " act(),\n", - " nn.Linear(width, d_out),\n", - " )\n", - " else:\n", - " in_layer = nn.Linear(d_in, width)\n", - " if n_elements > 1:\n", - " out_layer = nn.Linear(width, d_out, n_elements)\n", - " else:\n", - " out_layer = nn.Linear(width, d_out)\n", - "\n", - " # This can probably be done in a more readable way, but it's fast and works...\n", - " hidden = list(\n", - " itertools.chain.from_iterable(\n", - " [\n", - " [\n", - " (\n", - " nn.LayerNorm(width, elementwise_affine=False)\n", - " if has_norm\n", - " else nn.Identity()\n", - " ),\n", - " act(),\n", - " nn.Linear(width, width),\n", - " ]\n", - " for _ in range(depth - 1)\n", - " ]\n", - " )\n", - " )[:-1]\n", - " arch = nn.Sequential(in_layer, *hidden, out_layer)\n", - "\n", - " return arch\n", - "\n", - "\n", - "class GaussianHead(nn.Module):\n", - " def __init__(self, n):\n", - " super().__init__()\n", - " self._n = n\n", - "\n", - " def forward(self, x, is_training=True, return_dist=False):\n", - " mean = x[..., : self._n]\n", - " logstd = x[..., self._n :].clamp(-10.0, -2.0)\n", - " std = logstd.exp()\n", - " dist = Normal(mean, std, validate_args=False)\n", - " if is_training:\n", - " y = dist.rsample()\n", - " y_logprob = dist.log_prob(y).sum(dim=-1, keepdim=True)\n", - " else:\n", - " y = dist.mode\n", - " y_logprob = None\n", - " if return_dist:\n", - " return y, y_logprob, dist\n", - " return y, mean\n", - "\n", - "\n", - "class ActorNetProbabilistic(nn.Module):\n", - " def __init__(self, dim_obs, dim_act, depth=3, width=256, act=\"relu\", has_norm=True):\n", - " super().__init__()\n", - " self.dim_act = dim_act\n", - " self.arch = create_net(dim_obs, 2 * dim_act, depth, width, act, has_norm)\n", - "\n", - " self.head = GaussianHead(self.dim_act)\n", - "\n", - " def forward(self, x, is_training=True, return_dist=False):\n", - " f = self.arch(x)\n", - " return self.head(f, is_training, return_dist=return_dist)\n", - "\n", - "\n", - "class EvidentialCriticNet(nn.Module):\n", - " def __init__(self, dim_obs, depth=3, width=256, act=\"relu\", has_norm=False):\n", - " super().__init__()\n", - "\n", - " self.arch = create_net(dim_obs, 4, depth, width, act=act, has_norm=has_norm)\n", - "\n", - " @staticmethod\n", - " def evidence(x):\n", - " return torch.exp(x)\n", - "\n", - " def forward(self, x):\n", - " output = self.arch(x)\n", - " gamma, logv, log_alpha, log_beta = output.chunk(4, dim=-1)\n", - " v = self.evidence(logv)\n", - " alpha = self.evidence(log_alpha) + 1 # to ensure that alpha > 1\n", - " beta = self.evidence(log_beta)\n", - " return gamma, v, alpha, beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# EPPO" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class EPPOActor(nn.Module):\n", - " def __init__(\n", - " self,\n", - " arch,\n", - " n_state,\n", - " n_action,\n", - " clip_param,\n", - " max_grad_norm,\n", - " learning_rate,\n", - " depth_actor,\n", - " width_actor,\n", - " act_actor,\n", - " no_norm_actor,\n", - " device,\n", - " ):\n", - " super().__init__()\n", - " self.n_state = n_state\n", - " self.n_action = n_action\n", - " self.arch = arch\n", - " self.clip = clip_param\n", - " self.max_grad_norm = max_grad_norm\n", - " self.learning_rate = learning_rate\n", - " self.depth_actor = depth_actor\n", - " self.width_actor = width_actor\n", - " self.act_actor = act_actor\n", - " self.no_norm_actor = no_norm_actor\n", - " self.device = device\n", - "\n", - " self.initialize()\n", - "\n", - " def initialize(self):\n", - " self.model = self.arch(\n", - " self.n_state,\n", - " self.n_action,\n", - " depth=self.depth_actor,\n", - " width=self.width_actor,\n", - " act=self.act_actor,\n", - " has_norm=not self.no_norm_actor,\n", - " ).to(self.device)\n", - " self.optim = torch.optim.Adam(self.model.parameters(), self.learning_rate)\n", - "\n", - " def evaluate(self, s):\n", - " _, _, dist = self.model(s, return_dist=True)\n", - " # return dist here\n", - " return dist\n", - "\n", - " def loss(self, s, a, old_probs, adv):\n", - " dist = self.evaluate(s)\n", - " new_probs = dist.log_prob(a)\n", - " foo = new_probs.sum(1, keepdim=True) - old_probs.sum(1, keepdim=True)\n", - " prob_ratio = torch.exp(foo.clamp(-20, 1))\n", - "\n", - " weighted_probs = adv * prob_ratio\n", - " weighted_clipped_probs = (\n", - " torch.clamp(prob_ratio, 1 - self.clip, 1 + self.clip) * adv\n", - " )\n", - "\n", - " actor_loss = -torch.min(weighted_probs, weighted_clipped_probs).mean()\n", - " self.clip_fraction = (\n", - " (torch.abs((prob_ratio - 1)) > self.clip).to(torch.float).mean()\n", - " )\n", - "\n", - " return actor_loss\n", - "\n", - " def update(self, s, a, old_probs, adv):\n", - " self.optim.zero_grad()\n", - " loss = self.loss(s, a, old_probs, adv)\n", - " loss.backward()\n", - " torch.nn.utils.clip_grad_norm_(self.model.parameters(), self.max_grad_norm)\n", - " self.optim.step()\n", - "\n", - " def act(self, s, is_training=True):\n", - " a, e = self.model(s, is_training=is_training)\n", - " return a, e\n", - "\n", - "\n", - "class EvidentialCritic(nn.Module):\n", - " def __init__(\n", - " self,\n", - " arch,\n", - " n_state,\n", - " max_grad_norm,\n", - " depth_critic,\n", - " width_critic,\n", - " act_critic,\n", - " no_norm_critic,\n", - " device,\n", - " learning_rate,\n", - " regularization_coeff,\n", - " ):\n", - " super().__init__()\n", - "\n", - " self.arch = arch\n", - " self.max_grad_norm = max_grad_norm\n", - " self.depth_critic = depth_critic\n", - " self.width_critic = width_critic\n", - " self.act_critic = act_critic\n", - " self.no_norm_critic = no_norm_critic\n", - " self.n_state = n_state\n", - " self.learning_rate = learning_rate\n", - " self.iter = 0\n", - " self.device = device\n", - " self.initialize()\n", - "\n", - " self.regularization_coeff = regularization_coeff\n", - "\n", - " def initialize(self):\n", - " self.model = self.arch(\n", - " self.n_state,\n", - " depth=self.depth_critic,\n", - " width=self.width_critic,\n", - " act=self.act_critic,\n", - " has_norm=not self.no_norm_critic,\n", - " ).to(self.device)\n", - " self.loss = torch.nn.MSELoss()\n", - " self.optim = torch.optim.Adam(self.model.parameters(), self.learning_rate)\n", - "\n", - " self.prior_gamma = torch.distributions.Normal(\n", - " torch.tensor(0.0).to(self.device), torch.tensor(100.0).to(self.device)\n", - " )\n", - " self.prior_v = torch.distributions.Gamma(\n", - " torch.tensor(5.0).to(self.device), torch.tensor(1.0).to(self.device)\n", - " )\n", - " self.prior_alpha = torch.distributions.TransformedDistribution(\n", - " torch.distributions.Gamma(\n", - " torch.tensor(5.0).to(self.device), torch.tensor(1.0).to(self.device)\n", - " ),\n", - " [\n", - " torch.distributions.transforms.AffineTransform(\n", - " loc=1.0, scale=1.0, cache_size=1\n", - " )\n", - " ],\n", - " )\n", - " self.prior_beta = torch.distributions.Gamma(\n", - " torch.tensor(5.0).to(self.device), torch.tensor(1.0).to(self.device)\n", - " )\n", - "\n", - " def get_prior(self, x):\n", - " gamma, v, alpha, beta = self.model(x)\n", - " return gamma, v, alpha, beta\n", - "\n", - " def loss(self, state, target):\n", - " gamma, v, alpha, beta = self.get_prior(state)\n", - " twoBlambda = 2 * beta * (1 + v)\n", - " loss = (\n", - " -0.5 * torch.log(v)\n", - " - alpha * torch.log(twoBlambda)\n", - " + (alpha + 0.5) * torch.log(v * (target - gamma) ** 2 + twoBlambda)\n", - " + torch.lgamma(alpha)\n", - " - torch.lgamma(alpha + 0.5)\n", - " )\n", - "\n", - " regularization = (\n", - " self.prior_gamma.log_prob(gamma).mean()\n", - " + self.prior_v.log_prob(v).mean()\n", - " + self.prior_alpha.log_prob(alpha).mean()\n", - " + self.prior_beta.log_prob(beta).mean()\n", - " )\n", - " loss -= regularization * self.regularization_coeff\n", - "\n", - " return loss.mean()\n", - "\n", - " def update(self, state, target): # y denotes bellman target\n", - " self.optim.zero_grad()\n", - " loss = self.loss(state, target)\n", - " loss.backward()\n", - " torch.nn.utils.clip_grad_norm_(self.model.parameters(), self.max_grad_norm)\n", - " self.optim.step()\n", - "\n", - " def forward(self, x, target=False):\n", - " gamma, v, alpha, beta = self.get_prior(x)\n", - " if target:\n", - " return gamma\n", - "\n", - " return gamma\n", - "\n", - " def get_mean_and_variance_of_y(self, x):\n", - " gamma, v, alpha, beta = self.get_prior(x)\n", - " mean = gamma\n", - " variance = (beta / (alpha - 1)) * (1 + 1.0 / v)\n", - " return mean, variance\n", - "\n", - "\n", - "class EvidentialProximalPolicyOptimization(nn.Module):\n", - " _agent_name = \"EPPO\"\n", - "\n", - " def __init__(\n", - " self,\n", - " env,\n", - " actor_nn,\n", - " critic_nn,\n", - " device,\n", - " gamma,\n", - " buffer_size,\n", - " clip_param,\n", - " gae_lambda,\n", - " max_grad_norm,\n", - " learning_rate,\n", - " depth_actor,\n", - " width_actor,\n", - " act_actor,\n", - " no_norm_actor,\n", - " depth_critic,\n", - " width_critic,\n", - " act_critic,\n", - " no_norm_critic,\n", - " regularization_coeff,\n", - " radius,\n", - " exploration_type,\n", - " batch_size,\n", - " ):\n", - " super().__init__()\n", - "\n", - " self.device = device\n", - " self.env = env\n", - " self.eps = 1e-6 # small value to avoid division by zero\n", - " self.clip_param = clip_param\n", - " self.gae_lambda = gae_lambda\n", - " self.max_grad_norm = max_grad_norm\n", - " self.learning_rate = learning_rate\n", - " self.depth_actor = depth_actor\n", - " self.width_actor = width_actor\n", - " self.act_actor = act_actor\n", - " self.no_norm_actor = no_norm_actor\n", - " self.depth_critic = depth_critic\n", - " self.width_critic = width_critic\n", - " self.act_critic = act_critic\n", - " self.no_norm_critic = no_norm_critic\n", - " self.regularization_coeff = regularization_coeff\n", - " self.radius = radius\n", - " self.exploration_type = (exploration_type,)\n", - " self.batch_size = batch_size\n", - "\n", - " self.dim_obs, self.dim_act = (\n", - " self.env.observation_space.shape,\n", - " self.env.action_space.shape,\n", - " )\n", - " self.dim_obs_flat, self.dim_act_flat = np.prod(self.dim_obs), np.prod(\n", - " self.dim_act\n", - " )\n", - " self._u_min = totorch(self.env.action_space.low, device=self.device)\n", - " self._u_max = totorch(self.env.action_space.high, device=self.device)\n", - " self._x_min = totorch(self.env.observation_space.low, device=self.device)\n", - " self._x_max = totorch(self.env.observation_space.high, device=self.device)\n", - "\n", - " self._gamma = gamma\n", - " self.buffer_size = buffer_size\n", - "\n", - " dims = {\n", - " \"state\": (self.buffer_size, self.dim_obs_flat),\n", - " \"action\": (self.buffer_size, self.dim_act_flat),\n", - " \"next_state\": (self.buffer_size, self.dim_obs_flat),\n", - " \"reward\": (self.buffer_size),\n", - " \"terminated\": (self.buffer_size),\n", - " \"step\": (self.buffer_size),\n", - " }\n", - "\n", - " self.experience_memory = ExperienceMemoryTorch(\n", - " self.device, self.buffer_size, dims\n", - " )\n", - "\n", - " self.actor = EPPOActor(\n", - " actor_nn,\n", - " self.dim_obs_flat,\n", - " self.dim_act_flat,\n", - " self.clip_param,\n", - " self.max_grad_norm,\n", - " self.learning_rate,\n", - " self.depth_actor,\n", - " self.width_actor,\n", - " self.act_actor,\n", - " self.no_norm_actor,\n", - " self.device,\n", - " )\n", - "\n", - " self.critic = EvidentialCritic(\n", - " critic_nn,\n", - " self.dim_obs_flat,\n", - " self.max_grad_norm,\n", - " self.depth_critic,\n", - " self.width_critic,\n", - " self.act_critic,\n", - " self.no_norm_critic,\n", - " self.device,\n", - " self.learning_rate,\n", - " self.regularization_coeff,\n", - " )\n", - "\n", - " self._variance_coeff = (1.0 - self.gae_lambda) / (1.0 + self.gae_lambda)\n", - " self._next_variance_coeff = ((1.0 - self.gae_lambda) / (self.gae_lambda)) ** 2\n", - " self._accumulation_coeff = (self._gamma * self.gae_lambda) ** 2\n", - "\n", - " if exploration_type == \"mean\":\n", - " self.calculate_advantages = self.calculate_advantages_mean\n", - " elif exploration_type == \"cor\":\n", - " self.calculate_advantages = self.calculate_advantages_cor\n", - " elif exploration_type == \"ind\":\n", - " self.calculate_advantages = self.calculate_advantages_ind\n", - " else:\n", - " raise ValueError(f\"Unknown exploration type: {exploration_type}\")\n", - "\n", - " def end_task(self):\n", - " self.experience_memory.reset()\n", - "\n", - " @torch.no_grad()\n", - " def calculate_advantages_mean(self, states, next_states, rewards, dones):\n", - " # EPPO_mean\n", - " values = self.critic(states)\n", - " next_values = self.critic(next_states)\n", - " deltas = rewards + self._gamma * next_values * (1 - dones) - values\n", - " advantages = torch.zeros_like(rewards)\n", - " advantage = 0\n", - " for i in reversed(range(len(deltas))):\n", - " advantage = (\n", - " self._gamma * self.gae_lambda * advantage * (1 - dones[i]) + deltas[i]\n", - " )\n", - " advantages[i] = advantage\n", - "\n", - " returns = advantages + values\n", - " advantages = (advantages - advantages.mean()) / (advantages.std() + self.eps)\n", - " return advantages, returns\n", - "\n", - " @torch.no_grad()\n", - " def calculate_advantages_cor(self, states, next_states, rewards, dones):\n", - " # EPPO_cor\n", - " mean_values, variance_values = self.critic.get_mean_and_variance_of_y(states)\n", - " mean_next_values, variance_next_values = self.critic.get_mean_and_variance_of_y(\n", - " next_states\n", - " )\n", - " mean_deltas = (\n", - " rewards + self._gamma * mean_next_values * (1 - dones) - mean_values\n", - " )\n", - "\n", - " mean_advantages = torch.zeros_like(rewards)\n", - " variance_advantages = torch.zeros_like(rewards)\n", - " mean_advantage = 0\n", - " variance_accumulated = 0\n", - " for i in reversed(range(len(mean_deltas))):\n", - " mean_advantage = (\n", - " self._gamma * self.gae_lambda * mean_advantage * (1 - dones[i])\n", - " + mean_deltas[i]\n", - " )\n", - " mean_advantages[i] = mean_advantage\n", - " variance_accumulated = self._accumulation_coeff * (\n", - " variance_accumulated * (1 - dones[i]) + variance_next_values[i]\n", - " )\n", - " variance_advantages[i] = (\n", - " variance_values[i] + self._next_variance_coeff * variance_accumulated\n", - " )\n", - "\n", - " std_advantages = torch.sqrt(variance_advantages)\n", - " advantages = mean_advantages + self.radius * std_advantages\n", - " returns = mean_advantages + mean_values\n", - " advantages = (advantages - advantages.mean()) / (advantages.std() + self.eps)\n", - " return advantages, returns\n", - "\n", - " @torch.no_grad()\n", - " def calculate_advantages_ind(self, states, next_states, rewards, dones):\n", - " # EPPO_ind\n", - " mean_values, variance_values = self.critic.get_mean_and_variance_of_y(states)\n", - " mean_next_values, variance_next_values = self.critic.get_mean_and_variance_of_y(\n", - " next_states\n", - " )\n", - " mean_deltas = (\n", - " rewards + self._gamma * mean_next_values * (1 - dones) - mean_values\n", - " )\n", - "\n", - " mean_advantages = torch.zeros_like(rewards)\n", - " variance_advantages = torch.zeros_like(rewards)\n", - " mean_advantage = 0\n", - " variance_accumulated = 0\n", - " for i in reversed(range(len(mean_deltas))):\n", - " mean_advantage = (\n", - " self._gamma * self.gae_lambda * mean_advantage * (1 - dones[i])\n", - " + mean_deltas[i]\n", - " )\n", - " mean_advantages[i] = mean_advantage\n", - " variance_accumulated = self._accumulation_coeff * (\n", - " variance_accumulated * (1 - dones[i]) + variance_next_values[i]\n", - " )\n", - " variance_advantages[i] = (\n", - " self._variance_coeff * variance_values[i]\n", - " + self._next_variance_coeff * variance_accumulated\n", - " )\n", - "\n", - " std_advantages = torch.sqrt(variance_advantages)\n", - " advantages = mean_advantages + self.radius * std_advantages\n", - " returns = mean_advantages + mean_values\n", - " advantages = (advantages - advantages.mean()) / (advantages.std() + self.eps)\n", - " return advantages, returns\n", - "\n", - " @torch.no_grad()\n", - " def calculate_old_probs(self, states, actions):\n", - " dist = self.actor.evaluate(states)\n", - " return dist.log_prob(actions)\n", - "\n", - " def learn(self, max_iter=1):\n", - " if self.batch_size > len(self.experience_memory):\n", - " return None\n", - "\n", - " states, actions, rewards, next_states, terminateds, _ = (\n", - " self.experience_memory.sample_all()\n", - " )\n", - " rewards = rewards.reshape(-1, 1)\n", - " terminateds = terminateds.reshape(-1, 1)\n", - " advantages, returns = self.calculate_advantages(\n", - " states, next_states, rewards, terminateds\n", - " )\n", - " old_probs = self.calculate_old_probs(states, actions)\n", - "\n", - " for ii in range(max_iter):\n", - " # shuffle data\n", - " indices = torch.randperm(len(states))\n", - " for i in range(0, len(states), self.batch_size):\n", - " batch_indices = indices[i : i + self.batch_size]\n", - " batch_states = states[batch_indices]\n", - " batch_actions = actions[batch_indices]\n", - " batch_old_probs = old_probs[batch_indices]\n", - " batch_advantages = advantages[batch_indices]\n", - " batch_returns = returns[batch_indices]\n", - "\n", - " self.actor.update(\n", - " batch_states, batch_actions, batch_old_probs, batch_advantages\n", - " )\n", - " self.critic.update(batch_states, batch_returns)\n", - "\n", - " # clear memory after learning due to on-policy\n", - " self.experience_memory.reset()\n", - "\n", - " @torch.no_grad()\n", - " def select_action(self, s, is_training=True):\n", - " a, _ = self.actor.act(s, is_training=is_training)\n", - " return a.clamp(self._u_min + self.eps, self._u_max - self.eps)\n", - "\n", - " def Q_value(self, s, a):\n", - " return self.critic(s)\n", - "\n", - " def store_transition(self, s, a, r, sp, terminated, truncated, step):\n", - " self.experience_memory.add(s, a, r, sp, terminated or truncated, step)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Experimenting" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# env\n", - "eval_env = make_env(\n", - " exp_name=exp_name,\n", - " seed=seed + 100,\n", - " idxs=get_idx_to_paralyze(exp_name),\n", - " paralyzed_ratio=0.0,\n", - ")\n", - "\n", - "# EPPO\n", - "agent = EvidentialProximalPolicyOptimization(\n", - " env=eval_env,\n", - " actor_nn=ActorNetProbabilistic,\n", - " critic_nn=EvidentialCriticNet,\n", - " device=device,\n", - " gamma=gamma,\n", - " buffer_size=buffer_size,\n", - " clip_param=clip_param,\n", - " gae_lambda=gae_lambda,\n", - " max_grad_norm=max_grad_norm,\n", - " learning_rate=learning_rate,\n", - " depth_actor=depth_actor,\n", - " width_actor=width_actor,\n", - " act_actor=act_actor,\n", - " no_norm_actor=no_norm_actor,\n", - " depth_critic=depth_critic,\n", - " width_critic=width_critic,\n", - " act_critic=act_critic,\n", - " no_norm_critic=no_norm_critic,\n", - " regularization_coeff=regularization_coeff,\n", - " radius=radius,\n", - " exploration_type=exploration_type,\n", - " batch_size=batch_size,\n", - ")\n", - "\n", - "# experimenter\n", - "experimenter = ParalysisExpriment(\n", - " agent=agent,\n", - " exp_name=exp_name,\n", - " seed=seed,\n", - " max_steps=max_steps,\n", - " eval_frequency=eval_frequency,\n", - " device=device,\n", - " learn_frequency=learn_frequency,\n", - " eval_episodes=eval_episodes,\n", - " max_iter=max_iter,\n", - " gamma=gamma,\n", - ")\n", - "\n", - "experimenter.train()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "eppo", - "language": "python", - "name": "python3" - }, - "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.12.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "cells": [ + { + "cell_type": "code", + "source": [ + "!pip install -q \"gymnasium[mujoco]\"" + ], + "metadata": { + "id": "87f4plwFtIR4", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "69e089db-0cb7-4bd6-c73c-9195fa44b576" + }, + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m42.0/42.0 kB\u001b[0m \u001b[31m1.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.0/7.0 MB\u001b[0m \u001b[31m60.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m243.5/243.5 kB\u001b[0m \u001b[31m13.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Derived from ADIN Lab's EPPO [implementation](https://github.com/adinlab/EPPO), as outlined in [this paper](https://arxiv.org/html/2503.01468v2). Replicates the experiments therein. Recorded data relates to the `HalfCheetah` environment, using the `front-one` strategy.\n", + "\n" + ], + "metadata": { + "id": "MT2YhUTtjBXd" + } + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "9RWHhh1Wi3sS" + }, + "outputs": [], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import numpy as np\n", + "import gymnasium as gym\n", + "import itertools\n", + "import time\n", + "import copy\n", + "from gymnasium.wrappers import RescaleAction\n", + "from typing import Optional\n", + "from torch.distributions import Normal\n", + "from tqdm import tqdm" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Shared Code" + ], + "metadata": { + "id": "4WyNyKabtOyD" + } + }, + { + "cell_type": "code", + "source": [ + "# @title Experiment Parameters\n", + "environment = \"halfcheetah\" # @param [\"halfcheetah\", \"ant\"]\n", + "strategy_halfcheetah = 'front_one' # @param [\"back_one\", \"front_one\", \"cross_v1\", \"cross_v2\"]\n", + "strategy_ant = 'back_one' # @param [\"back_one\", \"front_one\", \"back_two\", \"front_two\", \"parallel\", \"cross\"]\n", + "\n", + "strategy = strategy_ant if environment=='ant' else strategy_halfcheetah\n", + "\n", + "# common parameters\n", + "max_steps = 500_000\n", + "learning_rate = 3e-4\n", + "learn_frequency = 2047 # it is 2048 but we are using 0 based index\n", + "batch_size = 256\n", + "max_iter = 10\n", + "act_actor = \"relu\"\n", + "act_critic = \"relu\"\n", + "depth_actor = 3\n", + "depth_critic = 3\n", + "width_actor = 256\n", + "width_critic = 256\n", + "gamma = 0.99\n", + "no_norm_actor = False\n", + "no_norm_critic = False\n", + "eval_frequency = 20_000\n", + "eval_episodes = 10\n", + "buffer_size = 2048\n", + "\n", + "# ppo related\n", + "clip_param = 0.2\n", + "gae_lambda = 0.95\n", + "max_grad_norm = 0.5\n", + "\n", + "# eppo related\n", + "regularization_coeff = 0.01\n", + "radius = 0.01\n", + "seed = 1\n", + "exploration_types = [\"mean\", \"cor\", \"ind\"]\n", + "exploration_type = exploration_types[0]\n", + "\n", + "exp_name = f\"{environment}_{strategy}\"\n", + "print(f\"Experiment: {exp_name}\")\n", + "\n", + "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "cellView": "form", + "id": "Fdvx0i2gv9RV", + "outputId": "123b059a-d627-46f8-ad34-f273b5022580" + }, + "execution_count": 155, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Experiment: halfcheetah_front_one\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# @title Env and wrappers\n", + "class ParalyzeActionWrapper(gym.ActionWrapper):\n", + " def __init__(self, env, joint_idxs, paralyzed_ratio=0.0):\n", + " super().__init__(env)\n", + " self.paralyzed_ratio = paralyzed_ratio\n", + " self.joint_idxs = joint_idxs\n", + " self.coeff = np.ones(self.action_space.shape)\n", + " self.coeff[joint_idxs] = paralyzed_ratio\n", + "\n", + " def step(self, action):\n", + " action = action * self.coeff\n", + " return self.env.step(action)\n", + "\n", + "class SinglePrecision(gym.ObservationWrapper):\n", + "\n", + " def __init__(self, env):\n", + " super().__init__(env)\n", + "\n", + " if isinstance(self.observation_space, gym.spaces.Box):\n", + " obs_space = self.observation_space\n", + " self.observation_space = gym.spaces.Box(obs_space.low, obs_space.high, obs_space.shape)\n", + " elif isinstance(self.observation_space, gym.spaces.Dict):\n", + " obs_spaces = copy.copy(self.observation_space.spaces)\n", + " for k, v in obs_spaces.items():\n", + " obs_spaces[k] = gym.spaces.Box(v.low, v.high, v.shape)\n", + " self.observation_space = gym.spaces.Dict(obs_spaces)\n", + " else:\n", + " raise NotImplementedError\n", + "\n", + " def observation(self, observation: np.ndarray) -> np.ndarray:\n", + " if isinstance(observation, np.ndarray):\n", + " return observation.astype(np.float32)\n", + " elif isinstance(observation, dict):\n", + " observation = copy.copy(observation)\n", + " for k, v in observation.items():\n", + " observation[k] = v.astype(np.float32)\n", + " return observation\n", + "\n", + "\n", + "def get_idx_to_paralyze(exp_name):\n", + " if \"ant\" in exp_name:\n", + " if \"front_one\" in exp_name: # front left joints\n", + " return [2, 3]\n", + " elif \"front_two\" in exp_name: # front left and right joints\n", + " return [2, 3, 4, 5]\n", + " elif \"back_one\" in exp_name: # back left joints\n", + " return [6, 7]\n", + " elif \"back_two\" in exp_name: # back left and right joints\n", + " return [0, 1, 6, 7]\n", + " elif \"parallel\" in exp_name: # left front and back joints\n", + " return [2, 3, 6, 7]\n", + " elif \"cross\" in exp_name: # left front and right back joints\n", + " return [2, 3, 0, 1]\n", + " elif \"halfcheetah\" in exp_name:\n", + " if \"front_one\" in exp_name:\n", + " return [5]\n", + " elif \"back_one\" in exp_name:\n", + " return [2]\n", + " elif \"cross_v1\" in exp_name:\n", + " return [2, 4]\n", + " elif \"cross_v2\" in exp_name:\n", + " return [1, 5]\n", + " else:\n", + " raise ValueError(f\"Unknown experiment: {exp_name}\")\n", + "\n", + "\n", + "def make_env(\n", + " exp_name: str,\n", + " seed: int,\n", + " idxs: Optional[list] = None,\n", + " paralyzed_ratio: Optional[float] = 0.0,\n", + ") -> gym.Env:\n", + "\n", + " if \"ant\" in exp_name:\n", + " env_name = \"Ant-v5\"\n", + " elif \"halfcheetah\" in exp_name:\n", + " env_name = \"HalfCheetah-v5\"\n", + " else:\n", + " raise NotImplementedError(f\"Environment {exp_name} not implemented\")\n", + "\n", + " env = gym.make(env_name)\n", + " env = RescaleAction(env, -1.0, 1.0)\n", + " env = SinglePrecision(env)\n", + " env = ParalyzeActionWrapper(env, idxs, paralyzed_ratio)\n", + "\n", + " env.reset(seed=seed)\n", + " env.action_space.seed(seed)\n", + " env.observation_space.seed(seed)\n", + " np.random.seed(seed)\n", + " torch.manual_seed(seed)\n", + " return env" + ], + "metadata": { + "cellView": "form", + "id": "3rFu5zGblgPC" + }, + "execution_count": 156, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# @title Experiment Code\n", + "def totorch(x, dtype=torch.float32, device=\"cuda\"):\n", + " return torch.as_tensor(x, dtype=dtype, device=device)\n", + "\n", + "\n", + "def tonumpy(x):\n", + " return x.data.cpu().numpy()\n", + "\n", + "\n", + "class ExperienceMemoryTorch:\n", + " \"\"\"Fixed-size buffer to store experience tuples.\"\"\"\n", + "\n", + " field_names = [\"state\", \"action\", \"reward\", \"next_state\", \"terminated\", \"step\"]\n", + "\n", + " def __init__(self, device, buffer_size, dims):\n", + " self.device = device\n", + " self.buffer_size = buffer_size\n", + " self.dims = dims\n", + " self.reset()\n", + "\n", + " def reset(self, buffer_size=None):\n", + " if buffer_size is not None:\n", + " self.buffer_size = buffer_size\n", + " self.data_size = 0\n", + " self.pointer = 0\n", + " self.memory = {\n", + " field: torch.empty(self.dims[field], device=self.device)\n", + " for field in self.field_names\n", + " }\n", + "\n", + " def add(self, state, action, reward, next_state, terminated, step):\n", + " for field, value in zip(\n", + " self.field_names, [state, action, reward, next_state, terminated, step]\n", + " ):\n", + " self.memory[field][self.pointer] = value\n", + " self.pointer = (self.pointer + 1) % self.buffer_size\n", + " self.data_size = min(self.data_size + 1, self.buffer_size)\n", + "\n", + " def sample_by_index(self, index):\n", + " return tuple(self.memory[field][index] for field in self.field_names)\n", + "\n", + " def sample_all(self):\n", + " return self.sample_by_index(range(self.data_size))\n", + "\n", + " def __len__(self):\n", + " return self.data_size\n", + "\n", + " @property\n", + " def size(self):\n", + " return self.data_size\n", + "\n", + "\n", + "class ParalysisExpriment(object):\n", + " def __init__(\n", + " self,\n", + " agent,\n", + " exp_name,\n", + " seed,\n", + " max_steps,\n", + " eval_frequency,\n", + " device,\n", + " learn_frequency,\n", + " eval_episodes,\n", + " max_iter,\n", + " gamma,\n", + " ):\n", + " self.exp_name = exp_name\n", + " self.seed = seed\n", + " self.max_steps = max_steps\n", + " self.eval_frequency = eval_frequency\n", + " self.device = device\n", + " self.learn_frequency = learn_frequency\n", + " self.eval_episodes = eval_episodes\n", + " self.max_iter = max_iter\n", + " self.gamma = gamma\n", + "\n", + " self.idx_to_paralyze = get_idx_to_paralyze(self.exp_name)\n", + " self.prepare_tasks()\n", + "\n", + " self.agent = agent\n", + "\n", + " self.AULCS = []\n", + " self.FINAL_RETURNS = []\n", + "\n", + " def prepare_tasks(self):\n", + " task_order = [1.0, 0.75, 0.5, 0.25, 0.0, 0.25, 0.5, 0.75, 1.0]\n", + " self.n_tasks = len(task_order)\n", + "\n", + " self.tasks = {\n", + " task_id: {\"task\": coeff, \"idxs\": self.idx_to_paralyze}\n", + " for task_id, coeff in enumerate(task_order)\n", + " }\n", + " task_names = [task_info[\"task\"] for task_info in self.tasks.values()]\n", + " print(f\"Tasks: {task_names}\")\n", + "\n", + " def set_task(self, task_id, task_info):\n", + " task = task_info[\"task\"]\n", + "\n", + " self.env = make_env(\n", + " exp_name=self.exp_name,\n", + " seed=self.seed,\n", + " idxs=task_info[\"idxs\"],\n", + " paralyzed_ratio=task,\n", + " )\n", + "\n", + " self.eval_env = make_env(\n", + " exp_name=self.exp_name,\n", + " seed=self.seed + 100,\n", + " idxs=task_info[\"idxs\"],\n", + " paralyzed_ratio=task,\n", + " )\n", + "\n", + " return task\n", + "\n", + " def train(self):\n", + " time_start = time.time()\n", + "\n", + " information_dict = {\n", + " \"episode_rewards\": torch.zeros(self.max_steps * (self.n_tasks + 1)),\n", + " \"episode_steps\": torch.zeros(self.max_steps * (self.n_tasks + 1)),\n", + " \"step_rewards\": np.empty((2 * self.max_steps * self.n_tasks), dtype=object),\n", + " }\n", + "\n", + " r_cum = np.zeros(1)\n", + " episode = 0\n", + " e_step = 0\n", + " for task_id, task_info in self.tasks.items():\n", + " # task starts\n", + " task = self.set_task(task_id, task_info)\n", + " print(f\"Commencing task {task_id}: {task}\")\n", + "\n", + " r_cum = np.zeros(1)\n", + " s, _ = self.env.reset()\n", + " s = totorch(s, device=self.device)\n", + " for step in tqdm(\n", + " range(task_id * self.max_steps, (task_id + 1) * self.max_steps),\n", + " leave=True,\n", + " disable=True,\n", + " ):\n", + " e_step += 1\n", + "\n", + " if step % self.eval_frequency == 0:\n", + " self.eval(step)\n", + "\n", + " a = self.agent.select_action(s).clip(-1.0, 1.0)\n", + "\n", + " sp, r, done, truncated, info = self.env.step(tonumpy(a))\n", + " sp = totorch(sp, device=self.device)\n", + "\n", + " self.agent.store_transition(s, a, r, sp, done, truncated, step + 1)\n", + "\n", + " information_dict[\"step_rewards\"][step] = (\n", + " episode,\n", + " step,\n", + " r,\n", + " )\n", + "\n", + " s = sp # Update state\n", + " r_cum += r # Update cumulative reward\n", + "\n", + " if (step % self.learn_frequency) == 0:\n", + " # print(\"Learning at step: \", step)\n", + " self.agent.learn(max_iter=self.max_iter)\n", + "\n", + " if done or truncated:\n", + "\n", + " information_dict[\"episode_rewards\"][episode] = r_cum.item()\n", + " information_dict[\"episode_steps\"][episode] = step\n", + " if episode % 10 == 0:\n", + " print(\n", + " f\"Episode: {episode + 1:4d}\\tN-steps: {step:7d}\\tReward: {r_cum.item():10.3f}\"\n", + " )\n", + " s, _ = self.env.reset()\n", + " s = totorch(s, device=self.device)\n", + " r_cum = np.zeros(1)\n", + " episode += 1\n", + " e_step = 0\n", + "\n", + " # task finishes\n", + " self.eval(step, final=True)\n", + " self.agent.end_task()\n", + "\n", + " time_end = time.time()\n", + " print(f\"Training time: {time_end - time_start:.2f} seconds\")\n", + "\n", + " print(f\"AULC: {np.mean(self.AULCS)}\")\n", + " print(f\"Final Return: {np.mean(self.FINAL_RETURNS)}\")\n", + "\n", + " @torch.no_grad()\n", + " def eval(self, n_step, final=False):\n", + " self.agent.eval()\n", + " results = torch.zeros(self.eval_episodes)\n", + " collect_infos = {}\n", + " for episode in range(self.eval_episodes):\n", + " collect_infos[episode] = []\n", + " s, info = self.eval_env.reset()\n", + " s = totorch(s, device=self.device)\n", + " step = 0\n", + " a = self.agent.select_action(s, is_training=False)\n", + " done = False\n", + "\n", + " while not done:\n", + " a = self.agent.select_action(s, is_training=False)\n", + "\n", + " sp, r, term, trunc, info = self.eval_env.step(tonumpy(a))\n", + " collect_infos[episode].append(info)\n", + "\n", + " done = term or trunc\n", + " s = totorch(sp, device=self.device)\n", + " results[episode] += r\n", + " step += 1\n", + "\n", + " print(f\"EVALUATION\\tN-steps: {n_step:7d}\\tMean_Reward: {results.mean():10.3f}\")\n", + " self.AULCS.append(results.mean())\n", + " if final:\n", + " self.FINAL_RETURNS.append(results.mean())\n", + "\n", + " self.agent.train()" + ], + "metadata": { + "cellView": "form", + "id": "99AwvqRtlgbT" + }, + "execution_count": 157, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# @title Network Arch\n", + "def get_activation(act):\n", + " if act == \"relu\":\n", + " return nn.ReLU\n", + " elif act == \"tanh\":\n", + " return nn.Tanh\n", + " else:\n", + " raise NotImplementedError(f\"{act} is not implemented\")\n", + "\n", + "\n", + "def create_net(d_in, d_out, depth, width, act=\"crelu\", has_norm=True, n_elements=1):\n", + " assert depth > 0, \"Need at least one layer\"\n", + "\n", + " act = get_activation(act)\n", + "\n", + " if depth == 1:\n", + " arch = nn.Linear(d_in, d_out)\n", + " elif depth == 2:\n", + " arch = nn.Sequential(\n", + " nn.Linear(d_in, width),\n", + " (\n", + " nn.LayerNorm(width, elementwise_affine=False)\n", + " if has_norm\n", + " else nn.Identity()\n", + " ),\n", + " act(),\n", + " nn.Linear(width, d_out),\n", + " )\n", + " else:\n", + " in_layer = nn.Linear(d_in, width)\n", + " if n_elements > 1:\n", + " out_layer = nn.Linear(width, d_out, n_elements)\n", + " else:\n", + " out_layer = nn.Linear(width, d_out)\n", + "\n", + " # This can probably be done in a more readable way, but it's fast and works...\n", + " hidden = list(\n", + " itertools.chain.from_iterable(\n", + " [\n", + " [\n", + " (\n", + " nn.LayerNorm(width, elementwise_affine=False)\n", + " if has_norm\n", + " else nn.Identity()\n", + " ),\n", + " act(),\n", + " nn.Linear(width, width),\n", + " ]\n", + " for _ in range(depth - 1)\n", + " ]\n", + " )\n", + " )[:-1]\n", + " arch = nn.Sequential(in_layer, *hidden, out_layer)\n", + "\n", + " return arch\n", + "\n", + "\n", + "class GaussianHead(nn.Module):\n", + " def __init__(self, n):\n", + " super().__init__()\n", + " self._n = n\n", + "\n", + " def forward(self, x, is_training=True, return_dist=False):\n", + " mean = x[..., : self._n]\n", + " logstd = x[..., self._n :].clamp(-10.0, -2.0)\n", + " std = logstd.exp()\n", + " dist = Normal(mean, std, validate_args=False)\n", + " if is_training:\n", + " y = dist.rsample()\n", + " y_logprob = dist.log_prob(y).sum(dim=-1, keepdim=True)\n", + " else:\n", + " y = dist.mode\n", + " y_logprob = None\n", + " if return_dist:\n", + " return y, y_logprob, dist\n", + " return y, mean\n", + "\n", + "\n", + "class ActorNetProbabilistic(nn.Module):\n", + " def __init__(self, dim_obs, dim_act, depth=3, width=256, act=\"relu\", has_norm=True):\n", + " super().__init__()\n", + " self.dim_act = dim_act\n", + " self.arch = create_net(dim_obs, 2 * dim_act, depth, width, act, has_norm)\n", + "\n", + " self.head = GaussianHead(self.dim_act)\n", + "\n", + " def forward(self, x, is_training=True, return_dist=False):\n", + " f = self.arch(x)\n", + " return self.head(f, is_training, return_dist=return_dist)\n", + "\n", + "\n", + "class EvidentialCriticNet(nn.Module):\n", + " def __init__(self, dim_obs, depth=3, width=256, act=\"relu\", has_norm=False):\n", + " super().__init__()\n", + "\n", + " self.arch = create_net(dim_obs, 4, depth, width, act=act, has_norm=has_norm)\n", + "\n", + " @staticmethod\n", + " def evidence(x):\n", + " return torch.exp(x)\n", + "\n", + " def forward(self, x):\n", + " output = self.arch(x)\n", + " gamma, logv, log_alpha, log_beta = output.chunk(4, dim=-1)\n", + " v = self.evidence(logv)\n", + " alpha = self.evidence(log_alpha) + 1 # to ensure that alpha > 1\n", + " beta = self.evidence(log_beta)\n", + " return gamma, v, alpha, beta" + ], + "metadata": { + "cellView": "form", + "id": "vcZpLI1zlgpd" + }, + "execution_count": 158, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# @title Evidential PPO Algorithm\n", + "class EPPOActor(nn.Module):\n", + " '''\n", + " Looks like a normal PPO actor.\n", + " '''\n", + " def __init__(\n", + " self,\n", + " arch,\n", + " n_state,\n", + " n_action,\n", + " clip_param,\n", + " max_grad_norm,\n", + " learning_rate,\n", + " depth_actor,\n", + " width_actor,\n", + " act_actor,\n", + " no_norm_actor,\n", + " device,\n", + " ):\n", + " super().__init__()\n", + " self.n_state = n_state\n", + " self.n_action = n_action\n", + " self.arch = arch\n", + " self.clip = clip_param\n", + " self.max_grad_norm = max_grad_norm\n", + " self.learning_rate = learning_rate\n", + " self.depth_actor = depth_actor\n", + " self.width_actor = width_actor\n", + " self.act_actor = act_actor\n", + " self.no_norm_actor = no_norm_actor\n", + " self.device = device\n", + "\n", + " self.initialize()\n", + "\n", + " def initialize(self):\n", + " self.model = self.arch(\n", + " self.n_state,\n", + " self.n_action,\n", + " depth=self.depth_actor,\n", + " width=self.width_actor,\n", + " act=self.act_actor,\n", + " has_norm=not self.no_norm_actor,\n", + " ).to(self.device)\n", + " self.optim = torch.optim.Adam(self.model.parameters(), self.learning_rate)\n", + "\n", + " def evaluate(self, s):\n", + " _, _, dist = self.model(s, return_dist=True)\n", + " # return dist here\n", + " return dist\n", + "\n", + " def loss(self, s, a, old_probs, adv):\n", + " dist = self.evaluate(s)\n", + " new_probs = dist.log_prob(a)\n", + " foo = new_probs.sum(1, keepdim=True) - old_probs.sum(1, keepdim=True)\n", + " prob_ratio = torch.exp(foo.clamp(-20, 1))\n", + "\n", + " weighted_probs = adv * prob_ratio\n", + " weighted_clipped_probs = (\n", + " torch.clamp(prob_ratio, 1 - self.clip, 1 + self.clip) * adv\n", + " )\n", + "\n", + " actor_loss = -torch.min(weighted_probs, weighted_clipped_probs).mean()\n", + " self.clip_fraction = ( # No idea what this is for. Looks unused.\n", + " (torch.abs((prob_ratio - 1)) > self.clip).to(torch.float).mean()\n", + " )\n", + "\n", + " return actor_loss\n", + "\n", + " def update(self, s, a, old_probs, adv):\n", + " self.optim.zero_grad()\n", + " loss = self.loss(s, a, old_probs, adv)\n", + " loss.backward()\n", + " torch.nn.utils.clip_grad_norm_(self.model.parameters(), self.max_grad_norm)\n", + " self.optim.step()\n", + "\n", + " def act(self, s, is_training=True):\n", + " a, e = self.model(s, is_training=is_training)\n", + " return a, e\n", + "\n", + "\n", + "class EvidentialCritic(nn.Module):\n", + " def __init__(\n", + " self,\n", + " arch,\n", + " n_state,\n", + " max_grad_norm,\n", + " depth_critic,\n", + " width_critic,\n", + " act_critic,\n", + " no_norm_critic,\n", + " device,\n", + " learning_rate,\n", + " regularization_coeff,\n", + " ):\n", + " super().__init__()\n", + "\n", + " self.arch = arch\n", + " self.max_grad_norm = max_grad_norm\n", + " self.depth_critic = depth_critic\n", + " self.width_critic = width_critic\n", + " self.act_critic = act_critic\n", + " self.no_norm_critic = no_norm_critic\n", + " self.n_state = n_state\n", + " self.learning_rate = learning_rate\n", + " self.iter = 0\n", + " self.device = device\n", + " self.initialize()\n", + "\n", + " self.regularization_coeff = regularization_coeff\n", + "\n", + " def initialize(self):\n", + " self.model = self.arch(\n", + " self.n_state,\n", + " depth=self.depth_critic,\n", + " width=self.width_critic,\n", + " act=self.act_critic,\n", + " has_norm=not self.no_norm_critic,\n", + " ).to(self.device)\n", + " self.loss = torch.nn.MSELoss()\n", + " self.optim = torch.optim.Adam(self.model.parameters(), self.learning_rate)\n", + "\n", + " self.prior_gamma = torch.distributions.Normal(\n", + " torch.tensor(0.0).to(self.device), torch.tensor(100.0).to(self.device)\n", + " )\n", + " self.prior_v = torch.distributions.Gamma(\n", + " torch.tensor(5.0).to(self.device), torch.tensor(1.0).to(self.device)\n", + " )\n", + " self.prior_alpha = torch.distributions.TransformedDistribution(\n", + " torch.distributions.Gamma(\n", + " torch.tensor(5.0).to(self.device), torch.tensor(1.0).to(self.device)\n", + " ),\n", + " [\n", + " torch.distributions.transforms.AffineTransform(\n", + " loc=1.0, scale=1.0, cache_size=1\n", + " )\n", + " ],\n", + " )\n", + " self.prior_beta = torch.distributions.Gamma(\n", + " torch.tensor(5.0).to(self.device), torch.tensor(1.0).to(self.device)\n", + " )\n", + "\n", + " def get_prior(self, x):\n", + " gamma, v, alpha, beta = self.model(x)\n", + " return gamma, v, alpha, beta\n", + "\n", + " def loss(self, state, target):\n", + " gamma, v, alpha, beta = self.get_prior(state)\n", + " twoBlambda = 2 * beta * (1 + v)\n", + " loss = (\n", + " -0.5 * torch.log(v)\n", + " - alpha * torch.log(twoBlambda)\n", + " + (alpha + 0.5) * torch.log(v * (target - gamma) ** 2 + twoBlambda)\n", + " + torch.lgamma(alpha)\n", + " - torch.lgamma(alpha + 0.5)\n", + " )\n", + "\n", + " regularization = (\n", + " self.prior_gamma.log_prob(gamma).mean()\n", + " + self.prior_v.log_prob(v).mean()\n", + " + self.prior_alpha.log_prob(alpha).mean()\n", + " + self.prior_beta.log_prob(beta).mean()\n", + " )\n", + " loss -= regularization * self.regularization_coeff\n", + "\n", + " return loss.mean()\n", + "\n", + " def update(self, state, target): # y denotes bellman target\n", + " self.optim.zero_grad()\n", + " loss = self.loss(state, target)\n", + " loss.backward()\n", + " torch.nn.utils.clip_grad_norm_(self.model.parameters(), self.max_grad_norm)\n", + " self.optim.step()\n", + "\n", + " def forward(self, x, target=False):\n", + " gamma, v, alpha, beta = self.get_prior(x)\n", + " if target:\n", + " return gamma\n", + "\n", + " return gamma\n", + "\n", + " def get_mean_and_variance_of_y(self, x):\n", + " gamma, v, alpha, beta = self.get_prior(x)\n", + " mean = gamma\n", + " variance = (beta / (alpha - 1)) * (1 + 1.0 / v)\n", + " return mean, variance\n", + "\n", + "\n", + "class EvidentialProximalPolicyOptimization(nn.Module):\n", + " _agent_name = \"EPPO\"\n", + "\n", + " def __init__(\n", + " self,\n", + " env,\n", + " actor_nn,\n", + " critic_nn,\n", + " device,\n", + " gamma,\n", + " buffer_size,\n", + " clip_param,\n", + " gae_lambda,\n", + " max_grad_norm,\n", + " learning_rate,\n", + " depth_actor,\n", + " width_actor,\n", + " act_actor,\n", + " no_norm_actor,\n", + " depth_critic,\n", + " width_critic,\n", + " act_critic,\n", + " no_norm_critic,\n", + " regularization_coeff,\n", + " radius,\n", + " exploration_type,\n", + " batch_size,\n", + " ):\n", + " super().__init__()\n", + "\n", + " self.device = device\n", + " self.env = env\n", + " self.eps = 1e-6 # small value to avoid division by zero\n", + " self.clip_param = clip_param\n", + " self.gae_lambda = gae_lambda\n", + " self.max_grad_norm = max_grad_norm\n", + " self.learning_rate = learning_rate\n", + " self.depth_actor = depth_actor\n", + " self.width_actor = width_actor\n", + " self.act_actor = act_actor\n", + " self.no_norm_actor = no_norm_actor\n", + " self.depth_critic = depth_critic\n", + " self.width_critic = width_critic\n", + " self.act_critic = act_critic\n", + " self.no_norm_critic = no_norm_critic\n", + " self.regularization_coeff = regularization_coeff\n", + " self.radius = radius\n", + " self.exploration_type = (exploration_type,)\n", + " self.batch_size = batch_size\n", + "\n", + " self.dim_obs, self.dim_act = (\n", + " self.env.observation_space.shape,\n", + " self.env.action_space.shape,\n", + " )\n", + " self.dim_obs_flat, self.dim_act_flat = np.prod(self.dim_obs), np.prod(\n", + " self.dim_act\n", + " )\n", + " self._u_min = totorch(self.env.action_space.low, device=self.device)\n", + " self._u_max = totorch(self.env.action_space.high, device=self.device)\n", + " self._x_min = totorch(self.env.observation_space.low, device=self.device)\n", + " self._x_max = totorch(self.env.observation_space.high, device=self.device)\n", + "\n", + " self._gamma = gamma\n", + " self.buffer_size = buffer_size\n", + "\n", + " dims = {\n", + " \"state\": (self.buffer_size, self.dim_obs_flat),\n", + " \"action\": (self.buffer_size, self.dim_act_flat),\n", + " \"next_state\": (self.buffer_size, self.dim_obs_flat),\n", + " \"reward\": (self.buffer_size),\n", + " \"terminated\": (self.buffer_size),\n", + " \"step\": (self.buffer_size),\n", + " }\n", + "\n", + " self.experience_memory = ExperienceMemoryTorch(\n", + " self.device, self.buffer_size, dims\n", + " )\n", + "\n", + " self.actor = EPPOActor(\n", + " actor_nn,\n", + " self.dim_obs_flat,\n", + " self.dim_act_flat,\n", + " self.clip_param,\n", + " self.max_grad_norm,\n", + " self.learning_rate,\n", + " self.depth_actor,\n", + " self.width_actor,\n", + " self.act_actor,\n", + " self.no_norm_actor,\n", + " self.device,\n", + " )\n", + "\n", + " self.critic = EvidentialCritic(\n", + " critic_nn,\n", + " self.dim_obs_flat,\n", + " self.max_grad_norm,\n", + " self.depth_critic,\n", + " self.width_critic,\n", + " self.act_critic,\n", + " self.no_norm_critic,\n", + " self.device,\n", + " self.learning_rate,\n", + " self.regularization_coeff,\n", + " )\n", + "\n", + " self._variance_coeff = (1.0 - self.gae_lambda) / (1.0 + self.gae_lambda)\n", + " self._next_variance_coeff = ((1.0 - self.gae_lambda) / (self.gae_lambda)) ** 2\n", + " self._accumulation_coeff = (self._gamma * self.gae_lambda) ** 2\n", + "\n", + " if exploration_type == \"mean\":\n", + " self.calculate_advantages = self.calculate_advantages_mean\n", + " elif exploration_type == \"cor\":\n", + " # Could replace this with ind and setting variance_coeff to 1\n", + " self.calculate_advantages = self.calculate_advantages_cor\n", + " elif exploration_type == \"ind\":\n", + " self.calculate_advantages = self.calculate_advantages_ind\n", + " else:\n", + " raise ValueError(f\"Unknown exploration type: {exploration_type}\")\n", + "\n", + " def end_task(self):\n", + " self.experience_memory.reset()\n", + "\n", + " @torch.no_grad()\n", + " def calculate_advantages_mean(self, states, next_states, rewards, dones):\n", + " # EPPO_mean\n", + " values = self.critic(states)\n", + " next_values = self.critic(next_states)\n", + " deltas = rewards + self._gamma * next_values * (1 - dones) - values\n", + " advantages = torch.zeros_like(rewards)\n", + " advantage = 0\n", + " for i in reversed(range(len(deltas))):\n", + " advantage = (\n", + " self._gamma * self.gae_lambda * advantage * (1 - dones[i]) + deltas[i]\n", + " )\n", + " advantages[i] = advantage\n", + "\n", + " returns = advantages + values\n", + " advantages = (advantages - advantages.mean()) / (advantages.std() + self.eps)\n", + " return advantages, returns\n", + "\n", + " @torch.no_grad()\n", + " def calculate_advantages_cor(self, states, next_states, rewards, dones):\n", + " # EPPO_cor\n", + " mean_values, variance_values = self.critic.get_mean_and_variance_of_y(states)\n", + " mean_next_values, variance_next_values = self.critic.get_mean_and_variance_of_y(\n", + " next_states\n", + " )\n", + " mean_deltas = (\n", + " rewards + self._gamma * mean_next_values * (1 - dones) - mean_values\n", + " )\n", + "\n", + " mean_advantages = torch.zeros_like(rewards)\n", + " variance_advantages = torch.zeros_like(rewards)\n", + " mean_advantage = 0\n", + " variance_accumulated = 0\n", + " for i in reversed(range(len(mean_deltas))):\n", + " mean_advantage = (\n", + " self._gamma * self.gae_lambda * mean_advantage * (1 - dones[i])\n", + " + mean_deltas[i]\n", + " )\n", + " mean_advantages[i] = mean_advantage\n", + " variance_accumulated = self._accumulation_coeff * (\n", + " variance_accumulated * (1 - dones[i]) + variance_next_values[i]\n", + " )\n", + " variance_advantages[i] = (\n", + " # Equivalent to ind, except for no variance coefficient\n", + " variance_values[i] + self._next_variance_coeff * variance_accumulated\n", + " )\n", + "\n", + " std_advantages = torch.sqrt(variance_advantages)\n", + " advantages = mean_advantages + self.radius * std_advantages\n", + " returns = mean_advantages + mean_values\n", + " advantages = (advantages - advantages.mean()) / (advantages.std() + self.eps)\n", + " return advantages, returns\n", + "\n", + " @torch.no_grad()\n", + " def calculate_advantages_ind(self, states, next_states, rewards, dones):\n", + " # EPPO_ind\n", + " mean_values, variance_values = self.critic.get_mean_and_variance_of_y(states)\n", + " mean_next_values, variance_next_values = self.critic.get_mean_and_variance_of_y(\n", + " next_states\n", + " )\n", + " mean_deltas = (\n", + " rewards + self._gamma * mean_next_values * (1 - dones) - mean_values\n", + " )\n", + "\n", + " mean_advantages = torch.zeros_like(rewards)\n", + " variance_advantages = torch.zeros_like(rewards)\n", + " mean_advantage = 0\n", + " variance_accumulated = 0\n", + " for i in reversed(range(len(mean_deltas))):\n", + " mean_advantage = (\n", + " self._gamma * self.gae_lambda * mean_advantage * (1 - dones[i])\n", + " + mean_deltas[i]\n", + " )\n", + " mean_advantages[i] = mean_advantage\n", + " variance_accumulated = self._accumulation_coeff * (\n", + " variance_accumulated * (1 - dones[i]) + variance_next_values[i]\n", + " )\n", + " variance_advantages[i] = (\n", + " self._variance_coeff * variance_values[i]\n", + " + self._next_variance_coeff * variance_accumulated\n", + " )\n", + "\n", + " std_advantages = torch.sqrt(variance_advantages)\n", + " advantages = mean_advantages + self.radius * std_advantages\n", + " returns = mean_advantages + mean_values\n", + " advantages = (advantages - advantages.mean()) / (advantages.std() + self.eps)\n", + " return advantages, returns\n", + "\n", + " @torch.no_grad()\n", + " def calculate_old_probs(self, states, actions):\n", + " dist = self.actor.evaluate(states)\n", + " return dist.log_prob(actions)\n", + "\n", + " def learn(self, max_iter=1):\n", + " if self.batch_size > len(self.experience_memory):\n", + " return None\n", + "\n", + " states, actions, rewards, next_states, terminateds, _ = (\n", + " self.experience_memory.sample_all()\n", + " )\n", + " rewards = rewards.reshape(-1, 1)\n", + " terminateds = terminateds.reshape(-1, 1)\n", + " advantages, returns = self.calculate_advantages(\n", + " states, next_states, rewards, terminateds\n", + " )\n", + " old_probs = self.calculate_old_probs(states, actions)\n", + "\n", + " for ii in range(max_iter):\n", + " # shuffle data\n", + " indices = torch.randperm(len(states))\n", + " for i in range(0, len(states), self.batch_size):\n", + " batch_indices = indices[i : i + self.batch_size]\n", + " batch_states = states[batch_indices]\n", + " batch_actions = actions[batch_indices]\n", + " batch_old_probs = old_probs[batch_indices]\n", + " batch_advantages = advantages[batch_indices]\n", + " batch_returns = returns[batch_indices]\n", + "\n", + " self.actor.update(\n", + " batch_states, batch_actions, batch_old_probs, batch_advantages\n", + " )\n", + " self.critic.update(batch_states, batch_returns)\n", + "\n", + " # clear memory after learning due to on-policy\n", + " self.experience_memory.reset()\n", + "\n", + " @torch.no_grad()\n", + " def select_action(self, s, is_training=True):\n", + " a, _ = self.actor.act(s, is_training=is_training)\n", + " return a.clamp(self._u_min + self.eps, self._u_max - self.eps)\n", + "\n", + " def Q_value(self, s, a):\n", + " return self.critic(s)\n", + "\n", + " def store_transition(self, s, a, r, sp, terminated, truncated, step):\n", + " self.experience_memory.add(s, a, r, sp, terminated or truncated, step)" + ], + "metadata": { + "cellView": "form", + "id": "gNQpaxzXl-7t" + }, + "execution_count": 159, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Run a trial with Evidential PPO" + ], + "metadata": { + "id": "gz-GItQ46ocz" + } + }, + { + "cell_type": "code", + "source": [ + "# @title Run Experiment\n", + "# env\n", + "eval_env = make_env(\n", + " exp_name=exp_name,\n", + " seed=seed + 100,\n", + " idxs=get_idx_to_paralyze(exp_name),\n", + " paralyzed_ratio=0.0,\n", + ")\n", + "\n", + "# EPPO\n", + "agent = EvidentialProximalPolicyOptimization(\n", + " env=eval_env,\n", + " actor_nn=ActorNetProbabilistic,\n", + " critic_nn=EvidentialCriticNet,\n", + " device=device,\n", + " gamma=gamma,\n", + " buffer_size=buffer_size,\n", + " clip_param=clip_param,\n", + " gae_lambda=gae_lambda,\n", + " max_grad_norm=max_grad_norm,\n", + " learning_rate=learning_rate,\n", + " depth_actor=depth_actor,\n", + " width_actor=width_actor,\n", + " act_actor=act_actor,\n", + " no_norm_actor=no_norm_actor,\n", + " depth_critic=depth_critic,\n", + " width_critic=width_critic,\n", + " act_critic=act_critic,\n", + " no_norm_critic=no_norm_critic,\n", + " regularization_coeff=regularization_coeff,\n", + " radius=radius,\n", + " exploration_type=exploration_type,\n", + " batch_size=batch_size,\n", + ")\n", + "\n", + "# experimenter\n", + "experimenter = ParalysisExpriment(\n", + " agent=agent,\n", + " exp_name=exp_name,\n", + " seed=seed,\n", + " max_steps=max_steps,\n", + " eval_frequency=eval_frequency,\n", + " device=device,\n", + " learn_frequency=learn_frequency,\n", + " eval_episodes=eval_episodes,\n", + " max_iter=max_iter,\n", + " gamma=gamma,\n", + ")\n", + "\n", + "experimenter.train()" + ], + "metadata": { + "id": "63nEnGhrmIW1", + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "collapsed": true, + "outputId": "49db5eb7-0f57-4797-b3a3-0bd575e4f2b7" + }, + "execution_count": 160, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "...\n", + "AULC: 3833.0048828125\n", + "Final Return: 4082.907470703125\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Run a trial with Vanilla PPO" + ], + "metadata": { + "id": "UTpEN_ACPlND" + } + }, + { + "cell_type": "code", + "source": [ + "# @title Non-Evidential Critic\n", + "class CriticNet(nn.Module):\n", + " def __init__(self, dim_obs, depth=3, width=256, act=\"relu\", has_norm=False):\n", + " super().__init__()\n", + " # 1 output instead of 4\n", + " self.arch = create_net(dim_obs, 1, depth, width, act=act, has_norm=has_norm)\n", + "\n", + " def forward(self, x):\n", + " output = self.arch(x)\n", + " return output\n", + "\n", + "class NonEvidentialCritic(nn.Module):\n", + " def __init__(\n", + " self,\n", + " arch,\n", + " n_state,\n", + " max_grad_norm,\n", + " depth_critic,\n", + " width_critic,\n", + " act_critic,\n", + " no_norm_critic,\n", + " device,\n", + " learning_rate,\n", + " regularization_coeff,\n", + " ):\n", + " super().__init__()\n", + "\n", + " self.arch = arch\n", + " self.max_grad_norm = max_grad_norm\n", + " self.depth_critic = depth_critic\n", + " self.width_critic = width_critic\n", + " self.act_critic = act_critic\n", + " self.no_norm_critic = no_norm_critic\n", + " self.n_state = n_state\n", + " self.learning_rate = learning_rate\n", + " self.iter = 0\n", + " self.device = device\n", + " self.initialize()\n", + "\n", + " # No idea whether this is still of value. Basically, keep value estimates pegged to around this range.\n", + " self.regularization_coeff = regularization_coeff\n", + " self.prior_gamma = torch.distributions.Normal(\n", + " torch.tensor(0.0).to(self.device), torch.tensor(100.0).to(self.device)\n", + " )\n", + "\n", + " def initialize(self):\n", + " self.model = self.arch(\n", + " self.n_state,\n", + " depth=self.depth_critic,\n", + " width=self.width_critic,\n", + " act=self.act_critic,\n", + " has_norm=not self.no_norm_critic,\n", + " ).to(self.device)\n", + " self.loss = torch.nn.MSELoss()\n", + " self.optim = torch.optim.Adam(self.model.parameters(), self.learning_rate)\n", + "\n", + "\n", + " def loss(self, state, target):\n", + " v_pred = self(state)\n", + " loss = (target - v_pred) ** 2\n", + "\n", + " regularization = (\n", + " self.prior_gamma.log_prob(v_pred).mean()\n", + " )\n", + " loss -= regularization * self.regularization_coeff\n", + "\n", + " return loss.mean()\n", + "\n", + " def update(self, state, target): # Just runs optimization based on above\n", + " self.optim.zero_grad()\n", + " loss = self.loss(state, target)\n", + " loss.backward()\n", + " torch.nn.utils.clip_grad_norm_(self.model.parameters(), self.max_grad_norm)\n", + " self.optim.step()\n", + "\n", + " def forward(self, x):\n", + " return self.model(x)" + ], + "metadata": { + "cellView": "form", + "id": "yVTppQxoWXEk" + }, + "execution_count": 161, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# @title Non-Evidential PPO Algorithm\n", + "class ProximalPolicyOptimization(nn.Module):\n", + " _agent_name = \"PPO\"\n", + "\n", + " def __init__(\n", + " self,\n", + " env,\n", + " actor_nn,\n", + " critic_nn,\n", + " device,\n", + " gamma,\n", + " buffer_size,\n", + " clip_param,\n", + " gae_lambda,\n", + " max_grad_norm,\n", + " learning_rate,\n", + " depth_actor,\n", + " width_actor,\n", + " act_actor,\n", + " no_norm_actor,\n", + " depth_critic,\n", + " width_critic,\n", + " act_critic,\n", + " no_norm_critic,\n", + " regularization_coeff,\n", + " batch_size,\n", + " ):\n", + " super().__init__()\n", + "\n", + " self.device = device\n", + " self.env = env\n", + " self.eps = 1e-6 # small value to avoid division by zero\n", + " self.clip_param = clip_param\n", + " self.gae_lambda = gae_lambda\n", + " self.max_grad_norm = max_grad_norm\n", + " self.learning_rate = learning_rate\n", + " self.depth_actor = depth_actor\n", + " self.width_actor = width_actor\n", + " self.act_actor = act_actor\n", + " self.no_norm_actor = no_norm_actor\n", + " self.depth_critic = depth_critic\n", + " self.width_critic = width_critic\n", + " self.act_critic = act_critic\n", + " self.no_norm_critic = no_norm_critic\n", + " self.regularization_coeff = regularization_coeff\n", + " self.batch_size = batch_size\n", + "\n", + " self.dim_obs, self.dim_act = (\n", + " self.env.observation_space.shape,\n", + " self.env.action_space.shape,\n", + " )\n", + " self.dim_obs_flat, self.dim_act_flat = np.prod(self.dim_obs), np.prod(\n", + " self.dim_act\n", + " )\n", + " self._u_min = totorch(self.env.action_space.low, device=self.device)\n", + " self._u_max = totorch(self.env.action_space.high, device=self.device)\n", + " self._x_min = totorch(self.env.observation_space.low, device=self.device)\n", + " self._x_max = totorch(self.env.observation_space.high, device=self.device)\n", + "\n", + " self._gamma = gamma\n", + " self.buffer_size = buffer_size\n", + "\n", + " dims = {\n", + " \"state\": (self.buffer_size, self.dim_obs_flat),\n", + " \"action\": (self.buffer_size, self.dim_act_flat),\n", + " \"next_state\": (self.buffer_size, self.dim_obs_flat),\n", + " \"reward\": (self.buffer_size),\n", + " \"terminated\": (self.buffer_size),\n", + " \"step\": (self.buffer_size),\n", + " }\n", + "\n", + " self.experience_memory = ExperienceMemoryTorch(\n", + " self.device, self.buffer_size, dims\n", + " )\n", + "\n", + " self.actor = EPPOActor(\n", + " actor_nn,\n", + " self.dim_obs_flat,\n", + " self.dim_act_flat,\n", + " self.clip_param,\n", + " self.max_grad_norm,\n", + " self.learning_rate,\n", + " self.depth_actor,\n", + " self.width_actor,\n", + " self.act_actor,\n", + " self.no_norm_actor,\n", + " self.device,\n", + " )\n", + "\n", + " self.critic = NonEvidentialCritic(\n", + " critic_nn,\n", + " self.dim_obs_flat,\n", + " self.max_grad_norm,\n", + " self.depth_critic,\n", + " self.width_critic,\n", + " self.act_critic,\n", + " self.no_norm_critic,\n", + " self.device,\n", + " self.learning_rate,\n", + " self.regularization_coeff,\n", + " )\n", + "\n", + " @torch.no_grad()\n", + " def calculate_advantages(self, states, next_states, rewards, dones):\n", + " values = self.critic(states)\n", + " next_values = self.critic(next_states)\n", + " deltas = rewards + self._gamma * next_values * (1 - dones) - values\n", + " advantages = torch.zeros_like(rewards)\n", + " advantage = 0\n", + " for i in reversed(range(len(deltas))):\n", + " advantage = (\n", + " self._gamma * self.gae_lambda * advantage * (1 - dones[i]) + deltas[i]\n", + " )\n", + " advantages[i] = advantage\n", + "\n", + " returns = advantages + values\n", + " advantages = (advantages - advantages.mean()) / (advantages.std() + self.eps)\n", + " return advantages, returns\n", + "\n", + " @torch.no_grad()\n", + " def calculate_old_probs(self, states, actions):\n", + " dist = self.actor.evaluate(states)\n", + " return dist.log_prob(actions)\n", + "\n", + " def end_task(self): # Called in experiment loop when a task finishes\n", + " self.experience_memory.reset()\n", + "\n", + " def learn(self, max_iter=1):\n", + " if self.batch_size > len(self.experience_memory):\n", + " return None\n", + "\n", + " states, actions, rewards, next_states, terminateds, _ = (\n", + " self.experience_memory.sample_all()\n", + " )\n", + " rewards = rewards.reshape(-1, 1)\n", + " terminateds = terminateds.reshape(-1, 1)\n", + " advantages, returns = self.calculate_advantages(\n", + " states, next_states, rewards, terminateds\n", + " )\n", + " old_probs = self.calculate_old_probs(states, actions)\n", + "\n", + " for ii in range(max_iter):\n", + " # shuffle data\n", + " indices = torch.randperm(len(states))\n", + " for i in range(0, len(states), self.batch_size):\n", + " batch_indices = indices[i : i + self.batch_size]\n", + " batch_states = states[batch_indices]\n", + " batch_actions = actions[batch_indices]\n", + " batch_old_probs = old_probs[batch_indices]\n", + " batch_advantages = advantages[batch_indices]\n", + " batch_returns = returns[batch_indices]\n", + "\n", + " self.actor.update( # PPO Actor loss\n", + " batch_states, batch_actions, batch_old_probs, batch_advantages\n", + " )\n", + " # PPO Critic loss\n", + " self.critic.update(batch_states, batch_returns)\n", + "\n", + " # clear memory after learning due to on-policy\n", + " self.experience_memory.reset()\n", + "\n", + " @torch.no_grad()\n", + " def select_action(self, s, is_training=True):\n", + " a, _ = self.actor.act(s, is_training=is_training)\n", + " return a.clamp(self._u_min + self.eps, self._u_max - self.eps)\n", + "\n", + " def store_transition(self, s, a, r, sp, terminated, truncated, step):\n", + " self.experience_memory.add(s, a, r, sp, terminated or truncated, step)" + ], + "metadata": { + "cellView": "form", + "id": "YOKF1aGfQbHr" + }, + "execution_count": 162, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# @title Run Control\n", + "# env\n", + "eval_env = make_env(\n", + " exp_name=exp_name,\n", + " seed=seed + 100,\n", + " idxs=get_idx_to_paralyze(exp_name),\n", + " paralyzed_ratio=0.0,\n", + ")\n", + "\n", + "# PPO\n", + "agent = ProximalPolicyOptimization(\n", + " env=eval_env,\n", + " actor_nn=ActorNetProbabilistic,\n", + " critic_nn=CriticNet,\n", + " device=device,\n", + " gamma=gamma,\n", + " buffer_size=buffer_size,\n", + " clip_param=clip_param,\n", + " gae_lambda=gae_lambda,\n", + " max_grad_norm=max_grad_norm,\n", + " learning_rate=learning_rate,\n", + " depth_actor=depth_actor,\n", + " width_actor=width_actor,\n", + " act_actor=act_actor,\n", + " no_norm_actor=no_norm_actor,\n", + " depth_critic=depth_critic,\n", + " width_critic=width_critic,\n", + " act_critic=act_critic,\n", + " no_norm_critic=no_norm_critic,\n", + " regularization_coeff=regularization_coeff,\n", + " batch_size=batch_size,\n", + ")\n", + "\n", + "# experimenter\n", + "experimenter = ParalysisExpriment(\n", + " agent=agent,\n", + " exp_name=exp_name,\n", + " seed=seed,\n", + " max_steps=max_steps,\n", + " eval_frequency=eval_frequency,\n", + " device=device,\n", + " learn_frequency=learn_frequency,\n", + " eval_episodes=eval_episodes,\n", + " max_iter=max_iter,\n", + " gamma=gamma,\n", + ")\n", + "\n", + "experimenter.train()" + ], + "metadata": { + "id": "zGqHrYLLQGXz", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "collapsed": true, + "cellView": "form", + "outputId": "0c9df773-9c86-4145-9fd7-1c75c07c0222" + }, + "execution_count": 163, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "...\n", + "AULC: 3481.70068359375\n", + "Final Return: 3648.4755859375\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Display results" + ], + "metadata": { + "id": "gvKMillRrfah" + } + }, + { + "cell_type": "code", + "source": [ + "# @title result_output_experiment\n", + "result_output_experiment = \"Tasks: [1.0, 0.75, 0.5, 0.25, 0.0, 0.25, 0.5, 0.75, 1.0] Commencing task 0: 1.0 EVALUATION\\tN-steps: 0\\tMean_Reward: 187.372 Episode: 1\\tN-steps: 999\\tReward: 54.970 Episode: 11\\tN-steps: 10999\\tReward: 406.393 EVALUATION\\tN-steps: 20000\\tMean_Reward: 596.693 Episode: 21\\tN-steps: 20999\\tReward: 441.888 Episode: 31\\tN-steps: 30999\\tReward: 541.480 EVALUATION\\tN-steps: 40000\\tMean_Reward: 875.716 Episode: 41\\tN-steps: 40999\\tReward: 675.509 Episode: 51\\tN-steps: 50999\\tReward: 812.666 EVALUATION\\tN-steps: 60000\\tMean_Reward: 1151.444 Episode: 61\\tN-steps: 60999\\tReward: 903.672 Episode: 71\\tN-steps: 70999\\tReward: 1051.080 EVALUATION\\tN-steps: 80000\\tMean_Reward: 1405.171 Episode: 81\\tN-steps: 80999\\tReward: 1231.307 Episode: 91\\tN-steps: 90999\\tReward: 1395.843 EVALUATION\\tN-steps: 100000\\tMean_Reward: 1655.552 Episode: 101\\tN-steps: 100999\\tReward: 1392.734 Episode: 111\\tN-steps: 110999\\tReward: 1461.651 EVALUATION\\tN-steps: 120000\\tMean_Reward: 1913.138 Episode: 121\\tN-steps: 120999\\tReward: 1527.533 Episode: 131\\tN-steps: 130999\\tReward: 1647.563 EVALUATION\\tN-steps: 140000\\tMean_Reward: 2206.189 Episode: 141\\tN-steps: 140999\\tReward: 1727.989 Episode: 151\\tN-steps: 150999\\tReward: 1761.608 EVALUATION\\tN-steps: 160000\\tMean_Reward: 2189.024 Episode: 161\\tN-steps: 160999\\tReward: 1757.870 Episode: 171\\tN-steps: 170999\\tReward: 1848.341 EVALUATION\\tN-steps: 180000\\tMean_Reward: 2410.950 Episode: 181\\tN-steps: 180999\\tReward: 1490.274 Episode: 191\\tN-steps: 190999\\tReward: 1789.810 EVALUATION\\tN-steps: 200000\\tMean_Reward: 2301.600 Episode: 201\\tN-steps: 200999\\tReward: 1924.238 Episode: 211\\tN-steps: 210999\\tReward: 1969.517 EVALUATION\\tN-steps: 220000\\tMean_Reward: 2526.112 Episode: 221\\tN-steps: 220999\\tReward: 2076.631 Episode: 231\\tN-steps: 230999\\tReward: -36.685 EVALUATION\\tN-steps: 240000\\tMean_Reward: 2700.376 Episode: 241\\tN-steps: 240999\\tReward: 2226.411 Episode: 251\\tN-steps: 250999\\tReward: 2291.134 EVALUATION\\tN-steps: 260000\\tMean_Reward: 2825.303 Episode: 261\\tN-steps: 260999\\tReward: 854.246 Episode: 271\\tN-steps: 270999\\tReward: 413.877 EVALUATION\\tN-steps: 280000\\tMean_Reward: 2651.720 Episode: 281\\tN-steps: 280999\\tReward: 982.007 Episode: 291\\tN-steps: 290999\\tReward: 605.560 EVALUATION\\tN-steps: 300000\\tMean_Reward: 2753.022 Episode: 301\\tN-steps: 300999\\tReward: 1655.702 Episode: 311\\tN-steps: 310999\\tReward: 1786.846 EVALUATION\\tN-steps: 320000\\tMean_Reward: 3068.249 Episode: 321\\tN-steps: 320999\\tReward: 871.781 Episode: 331\\tN-steps: 330999\\tReward: 494.499 EVALUATION\\tN-steps: 340000\\tMean_Reward: 3029.417 Episode: 341\\tN-steps: 340999\\tReward: 963.566 Episode: 351\\tN-steps: 350999\\tReward: 932.681 EVALUATION\\tN-steps: 360000\\tMean_Reward: 3109.640 Episode: 361\\tN-steps: 360999\\tReward: 872.623 Episode: 371\\tN-steps: 370999\\tReward: 2566.215 EVALUATION\\tN-steps: 380000\\tMean_Reward: 3113.613 Episode: 381\\tN-steps: 380999\\tReward: 2634.306 Episode: 391\\tN-steps: 390999\\tReward: 798.565 EVALUATION\\tN-steps: 400000\\tMean_Reward: 2964.285 Episode: 401\\tN-steps: 400999\\tReward: 2530.818 Episode: 411\\tN-steps: 410999\\tReward: 1612.465 EVALUATION\\tN-steps: 420000\\tMean_Reward: 2908.284 Episode: 421\\tN-steps: 420999\\tReward: 1209.841 Episode: 431\\tN-steps: 430999\\tReward: 2554.110 EVALUATION\\tN-steps: 440000\\tMean_Reward: 3156.235 Episode: 441\\tN-steps: 440999\\tReward: 702.188 Episode: 451\\tN-steps: 450999\\tReward: 2492.349 EVALUATION\\tN-steps: 460000\\tMean_Reward: 3131.597 Episode: 461\\tN-steps: 460999\\tReward: 1097.670 Episode: 471\\tN-steps: 470999\\tReward: 454.017 EVALUATION\\tN-steps: 480000\\tMean_Reward: 3147.053 Episode: 481\\tN-steps: 480999\\tReward: 2663.329 Episode: 491\\tN-steps: 490999\\tReward: 2800.849 EVALUATION\\tN-steps: 499999\\tMean_Reward: 3307.333 Commencing task 1: 0.75 EVALUATION\\tN-steps: 500000\\tMean_Reward: 3131.157 Episode: 501\\tN-steps: 500999\\tReward: 2484.745 Episode: 511\\tN-steps: 510999\\tReward: 485.594 EVALUATION\\tN-steps: 520000\\tMean_Reward: 3280.527 Episode: 521\\tN-steps: 520999\\tReward: 2730.937 Episode: 531\\tN-steps: 530999\\tReward: 2508.465 EVALUATION\\tN-steps: 540000\\tMean_Reward: 3040.385 Episode: 541\\tN-steps: 540999\\tReward: 2835.083 Episode: 551\\tN-steps: 550999\\tReward: 856.644 EVALUATION\\tN-steps: 560000\\tMean_Reward: 3105.648 Episode: 561\\tN-steps: 560999\\tReward: 2794.571 Episode: 571\\tN-steps: 570999\\tReward: 1964.389 EVALUATION\\tN-steps: 580000\\tMean_Reward: 3319.534 Episode: 581\\tN-steps: 580999\\tReward: 2865.326 Episode: 591\\tN-steps: 590999\\tReward: 1097.562 EVALUATION\\tN-steps: 600000\\tMean_Reward: 3425.254 Episode: 601\\tN-steps: 600999\\tReward: 2917.974 Episode: 611\\tN-steps: 610999\\tReward: 1277.913 EVALUATION\\tN-steps: 620000\\tMean_Reward: 3394.104 Episode: 621\\tN-steps: 620999\\tReward: 2921.398 Episode: 631\\tN-steps: 630999\\tReward: 2906.727 EVALUATION\\tN-steps: 640000\\tMean_Reward: 3343.558 Episode: 641\\tN-steps: 640999\\tReward: 3102.902 Episode: 651\\tN-steps: 650999\\tReward: 3133.909 EVALUATION\\tN-steps: 660000\\tMean_Reward: 3692.198 Episode: 661\\tN-steps: 660999\\tReward: 814.014 Episode: 671\\tN-steps: 670999\\tReward: 514.828 EVALUATION\\tN-steps: 680000\\tMean_Reward: 3524.564 Episode: 681\\tN-steps: 680999\\tReward: 3025.709 Episode: 691\\tN-steps: 690999\\tReward: 1243.312 EVALUATION\\tN-steps: 700000\\tMean_Reward: 3584.999 Episode: 701\\tN-steps: 700999\\tReward: 3010.545 Episode: 711\\tN-steps: 710999\\tReward: 2970.919 EVALUATION\\tN-steps: 720000\\tMean_Reward: 3510.000 Episode: 721\\tN-steps: 720999\\tReward: 2277.385 Episode: 731\\tN-steps: 730999\\tReward: 382.813 EVALUATION\\tN-steps: 740000\\tMean_Reward: 3733.048 Episode: 741\\tN-steps: 740999\\tReward: 1319.039 Episode: 751\\tN-steps: 750999\\tReward: 2541.352 EVALUATION\\tN-steps: 760000\\tMean_Reward: 3563.617 Episode: 761\\tN-steps: 760999\\tReward: 1506.093 Episode: 771\\tN-steps: 770999\\tReward: 2967.674 EVALUATION\\tN-steps: 780000\\tMean_Reward: 3479.836 Episode: 781\\tN-steps: 780999\\tReward: 1206.052 Episode: 791\\tN-steps: 790999\\tReward: 2648.815 EVALUATION\\tN-steps: 800000\\tMean_Reward: 3522.705 Episode: 801\\tN-steps: 800999\\tReward: 703.864 Episode: 811\\tN-steps: 810999\\tReward: 2852.258 EVALUATION\\tN-steps: 820000\\tMean_Reward: 3373.811 Episode: 821\\tN-steps: 820999\\tReward: 851.135 Episode: 831\\tN-steps: 830999\\tReward: 3110.592 EVALUATION\\tN-steps: 840000\\tMean_Reward: 2208.656 Episode: 841\\tN-steps: 840999\\tReward: 1899.764 Episode: 851\\tN-steps: 850999\\tReward: 2870.193 EVALUATION\\tN-steps: 860000\\tMean_Reward: 3561.490 Episode: 861\\tN-steps: 860999\\tReward: 977.959 Episode: 871\\tN-steps: 870999\\tReward: 3190.842 EVALUATION\\tN-steps: 880000\\tMean_Reward: 3562.023 Episode: 881\\tN-steps: 880999\\tReward: 3183.159 Episode: 891\\tN-steps: 890999\\tReward: 3140.599 EVALUATION\\tN-steps: 900000\\tMean_Reward: 3462.331 Episode: 901\\tN-steps: 900999\\tReward: 3317.348 Episode: 911\\tN-steps: 910999\\tReward: 1741.729 EVALUATION\\tN-steps: 920000\\tMean_Reward: 3612.709 Episode: 921\\tN-steps: 920999\\tReward: 3115.616 Episode: 931\\tN-steps: 930999\\tReward: 3070.891 EVALUATION\\tN-steps: 940000\\tMean_Reward: 3558.492 Episode: 941\\tN-steps: 940999\\tReward: 3229.075 Episode: 951\\tN-steps: 950999\\tReward: 3185.274 EVALUATION\\tN-steps: 960000\\tMean_Reward: 3649.527 Episode: 961\\tN-steps: 960999\\tReward: 3084.616 Episode: 971\\tN-steps: 970999\\tReward: 1553.232 EVALUATION\\tN-steps: 980000\\tMean_Reward: 3675.308 Episode: 981\\tN-steps: 980999\\tReward: 3116.899 Episode: 991\\tN-steps: 990999\\tReward: 3258.056 EVALUATION\\tN-steps: 999999\\tMean_Reward: 3567.620 Commencing task 2: 0.5 EVALUATION\\tN-steps: 1000000\\tMean_Reward: 3451.837 Episode: 1001\\tN-steps: 1000999\\tReward: 2863.071 Episode: 1011\\tN-steps: 1010999\\tReward: 2943.263 EVALUATION\\tN-steps: 1020000\\tMean_Reward: 3598.568 Episode: 1021\\tN-steps: 1020999\\tReward: 3065.560 Episode: 1031\\tN-steps: 1030999\\tReward: 3118.955 EVALUATION\\tN-steps: 1040000\\tMean_Reward: 3616.571 Episode: 1041\\tN-steps: 1040999\\tReward: 3094.284 Episode: 1051\\tN-steps: 1050999\\tReward: 2931.010 EVALUATION\\tN-steps: 1060000\\tMean_Reward: 3499.168 Episode: 1061\\tN-steps: 1060999\\tReward: 3118.489 Episode: 1071\\tN-steps: 1070999\\tReward: 3137.251 EVALUATION\\tN-steps: 1080000\\tMean_Reward: 3693.827 Episode: 1081\\tN-steps: 1080999\\tReward: 2972.992 Episode: 1091\\tN-steps: 1090999\\tReward: 1467.153 EVALUATION\\tN-steps: 1100000\\tMean_Reward: 3659.796 Episode: 1101\\tN-steps: 1100999\\tReward: 3027.675 Episode: 1111\\tN-steps: 1110999\\tReward: 3255.331 EVALUATION\\tN-steps: 1120000\\tMean_Reward: 3733.239 Episode: 1121\\tN-steps: 1120999\\tReward: 1069.492 Episode: 1131\\tN-steps: 1130999\\tReward: 2750.736 EVALUATION\\tN-steps: 1140000\\tMean_Reward: 3721.174 Episode: 1141\\tN-steps: 1140999\\tReward: 260.064 Episode: 1151\\tN-steps: 1150999\\tReward: 2352.544 EVALUATION\\tN-steps: 1160000\\tMean_Reward: 3686.361 Episode: 1161\\tN-steps: 1160999\\tReward: 3094.343 Episode: 1171\\tN-steps: 1170999\\tReward: 3205.607 EVALUATION\\tN-steps: 1180000\\tMean_Reward: 3860.708 Episode: 1181\\tN-steps: 1180999\\tReward: 3098.393 Episode: 1191\\tN-steps: 1190999\\tReward: 2221.827 EVALUATION\\tN-steps: 1200000\\tMean_Reward: 3941.863 Episode: 1201\\tN-steps: 1200999\\tReward: 3347.403 Episode: 1211\\tN-steps: 1210999\\tReward: 2604.816 EVALUATION\\tN-steps: 1220000\\tMean_Reward: 3808.906 Episode: 1221\\tN-steps: 1220999\\tReward: 3541.102 Episode: 1231\\tN-steps: 1230999\\tReward: 1213.751 EVALUATION\\tN-steps: 1240000\\tMean_Reward: 3848.708 Episode: 1241\\tN-steps: 1240999\\tReward: 3196.759 Episode: 1251\\tN-steps: 1250999\\tReward: 2588.965 EVALUATION\\tN-steps: 1260000\\tMean_Reward: 3745.464 Episode: 1261\\tN-steps: 1260999\\tReward: 3269.506 Episode: 1271\\tN-steps: 1270999\\tReward: 3366.836 EVALUATION\\tN-steps: 1280000\\tMean_Reward: 3836.395 Episode: 1281\\tN-steps: 1280999\\tReward: 3553.743 Episode: 1291\\tN-steps: 1290999\\tReward: 3607.980 EVALUATION\\tN-steps: 1300000\\tMean_Reward: 4055.826 Episode: 1301\\tN-steps: 1300999\\tReward: 3460.980 Episode: 1311\\tN-steps: 1310999\\tReward: 893.211 EVALUATION\\tN-steps: 1320000\\tMean_Reward: 3699.751 Episode: 1321\\tN-steps: 1320999\\tReward: 3456.681 Episode: 1331\\tN-steps: 1330999\\tReward: 1323.463 EVALUATION\\tN-steps: 1340000\\tMean_Reward: 3681.847 Episode: 1341\\tN-steps: 1340999\\tReward: 2011.464 Episode: 1351\\tN-steps: 1350999\\tReward: 3375.025 EVALUATION\\tN-steps: 1360000\\tMean_Reward: 3921.475 Episode: 1361\\tN-steps: 1360999\\tReward: 3303.259 Episode: 1371\\tN-steps: 1370999\\tReward: 3411.940 EVALUATION\\tN-steps: 1380000\\tMean_Reward: 3879.073 Episode: 1381\\tN-steps: 1380999\\tReward: 2134.003 Episode: 1391\\tN-steps: 1390999\\tReward: 3562.011 EVALUATION\\tN-steps: 1400000\\tMean_Reward: 3808.208 Episode: 1401\\tN-steps: 1400999\\tReward: 3747.651 Episode: 1411\\tN-steps: 1410999\\tReward: 2537.692 EVALUATION\\tN-steps: 1420000\\tMean_Reward: 4121.635 Episode: 1421\\tN-steps: 1420999\\tReward: 3520.185 Episode: 1431\\tN-steps: 1430999\\tReward: 1396.863 EVALUATION\\tN-steps: 1440000\\tMean_Reward: 3925.766 Episode: 1441\\tN-steps: 1440999\\tReward: 943.833 Episode: 1451\\tN-steps: 1450999\\tReward: 1765.687 EVALUATION\\tN-steps: 1460000\\tMean_Reward: 3834.728 Episode: 1461\\tN-steps: 1460999\\tReward: 3433.335 Episode: 1471\\tN-steps: 1470999\\tReward: 666.821 EVALUATION\\tN-steps: 1480000\\tMean_Reward: 4098.007 Episode: 1481\\tN-steps: 1480999\\tReward: 3678.195 Episode: 1491\\tN-steps: 1490999\\tReward: 2930.954 EVALUATION\\tN-steps: 1499999\\tMean_Reward: 4167.354 Commencing task 3: 0.25 EVALUATION\\tN-steps: 1500000\\tMean_Reward: 3219.890 Episode: 1501\\tN-steps: 1500999\\tReward: 2905.338 Episode: 1511\\tN-steps: 1510999\\tReward: 2943.631 EVALUATION\\tN-steps: 1520000\\tMean_Reward: 3844.227 Episode: 1521\\tN-steps: 1520999\\tReward: 3393.511 Episode: 1531\\tN-steps: 1530999\\tReward: 3228.804 EVALUATION\\tN-steps: 1540000\\tMean_Reward: 3878.771 Episode: 1541\\tN-steps: 1540999\\tReward: 2809.766 Episode: 1551\\tN-steps: 1550999\\tReward: 3480.784 EVALUATION\\tN-steps: 1560000\\tMean_Reward: 3843.516 Episode: 1561\\tN-steps: 1560999\\tReward: 3268.093 Episode: 1571\\tN-steps: 1570999\\tReward: 3322.385 EVALUATION\\tN-steps: 1580000\\tMean_Reward: 3749.019 Episode: 1581\\tN-steps: 1580999\\tReward: 3213.455 Episode: 1591\\tN-steps: 1590999\\tReward: 3143.720 EVALUATION\\tN-steps: 1600000\\tMean_Reward: 4011.025 Episode: 1601\\tN-steps: 1600999\\tReward: 3444.016 Episode: 1611\\tN-steps: 1610999\\tReward: 3191.096 EVALUATION\\tN-steps: 1620000\\tMean_Reward: 3778.617 Episode: 1621\\tN-steps: 1620999\\tReward: 3295.997 Episode: 1631\\tN-steps: 1630999\\tReward: 3338.874 EVALUATION\\tN-steps: 1640000\\tMean_Reward: 3873.257 Episode: 1641\\tN-steps: 1640999\\tReward: 2996.515 Episode: 1651\\tN-steps: 1650999\\tReward: 3339.501 EVALUATION\\tN-steps: 1660000\\tMean_Reward: 3299.230 Episode: 1661\\tN-steps: 1660999\\tReward: 3266.783 Episode: 1671\\tN-steps: 1670999\\tReward: 3590.929 EVALUATION\\tN-steps: 1680000\\tMean_Reward: 3210.195 Episode: 1681\\tN-steps: 1680999\\tReward: 3531.918 Episode: 1691\\tN-steps: 1690999\\tReward: 3544.449 EVALUATION\\tN-steps: 1700000\\tMean_Reward: 3924.434 Episode: 1701\\tN-steps: 1700999\\tReward: 3377.522 Episode: 1711\\tN-steps: 1710999\\tReward: 1711.326 EVALUATION\\tN-steps: 1720000\\tMean_Reward: 4175.663 Episode: 1721\\tN-steps: 1720999\\tReward: 763.162 Episode: 1731\\tN-steps: 1730999\\tReward: 3574.957 EVALUATION\\tN-steps: 1740000\\tMean_Reward: 4074.093 Episode: 1741\\tN-steps: 1740999\\tReward: 3558.331 Episode: 1751\\tN-steps: 1750999\\tReward: 3543.424 EVALUATION\\tN-steps: 1760000\\tMean_Reward: 3888.958 Episode: 1761\\tN-steps: 1760999\\tReward: 3576.184 Episode: 1771\\tN-steps: 1770999\\tReward: 3493.242 EVALUATION\\tN-steps: 1780000\\tMean_Reward: 4112.233 Episode: 1781\\tN-steps: 1780999\\tReward: 3471.877 Episode: 1791\\tN-steps: 1790999\\tReward: 961.963 EVALUATION\\tN-steps: 1800000\\tMean_Reward: 3761.540 Episode: 1801\\tN-steps: 1800999\\tReward: 3593.200 Episode: 1811\\tN-steps: 1810999\\tReward: 1901.017 EVALUATION\\tN-steps: 1820000\\tMean_Reward: 3507.323 Episode: 1821\\tN-steps: 1820999\\tReward: 3570.470 Episode: 1831\\tN-steps: 1830999\\tReward: 533.235 EVALUATION\\tN-steps: 1840000\\tMean_Reward: 3865.872 Episode: 1841\\tN-steps: 1840999\\tReward: 3577.304 Episode: 1851\\tN-steps: 1850999\\tReward: 1739.356 EVALUATION\\tN-steps: 1860000\\tMean_Reward: 3877.486 Episode: 1861\\tN-steps: 1860999\\tReward: 2722.130 Episode: 1871\\tN-steps: 1870999\\tReward: 1612.182 EVALUATION\\tN-steps: 1880000\\tMean_Reward: 3816.666 Episode: 1881\\tN-steps: 1880999\\tReward: 2738.559 Episode: 1891\\tN-steps: 1890999\\tReward: 3608.962 EVALUATION\\tN-steps: 1900000\\tMean_Reward: 4199.611 Episode: 1901\\tN-steps: 1900999\\tReward: 3588.459 Episode: 1911\\tN-steps: 1910999\\tReward: 3420.314 EVALUATION\\tN-steps: 1920000\\tMean_Reward: 4175.334 Episode: 1921\\tN-steps: 1920999\\tReward: 2275.099 Episode: 1931\\tN-steps: 1930999\\tReward: 3384.974 EVALUATION\\tN-steps: 1940000\\tMean_Reward: 4161.196 Episode: 1941\\tN-steps: 1940999\\tReward: 3512.978 Episode: 1951\\tN-steps: 1950999\\tReward: 3536.818 EVALUATION\\tN-steps: 1960000\\tMean_Reward: 4283.382 Episode: 1961\\tN-steps: 1960999\\tReward: 1941.744 Episode: 1971\\tN-steps: 1970999\\tReward: 3061.685 EVALUATION\\tN-steps: 1980000\\tMean_Reward: 4211.697 Episode: 1981\\tN-steps: 1980999\\tReward: 3516.190 Episode: 1991\\tN-steps: 1990999\\tReward: 2405.323 EVALUATION\\tN-steps: 1999999\\tMean_Reward: 4181.372 Commencing task 4: 0.0 EVALUATION\\tN-steps: 2000000\\tMean_Reward: 3624.650 Episode: 2001\\tN-steps: 2000999\\tReward: 3033.359 Episode: 2011\\tN-steps: 2010999\\tReward: 3165.386 EVALUATION\\tN-steps: 2020000\\tMean_Reward: 3929.374 Episode: 2021\\tN-steps: 2020999\\tReward: 3325.698 Episode: 2031\\tN-steps: 2030999\\tReward: 1723.381 EVALUATION\\tN-steps: 2040000\\tMean_Reward: 3949.646 Episode: 2041\\tN-steps: 2040999\\tReward: 3223.656 Episode: 2051\\tN-steps: 2050999\\tReward: 1805.714 EVALUATION\\tN-steps: 2060000\\tMean_Reward: 4070.919 Episode: 2061\\tN-steps: 2060999\\tReward: 3434.009 Episode: 2071\\tN-steps: 2070999\\tReward: 3307.572 EVALUATION\\tN-steps: 2080000\\tMean_Reward: 4002.109 Episode: 2081\\tN-steps: 2080999\\tReward: 3295.369 Episode: 2091\\tN-steps: 2090999\\tReward: 3540.647 EVALUATION\\tN-steps: 2100000\\tMean_Reward: 3893.568 Episode: 2101\\tN-steps: 2100999\\tReward: 3429.308 Episode: 2111\\tN-steps: 2110999\\tReward: 3442.021 EVALUATION\\tN-steps: 2120000\\tMean_Reward: 3936.007 Episode: 2121\\tN-steps: 2120999\\tReward: 3381.098 Episode: 2131\\tN-steps: 2130999\\tReward: 3270.343 EVALUATION\\tN-steps: 2140000\\tMean_Reward: 4004.040 Episode: 2141\\tN-steps: 2140999\\tReward: 2664.422 Episode: 2151\\tN-steps: 2150999\\tReward: 3527.198 EVALUATION\\tN-steps: 2160000\\tMean_Reward: 4009.507 Episode: 2161\\tN-steps: 2160999\\tReward: 3575.908 Episode: 2171\\tN-steps: 2170999\\tReward: 3444.284 EVALUATION\\tN-steps: 2180000\\tMean_Reward: 3826.501 Episode: 2181\\tN-steps: 2180999\\tReward: 2257.445 Episode: 2191\\tN-steps: 2190999\\tReward: 969.842 EVALUATION\\tN-steps: 2200000\\tMean_Reward: 3992.938 Episode: 2201\\tN-steps: 2200999\\tReward: 3517.010 Episode: 2211\\tN-steps: 2210999\\tReward: 3437.974 EVALUATION\\tN-steps: 2220000\\tMean_Reward: 3995.992 Episode: 2221\\tN-steps: 2220999\\tReward: 3415.402 Episode: 2231\\tN-steps: 2230999\\tReward: 3443.474 EVALUATION\\tN-steps: 2240000\\tMean_Reward: 3959.554 Episode: 2241\\tN-steps: 2240999\\tReward: 3355.941 Episode: 2251\\tN-steps: 2250999\\tReward: 3479.161 EVALUATION\\tN-steps: 2260000\\tMean_Reward: 4029.493 Episode: 2261\\tN-steps: 2260999\\tReward: 1939.998 Episode: 2271\\tN-steps: 2270999\\tReward: 3536.494 EVALUATION\\tN-steps: 2280000\\tMean_Reward: 4009.393 Episode: 2281\\tN-steps: 2280999\\tReward: 3458.142 Episode: 2291\\tN-steps: 2290999\\tReward: 3466.037 EVALUATION\\tN-steps: 2300000\\tMean_Reward: 3914.006 Episode: 2301\\tN-steps: 2300999\\tReward: 3446.732 Episode: 2311\\tN-steps: 2310999\\tReward: 3363.282 EVALUATION\\tN-steps: 2320000\\tMean_Reward: 3942.788 Episode: 2321\\tN-steps: 2320999\\tReward: 3485.973 Episode: 2331\\tN-steps: 2330999\\tReward: 2194.853 EVALUATION\\tN-steps: 2340000\\tMean_Reward: 3971.994 Episode: 2341\\tN-steps: 2340999\\tReward: 3586.649 Episode: 2351\\tN-steps: 2350999\\tReward: 495.910 EVALUATION\\tN-steps: 2360000\\tMean_Reward: 4090.374 Episode: 2361\\tN-steps: 2360999\\tReward: 3581.824 Episode: 2371\\tN-steps: 2370999\\tReward: 2380.878 EVALUATION\\tN-steps: 2380000\\tMean_Reward: 4083.297 Episode: 2381\\tN-steps: 2380999\\tReward: 2518.878 Episode: 2391\\tN-steps: 2390999\\tReward: 3682.870 EVALUATION\\tN-steps: 2400000\\tMean_Reward: 4038.592 Episode: 2401\\tN-steps: 2400999\\tReward: 3606.694 Episode: 2411\\tN-steps: 2410999\\tReward: 3770.752 EVALUATION\\tN-steps: 2420000\\tMean_Reward: 4158.278 Episode: 2421\\tN-steps: 2420999\\tReward: 2051.902 Episode: 2431\\tN-steps: 2430999\\tReward: 2228.462 EVALUATION\\tN-steps: 2440000\\tMean_Reward: 4188.850 Episode: 2441\\tN-steps: 2440999\\tReward: 1574.191 Episode: 2451\\tN-steps: 2450999\\tReward: 3564.140 EVALUATION\\tN-steps: 2460000\\tMean_Reward: 3966.564 Episode: 2461\\tN-steps: 2460999\\tReward: 3648.202 Episode: 2471\\tN-steps: 2470999\\tReward: 3588.478 EVALUATION\\tN-steps: 2480000\\tMean_Reward: 4035.878 Episode: 2481\\tN-steps: 2480999\\tReward: 3565.731 Episode: 2491\\tN-steps: 2490999\\tReward: 3611.507 EVALUATION\\tN-steps: 2499999\\tMean_Reward: 4086.182 Commencing task 5: 0.25 EVALUATION\\tN-steps: 2500000\\tMean_Reward: 3784.228 Episode: 2501\\tN-steps: 2500999\\tReward: 3655.407 Episode: 2511\\tN-steps: 2510999\\tReward: 3580.529 EVALUATION\\tN-steps: 2520000\\tMean_Reward: 3942.433 Episode: 2521\\tN-steps: 2520999\\tReward: 3629.777 Episode: 2531\\tN-steps: 2530999\\tReward: 3649.041 EVALUATION\\tN-steps: 2540000\\tMean_Reward: 4088.217 Episode: 2541\\tN-steps: 2540999\\tReward: 2737.161 Episode: 2551\\tN-steps: 2550999\\tReward: 3735.411 EVALUATION\\tN-steps: 2560000\\tMean_Reward: 4003.064 Episode: 2561\\tN-steps: 2560999\\tReward: 3554.765 Episode: 2571\\tN-steps: 2570999\\tReward: 3638.317 EVALUATION\\tN-steps: 2580000\\tMean_Reward: 4008.357 Episode: 2581\\tN-steps: 2580999\\tReward: 3446.300 Episode: 2591\\tN-steps: 2590999\\tReward: 3657.126 EVALUATION\\tN-steps: 2600000\\tMean_Reward: 4048.802 Episode: 2601\\tN-steps: 2600999\\tReward: 3684.368 Episode: 2611\\tN-steps: 2610999\\tReward: 3678.987 EVALUATION\\tN-steps: 2620000\\tMean_Reward: 4155.752 Episode: 2621\\tN-steps: 2620999\\tReward: 3673.922 Episode: 2631\\tN-steps: 2630999\\tReward: 3699.616 EVALUATION\\tN-steps: 2640000\\tMean_Reward: 4107.751 Episode: 2641\\tN-steps: 2640999\\tReward: 3710.614 Episode: 2651\\tN-steps: 2650999\\tReward: 3698.287 EVALUATION\\tN-steps: 2660000\\tMean_Reward: 4046.130 Episode: 2661\\tN-steps: 2660999\\tReward: 3703.529 Episode: 2671\\tN-steps: 2670999\\tReward: 3716.861 EVALUATION\\tN-steps: 2680000\\tMean_Reward: 4000.945 Episode: 2681\\tN-steps: 2680999\\tReward: 3673.759 Episode: 2691\\tN-steps: 2690999\\tReward: 3697.466 EVALUATION\\tN-steps: 2700000\\tMean_Reward: 3995.443 Episode: 2701\\tN-steps: 2700999\\tReward: 3590.735 Episode: 2711\\tN-steps: 2710999\\tReward: 3659.080 EVALUATION\\tN-steps: 2720000\\tMean_Reward: 3965.947 Episode: 2721\\tN-steps: 2720999\\tReward: 3320.557 Episode: 2731\\tN-steps: 2730999\\tReward: 2075.825 EVALUATION\\tN-steps: 2740000\\tMean_Reward: 4121.287 Episode: 2741\\tN-steps: 2740999\\tReward: 3676.643 Episode: 2751\\tN-steps: 2750999\\tReward: 3260.687 EVALUATION\\tN-steps: 2760000\\tMean_Reward: 4100.884 Episode: 2761\\tN-steps: 2760999\\tReward: 3656.986 Episode: 2771\\tN-steps: 2770999\\tReward: 1352.746 EVALUATION\\tN-steps: 2780000\\tMean_Reward: 4089.046 Episode: 2781\\tN-steps: 2780999\\tReward: 3616.770 Episode: 2791\\tN-steps: 2790999\\tReward: 3763.538 EVALUATION\\tN-steps: 2800000\\tMean_Reward: 4184.274 Episode: 2801\\tN-steps: 2800999\\tReward: 3722.684 Episode: 2811\\tN-steps: 2810999\\tReward: 3807.449 EVALUATION\\tN-steps: 2820000\\tMean_Reward: 4263.311 Episode: 2821\\tN-steps: 2820999\\tReward: 3901.451 Episode: 2831\\tN-steps: 2830999\\tReward: 3697.381 EVALUATION\\tN-steps: 2840000\\tMean_Reward: 4330.313 Episode: 2841\\tN-steps: 2840999\\tReward: 3774.419 Episode: 2851\\tN-steps: 2850999\\tReward: 3658.751 EVALUATION\\tN-steps: 2860000\\tMean_Reward: 4262.522 Episode: 2861\\tN-steps: 2860999\\tReward: 782.259 Episode: 2871\\tN-steps: 2870999\\tReward: 3734.820 EVALUATION\\tN-steps: 2880000\\tMean_Reward: 4430.997 Episode: 2881\\tN-steps: 2880999\\tReward: 516.751 Episode: 2891\\tN-steps: 2890999\\tReward: 541.811 EVALUATION\\tN-steps: 2900000\\tMean_Reward: 4210.494 Episode: 2901\\tN-steps: 2900999\\tReward: 3677.985 Episode: 2911\\tN-steps: 2910999\\tReward: 3791.762 EVALUATION\\tN-steps: 2920000\\tMean_Reward: 4006.635 Episode: 2921\\tN-steps: 2920999\\tReward: 3636.213 Episode: 2931\\tN-steps: 2930999\\tReward: 3723.912 EVALUATION\\tN-steps: 2940000\\tMean_Reward: 3976.850 Episode: 2941\\tN-steps: 2940999\\tReward: 3754.393 Episode: 2951\\tN-steps: 2950999\\tReward: 3786.956 EVALUATION\\tN-steps: 2960000\\tMean_Reward: 4007.767 Episode: 2961\\tN-steps: 2960999\\tReward: 3678.869 Episode: 2971\\tN-steps: 2970999\\tReward: 567.725 EVALUATION\\tN-steps: 2980000\\tMean_Reward: 3822.027 Episode: 2981\\tN-steps: 2980999\\tReward: 3727.676 Episode: 2991\\tN-steps: 2990999\\tReward: 3674.882 EVALUATION\\tN-steps: 2999999\\tMean_Reward: 3982.593 Commencing task 6: 0.5 EVALUATION\\tN-steps: 3000000\\tMean_Reward: 4023.764 Episode: 3001\\tN-steps: 3000999\\tReward: 3701.236 Episode: 3011\\tN-steps: 3010999\\tReward: 3627.877 EVALUATION\\tN-steps: 3020000\\tMean_Reward: 4077.568 Episode: 3021\\tN-steps: 3020999\\tReward: 3762.156 Episode: 3031\\tN-steps: 3030999\\tReward: 3275.841 EVALUATION\\tN-steps: 3040000\\tMean_Reward: 4096.780 Episode: 3041\\tN-steps: 3040999\\tReward: 3729.630 Episode: 3051\\tN-steps: 3050999\\tReward: 1495.875 EVALUATION\\tN-steps: 3060000\\tMean_Reward: 4025.100 Episode: 3061\\tN-steps: 3060999\\tReward: 3785.641 Episode: 3071\\tN-steps: 3070999\\tReward: 3883.508 EVALUATION\\tN-steps: 3080000\\tMean_Reward: 4087.031 Episode: 3081\\tN-steps: 3080999\\tReward: 3833.741 Episode: 3091\\tN-steps: 3090999\\tReward: 898.412 EVALUATION\\tN-steps: 3100000\\tMean_Reward: 4058.404 Episode: 3101\\tN-steps: 3100999\\tReward: 3713.422 Episode: 3111\\tN-steps: 3110999\\tReward: 3759.468 EVALUATION\\tN-steps: 3120000\\tMean_Reward: 4052.527 Episode: 3121\\tN-steps: 3120999\\tReward: 3439.945 Episode: 3131\\tN-steps: 3130999\\tReward: 3653.581 EVALUATION\\tN-steps: 3140000\\tMean_Reward: 4062.691 Episode: 3141\\tN-steps: 3140999\\tReward: 3774.429 Episode: 3151\\tN-steps: 3150999\\tReward: 3741.416 EVALUATION\\tN-steps: 3160000\\tMean_Reward: 4055.042 Episode: 3161\\tN-steps: 3160999\\tReward: 3748.954 Episode: 3171\\tN-steps: 3170999\\tReward: 3806.189 EVALUATION\\tN-steps: 3180000\\tMean_Reward: 4164.603 Episode: 3181\\tN-steps: 3180999\\tReward: 3844.262 Episode: 3191\\tN-steps: 3190999\\tReward: 1586.817 EVALUATION\\tN-steps: 3200000\\tMean_Reward: 4232.331 Episode: 3201\\tN-steps: 3200999\\tReward: 2861.125 Episode: 3211\\tN-steps: 3210999\\tReward: 3957.586 EVALUATION\\tN-steps: 3220000\\tMean_Reward: 4331.592 Episode: 3221\\tN-steps: 3220999\\tReward: 2892.020 Episode: 3231\\tN-steps: 3230999\\tReward: 893.530 EVALUATION\\tN-steps: 3240000\\tMean_Reward: 4283.041 Episode: 3241\\tN-steps: 3240999\\tReward: 3993.894 Episode: 3251\\tN-steps: 3250999\\tReward: 2913.740 EVALUATION\\tN-steps: 3260000\\tMean_Reward: 4229.168 Episode: 3261\\tN-steps: 3260999\\tReward: 3901.839 Episode: 3271\\tN-steps: 3270999\\tReward: 3620.038 EVALUATION\\tN-steps: 3280000\\tMean_Reward: 4231.334 Episode: 3281\\tN-steps: 3280999\\tReward: 4035.820 Episode: 3291\\tN-steps: 3290999\\tReward: 2190.223 EVALUATION\\tN-steps: 3300000\\tMean_Reward: 4170.874 Episode: 3301\\tN-steps: 3300999\\tReward: 3882.373 Episode: 3311\\tN-steps: 3310999\\tReward: 3908.179 EVALUATION\\tN-steps: 3320000\\tMean_Reward: 4347.440 Episode: 3321\\tN-steps: 3320999\\tReward: 2257.033 Episode: 3331\\tN-steps: 3330999\\tReward: 3805.434 EVALUATION\\tN-steps: 3340000\\tMean_Reward: 4315.161 Episode: 3341\\tN-steps: 3340999\\tReward: 3856.230 Episode: 3351\\tN-steps: 3350999\\tReward: 3699.973 EVALUATION\\tN-steps: 3360000\\tMean_Reward: 4372.755 Episode: 3361\\tN-steps: 3360999\\tReward: 1153.477 Episode: 3371\\tN-steps: 3370999\\tReward: 3981.317 EVALUATION\\tN-steps: 3380000\\tMean_Reward: 4300.390 Episode: 3381\\tN-steps: 3380999\\tReward: 1034.718 Episode: 3391\\tN-steps: 3390999\\tReward: 2345.158 EVALUATION\\tN-steps: 3400000\\tMean_Reward: 4403.071 Episode: 3401\\tN-steps: 3400999\\tReward: 2084.293 Episode: 3411\\tN-steps: 3410999\\tReward: 3883.739 EVALUATION\\tN-steps: 3420000\\tMean_Reward: 4197.143 Episode: 3421\\tN-steps: 3420999\\tReward: 3875.178 Episode: 3431\\tN-steps: 3430999\\tReward: 3829.349 EVALUATION\\tN-steps: 3440000\\tMean_Reward: 4325.496 Episode: 3441\\tN-steps: 3440999\\tReward: 1537.239 Episode: 3451\\tN-steps: 3450999\\tReward: 1049.932 EVALUATION\\tN-steps: 3460000\\tMean_Reward: 4277.338 Episode: 3461\\tN-steps: 3460999\\tReward: 3822.814 Episode: 3471\\tN-steps: 3470999\\tReward: 3097.299 EVALUATION\\tN-steps: 3480000\\tMean_Reward: 4322.556 Episode: 3481\\tN-steps: 3480999\\tReward: 2914.852 Episode: 3491\\tN-steps: 3490999\\tReward: 784.796 EVALUATION\\tN-steps: 3499999\\tMean_Reward: 4287.920 Commencing task 7: 0.75 EVALUATION\\tN-steps: 3500000\\tMean_Reward: 4242.615 Episode: 3501\\tN-steps: 3500999\\tReward: 2495.663 Episode: 3511\\tN-steps: 3510999\\tReward: 1877.694 EVALUATION\\tN-steps: 3520000\\tMean_Reward: 4204.428 Episode: 3521\\tN-steps: 3520999\\tReward: 3910.809 Episode: 3531\\tN-steps: 3530999\\tReward: 1533.107 EVALUATION\\tN-steps: 3540000\\tMean_Reward: 4460.781 Episode: 3541\\tN-steps: 3540999\\tReward: 1439.369 Episode: 3551\\tN-steps: 3550999\\tReward: 3937.000 EVALUATION\\tN-steps: 3560000\\tMean_Reward: 4324.458 Episode: 3561\\tN-steps: 3560999\\tReward: 674.083 Episode: 3571\\tN-steps: 3570999\\tReward: 3214.821 EVALUATION\\tN-steps: 3580000\\tMean_Reward: 4257.639 Episode: 3581\\tN-steps: 3580999\\tReward: 3881.933 Episode: 3591\\tN-steps: 3590999\\tReward: 3709.471 EVALUATION\\tN-steps: 3600000\\tMean_Reward: 4280.368 Episode: 3601\\tN-steps: 3600999\\tReward: 1512.360 Episode: 3611\\tN-steps: 3610999\\tReward: 3550.886 EVALUATION\\tN-steps: 3620000\\tMean_Reward: 4216.635 Episode: 3621\\tN-steps: 3620999\\tReward: 3714.809 Episode: 3631\\tN-steps: 3630999\\tReward: 3809.304 EVALUATION\\tN-steps: 3640000\\tMean_Reward: 4047.281 Episode: 3641\\tN-steps: 3640999\\tReward: 1071.840 Episode: 3651\\tN-steps: 3650999\\tReward: 3808.196 EVALUATION\\tN-steps: 3660000\\tMean_Reward: 4198.279 Episode: 3661\\tN-steps: 3660999\\tReward: 3956.539 Episode: 3671\\tN-steps: 3670999\\tReward: 3857.012 EVALUATION\\tN-steps: 3680000\\tMean_Reward: 4234.064 Episode: 3681\\tN-steps: 3680999\\tReward: 3815.485 Episode: 3691\\tN-steps: 3690999\\tReward: 3570.631 EVALUATION\\tN-steps: 3700000\\tMean_Reward: 4195.618 Episode: 3701\\tN-steps: 3700999\\tReward: 1767.978 Episode: 3711\\tN-steps: 3710999\\tReward: 3963.408 EVALUATION\\tN-steps: 3720000\\tMean_Reward: 4310.607 Episode: 3721\\tN-steps: 3720999\\tReward: 3906.895 Episode: 3731\\tN-steps: 3730999\\tReward: 776.432 EVALUATION\\tN-steps: 3740000\\tMean_Reward: 4322.107 Episode: 3741\\tN-steps: 3740999\\tReward: 4020.799 Episode: 3751\\tN-steps: 3750999\\tReward: 3892.980 EVALUATION\\tN-steps: 3760000\\tMean_Reward: 4278.188 Episode: 3761\\tN-steps: 3760999\\tReward: 3969.494 Episode: 3771\\tN-steps: 3770999\\tReward: 3801.341 EVALUATION\\tN-steps: 3780000\\tMean_Reward: 4211.658 Episode: 3781\\tN-steps: 3780999\\tReward: 3933.754 Episode: 3791\\tN-steps: 3790999\\tReward: 3633.638 EVALUATION\\tN-steps: 3800000\\tMean_Reward: 4054.726 Episode: 3801\\tN-steps: 3800999\\tReward: 3877.758 Episode: 3811\\tN-steps: 3810999\\tReward: 3789.736 EVALUATION\\tN-steps: 3820000\\tMean_Reward: 4126.129 Episode: 3821\\tN-steps: 3820999\\tReward: 3801.602 Episode: 3831\\tN-steps: 3830999\\tReward: 2406.925 EVALUATION\\tN-steps: 3840000\\tMean_Reward: 4119.635 Episode: 3841\\tN-steps: 3840999\\tReward: 1131.459 Episode: 3851\\tN-steps: 3850999\\tReward: 3737.230 EVALUATION\\tN-steps: 3860000\\tMean_Reward: 4257.803 Episode: 3861\\tN-steps: 3860999\\tReward: 605.975 Episode: 3871\\tN-steps: 3870999\\tReward: 3812.090 EVALUATION\\tN-steps: 3880000\\tMean_Reward: 4331.917 Episode: 3881\\tN-steps: 3880999\\tReward: 3758.611 Episode: 3891\\tN-steps: 3890999\\tReward: 3805.523 EVALUATION\\tN-steps: 3900000\\tMean_Reward: 4153.164 Episode: 3901\\tN-steps: 3900999\\tReward: 3017.341 Episode: 3911\\tN-steps: 3910999\\tReward: 3879.786 EVALUATION\\tN-steps: 3920000\\tMean_Reward: 4362.702 Episode: 3921\\tN-steps: 3920999\\tReward: 3827.251 Episode: 3931\\tN-steps: 3930999\\tReward: 2252.366 EVALUATION\\tN-steps: 3940000\\tMean_Reward: 4173.109 Episode: 3941\\tN-steps: 3940999\\tReward: 3994.800 Episode: 3951\\tN-steps: 3950999\\tReward: 1111.839 EVALUATION\\tN-steps: 3960000\\tMean_Reward: 4261.026 Episode: 3961\\tN-steps: 3960999\\tReward: 3906.330 Episode: 3971\\tN-steps: 3970999\\tReward: 3482.922 EVALUATION\\tN-steps: 3980000\\tMean_Reward: 4608.880 Episode: 3981\\tN-steps: 3980999\\tReward: 1450.007 Episode: 3991\\tN-steps: 3990999\\tReward: 1598.363 EVALUATION\\tN-steps: 3999999\\tMean_Reward: 4618.083 Commencing task 8: 1.0 EVALUATION\\tN-steps: 4000000\\tMean_Reward: 4643.759 Episode: 4001\\tN-steps: 4000999\\tReward: 3565.829 Episode: 4011\\tN-steps: 4010999\\tReward: 1476.922 EVALUATION\\tN-steps: 4020000\\tMean_Reward: 4567.065 Episode: 4021\\tN-steps: 4020999\\tReward: 4002.716 Episode: 4031\\tN-steps: 4030999\\tReward: 1071.626 EVALUATION\\tN-steps: 4040000\\tMean_Reward: 4373.139 Episode: 4041\\tN-steps: 4040999\\tReward: 930.281 Episode: 4051\\tN-steps: 4050999\\tReward: 3980.209 EVALUATION\\tN-steps: 4060000\\tMean_Reward: 4635.052 Episode: 4061\\tN-steps: 4060999\\tReward: 2365.255 Episode: 4071\\tN-steps: 4070999\\tReward: 2005.547 EVALUATION\\tN-steps: 4080000\\tMean_Reward: 4392.642 Episode: 4081\\tN-steps: 4080999\\tReward: 4053.914 Episode: 4091\\tN-steps: 4090999\\tReward: 1926.917 EVALUATION\\tN-steps: 4100000\\tMean_Reward: 4502.339 Episode: 4101\\tN-steps: 4100999\\tReward: 3641.573 Episode: 4111\\tN-steps: 4110999\\tReward: 4021.953 EVALUATION\\tN-steps: 4120000\\tMean_Reward: 4300.279 Episode: 4121\\tN-steps: 4120999\\tReward: 4153.498 Episode: 4131\\tN-steps: 4130999\\tReward: 4138.474 EVALUATION\\tN-steps: 4140000\\tMean_Reward: 4637.247 Episode: 4141\\tN-steps: 4140999\\tReward: 4234.285 Episode: 4151\\tN-steps: 4150999\\tReward: 3208.843 EVALUATION\\tN-steps: 4160000\\tMean_Reward: 4675.083 Episode: 4161\\tN-steps: 4160999\\tReward: 4137.510 Episode: 4171\\tN-steps: 4170999\\tReward: 3603.889 EVALUATION\\tN-steps: 4180000\\tMean_Reward: 4568.880 Episode: 4181\\tN-steps: 4180999\\tReward: 3958.007 Episode: 4191\\tN-steps: 4190999\\tReward: 3889.104 EVALUATION\\tN-steps: 4200000\\tMean_Reward: 4584.597 Episode: 4201\\tN-steps: 4200999\\tReward: 3909.325 Episode: 4211\\tN-steps: 4210999\\tReward: 4038.314 EVALUATION\\tN-steps: 4220000\\tMean_Reward: 4444.629 Episode: 4221\\tN-steps: 4220999\\tReward: 3902.399 Episode: 4231\\tN-steps: 4230999\\tReward: 3956.854 EVALUATION\\tN-steps: 4240000\\tMean_Reward: 4332.544 Episode: 4241\\tN-steps: 4240999\\tReward: 3967.902 Episode: 4251\\tN-steps: 4250999\\tReward: 868.271 EVALUATION\\tN-steps: 4260000\\tMean_Reward: 4169.368 Episode: 4261\\tN-steps: 4260999\\tReward: 3954.675 Episode: 4271\\tN-steps: 4270999\\tReward: 3961.261 EVALUATION\\tN-steps: 4280000\\tMean_Reward: 4457.168 Episode: 4281\\tN-steps: 4280999\\tReward: 3962.987 Episode: 4291\\tN-steps: 4290999\\tReward: 3845.994 EVALUATION\\tN-steps: 4300000\\tMean_Reward: 4553.352 Episode: 4301\\tN-steps: 4300999\\tReward: 4138.392 Episode: 4311\\tN-steps: 4310999\\tReward: 4076.259 EVALUATION\\tN-steps: 4320000\\tMean_Reward: 4685.189 Episode: 4321\\tN-steps: 4320999\\tReward: 4151.880 Episode: 4331\\tN-steps: 4330999\\tReward: 597.878 EVALUATION\\tN-steps: 4340000\\tMean_Reward: 4555.020 Episode: 4341\\tN-steps: 4340999\\tReward: 4112.001 Episode: 4351\\tN-steps: 4350999\\tReward: 3935.343 EVALUATION\\tN-steps: 4360000\\tMean_Reward: 4626.791 Episode: 4361\\tN-steps: 4360999\\tReward: 4044.540 Episode: 4371\\tN-steps: 4370999\\tReward: 4021.838 EVALUATION\\tN-steps: 4380000\\tMean_Reward: 4486.131 Episode: 4381\\tN-steps: 4380999\\tReward: 3953.874 Episode: 4391\\tN-steps: 4390999\\tReward: 4066.373 EVALUATION\\tN-steps: 4400000\\tMean_Reward: 4406.265 Episode: 4401\\tN-steps: 4400999\\tReward: 4021.474 Episode: 4411\\tN-steps: 4410999\\tReward: 4081.299 EVALUATION\\tN-steps: 4420000\\tMean_Reward: 4555.123 Episode: 4421\\tN-steps: 4420999\\tReward: 3972.232 Episode: 4431\\tN-steps: 4430999\\tReward: 2313.018 EVALUATION\\tN-steps: 4440000\\tMean_Reward: 4508.437 Episode: 4441\\tN-steps: 4440999\\tReward: 4079.171 Episode: 4451\\tN-steps: 4450999\\tReward: 4118.501 EVALUATION\\tN-steps: 4460000\\tMean_Reward: 4459.876 Episode: 4461\\tN-steps: 4460999\\tReward: 1052.292 Episode: 4471\\tN-steps: 4470999\\tReward: 4033.364 EVALUATION\\tN-steps: 4480000\\tMean_Reward: 4436.849 Episode: 4481\\tN-steps: 4480999\\tReward: 4089.952 Episode: 4491\\tN-steps: 4490999\\tReward: 4037.241 EVALUATION\\tN-steps: 4499999\\tMean_Reward: 4547.711 Training time: 7668.44 seconds AULC: 3833.0048828125 Final Return: 4082.907470703125\" # @param {\"type\":\"string\"}\n" + ], + "metadata": { + "cellView": "form", + "id": "XjNBIB2HpTbz" + }, + "execution_count": 168, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# @title result_output\n", + "result_output = \"Tasks: [1.0, 0.75, 0.5, 0.25, 0.0, 0.25, 0.5, 0.75, 1.0] Commencing task 0: 1.0 EVALUATION\\tN-steps: 0\\tMean_Reward: 187.372 Episode: 1\\tN-steps: 999\\tReward: 54.970 Episode: 11\\tN-steps: 10999\\tReward: 378.171 EVALUATION\\tN-steps: 20000\\tMean_Reward: 609.787 Episode: 21\\tN-steps: 20999\\tReward: 491.111 Episode: 31\\tN-steps: 30999\\tReward: 607.481 EVALUATION\\tN-steps: 40000\\tMean_Reward: 788.074 Episode: 41\\tN-steps: 40999\\tReward: 636.289 Episode: 51\\tN-steps: 50999\\tReward: 683.336 EVALUATION\\tN-steps: 60000\\tMean_Reward: 862.071 Episode: 61\\tN-steps: 60999\\tReward: 733.510 Episode: 71\\tN-steps: 70999\\tReward: 907.471 EVALUATION\\tN-steps: 80000\\tMean_Reward: 1323.700 Episode: 81\\tN-steps: 80999\\tReward: 1030.951 Episode: 91\\tN-steps: 90999\\tReward: 1232.713 EVALUATION\\tN-steps: 100000\\tMean_Reward: 1687.299 Episode: 101\\tN-steps: 100999\\tReward: 1361.458 Episode: 111\\tN-steps: 110999\\tReward: 1463.807 EVALUATION\\tN-steps: 120000\\tMean_Reward: 2096.971 Episode: 121\\tN-steps: 120999\\tReward: 1644.761 Episode: 131\\tN-steps: 130999\\tReward: 1477.897 EVALUATION\\tN-steps: 140000\\tMean_Reward: 2097.781 Episode: 141\\tN-steps: 140999\\tReward: 1679.817 Episode: 151\\tN-steps: 150999\\tReward: 1736.946 EVALUATION\\tN-steps: 160000\\tMean_Reward: 2323.716 Episode: 161\\tN-steps: 160999\\tReward: 1659.451 Episode: 171\\tN-steps: 170999\\tReward: 1149.984 EVALUATION\\tN-steps: 180000\\tMean_Reward: 2268.333 Episode: 181\\tN-steps: 180999\\tReward: 2026.154 Episode: 191\\tN-steps: 190999\\tReward: 1618.880 EVALUATION\\tN-steps: 200000\\tMean_Reward: 2335.551 Episode: 201\\tN-steps: 200999\\tReward: 2044.250 Episode: 211\\tN-steps: 210999\\tReward: 2280.723 EVALUATION\\tN-steps: 220000\\tMean_Reward: 2567.936 Episode: 221\\tN-steps: 220999\\tReward: 2219.927 Episode: 231\\tN-steps: 230999\\tReward: 2260.925 EVALUATION\\tN-steps: 240000\\tMean_Reward: 2641.228 Episode: 241\\tN-steps: 240999\\tReward: 2245.524 Episode: 251\\tN-steps: 250999\\tReward: 1988.585 EVALUATION\\tN-steps: 260000\\tMean_Reward: 2627.128 Episode: 261\\tN-steps: 260999\\tReward: 2075.794 Episode: 271\\tN-steps: 270999\\tReward: 2460.748 EVALUATION\\tN-steps: 280000\\tMean_Reward: 2407.393 Episode: 281\\tN-steps: 280999\\tReward: 2429.115 Episode: 291\\tN-steps: 290999\\tReward: 1488.716 EVALUATION\\tN-steps: 300000\\tMean_Reward: 2539.393 Episode: 301\\tN-steps: 300999\\tReward: 2373.519 Episode: 311\\tN-steps: 310999\\tReward: 2428.394 EVALUATION\\tN-steps: 320000\\tMean_Reward: 2867.947 Episode: 321\\tN-steps: 320999\\tReward: 2042.579 Episode: 331\\tN-steps: 330999\\tReward: 1779.311 EVALUATION\\tN-steps: 340000\\tMean_Reward: 2742.407 Episode: 341\\tN-steps: 340999\\tReward: -213.307 Episode: 351\\tN-steps: 350999\\tReward: 2548.549 EVALUATION\\tN-steps: 360000\\tMean_Reward: 2809.883 Episode: 361\\tN-steps: 360999\\tReward: 2059.649 Episode: 371\\tN-steps: 370999\\tReward: 2513.030 EVALUATION\\tN-steps: 380000\\tMean_Reward: 2688.028 Episode: 381\\tN-steps: 380999\\tReward: 965.015 Episode: 391\\tN-steps: 390999\\tReward: 2435.438 EVALUATION\\tN-steps: 400000\\tMean_Reward: 2879.639 Episode: 401\\tN-steps: 400999\\tReward: 2496.619 Episode: 411\\tN-steps: 410999\\tReward: 705.331 EVALUATION\\tN-steps: 420000\\tMean_Reward: 2802.372 Episode: 421\\tN-steps: 420999\\tReward: 2495.569 Episode: 431\\tN-steps: 430999\\tReward: 2431.132 EVALUATION\\tN-steps: 440000\\tMean_Reward: 2897.531 Episode: 441\\tN-steps: 440999\\tReward: 1472.796 Episode: 451\\tN-steps: 450999\\tReward: 2485.343 EVALUATION\\tN-steps: 460000\\tMean_Reward: 2940.846 Episode: 461\\tN-steps: 460999\\tReward: 1997.424 Episode: 471\\tN-steps: 470999\\tReward: 2496.998 EVALUATION\\tN-steps: 480000\\tMean_Reward: 3085.087 Episode: 481\\tN-steps: 480999\\tReward: 2669.894 Episode: 491\\tN-steps: 490999\\tReward: 2678.384 EVALUATION\\tN-steps: 499999\\tMean_Reward: 3021.936 Commencing task 1: 0.75 EVALUATION\\tN-steps: 500000\\tMean_Reward: 2783.324 Episode: 501\\tN-steps: 500999\\tReward: 2541.741 Episode: 511\\tN-steps: 510999\\tReward: 2537.646 EVALUATION\\tN-steps: 520000\\tMean_Reward: 3021.631 Episode: 521\\tN-steps: 520999\\tReward: 2612.860 Episode: 531\\tN-steps: 530999\\tReward: 2598.559 EVALUATION\\tN-steps: 540000\\tMean_Reward: 2884.051 Episode: 541\\tN-steps: 540999\\tReward: 2563.555 Episode: 551\\tN-steps: 550999\\tReward: 2681.505 EVALUATION\\tN-steps: 560000\\tMean_Reward: 3129.926 Episode: 561\\tN-steps: 560999\\tReward: 2646.542 Episode: 571\\tN-steps: 570999\\tReward: 2667.715 EVALUATION\\tN-steps: 580000\\tMean_Reward: 3252.037 Episode: 581\\tN-steps: 580999\\tReward: 2802.069 Episode: 591\\tN-steps: 590999\\tReward: 2765.652 EVALUATION\\tN-steps: 600000\\tMean_Reward: 3189.655 Episode: 601\\tN-steps: 600999\\tReward: 2554.462 Episode: 611\\tN-steps: 610999\\tReward: 2781.622 EVALUATION\\tN-steps: 620000\\tMean_Reward: 3066.659 Episode: 621\\tN-steps: 620999\\tReward: 2754.687 Episode: 631\\tN-steps: 630999\\tReward: 2739.148 EVALUATION\\tN-steps: 640000\\tMean_Reward: 3159.176 Episode: 641\\tN-steps: 640999\\tReward: 2757.131 Episode: 651\\tN-steps: 650999\\tReward: 2769.271 EVALUATION\\tN-steps: 660000\\tMean_Reward: 3082.311 Episode: 661\\tN-steps: 660999\\tReward: 2861.348 Episode: 671\\tN-steps: 670999\\tReward: 2836.117 EVALUATION\\tN-steps: 680000\\tMean_Reward: 3200.592 Episode: 681\\tN-steps: 680999\\tReward: 709.484 Episode: 691\\tN-steps: 690999\\tReward: 2851.590 EVALUATION\\tN-steps: 700000\\tMean_Reward: 2979.893 Episode: 701\\tN-steps: 700999\\tReward: 2783.497 Episode: 711\\tN-steps: 710999\\tReward: 2743.248 EVALUATION\\tN-steps: 720000\\tMean_Reward: 3034.972 Episode: 721\\tN-steps: 720999\\tReward: 2801.413 Episode: 731\\tN-steps: 730999\\tReward: 2862.387 EVALUATION\\tN-steps: 740000\\tMean_Reward: 3261.544 Episode: 741\\tN-steps: 740999\\tReward: 2892.845 Episode: 751\\tN-steps: 750999\\tReward: 2807.465 EVALUATION\\tN-steps: 760000\\tMean_Reward: 3105.901 Episode: 761\\tN-steps: 760999\\tReward: 2833.494 Episode: 771\\tN-steps: 770999\\tReward: 2885.132 EVALUATION\\tN-steps: 780000\\tMean_Reward: 3190.181 Episode: 781\\tN-steps: 780999\\tReward: 2935.850 Episode: 791\\tN-steps: 790999\\tReward: 1130.085 EVALUATION\\tN-steps: 800000\\tMean_Reward: 3023.085 Episode: 801\\tN-steps: 800999\\tReward: 1791.225 Episode: 811\\tN-steps: 810999\\tReward: 2983.782 EVALUATION\\tN-steps: 820000\\tMean_Reward: 3117.664 Episode: 821\\tN-steps: 820999\\tReward: 2876.372 Episode: 831\\tN-steps: 830999\\tReward: 2906.615 EVALUATION\\tN-steps: 840000\\tMean_Reward: 3231.247 Episode: 841\\tN-steps: 840999\\tReward: 2898.307 Episode: 851\\tN-steps: 850999\\tReward: 2856.446 EVALUATION\\tN-steps: 860000\\tMean_Reward: 3294.113 Episode: 861\\tN-steps: 860999\\tReward: 2895.751 Episode: 871\\tN-steps: 870999\\tReward: 2852.706 EVALUATION\\tN-steps: 880000\\tMean_Reward: 3282.235 Episode: 881\\tN-steps: 880999\\tReward: 1938.666 Episode: 891\\tN-steps: 890999\\tReward: 2879.944 EVALUATION\\tN-steps: 900000\\tMean_Reward: 2967.927 Episode: 901\\tN-steps: 900999\\tReward: 2957.304 Episode: 911\\tN-steps: 910999\\tReward: 3019.219 EVALUATION\\tN-steps: 920000\\tMean_Reward: 3365.509 Episode: 921\\tN-steps: 920999\\tReward: 2992.971 Episode: 931\\tN-steps: 930999\\tReward: 3003.682 EVALUATION\\tN-steps: 940000\\tMean_Reward: 3442.211 Episode: 941\\tN-steps: 940999\\tReward: 2905.103 Episode: 951\\tN-steps: 950999\\tReward: 453.591 EVALUATION\\tN-steps: 960000\\tMean_Reward: 3442.582 Episode: 961\\tN-steps: 960999\\tReward: 2938.971 Episode: 971\\tN-steps: 970999\\tReward: 3008.213 EVALUATION\\tN-steps: 980000\\tMean_Reward: 3447.198 Episode: 981\\tN-steps: 980999\\tReward: 3004.606 Episode: 991\\tN-steps: 990999\\tReward: 3075.360 EVALUATION\\tN-steps: 999999\\tMean_Reward: 3092.923 Commencing task 2: 0.5 EVALUATION\\tN-steps: 1000000\\tMean_Reward: 3082.174 Episode: 1001\\tN-steps: 1000999\\tReward: 2804.323 Episode: 1011\\tN-steps: 1010999\\tReward: 2856.230 EVALUATION\\tN-steps: 1020000\\tMean_Reward: 3129.255 Episode: 1021\\tN-steps: 1020999\\tReward: 2807.281 Episode: 1031\\tN-steps: 1030999\\tReward: 2865.225 EVALUATION\\tN-steps: 1040000\\tMean_Reward: 3214.523 Episode: 1041\\tN-steps: 1040999\\tReward: 2895.714 Episode: 1051\\tN-steps: 1050999\\tReward: 2876.319 EVALUATION\\tN-steps: 1060000\\tMean_Reward: 3302.273 Episode: 1061\\tN-steps: 1060999\\tReward: 2890.646 Episode: 1071\\tN-steps: 1070999\\tReward: 2786.857 EVALUATION\\tN-steps: 1080000\\tMean_Reward: 3347.327 Episode: 1081\\tN-steps: 1080999\\tReward: 2638.856 Episode: 1091\\tN-steps: 1090999\\tReward: 2527.687 EVALUATION\\tN-steps: 1100000\\tMean_Reward: 3247.698 Episode: 1101\\tN-steps: 1100999\\tReward: 2817.079 Episode: 1111\\tN-steps: 1110999\\tReward: 2899.471 EVALUATION\\tN-steps: 1120000\\tMean_Reward: 3396.247 Episode: 1121\\tN-steps: 1120999\\tReward: 203.347 Episode: 1131\\tN-steps: 1130999\\tReward: 241.905 EVALUATION\\tN-steps: 1140000\\tMean_Reward: 3259.553 Episode: 1141\\tN-steps: 1140999\\tReward: 2952.586 Episode: 1151\\tN-steps: 1150999\\tReward: 3061.690 EVALUATION\\tN-steps: 1160000\\tMean_Reward: 3252.283 Episode: 1161\\tN-steps: 1160999\\tReward: 2987.297 Episode: 1171\\tN-steps: 1170999\\tReward: 2939.014 EVALUATION\\tN-steps: 1180000\\tMean_Reward: 3252.191 Episode: 1181\\tN-steps: 1180999\\tReward: 3115.779 Episode: 1191\\tN-steps: 1190999\\tReward: 2937.144 EVALUATION\\tN-steps: 1200000\\tMean_Reward: 3277.353 Episode: 1201\\tN-steps: 1200999\\tReward: 2983.449 Episode: 1211\\tN-steps: 1210999\\tReward: 3088.008 EVALUATION\\tN-steps: 1220000\\tMean_Reward: 3417.172 Episode: 1221\\tN-steps: 1220999\\tReward: 3028.487 Episode: 1231\\tN-steps: 1230999\\tReward: 3082.852 EVALUATION\\tN-steps: 1240000\\tMean_Reward: 3457.189 Episode: 1241\\tN-steps: 1240999\\tReward: 3133.395 Episode: 1251\\tN-steps: 1250999\\tReward: 3030.087 EVALUATION\\tN-steps: 1260000\\tMean_Reward: 3388.408 Episode: 1261\\tN-steps: 1260999\\tReward: 3060.672 Episode: 1271\\tN-steps: 1270999\\tReward: 2971.165 EVALUATION\\tN-steps: 1280000\\tMean_Reward: 3284.353 Episode: 1281\\tN-steps: 1280999\\tReward: 3010.932 Episode: 1291\\tN-steps: 1290999\\tReward: 1846.439 EVALUATION\\tN-steps: 1300000\\tMean_Reward: 3325.879 Episode: 1301\\tN-steps: 1300999\\tReward: 2930.658 Episode: 1311\\tN-steps: 1310999\\tReward: 2857.060 EVALUATION\\tN-steps: 1320000\\tMean_Reward: 3351.464 Episode: 1321\\tN-steps: 1320999\\tReward: 3018.031 Episode: 1331\\tN-steps: 1330999\\tReward: 1215.009 EVALUATION\\tN-steps: 1340000\\tMean_Reward: 3280.796 Episode: 1341\\tN-steps: 1340999\\tReward: 632.943 Episode: 1351\\tN-steps: 1350999\\tReward: 2980.060 EVALUATION\\tN-steps: 1360000\\tMean_Reward: 3081.023 Episode: 1361\\tN-steps: 1360999\\tReward: 2873.076 Episode: 1371\\tN-steps: 1370999\\tReward: 2118.468 EVALUATION\\tN-steps: 1380000\\tMean_Reward: 3061.264 Episode: 1381\\tN-steps: 1380999\\tReward: 2946.987 Episode: 1391\\tN-steps: 1390999\\tReward: 2951.704 EVALUATION\\tN-steps: 1400000\\tMean_Reward: 3278.758 Episode: 1401\\tN-steps: 1400999\\tReward: 3045.706 Episode: 1411\\tN-steps: 1410999\\tReward: 3031.882 EVALUATION\\tN-steps: 1420000\\tMean_Reward: 3441.628 Episode: 1421\\tN-steps: 1420999\\tReward: 2960.752 Episode: 1431\\tN-steps: 1430999\\tReward: 2971.708 EVALUATION\\tN-steps: 1440000\\tMean_Reward: 3344.326 Episode: 1441\\tN-steps: 1440999\\tReward: 3108.047 Episode: 1451\\tN-steps: 1450999\\tReward: 2972.154 EVALUATION\\tN-steps: 1460000\\tMean_Reward: 3210.625 Episode: 1461\\tN-steps: 1460999\\tReward: 3035.742 Episode: 1471\\tN-steps: 1470999\\tReward: 2932.729 EVALUATION\\tN-steps: 1480000\\tMean_Reward: 3231.953 Episode: 1481\\tN-steps: 1480999\\tReward: 2926.644 Episode: 1491\\tN-steps: 1490999\\tReward: 2840.643 EVALUATION\\tN-steps: 1499999\\tMean_Reward: 2960.551 Commencing task 3: 0.25 EVALUATION\\tN-steps: 1500000\\tMean_Reward: 2744.534 Episode: 1501\\tN-steps: 1500999\\tReward: 2419.751 Episode: 1511\\tN-steps: 1510999\\tReward: 2568.625 EVALUATION\\tN-steps: 1520000\\tMean_Reward: 2951.202 Episode: 1521\\tN-steps: 1520999\\tReward: 2617.491 Episode: 1531\\tN-steps: 1530999\\tReward: 2646.973 EVALUATION\\tN-steps: 1540000\\tMean_Reward: 2993.463 Episode: 1541\\tN-steps: 1540999\\tReward: 2770.250 Episode: 1551\\tN-steps: 1550999\\tReward: 1712.066 EVALUATION\\tN-steps: 1560000\\tMean_Reward: 3153.352 Episode: 1561\\tN-steps: 1560999\\tReward: 2798.535 Episode: 1571\\tN-steps: 1570999\\tReward: 2668.131 EVALUATION\\tN-steps: 1580000\\tMean_Reward: 3202.437 Episode: 1581\\tN-steps: 1580999\\tReward: 2828.562 Episode: 1591\\tN-steps: 1590999\\tReward: 2859.384 EVALUATION\\tN-steps: 1600000\\tMean_Reward: 3193.205 Episode: 1601\\tN-steps: 1600999\\tReward: 2864.533 Episode: 1611\\tN-steps: 1610999\\tReward: 2871.364 EVALUATION\\tN-steps: 1620000\\tMean_Reward: 3315.475 Episode: 1621\\tN-steps: 1620999\\tReward: 2946.129 Episode: 1631\\tN-steps: 1630999\\tReward: 363.342 EVALUATION\\tN-steps: 1640000\\tMean_Reward: 3274.641 Episode: 1641\\tN-steps: 1640999\\tReward: 2865.751 Episode: 1651\\tN-steps: 1650999\\tReward: 2862.348 EVALUATION\\tN-steps: 1660000\\tMean_Reward: 3167.940 Episode: 1661\\tN-steps: 1660999\\tReward: 2711.995 Episode: 1671\\tN-steps: 1670999\\tReward: 2812.927 EVALUATION\\tN-steps: 1680000\\tMean_Reward: 3166.648 Episode: 1681\\tN-steps: 1680999\\tReward: 2842.354 Episode: 1691\\tN-steps: 1690999\\tReward: 2897.771 EVALUATION\\tN-steps: 1700000\\tMean_Reward: 3282.782 Episode: 1701\\tN-steps: 1700999\\tReward: 2871.537 Episode: 1711\\tN-steps: 1710999\\tReward: 2891.990 EVALUATION\\tN-steps: 1720000\\tMean_Reward: 3139.302 Episode: 1721\\tN-steps: 1720999\\tReward: 2905.677 Episode: 1731\\tN-steps: 1730999\\tReward: 2783.224 EVALUATION\\tN-steps: 1740000\\tMean_Reward: 3180.648 Episode: 1741\\tN-steps: 1740999\\tReward: 2750.140 Episode: 1751\\tN-steps: 1750999\\tReward: 2866.442 EVALUATION\\tN-steps: 1760000\\tMean_Reward: 3339.268 Episode: 1761\\tN-steps: 1760999\\tReward: 2905.983 Episode: 1771\\tN-steps: 1770999\\tReward: 3000.150 EVALUATION\\tN-steps: 1780000\\tMean_Reward: 3374.802 Episode: 1781\\tN-steps: 1780999\\tReward: 3009.061 Episode: 1791\\tN-steps: 1790999\\tReward: 2926.138 EVALUATION\\tN-steps: 1800000\\tMean_Reward: 3282.279 Episode: 1801\\tN-steps: 1800999\\tReward: 3010.748 Episode: 1811\\tN-steps: 1810999\\tReward: 2967.306 EVALUATION\\tN-steps: 1820000\\tMean_Reward: 3267.035 Episode: 1821\\tN-steps: 1820999\\tReward: 2879.900 Episode: 1831\\tN-steps: 1830999\\tReward: 2962.403 EVALUATION\\tN-steps: 1840000\\tMean_Reward: 3369.307 Episode: 1841\\tN-steps: 1840999\\tReward: 2992.204 Episode: 1851\\tN-steps: 1850999\\tReward: 3014.063 EVALUATION\\tN-steps: 1860000\\tMean_Reward: 3424.155 Episode: 1861\\tN-steps: 1860999\\tReward: 2994.865 Episode: 1871\\tN-steps: 1870999\\tReward: 2940.862 EVALUATION\\tN-steps: 1880000\\tMean_Reward: 3369.393 Episode: 1881\\tN-steps: 1880999\\tReward: 2969.842 Episode: 1891\\tN-steps: 1890999\\tReward: 2910.767 EVALUATION\\tN-steps: 1900000\\tMean_Reward: 3256.367 Episode: 1901\\tN-steps: 1900999\\tReward: 2942.561 Episode: 1911\\tN-steps: 1910999\\tReward: 2866.463 EVALUATION\\tN-steps: 1920000\\tMean_Reward: 3241.871 Episode: 1921\\tN-steps: 1920999\\tReward: 2924.743 Episode: 1931\\tN-steps: 1930999\\tReward: 2986.346 EVALUATION\\tN-steps: 1940000\\tMean_Reward: 3295.521 Episode: 1941\\tN-steps: 1940999\\tReward: 2929.057 Episode: 1951\\tN-steps: 1950999\\tReward: 2959.230 EVALUATION\\tN-steps: 1960000\\tMean_Reward: 3235.567 Episode: 1961\\tN-steps: 1960999\\tReward: 3090.342 Episode: 1971\\tN-steps: 1970999\\tReward: 3005.562 EVALUATION\\tN-steps: 1980000\\tMean_Reward: 3402.376 Episode: 1981\\tN-steps: 1980999\\tReward: 3008.312 Episode: 1991\\tN-steps: 1990999\\tReward: 3008.663 EVALUATION\\tN-steps: 1999999\\tMean_Reward: 3457.930 Commencing task 4: 0.0 EVALUATION\\tN-steps: 2000000\\tMean_Reward: 3233.362 Episode: 2001\\tN-steps: 2000999\\tReward: 1080.893 Episode: 2011\\tN-steps: 2010999\\tReward: 2845.669 EVALUATION\\tN-steps: 2020000\\tMean_Reward: 3277.935 Episode: 2021\\tN-steps: 2020999\\tReward: 2833.157 Episode: 2031\\tN-steps: 2030999\\tReward: 2746.674 EVALUATION\\tN-steps: 2040000\\tMean_Reward: 3365.926 Episode: 2041\\tN-steps: 2040999\\tReward: 2711.052 Episode: 2051\\tN-steps: 2050999\\tReward: 2868.345 EVALUATION\\tN-steps: 2060000\\tMean_Reward: 3322.479 Episode: 2061\\tN-steps: 2060999\\tReward: 2769.800 Episode: 2071\\tN-steps: 2070999\\tReward: 2837.758 EVALUATION\\tN-steps: 2080000\\tMean_Reward: 3228.550 Episode: 2081\\tN-steps: 2080999\\tReward: 2793.691 Episode: 2091\\tN-steps: 2090999\\tReward: 2889.352 EVALUATION\\tN-steps: 2100000\\tMean_Reward: 3247.428 Episode: 2101\\tN-steps: 2100999\\tReward: 2843.627 Episode: 2111\\tN-steps: 2110999\\tReward: 2899.193 EVALUATION\\tN-steps: 2120000\\tMean_Reward: 3360.962 Episode: 2121\\tN-steps: 2120999\\tReward: 2982.661 Episode: 2131\\tN-steps: 2130999\\tReward: 2891.783 EVALUATION\\tN-steps: 2140000\\tMean_Reward: 3391.930 Episode: 2141\\tN-steps: 2140999\\tReward: 2975.131 Episode: 2151\\tN-steps: 2150999\\tReward: 2999.567 EVALUATION\\tN-steps: 2160000\\tMean_Reward: 3445.113 Episode: 2161\\tN-steps: 2160999\\tReward: 3078.298 Episode: 2171\\tN-steps: 2170999\\tReward: 3110.992 EVALUATION\\tN-steps: 2180000\\tMean_Reward: 3501.943 Episode: 2181\\tN-steps: 2180999\\tReward: 3079.379 Episode: 2191\\tN-steps: 2190999\\tReward: 3029.389 EVALUATION\\tN-steps: 2200000\\tMean_Reward: 3467.450 Episode: 2201\\tN-steps: 2200999\\tReward: 3114.484 Episode: 2211\\tN-steps: 2210999\\tReward: 3123.151 EVALUATION\\tN-steps: 2220000\\tMean_Reward: 3549.055 Episode: 2221\\tN-steps: 2220999\\tReward: 3081.209 Episode: 2231\\tN-steps: 2230999\\tReward: 275.601 EVALUATION\\tN-steps: 2240000\\tMean_Reward: 3547.329 Episode: 2241\\tN-steps: 2240999\\tReward: 3100.435 Episode: 2251\\tN-steps: 2250999\\tReward: 3109.511 EVALUATION\\tN-steps: 2260000\\tMean_Reward: 3429.110 Episode: 2261\\tN-steps: 2260999\\tReward: 3064.018 Episode: 2271\\tN-steps: 2270999\\tReward: 3039.826 EVALUATION\\tN-steps: 2280000\\tMean_Reward: 3429.525 Episode: 2281\\tN-steps: 2280999\\tReward: 3028.702 Episode: 2291\\tN-steps: 2290999\\tReward: 3032.267 EVALUATION\\tN-steps: 2300000\\tMean_Reward: 3403.667 Episode: 2301\\tN-steps: 2300999\\tReward: 3019.400 Episode: 2311\\tN-steps: 2310999\\tReward: 3035.016 EVALUATION\\tN-steps: 2320000\\tMean_Reward: 3385.723 Episode: 2321\\tN-steps: 2320999\\tReward: 2984.798 Episode: 2331\\tN-steps: 2330999\\tReward: 3001.257 EVALUATION\\tN-steps: 2340000\\tMean_Reward: 3568.711 Episode: 2341\\tN-steps: 2340999\\tReward: 3015.191 Episode: 2351\\tN-steps: 2350999\\tReward: 2962.553 EVALUATION\\tN-steps: 2360000\\tMean_Reward: 3586.086 Episode: 2361\\tN-steps: 2360999\\tReward: 3075.193 Episode: 2371\\tN-steps: 2370999\\tReward: 3193.475 EVALUATION\\tN-steps: 2380000\\tMean_Reward: 3658.555 Episode: 2381\\tN-steps: 2380999\\tReward: 3159.693 Episode: 2391\\tN-steps: 2390999\\tReward: 3166.071 EVALUATION\\tN-steps: 2400000\\tMean_Reward: 3625.867 Episode: 2401\\tN-steps: 2400999\\tReward: 3198.691 Episode: 2411\\tN-steps: 2410999\\tReward: 3096.255 EVALUATION\\tN-steps: 2420000\\tMean_Reward: 3413.802 Episode: 2421\\tN-steps: 2420999\\tReward: 3100.656 Episode: 2431\\tN-steps: 2430999\\tReward: 2956.020 EVALUATION\\tN-steps: 2440000\\tMean_Reward: 3326.188 Episode: 2441\\tN-steps: 2440999\\tReward: 3148.552 Episode: 2451\\tN-steps: 2450999\\tReward: 3145.917 EVALUATION\\tN-steps: 2460000\\tMean_Reward: 3579.682 Episode: 2461\\tN-steps: 2460999\\tReward: 3144.128 Episode: 2471\\tN-steps: 2470999\\tReward: 3198.936 EVALUATION\\tN-steps: 2480000\\tMean_Reward: 3576.411 Episode: 2481\\tN-steps: 2480999\\tReward: 3066.533 Episode: 2491\\tN-steps: 2490999\\tReward: 3162.264 EVALUATION\\tN-steps: 2499999\\tMean_Reward: 3619.915 Commencing task 5: 0.25 EVALUATION\\tN-steps: 2500000\\tMean_Reward: 3785.600 Episode: 2501\\tN-steps: 2500999\\tReward: 3363.656 Episode: 2511\\tN-steps: 2510999\\tReward: 3302.317 EVALUATION\\tN-steps: 2520000\\tMean_Reward: 3811.650 Episode: 2521\\tN-steps: 2520999\\tReward: 3331.000 Episode: 2531\\tN-steps: 2530999\\tReward: 3169.765 EVALUATION\\tN-steps: 2540000\\tMean_Reward: 3656.624 Episode: 2541\\tN-steps: 2540999\\tReward: 3223.962 Episode: 2551\\tN-steps: 2550999\\tReward: 3243.749 EVALUATION\\tN-steps: 2560000\\tMean_Reward: 3725.495 Episode: 2561\\tN-steps: 2560999\\tReward: 3259.465 Episode: 2571\\tN-steps: 2570999\\tReward: 2629.053 EVALUATION\\tN-steps: 2580000\\tMean_Reward: 3797.898 Episode: 2581\\tN-steps: 2580999\\tReward: 3241.695 Episode: 2591\\tN-steps: 2590999\\tReward: 3329.384 EVALUATION\\tN-steps: 2600000\\tMean_Reward: 3834.051 Episode: 2601\\tN-steps: 2600999\\tReward: 701.316 Episode: 2611\\tN-steps: 2610999\\tReward: 1927.510 EVALUATION\\tN-steps: 2620000\\tMean_Reward: 3782.671 Episode: 2621\\tN-steps: 2620999\\tReward: 3232.324 Episode: 2631\\tN-steps: 2630999\\tReward: 2886.284 EVALUATION\\tN-steps: 2640000\\tMean_Reward: 3893.129 Episode: 2641\\tN-steps: 2640999\\tReward: 903.417 Episode: 2651\\tN-steps: 2650999\\tReward: 3419.450 EVALUATION\\tN-steps: 2660000\\tMean_Reward: 3856.020 Episode: 2661\\tN-steps: 2660999\\tReward: 3365.720 Episode: 2671\\tN-steps: 2670999\\tReward: 2505.075 EVALUATION\\tN-steps: 2680000\\tMean_Reward: 3858.197 Episode: 2681\\tN-steps: 2680999\\tReward: 3450.377 Episode: 2691\\tN-steps: 2690999\\tReward: 3479.097 EVALUATION\\tN-steps: 2700000\\tMean_Reward: 3854.094 Episode: 2701\\tN-steps: 2700999\\tReward: 3097.509 Episode: 2711\\tN-steps: 2710999\\tReward: 3332.295 EVALUATION\\tN-steps: 2720000\\tMean_Reward: 3820.431 Episode: 2721\\tN-steps: 2720999\\tReward: 3420.531 Episode: 2731\\tN-steps: 2730999\\tReward: 3347.594 EVALUATION\\tN-steps: 2740000\\tMean_Reward: 3781.032 Episode: 2741\\tN-steps: 2740999\\tReward: 3147.587 Episode: 2751\\tN-steps: 2750999\\tReward: 3398.229 EVALUATION\\tN-steps: 2760000\\tMean_Reward: 3799.292 Episode: 2761\\tN-steps: 2760999\\tReward: 3310.497 Episode: 2771\\tN-steps: 2770999\\tReward: 2424.249 EVALUATION\\tN-steps: 2780000\\tMean_Reward: 3717.197 Episode: 2781\\tN-steps: 2780999\\tReward: 3339.504 Episode: 2791\\tN-steps: 2790999\\tReward: 3437.702 EVALUATION\\tN-steps: 2800000\\tMean_Reward: 3609.323 Episode: 2801\\tN-steps: 2800999\\tReward: 3403.246 Episode: 2811\\tN-steps: 2810999\\tReward: 2985.339 EVALUATION\\tN-steps: 2820000\\tMean_Reward: 3780.143 Episode: 2821\\tN-steps: 2820999\\tReward: 1557.399 Episode: 2831\\tN-steps: 2830999\\tReward: 3415.121 EVALUATION\\tN-steps: 2840000\\tMean_Reward: 3889.753 Episode: 2841\\tN-steps: 2840999\\tReward: 3445.382 Episode: 2851\\tN-steps: 2850999\\tReward: 1737.903 EVALUATION\\tN-steps: 2860000\\tMean_Reward: 3817.355 Episode: 2861\\tN-steps: 2860999\\tReward: 2921.499 Episode: 2871\\tN-steps: 2870999\\tReward: 3457.402 EVALUATION\\tN-steps: 2880000\\tMean_Reward: 3810.570 Episode: 2881\\tN-steps: 2880999\\tReward: 3396.740 Episode: 2891\\tN-steps: 2890999\\tReward: 3465.313 EVALUATION\\tN-steps: 2900000\\tMean_Reward: 3920.869 Episode: 2901\\tN-steps: 2900999\\tReward: 3433.040 Episode: 2911\\tN-steps: 2910999\\tReward: 3440.142 EVALUATION\\tN-steps: 2920000\\tMean_Reward: 3901.468 Episode: 2921\\tN-steps: 2920999\\tReward: 3430.818 Episode: 2931\\tN-steps: 2930999\\tReward: 831.253 EVALUATION\\tN-steps: 2940000\\tMean_Reward: 3948.756 Episode: 2941\\tN-steps: 2940999\\tReward: 1385.165 Episode: 2951\\tN-steps: 2950999\\tReward: 3223.711 EVALUATION\\tN-steps: 2960000\\tMean_Reward: 3789.009 Episode: 2961\\tN-steps: 2960999\\tReward: 3260.939 Episode: 2971\\tN-steps: 2970999\\tReward: 3365.221 EVALUATION\\tN-steps: 2980000\\tMean_Reward: 3900.092 Episode: 2981\\tN-steps: 2980999\\tReward: 3420.730 Episode: 2991\\tN-steps: 2990999\\tReward: 3455.479 EVALUATION\\tN-steps: 2999999\\tMean_Reward: 3994.635 Commencing task 6: 0.5 EVALUATION\\tN-steps: 3000000\\tMean_Reward: 4067.255 Episode: 3001\\tN-steps: 3000999\\tReward: 2508.236 Episode: 3011\\tN-steps: 3010999\\tReward: 1615.083 EVALUATION\\tN-steps: 3020000\\tMean_Reward: 4038.992 Episode: 3021\\tN-steps: 3020999\\tReward: 3578.856 Episode: 3031\\tN-steps: 3030999\\tReward: 3467.359 EVALUATION\\tN-steps: 3040000\\tMean_Reward: 3840.148 Episode: 3041\\tN-steps: 3040999\\tReward: 3505.954 Episode: 3051\\tN-steps: 3050999\\tReward: 3384.754 EVALUATION\\tN-steps: 3060000\\tMean_Reward: 3744.337 Episode: 3061\\tN-steps: 3060999\\tReward: 3546.820 Episode: 3071\\tN-steps: 3070999\\tReward: 3325.421 EVALUATION\\tN-steps: 3080000\\tMean_Reward: 3682.316 Episode: 3081\\tN-steps: 3080999\\tReward: 3291.222 Episode: 3091\\tN-steps: 3090999\\tReward: 3479.997 EVALUATION\\tN-steps: 3100000\\tMean_Reward: 3698.427 Episode: 3101\\tN-steps: 3100999\\tReward: 3478.622 Episode: 3111\\tN-steps: 3110999\\tReward: 3391.460 EVALUATION\\tN-steps: 3120000\\tMean_Reward: 3818.671 Episode: 3121\\tN-steps: 3120999\\tReward: 3317.250 Episode: 3131\\tN-steps: 3130999\\tReward: 3480.118 EVALUATION\\tN-steps: 3140000\\tMean_Reward: 3819.904 Episode: 3141\\tN-steps: 3140999\\tReward: 3482.504 Episode: 3151\\tN-steps: 3150999\\tReward: 1048.096 EVALUATION\\tN-steps: 3160000\\tMean_Reward: 3994.761 Episode: 3161\\tN-steps: 3160999\\tReward: 3437.456 Episode: 3171\\tN-steps: 3170999\\tReward: 3491.627 EVALUATION\\tN-steps: 3180000\\tMean_Reward: 4076.446 Episode: 3181\\tN-steps: 3180999\\tReward: 3452.423 Episode: 3191\\tN-steps: 3190999\\tReward: 3521.826 EVALUATION\\tN-steps: 3200000\\tMean_Reward: 4110.595 Episode: 3201\\tN-steps: 3200999\\tReward: 3430.900 Episode: 3211\\tN-steps: 3210999\\tReward: 1220.214 EVALUATION\\tN-steps: 3220000\\tMean_Reward: 4070.751 Episode: 3221\\tN-steps: 3220999\\tReward: 3410.368 Episode: 3231\\tN-steps: 3230999\\tReward: 3536.075 EVALUATION\\tN-steps: 3240000\\tMean_Reward: 4022.736 Episode: 3241\\tN-steps: 3240999\\tReward: 1767.448 Episode: 3251\\tN-steps: 3250999\\tReward: 3340.495 EVALUATION\\tN-steps: 3260000\\tMean_Reward: 3976.578 Episode: 3261\\tN-steps: 3260999\\tReward: 3515.333 Episode: 3271\\tN-steps: 3270999\\tReward: 2950.366 EVALUATION\\tN-steps: 3280000\\tMean_Reward: 3971.189 Episode: 3281\\tN-steps: 3280999\\tReward: 3433.120 Episode: 3291\\tN-steps: 3290999\\tReward: 3560.837 EVALUATION\\tN-steps: 3300000\\tMean_Reward: 4090.404 Episode: 3301\\tN-steps: 3300999\\tReward: 3541.636 Episode: 3311\\tN-steps: 3310999\\tReward: 3463.807 EVALUATION\\tN-steps: 3320000\\tMean_Reward: 4041.261 Episode: 3321\\tN-steps: 3320999\\tReward: 3413.201 Episode: 3331\\tN-steps: 3330999\\tReward: 3383.989 EVALUATION\\tN-steps: 3340000\\tMean_Reward: 4165.418 Episode: 3341\\tN-steps: 3340999\\tReward: 3375.666 Episode: 3351\\tN-steps: 3350999\\tReward: 3488.683 EVALUATION\\tN-steps: 3360000\\tMean_Reward: 4260.617 Episode: 3361\\tN-steps: 3360999\\tReward: 3473.425 Episode: 3371\\tN-steps: 3370999\\tReward: 1005.498 EVALUATION\\tN-steps: 3380000\\tMean_Reward: 4094.407 Episode: 3381\\tN-steps: 3380999\\tReward: 3562.845 Episode: 3391\\tN-steps: 3390999\\tReward: 3576.203 EVALUATION\\tN-steps: 3400000\\tMean_Reward: 3529.971 Episode: 3401\\tN-steps: 3400999\\tReward: 3469.851 Episode: 3411\\tN-steps: 3410999\\tReward: 3534.968 EVALUATION\\tN-steps: 3420000\\tMean_Reward: 4069.376 Episode: 3421\\tN-steps: 3420999\\tReward: 3606.723 Episode: 3431\\tN-steps: 3430999\\tReward: 2529.515 EVALUATION\\tN-steps: 3440000\\tMean_Reward: 4138.915 Episode: 3441\\tN-steps: 3440999\\tReward: 3620.145 Episode: 3451\\tN-steps: 3450999\\tReward: 3477.892 EVALUATION\\tN-steps: 3460000\\tMean_Reward: 4010.872 Episode: 3461\\tN-steps: 3460999\\tReward: 3577.582 Episode: 3471\\tN-steps: 3470999\\tReward: 3580.575 EVALUATION\\tN-steps: 3480000\\tMean_Reward: 4074.786 Episode: 3481\\tN-steps: 3480999\\tReward: 3557.936 Episode: 3491\\tN-steps: 3490999\\tReward: 3499.262 EVALUATION\\tN-steps: 3499999\\tMean_Reward: 4039.592 Commencing task 7: 0.75 EVALUATION\\tN-steps: 3500000\\tMean_Reward: 3993.234 Episode: 3501\\tN-steps: 3500999\\tReward: 3587.852 Episode: 3511\\tN-steps: 3510999\\tReward: 3492.563 EVALUATION\\tN-steps: 3520000\\tMean_Reward: 4071.034 Episode: 3521\\tN-steps: 3520999\\tReward: 313.309 Episode: 3531\\tN-steps: 3530999\\tReward: 3435.866 EVALUATION\\tN-steps: 3540000\\tMean_Reward: 3878.328 Episode: 3541\\tN-steps: 3540999\\tReward: 515.947 Episode: 3551\\tN-steps: 3550999\\tReward: 1133.244 EVALUATION\\tN-steps: 3560000\\tMean_Reward: 2276.713 Episode: 3561\\tN-steps: 3560999\\tReward: 3599.499 Episode: 3571\\tN-steps: 3570999\\tReward: 3452.477 EVALUATION\\tN-steps: 3580000\\tMean_Reward: 3145.741 Episode: 3581\\tN-steps: 3580999\\tReward: 1123.178 Episode: 3591\\tN-steps: 3590999\\tReward: 3516.074 EVALUATION\\tN-steps: 3600000\\tMean_Reward: 3988.873 Episode: 3601\\tN-steps: 3600999\\tReward: 3500.022 Episode: 3611\\tN-steps: 3610999\\tReward: 3528.564 EVALUATION\\tN-steps: 3620000\\tMean_Reward: 3771.487 Episode: 3621\\tN-steps: 3620999\\tReward: 3497.345 Episode: 3631\\tN-steps: 3630999\\tReward: 3552.140 EVALUATION\\tN-steps: 3640000\\tMean_Reward: 4055.281 Episode: 3641\\tN-steps: 3640999\\tReward: 3705.644 Episode: 3651\\tN-steps: 3650999\\tReward: 2488.568 EVALUATION\\tN-steps: 3660000\\tMean_Reward: 4140.487 Episode: 3661\\tN-steps: 3660999\\tReward: 3593.790 Episode: 3671\\tN-steps: 3670999\\tReward: 3633.924 EVALUATION\\tN-steps: 3680000\\tMean_Reward: 4182.890 Episode: 3681\\tN-steps: 3680999\\tReward: 3752.696 Episode: 3691\\tN-steps: 3690999\\tReward: 2127.381 EVALUATION\\tN-steps: 3700000\\tMean_Reward: 4227.814 Episode: 3701\\tN-steps: 3700999\\tReward: 3659.290 Episode: 3711\\tN-steps: 3710999\\tReward: 1179.911 EVALUATION\\tN-steps: 3720000\\tMean_Reward: 4322.437 Episode: 3721\\tN-steps: 3720999\\tReward: 3056.671 Episode: 3731\\tN-steps: 3730999\\tReward: 3531.739 EVALUATION\\tN-steps: 3740000\\tMean_Reward: 4151.817 Episode: 3741\\tN-steps: 3740999\\tReward: 3558.667 Episode: 3751\\tN-steps: 3750999\\tReward: 3699.526 EVALUATION\\tN-steps: 3760000\\tMean_Reward: 4027.292 Episode: 3761\\tN-steps: 3760999\\tReward: 2092.957 Episode: 3771\\tN-steps: 3770999\\tReward: 3562.237 EVALUATION\\tN-steps: 3780000\\tMean_Reward: 4003.771 Episode: 3781\\tN-steps: 3780999\\tReward: 3572.951 Episode: 3791\\tN-steps: 3790999\\tReward: 3588.988 EVALUATION\\tN-steps: 3800000\\tMean_Reward: 3938.563 Episode: 3801\\tN-steps: 3800999\\tReward: 3465.839 Episode: 3811\\tN-steps: 3810999\\tReward: 3457.727 EVALUATION\\tN-steps: 3820000\\tMean_Reward: 3835.602 Episode: 3821\\tN-steps: 3820999\\tReward: 3514.633 Episode: 3831\\tN-steps: 3830999\\tReward: 3544.451 EVALUATION\\tN-steps: 3840000\\tMean_Reward: 3818.956 Episode: 3841\\tN-steps: 3840999\\tReward: 3536.542 Episode: 3851\\tN-steps: 3850999\\tReward: 3547.457 EVALUATION\\tN-steps: 3860000\\tMean_Reward: 4143.728 Episode: 3861\\tN-steps: 3860999\\tReward: 3483.426 Episode: 3871\\tN-steps: 3870999\\tReward: 3700.538 EVALUATION\\tN-steps: 3880000\\tMean_Reward: 4065.613 Episode: 3881\\tN-steps: 3880999\\tReward: 3575.710 Episode: 3891\\tN-steps: 3890999\\tReward: 3692.739 EVALUATION\\tN-steps: 3900000\\tMean_Reward: 4054.393 Episode: 3901\\tN-steps: 3900999\\tReward: 997.703 Episode: 3911\\tN-steps: 3910999\\tReward: 3570.602 EVALUATION\\tN-steps: 3920000\\tMean_Reward: 4183.339 Episode: 3921\\tN-steps: 3920999\\tReward: 3602.085 Episode: 3931\\tN-steps: 3930999\\tReward: 3659.731 EVALUATION\\tN-steps: 3940000\\tMean_Reward: 4237.217 Episode: 3941\\tN-steps: 3940999\\tReward: 3668.288 Episode: 3951\\tN-steps: 3950999\\tReward: 3588.699 EVALUATION\\tN-steps: 3960000\\tMean_Reward: 4245.550 Episode: 3961\\tN-steps: 3960999\\tReward: 3798.423 Episode: 3971\\tN-steps: 3970999\\tReward: 3602.344 EVALUATION\\tN-steps: 3980000\\tMean_Reward: 4125.759 Episode: 3981\\tN-steps: 3980999\\tReward: 3690.800 Episode: 3991\\tN-steps: 3990999\\tReward: 3764.106 EVALUATION\\tN-steps: 3999999\\tMean_Reward: 4199.869 Commencing task 8: 1.0 EVALUATION\\tN-steps: 4000000\\tMean_Reward: 4061.566 Episode: 4001\\tN-steps: 4000999\\tReward: 472.257 Episode: 4011\\tN-steps: 4010999\\tReward: 3647.763 EVALUATION\\tN-steps: 4020000\\tMean_Reward: 4173.869 Episode: 4021\\tN-steps: 4020999\\tReward: 3690.461 Episode: 4031\\tN-steps: 4030999\\tReward: 1355.762 EVALUATION\\tN-steps: 4040000\\tMean_Reward: 4300.476 Episode: 4041\\tN-steps: 4040999\\tReward: 1928.773 Episode: 4051\\tN-steps: 4050999\\tReward: 79.267 EVALUATION\\tN-steps: 4060000\\tMean_Reward: 4341.137 Episode: 4061\\tN-steps: 4060999\\tReward: 936.894 Episode: 4071\\tN-steps: 4070999\\tReward: 3667.116 EVALUATION\\tN-steps: 4080000\\tMean_Reward: 4206.160 Episode: 4081\\tN-steps: 4080999\\tReward: 3716.642 Episode: 4091\\tN-steps: 4090999\\tReward: 3746.784 EVALUATION\\tN-steps: 4100000\\tMean_Reward: 4377.011 Episode: 4101\\tN-steps: 4100999\\tReward: 3625.626 Episode: 4111\\tN-steps: 4110999\\tReward: 3314.688 EVALUATION\\tN-steps: 4120000\\tMean_Reward: 4259.891 Episode: 4121\\tN-steps: 4120999\\tReward: 3651.702 Episode: 4131\\tN-steps: 4130999\\tReward: 3762.914 EVALUATION\\tN-steps: 4140000\\tMean_Reward: 4435.653 Episode: 4141\\tN-steps: 4140999\\tReward: 3787.713 Episode: 4151\\tN-steps: 4150999\\tReward: 3836.911 EVALUATION\\tN-steps: 4160000\\tMean_Reward: 3990.234 Episode: 4161\\tN-steps: 4160999\\tReward: 3377.673 Episode: 4171\\tN-steps: 4170999\\tReward: 3656.133 EVALUATION\\tN-steps: 4180000\\tMean_Reward: 3792.871 Episode: 4181\\tN-steps: 4180999\\tReward: 3722.741 Episode: 4191\\tN-steps: 4190999\\tReward: -520.907 EVALUATION\\tN-steps: 4200000\\tMean_Reward: 4386.985 Episode: 4201\\tN-steps: 4200999\\tReward: 3811.737 Episode: 4211\\tN-steps: 4210999\\tReward: 2363.120 EVALUATION\\tN-steps: 4220000\\tMean_Reward: 4452.985 Episode: 4221\\tN-steps: 4220999\\tReward: 4001.224 Episode: 4231\\tN-steps: 4230999\\tReward: 1208.041 EVALUATION\\tN-steps: 4240000\\tMean_Reward: 3945.314 Episode: 4241\\tN-steps: 4240999\\tReward: 3714.872 Episode: 4251\\tN-steps: 4250999\\tReward: 3819.191 EVALUATION\\tN-steps: 4260000\\tMean_Reward: 4442.392 Episode: 4261\\tN-steps: 4260999\\tReward: 3791.472 Episode: 4271\\tN-steps: 4270999\\tReward: 3846.707 EVALUATION\\tN-steps: 4280000\\tMean_Reward: 4375.041 Episode: 4281\\tN-steps: 4280999\\tReward: 3834.739 Episode: 4291\\tN-steps: 4290999\\tReward: 1248.701 EVALUATION\\tN-steps: 4300000\\tMean_Reward: 4197.161 Episode: 4301\\tN-steps: 4300999\\tReward: 3710.479 Episode: 4311\\tN-steps: 4310999\\tReward: -399.974 EVALUATION\\tN-steps: 4320000\\tMean_Reward: 4152.975 Episode: 4321\\tN-steps: 4320999\\tReward: 3603.891 Episode: 4331\\tN-steps: 4330999\\tReward: 3740.204 EVALUATION\\tN-steps: 4340000\\tMean_Reward: 4348.862 Episode: 4341\\tN-steps: 4340999\\tReward: 400.044 Episode: 4351\\tN-steps: 4350999\\tReward: 3647.266 EVALUATION\\tN-steps: 4360000\\tMean_Reward: 3822.219 Episode: 4361\\tN-steps: 4360999\\tReward: 1243.447 Episode: 4371\\tN-steps: 4370999\\tReward: 3685.135 EVALUATION\\tN-steps: 4380000\\tMean_Reward: 4343.165 Episode: 4381\\tN-steps: 4380999\\tReward: 3785.212 Episode: 4391\\tN-steps: 4390999\\tReward: 3649.815 EVALUATION\\tN-steps: 4400000\\tMean_Reward: 4270.755 Episode: 4401\\tN-steps: 4400999\\tReward: 2334.143 Episode: 4411\\tN-steps: 4410999\\tReward: 3767.474 EVALUATION\\tN-steps: 4420000\\tMean_Reward: 4143.627 Episode: 4421\\tN-steps: 4420999\\tReward: 2256.559 Episode: 4431\\tN-steps: 4430999\\tReward: 2402.236 EVALUATION\\tN-steps: 4440000\\tMean_Reward: 4223.017 Episode: 4441\\tN-steps: 4440999\\tReward: 3692.952 Episode: 4451\\tN-steps: 4450999\\tReward: 3685.928 EVALUATION\\tN-steps: 4460000\\tMean_Reward: 4351.446 Episode: 4461\\tN-steps: 4460999\\tReward: 3786.685 Episode: 4471\\tN-steps: 4470999\\tReward: 3694.082 EVALUATION\\tN-steps: 4480000\\tMean_Reward: 4355.895 Episode: 4481\\tN-steps: 4480999\\tReward: 2394.527 Episode: 4491\\tN-steps: 4490999\\tReward: 3758.615 EVALUATION\\tN-steps: 4499999\\tMean_Reward: 4448.929 Training time: 7374.55 seconds AULC: 3481.70068359375 Final Return: 3648.4755859375\" # @param {\"type\":\"string\"}\n" + ], + "metadata": { + "cellView": "form", + "id": "cFNR5LtUg4Z-" + }, + "execution_count": 169, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# @title Display results\n", + "import re\n", + "import matplotlib.pyplot as plt\n", + "\n", + "eval_outputs_experiment = re.findall(r'N-steps:\\s+(\\d+)\\s+Mean_Reward:\\s+(\\d+\\.\\d+)', result_output_experiment)\n", + "eval_outputs_experiment = np.array([[int(x[0]), float(x[1])] for x in eval_outputs_experiment])\n", + "\n", + "eval_outputs = re.findall(r'N-steps:\\s+(\\d+)\\s+Mean_Reward:\\s+(\\d+\\.\\d+)', result_output)\n", + "eval_outputs = np.array([[int(x[0]), float(x[1])] for x in eval_outputs])\n", + "\n", + "task_breakpoints = re.findall(r'(\\d+)\\s+(?:Mean_)Reward:\\s+\\d+\\.\\d+ [a-zA-Z\\s]*? task\\s+\\d:\\s+(\\d+\\.\\d+)', result_output)\n", + "task_breakpoints = np.array([[int(x[0]), float(x[1])] for x in task_breakpoints])\n", + "\n", + "plt.figure(figsize=(10, 6))\n", + "plt.plot(eval_outputs[:,0], eval_outputs[:,1], label='Vanilla PPO')\n", + "plt.plot(eval_outputs_experiment[:,0], eval_outputs_experiment[:,1], label='Evidential PPO')\n", + "y_max = plt.gca().get_ylim()[1]\n", + "plt.vlines(x=task_breakpoints[:, 0], ymin=0, ymax=y_max, color='gray', linestyle=':', label='Task Transition')\n", + "for x, label in zip(task_breakpoints[:, 0], task_breakpoints[:, 1]):\n", + " plt.text(x, y_max/4, f' {label}', verticalalignment='bottom', color='gray')\n", + "\n", + "plt.title(f\"Experimental Results for {environment.capitalize()}: {strategy}\")\n", + "plt.xlabel('Step', fontsize=12)\n", + "plt.ylabel('Evaluation Reward', fontsize=12)\n", + "plt.grid(True, which='both', linestyle='--', alpha=0.5)\n", + "plt.legend(loc='lower right', frameon=True)\n", + "pass" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 498 + }, + "cellView": "form", + "id": "eUiSV223g_Pn", + "outputId": "0680b028-01d8-4d2b-f15d-2b0e0e62c5d9" + }, + "execution_count": 172, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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/PPP9u/62q65c+eSlpbG/Pnz2bx5M2+++Sbdu3fnmWeeAWDhwoXcdNNNjB07lltuuQWA9PR0QKSQrVmzhssvv5yUlBQOHjzIv//9b6ZMmcLu3bsJCwtr+eR5gfYgFxsba5+3a9cuJkyYQHJyMg8//DDh4eF88sknzJ49m88++4yLL74YEA9t8+fPt/ehoqKCjRs3snnzZs4+++xWteuSSy5h//79fPjhhzz//PMkJCQA0K1bN3bt2sX555/PsGHDePzxxwkODiY7O7uJE+xMt27dWLhwIU899RRVVVXMnz8fgIEDB6KqKhdeeCHLly/nxhtvZMSIESxZsoQHH3yQo0ePNklR/Pnnn/nkk0+46667SEhIaNaJBLBYLE1+Q4BbZ+XAgQN8+eWXXHbZZaSlpVFYWMjrr7/OmWeeye7du+nZs6fbffz5z3+mf//+/Oc//7Gnlmq2tHTpUs4//3ySkpK45557SExMZM+ePSxevJh77rnHpZ0zZszg9NNP57nnnmPZsmX885//JD09ndtvv92+3q233so777zDvHnzuPvuu8nNzeXll19my5YtrF69GqPRCAj7vu6665gxYwbPPPMMNTU1/Pvf/2bixIls2bKFPn36cOutt3Ls2DGWLl3KwoULm/TrxRdf5MILL+Sqq66ioaGBjz76iMsuu4zFixcza9Ysl3V//fVXPv/8c+644w4iIyP517/+xaWXXsrhw4ft1ysQ5/zMM89sVqTm1ltvJTk5maeffpq7776b0047jR49etiXm81mZsyYwcSJE3nuuecICwvz2Y5aam9zvwFvWLZsGTNnzqRv3748+uij1NbW8tJLLzFhwgQ2b97cxG5bul6BuH7/9a9/Ze7cudx0002cOHGCl156icmTJ7NlyxYZdZVI3KFKJBKJF7z99tsq4PYvODjYZd0dO3aoQUFB6k033aSWlpaqycnJ6pgxY1STyWRfZ/ny5SqgJicnqxUVFfb5n3zyiQqoL774oqqqqmq1WtXMzEx1xowZqtVqta9XU1OjpqWlqWeffbZ93t///ncVUK+44oom7deWOaO1PTc31z7v9ddfVwE1MTHRpV2PPPKICtjX9addN9xwg8v+L774YjU+Pt5lXnh4uHrdddc1aX9NTU2TeWvXrlUB9b333rPP047r8uXLm6zvjHY+ly1bpp44cULNy8tTFy1apHbr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yvz589m6dSvnnHMORqORrKwsPv30U1588UXmzJlDVFQU//73v7nmmmsYNWoUl19+Od26dePw4cN8++23TJgwwe6kaOf57rvvZsaMGej1ei6//HJmzZrFggULOPfcc7nyyis5fvw4r7zyChkZGWzfvt2v4wHeSc37Q3vYkaffgDdRq2effZaZM2cybtw4brzxRrvUfHR0NI8++qjPbUlPT+fJJ5/kkUce4eDBg8yePZvIyEhyc3P54osvuOWWW3jggQd83q5E0ukJsLqiRCI5RWlOah6bxLXZbFZPO+00NSUlRS0rK3P5/osvvqgC6scff6yqqkO2+cMPP1QfeeQRtXv37mpoaKg6a9Ys9dChQ032v2XLFvWSSy5R4+Pj1eDgYLV3797q3Llz1Z9++sm+jiaR7E5y3JPU/J133ukyT5Psdpb7dm5vY5np1rRLO6bOstF79+5VJ0+erIaGhqqAXXa+tLRUnTdvnpqQkKBGRESoM2bMUPfu3av27t3bRZreV6l5ZxlyDYvFoqanp6vp6emq2WxWVVVVc3Jy1GuvvVZNTExUjUajmpycrJ5//vnqokWL7N978skn1bFjx6oxMTFqaGioOmDAAPWpp55SGxoaXLb//vvvq3379lWDgoLUESNGqEuWLPFKal5VVfWJJ55Qk5OTVZ1OZz92P/30k3rRRRepPXv2VIOCgtSePXuqV1xxhbp///5mj4GqupeaV1UhjX7fffepPXv2VI1Go5qZmak+++yzLnLsWhsb25A/+1NV97ZXV1en3n///WpSUpIaGhqqTpgwQV27dm0TyX5vpeY1fv31V/Xss89WIyMj1fDwcHXYsGEukubXXXedGh4e3uR77n5Hqqqq//nPf9TRo0eroaGhamRkpDp06FD1oYceUo8dO+ay3vLly9UZM2ao0dHRakhIiJqenq5ef/316saNG+3rmM1m9fe//73arVs3VVEUl/3997//VTMzM9Xg4GB1wIAB6ttvv+31b1tV1Sa/F23d1krNuztWqtp6O3LXXne/AW9ZtmyZOmHCBDU0NFSNiopSL7jgAnX37t0u6/hyvVJVVf3ss8/UiRMnquHh4Wp4eLg6YMAA9c4771T37dvndbskkq6EoqodVMkpkUi6NCtWrGDq1Kl8+umnzJkzp6ObI5FIJBKJRNLuyJoviUQikUgkEolEIgkAsuZLIpFI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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "FPy2ZdW8sXOi" + }, + "execution_count": null, + "outputs": [] + } + ] }