{ "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import functools\n", "\n", "import matplotlib\n", "from matplotlib import pyplot\n", "import numpy as np\n", "\n", "import sys\n", "sys.path.append(\"..\")\n", "from hiora_cartpole import features\n", "from hiora_cartpole import fourier_fa\n", "from hiora_cartpole import easytile_fa\n", "from hiora_cartpole import driver\n", "\n", "import gym_ext.tools as gym_tools\n", "\n", "import gym" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[2016-09-23 13:07:02,758] Making new env: CartPole-v0\n" ] } ], "source": [ "env = gym.make('CartPole-v0')\n", "clipped_high = env.observation_space.high\n", "clipped_high = np.array([2.5, 3.6, 0.27, 3.7])\n", "clipped_low = -clipped_high\n", "state_ranges = np.array([clipped_low, clipped_high])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tile coding" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [], "source": [ "easyt_n_weights, easyt_feature_vec = easytile_fa.make_feature_vec(state_ranges, 2, [5, 7, 5, 7], 8)\n", "\n", "#fv = feature_vec(cartpole.observation_space.sample(), cartpole.action_space.sample())\n", "\n", "from hiora_cartpole import linfa\n", "eexperience = linfa.init(lmbda=0.9,\n", " init_alpha=0.05,\n", " epsi=0.01,\n", " feature_vec=easyt_feature_vec,\n", " n_weights=easyt_n_weights,\n", " act_space=env.action_space,\n", " theta=None,\n", " is_use_alpha_bounds=True,\n", " map_obs=functools.partial(gym_tools.warning_clip_obs, ranges=state_ranges))" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nf0rxeJiGSqL1AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "eexperience, steps_per_episode, alpha_per_episode \\\n", " = driver.train(env, linfa, eexperience, n_episodes=700, max_steps=500, is_render=False)\n", "# Credits: http://matplotlib.org/examples/api/two_scales.html\n", "fig, ax1 = pyplot.subplots()\n", "ax1.plot(steps_per_episode, color='b')\n", "ax2 = ax1.twinx()\n", "ax2.plot(alpha_per_episode, color='r')\n", "pyplot.show()" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [], "source": [ "steps_per_episode = driver.exec_greedy(env, eexperience, n_episodes=15, max_steps=600, is_render=True)" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " this.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width);\n", " canvas.attr('height', height);\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fexperience, steps_per_episode, alpha_per_episode \\\n", " = driver.train(env, linfa, fexperience, n_episodes=700, max_steps=500, is_render=False)\n", "# Credits: http://matplotlib.org/examples/api/two_scales.html\n", "fig, ax1 = pyplot.subplots()\n", "ax1.plot(steps_per_episode, color='b')\n", "ax2 = ax1.twinx()\n", "ax2.plot(alpha_per_episode, color='r')\n", "pyplot.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Haha, this just explodes after 30 or so episodes and doesn't diverge, at least not before 700 episodes." ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false }, "outputs": [], "source": [ "pyplot.plot(fexperience.theta)\n", "pyplot.show()" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false }, "outputs": [ { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msteps_per_episode\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexec_greedy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfexperience\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_episodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_steps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m600\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_render\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/home/erle/repos/cartpole/hiora_cartpole/driver.py\u001b[0m in \u001b[0;36mexec_greedy\u001b[0;34m(env, experience, n_episodes, max_steps, is_render)\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mxrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmax_steps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 86\u001b[0;31m \u001b[0mis_render\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# pylint: disable=expression-not-assigned\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 87\u001b[0m \u001b[0maction\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgreedy_act\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexperience\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobservation\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 88\u001b[0m \u001b[0mobservation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/home/erle/.local/lib/python2.7/site-packages/gym/core.pyc\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, mode, close)\u001b[0m\n\u001b[1;32m 190\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mUnsupportedMode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Unsupported rendering mode: {}. (Supported modes for {}: {})'\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 192\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_render\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 193\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 194\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/home/erle/.local/lib/python2.7/site-packages/gym/envs/classic_control/cartpole.pyc\u001b[0m in \u001b[0;36m_render\u001b[0;34m(self, mode, close)\u001b[0m\n\u001b[1;32m 147\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpoletrans\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_rotation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 148\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 149\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mviewer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreturn_rgb_array\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m==\u001b[0m\u001b[0;34m'rgb_array'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/home/erle/.local/lib/python2.7/site-packages/gym/envs/classic_control/rendering.pyc\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, return_rgb_array)\u001b[0m\n\u001b[1;32m 80\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreturn_rgb_array\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[0mglClearColor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 82\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwindow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclear\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 83\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwindow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mswitch_to\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwindow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch_events\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/home/erle/.local/lib/python2.7/site-packages/pyglet/window/__init__.pyc\u001b[0m in \u001b[0;36mclear\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1149\u001b[0m \u001b[0mbuffer\u001b[0m\u001b[0;34m.\u001b[0m \u001b[0mThe\u001b[0m \u001b[0mwindow\u001b[0m \u001b[0mmust\u001b[0m \u001b[0mbe\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mactive\u001b[0m \u001b[0mcontext\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0msee\u001b[0m \u001b[0;34m`\u001b[0m\u001b[0mswitch_to\u001b[0m\u001b[0;34m`\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1150\u001b[0m '''\n\u001b[0;32m-> 1151\u001b[0;31m \u001b[0mgl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mglClear\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGL_COLOR_BUFFER_BIT\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mgl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGL_DEPTH_BUFFER_BIT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1152\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1153\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdispatch_event\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/home/erle/.local/lib/python2.7/site-packages/pyglet/gl/lib.pyc\u001b[0m in \u001b[0;36merrcheck\u001b[0;34m(result, func, arguments)\u001b[0m\n\u001b[1;32m 82\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 84\u001b[0;31m \u001b[0;32mdef\u001b[0m \u001b[0merrcheck\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marguments\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 85\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0m_debug_gl_trace\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "steps_per_episode = driver.exec_greedy(env, fexperience, n_episodes=10, max_steps=600, is_render=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Q-learning" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "collapsed": true }, "outputs": [], "source": [ "qfour_n_weights, qfour_feature_vec \\\n", " = fourier_fa.make_feature_vec(state_ranges,\n", " n_acts=2,\n", " order=3)\n", "\n", "#fv = feature_vec(cartpole.observation_space.sample(), cartpole.action_space.sample())\n", "\n", "from hiora_cartpole import linfa\n", "qfexperience = linfa.init(lmbda=0.9,\n", " init_alpha=0.001,\n", " epsi=0.1,\n", " feature_vec=qfour_feature_vec,\n", " n_weights=qfour_n_weights,\n", " act_space=env.action_space,\n", " theta=None,\n", " is_use_alpha_bounds=True,\n", " map_obs=functools.partial(gym_tools.warning_clip_obs, ranges=state_ranges),\n", " choose_action=linfa.choose_action_Q)" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " this.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width);\n", " canvas.attr('height', height);\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = pyplot.subplots()\n", "ax.plot(qfexperience.theta)\n", "pyplot.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12+" } }, "nbformat": 4, "nbformat_minor": 1 }