├── README.md ├── chapter1 ├── .ipynb_checkpoints │ └── singleneuron-checkpoint.ipynb ├── singleneuron.ipynb ├── singleneuron.png └── singleneuron.py.cfg ├── chapter2 ├── .ipynb_checkpoints │ ├── scalars-checkpoint.ipynb │ └── vectors-checkpoint.ipynb ├── scalars.ipynb ├── scalars.png ├── scalars.py.cfg ├── vectors.ipynb ├── vectors.png └── vectors.py.cfg ├── chapter3 ├── .ipynb_checkpoints │ ├── addition-checkpoint.ipynb │ ├── arbitrary_linear-checkpoint.ipynb │ └── non_linear-checkpoint.ipynb ├── addition.ipynb ├── addition.png ├── addition.py.cfg ├── arbitrary_linear.ipynb ├── arbitrary_linear.png ├── arbitrary_linear.py.cfg ├── non_linear.ipynb ├── non_linear.png └── non_linear.py.cfg ├── chapter4 ├── .ipynb_checkpoints │ ├── structure-Copy0-checkpoint.ipynb │ ├── structure-checkpoint.ipynb │ ├── wason-Copy1-checkpoint.ipynb │ └── wason-checkpoint.ipynb ├── structure.ipynb ├── structure.png └── structure.py.cfg ├── chapter5 ├── .ipynb_checkpoints │ ├── question-checkpoint.ipynb │ ├── question-control-checkpoint.ipynb │ ├── question-control_backup-checkpoint.ipynb │ ├── question-memory-checkpoint.ipynb │ ├── question-memory_backup-checkpoint.ipynb │ └── question_backup-checkpoint.ipynb ├── question-control.ipynb ├── question-control.png ├── question-control.py.cfg ├── question-control1.png ├── question-memory.ipynb ├── question-memory.png ├── question-memory.py.cfg ├── question.ipynb ├── question.png ├── question.py.cfg └── structure.py.cfg ├── chapter6 ├── .ipynb_checkpoints │ └── learn-checkpoint.ipynb ├── learn.ipynb ├── learn.png └── learn.py.cfg ├── chapter7 ├── .ipynb_checkpoints │ ├── spa_sequence-checkpoint.ipynb │ ├── spa_sequencerouted-checkpoint.ipynb │ ├── spa_sequencerouted_cleanup-checkpoint.ipynb │ └── spa_sequencerouted_cleanupAll-checkpoint.ipynb ├── spa_sequence.ipynb ├── spa_sequence.png ├── spa_sequence.py.cfg ├── spa_sequencerouted.ipynb ├── spa_sequencerouted.png ├── spa_sequencerouted.py.cfg ├── spa_sequencerouted_cleanup.ipynb ├── spa_sequencerouted_cleanup.png ├── spa_sequencerouted_cleanup.py.cfg ├── spa_sequencerouted_cleanupAll.ipynb ├── spa_sequencerouted_cleanupAll.png └── spa_sequencerouted_cleanupAll.py.cfg └── chapter8 ├── .ipynb_checkpoints └── 2D_decision_integrator-checkpoint.ipynb ├── 2D_decision_integrator.ipynb ├── 2D_decision_integrator.png └── 2D_decision_integrator.py.cfg /README.md: -------------------------------------------------------------------------------- 1 | # Nengo2-Tutorials 2 | -------------------------------------------------------------------------------- /chapter1/.ipynb_checkpoints/singleneuron-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# A Single Neuron Model\n", 8 | "\n", 9 | "All models in nengo are built inside \"networks\". Inside a network, you can put more networks, and you can connect networks to each other. You can also put other objects such as neural populations or \"ensembles\" (which have individual neurons inside of them) inside the networks. For this model, you will make a network with one neuron." 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 10, 15 | "metadata": { 16 | "collapsed": false 17 | }, 18 | "outputs": [], 19 | "source": [ 20 | "#Setup the environment\n", 21 | "import numpy as np\n", 22 | "import matplotlib.pyplot as plt\n", 23 | "%matplotlib inline\n", 24 | "\n", 25 | "import nengo\n", 26 | "from nengo.utils.matplotlib import rasterplot" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "## Create the Model" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": {}, 39 | "source": [ 40 | "This model has parameters as described in the book, ensuring that it is an \"on\" neuron. The neuron will be slightly different each time you run this script, as many parameters are randomly chosen." 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 11, 46 | "metadata": { 47 | "collapsed": false 48 | }, 49 | "outputs": [], 50 | "source": [ 51 | "model = nengo.Network(label='A Single Neuron')\n", 52 | "with model:\n", 53 | " #Input\n", 54 | " cos = nengo.Node(lambda t: np.cos(16 * t))\n", 55 | " \n", 56 | " #Ensemble with one neuron\n", 57 | " neuron = nengo.Ensemble(1, dimensions=1, # Represent a scalar\n", 58 | " encoders=[[1]]) # Sets the neurons firing rate to increase for positive input\n", 59 | " \n", 60 | " #Connecting input to ensemble\n", 61 | " nengo.Connection(cos, neuron)" 62 | ] 63 | }, 64 | { 65 | "cell_type": "markdown", 66 | "metadata": {}, 67 | "source": [ 68 | "## Run the Model" 69 | ] 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "metadata": {}, 74 | "source": [ 75 | "In order to run the model, import the nengo_gui visualizer as follows." 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": null, 81 | "metadata": { 82 | "collapsed": false 83 | }, 84 | "outputs": [], 85 | "source": [ 86 | "from nengo_gui.ipython import IPythonViz\n", 87 | "IPythonViz(model, \"singleneuron.py.cfg\")" 88 | ] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "metadata": {}, 93 | "source": [ 94 | "Press the play button in the visualizer to run the simulation. You should see the graphs as shown in the figure below.\n", 95 | "\n", 96 | "The graph on the top left shows the input signal and the graph on the top right shows the value represented by the neuron. The filtered spikes from the neuron are shown in the graph on the bottom right." 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 13, 102 | "metadata": { 103 | "collapsed": false 104 | }, 105 | "outputs": [ 106 | { 107 | "data": { 108 | "image/png": "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\njD7H6z/6a2vdBSwQAywnFy9eZBhmATNJ5iIpKWlgYKCvr0+MBwdYAEarT+93u8NL2jznFfpJGCI+\nOLEuHfQGZ3otZPXaRK/TO9GAwntdXKpWx4paMMQiBO7lIDHtobWhnq4r45/2OH7+84YeStNOvvF6\nT1cPZeSvTSS6fvXq9cSMR0r+5sU36j58NafrP37RhcQNsIz88Y9/VKlUd7/fQq1atcrj8Yj3+ADz\nwujLrA+0VZTXuXmioNtm1etMtV4ihtWz/a56N09EXH11nXumb1YZys3MxxVVDo4nnquvrPitylxu\nwNI2TIXAvSxojd/N+arurV9c+ObqN3/4xeuVP/1tiBK13/1uzld1b/3Ke5Xo6oUzP/1FX/73jBn0\nTcO+ku++/IsLV4noek/7H/oo7YG0JTKqBQDuKhAIxMXFrVy5UrynSE5O7unpWRo7ZGApYPSV9R9Z\ng5V6ZVycWl8ZtNrtZVoiRl9R/Q+qOoOK1eosdn25OZ1m6MNWmWodNbp6y1plnFJrdRp+5qg1Im/D\nNDjafTZnz57t7e29//77pS4kAnocbxx44xe/uxJSrH3key8dfHHTmsk3UvK3/qf15Zesj6whom+a\n3jrw+n80XwkRKdY+Uvq/Xn2xJCN2E/f58+fvv/9+g8EgdSEAscHtdvt8Po1GI+qz/OlPf/r2t7+d\nnp4u6rMAAMgEAvdsllLgXrYQuAHm5b/+679WrFgh9hEE/f39f/EXf/HQQw+J+iwAADKBlhIAALgl\nEAjEx4s+MXblypVXr8byhH8AgPlA4AYAgHE3b968efOmqA3cgvj4+FAoJPazAADIBAI3AACMu379\negSPlpxFfHw8joAFgOUDgRsAAMatWLHixo0bUXiisbExkeZ8w5xwjiqjKk5XNX3SXdBRYdJpdTqd\nzlheP/tpiwAwZ/h7BwAA4xITE0dHR6PwRKOjo6tWrYrCE8EMeFeFpSpoNn1r+vQ63llhrTfa3G63\n2252lpXXB2f4fgCYN9F3xgAAwHxdvXp1cHAwFApdv3795s2b8fHxiYmJCoVCo9GI3fKRmJg4MjIi\n9rOMjo4qlUpRnwLuiNFV1Ncz7nJ73dSv8G6bQ2Wx6xki0pmtbLXNzZtwigvA4iFwAwDIRTAYvHLl\nis/nGxkZWbly5c2bNxMSElauXDkyMjI6OqpQKK5du6ZWq9evX5+ZmSlSJlar1VEI3KFQaO3ataI+\nBdwZo2Jo+gkuRERBb1BlGD+XnNWqeBvHEzFERFeuXPnlL385+b7f+c53MDYXYI4QuAEApDc4OHj+\n/Pn+/v6xsbHVq1crFIoZ76bRaK5du9bV1dXe3p6Tk5OTkxPxSjIyMjo7O8Xu9wiFQjj1JrZcvXr1\n97///eRP33rrrdzd/0pEp3Zvytp35oXHczbel7atptmwQeO85D+5a+O2muYXHs85+kmXcIthg4aI\nnJf8wiMIXyIi4auTPxBMv33yHcIfT36cyQVvzF5z9JMuoYyTuzYeabgglHqkoevoJ12+w6Xhez79\ndpPwpYj/0CJucqmTf+bhn3az55sp3+K85J/8WwjfPscf7+QfFCwGAjcAgMQ6Ojq8Xm9SUtJczndc\ntWqVkIa/+uqrzs7OoqKijIyMCBbz/7N399FNnfe+4H+yLGnblm1JxmibxI7ABuQmwWowrYDmINoC\nSkNaQTtFnZvkqjVzKnoa8AywriFrJmbN4Hgt4CxDeorbC7lO0nuOcqYB3xSmjnvbqC9Q5wCJDAEL\nYhNh87JtsCzbkr31Ymv+EC8GjF+1JVl8P6srxdp7P89vI2N//fjZz5Obm/v5559HscGHDQ0NiUQi\nhUIhaC8wFQqNwuPiiBRExLk8jJa9M59kwYIFtbW1d09sbW1ds2ZNXGoEmInw0CQAQDz9+c9/vnnz\nJsuymZmZk7pQpVI98cQTZ8+evXTpUhTrSU9Pz8jI8Pv9UWzzAV6vt6CgQLj2YQo8LqeLJ0ZrNvC2\nOgdPxDttdZzBrMMEboBoQOAGAIiPcDh87NixlJSUyUbtu0QiUW5u7pUrV86fPx/FwoqLiz0eAVen\n8Hq9mPsbT646o1ajNdZebK40aDQ6i50nrt6stzR4iNFX15mdFp1WqzPbDXU1BuRtgKjAlJIZYKZv\ngDzlMAGQ3D788MO8vLzpb+uoUqmuXbvm9/ufe+65qBSmVqvlcvng4KAQC4m43e558+YxDIJc/Ggs\nDU7LA69ZmjyRlxT6inpHRaxLAkh2CNyJ69atWxcvXmxra5PJZPGuZepSUlJ8Pp9Wq124cKFSqYx3\nOQCJwm635+TkRGsT9ZycnJs3b7a1tRUWFkalwWeeeebUqVNCBO5QKFRcXBz1ZgEAEhkCd4Jyu92f\nfvrpypUrN23aFJudloXD8/yZM2fsdvuyZcuysrLiXQ5A/J07dy4cDkc3zs6aNeuLL77IzMycPXv2\n9FtTqVRFRUWXL1+eyHOcE8dx3LJly6L1YwYAwEyBOdwJ6vLly1//+tf1ev1MT9tExDDM8uXLdTqd\ny+WKdy0A8dfX13flyhUhfvjMzs4euXDbNBUWFubk5PT09ESrQY7jiouL8ZsuAHgMIXAnqKtXry5Z\nsiTeVUTT1772tY6OjnhXARB/586dE+hXPVKpNBwOR/Ef2nPPPadQKKKSuW/evPn000/Pmzdv+k0B\nAMw4CNyJKBQKdXd3J9mzhgqFguO4eFcBEGe3bt3yer0ZGRkCtZ+Tk3PhwoUoNlhaWpqbm+t2u8c/\n9dFu3LixcOFCjUYTpaIAAGYYBG4AgNi5fv16aqqAD8+kpKQMDQ3dvHkzim2WlJQsWLCgs7Ozr69v\nstd6PJ6urq7ly5fPnTs3iiUBAMwseGgSACB2rl69mpOTI2gXUqn0xo0bubm5UWzzqaeeys3NvXDh\nwvXr1+VyuVwuT0kZa7wmGAx6vV6fzzd//nytVjv2yQAASQ+BO6ndOrnv9Tc/OHMjQPIFa7dW7XhJ\n8+ACg37X7/ZV/uLY590Bylmw9uf3TvFf/N2uXfsaL3lJmrf0HyurLIuTaoILQDxEdpMRdISbiDIz\nM69fv75o0aLoNpuenl5aWtrX19fa2nrt2jWRSCSTyVJTU1NTUyOrjoRCoVAoFAwGQ6GQWCx+8skn\nFyxYIJVKo1sGAMBMhFGHJHb9Xzdv/p30R2992NDw33csOLPrp/vOPbBZs//cvp/uasz5x1992PDh\nf//5gjO7Xrt9Sv/JXT998/rSqt82NPx27+r+f9tXd1HAfZ4BHhP9/f3hcFjoXlJTU0OhEM/zQjSe\nlZX13HPPvfTSS0uXLtVoNJHJ6IODgwMDA2KxWKFQzJ8///nnnzcajc888wzSNgBABEa4k5frg3+7\n9NQ/fvi/Lp5DRGu2bj22prLu8637Ft8b5Pa7fvfn7gWv7fj+s7OI6KWtO+wv7fy3z7c+u7i/8Rf2\nOVt/+9qyOUQ067W6j16L100AJBO/3y/08HZEOBwOBAKC7uaYk5Mj9NwYAICkgRHupNV/8cwN+bPP\n3vmGmLlgaZ730rkb950TCPhJKr/zkTRnTqb34rlu6r9kd2UuoA9ee2lZaWnpsu9v/deLM3tzeYDE\n4PV6YxO4JRKJ34/fSgEAJAoE7qTV391PmTmZd8ezM3MyKXC9f+T3YJlm9WLp579+58wtIvK7Gt9p\nvEHe6/3+/hvdge7Gf+1f+9ZHJz7+7RsLP//nn+47g2/eANMVCARiE7iJKBQKxaYjAAAYFwL3Yy1z\n2Y69P8r83U+NpaWlK1+z561+ikhGRH4/0eLXXlujyZRlatb8Hz9/xmv/4BISN8A0paWlxSYHh8Ph\nJNikFgAgaWAOd9LKzMmk/u5+fyRCE/Xf6Cf5nMwHlimZtWxrnf3n/f0BaWYmXdz33XdyFuTIMnMy\nSZqZeedxp8w5c6Te7v7AnZYAYGrS09NjE7iDwSAeWAQASBwY4U5amQsX53nPneu+/eGtc3+/IV/4\nbN79J906Z//o3C1ZZmamjOjG3+3deUufnUWZCxfnBc7dne/d73IFcp7KxHdvgGmSyWTDw8Mx6Egs\nFiNwAwAkDgTu5KX5vuWZG7/Y9a9nrt+6dfF3//zPZ3K+/5+fkRFR/7m6yqrfuYiIvGfeev21Nz+4\neOvW9ZNv7fx19+J//L7mzqW/rnzrzPX+W+c+ePOtS3mrv78Aw9sA06RQKIaGhoTuxe/3SyQSQZco\nAQCASUHgTkTDw8NyuXz888Yx5/t79/6I/u217xqN/+kX11fs/tVrC2VERH5X47Fj9m4/EWl+tO+N\nZa63/pPR+N1t9rx//NXel+bcufTAjzIbX/vuSuOPf929evevfr4wCnlbLpfHZngPIDHJ5XKJRBII\nBATtxefzFRQUCNoFAABMCuZwJyKpVCqTya5du/bEE09Mq6FZy1771e8eWkN71kv/evql23+WaV6q\n+uClqlEvfevhS6fB5XJlZWVhh2d4zBUUFFy9elWlUgnXRTAYnD17tnDtx0U4HPb7/TzPB4NBmUwW\n+SIpEoniXRcAwIQgcCeowsLC06dPTzdwJ5IzZ84UFhbGuwqAOHviiSfa2tqEaz8QCEilUkEDfSz1\n9fXdvHmzo6Ojt7c3JSVFJBIxDMPzfGTDzuzs7Pz8/Nzc3Gj8ShAAQEAI3Alq/vz5f/zjHz0ez5Il\nS9RqdbzLmTqRSNTR0XHmzJnr169/+9vfjnc5AHGWlZU1e/bsvr6+rKwsIdp3u92lpaVCtBxjN2/e\nPH/+vM/nS01NlcvlTz755MPnDA4OfvHFF+fPn1cqlcXFxUnzYwYAJB8E7gTFMMyaNWuuXLnyu9/9\nrru7e/wLJikUCj2wTG8wGBRiS46UlBSlUllYWPjss89iPgkAES1atKixsVGIwD04OJiRkTGdH9G9\nXu/Nmze7uroCgcDg4GA4HBaJROnp6QzD5Obmzpo1KyMjI4oFj8rj8TQ3N3u9XqVSmZmZOcaZaWlp\naWlpRDQ4OPjJJ59kZ2frdLr09HShKwQAmCwE7sSVmppaWFgoxDSMoaEhu93+gx/8YOQrR48e/da3\nvhX1vgDgAQzDFBcXX7lyRalURrflvr6+559/fmrXfvHFF19++WVkRopUKhWLxVlZWWKxeGhoKBQK\n+Xy+7u7uUCgklUrnzZsn3PSwjo6OlpaW9PR0lmUnflUkeft8vr/85S9f/epXZ/RvBQEgKSFwAwDE\n2vz583t6eqI7saSrq6ukpGTsIeFRXb58+dy5cxkZGVlZWQ/vT5mSkhJ5MTJP2u/3t7W1tbS06HS6\nUad5TEdLS8uVK1dyc3OndnlGRkZGRsbp06efeeaZp556Krq1AQBMB37FDwAQB1/72tdSUlL6+/uj\n0tr169eLioom+5j18PCw3W5vbW2dM2eOUqmcyG7wMpksJydn9uzZn3/++V//+tep1juK1tbWy5cv\nTzlt38Wy7Llz565duxaVqgAAogKBGwAgPlasWBEOh6efuW/duvXMM8/Mnz9/Ulf19fV9+OGHUqk0\nJydnss9XiMXiSDI+fvy43++f1LWj+vLLL7/88stJTSMZQ15e3tmzZ69fvx6V1gAApg+BGwAgblau\nXJmVleXxeKZ2ud/v5zju6aefnjt37mQv/NOf/pSfny+TTX1Pq/T09Nzc3IaGhmAwOOVGiMjtdre0\ntER3jZHZs2d/+umnPp8vim0CAEwZAjcAQDw999xz8+bNa29v7+npmfhVoVCoq6trcHDw+eefn+xc\n6oGBgcbGxvz8/ElWOgqxWPzkk08eP358OlvW/8d//EdOTs70i3mASqVqamqKerMAAFOAhyYBAOJs\n7ty5Go3m4sWLX375JRGlp6c/aieXUCjk9Xr9fr9YLNbpdHl5eVPo7k9/+lO0Jm9EzJ49+49//OPq\n1auncO3ly5eJSIg1SWUymcfjuXHjxtT+lgAAogiBGwAg/kQikVarnTdvXmdn5/Xr169duyYSiSQS\nyfDwcEpKSjgcjiyJHQ6Hn3zySZZlp7x5e1NTU3Z2dnQXxZfJZDzPNzc3l5SUTPbas2fPRn21k7tU\nKtXZs2cRuAEg7hC4AQAShVQqzc/Pz8/PHx4ejoxk+/3+oaEh6R1TWPVvpO7ubrfbLcQy1dnZ2R0d\n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\n", 109 | "text/plain": [ 110 | "" 111 | ] 112 | }, 113 | "execution_count": 13, 114 | "metadata": {}, 115 | "output_type": "execute_result" 116 | } 117 | ], 118 | "source": [ 119 | "from IPython.display import Image\n", 120 | "Image(filename='singleneuron.png')" 121 | ] 122 | } 123 | ], 124 | "metadata": { 125 | "kernelspec": { 126 | "display_name": "Python 2", 127 | "language": "python", 128 | "name": "python2" 129 | }, 130 | "language_info": { 131 | "codemirror_mode": { 132 | "name": "ipython", 133 | "version": 2 134 | }, 135 | "file_extension": ".py", 136 | "mimetype": "text/x-python", 137 | "name": "python", 138 | "nbconvert_exporter": "python", 139 | "pygments_lexer": "ipython2", 140 | "version": "2.7.10" 141 | } 142 | }, 143 | "nbformat": 4, 144 | "nbformat_minor": 0 145 | } 146 | -------------------------------------------------------------------------------- /chapter1/singleneuron.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# A Single Neuron Model\n", 8 | "\n", 9 | "All models in nengo are built inside \"networks\". Inside a network, you can put more networks, and you can connect networks to each other. You can also put other objects such as neural populations or \"ensembles\" (which have individual neurons inside of them) inside the networks. For this model, you will make a network with one neuron." 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 10, 15 | "metadata": { 16 | "collapsed": false 17 | }, 18 | "outputs": [], 19 | "source": [ 20 | "#Setup the environment\n", 21 | "import numpy as np\n", 22 | "import matplotlib.pyplot as plt\n", 23 | "%matplotlib inline\n", 24 | "\n", 25 | "import nengo\n", 26 | "from nengo.utils.matplotlib import rasterplot" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "## Create the Model" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": {}, 39 | "source": [ 40 | "This model has parameters as described in the book, ensuring that it is an \"on\" neuron. The neuron will be slightly different each time you run this script, as many parameters are randomly chosen." 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 11, 46 | "metadata": { 47 | "collapsed": false 48 | }, 49 | "outputs": [], 50 | "source": [ 51 | "model = nengo.Network(label='A Single Neuron')\n", 52 | "with model:\n", 53 | " #Input\n", 54 | " cos = nengo.Node(lambda t: np.cos(16 * t))\n", 55 | " \n", 56 | " #Ensemble with one neuron\n", 57 | " neuron = nengo.Ensemble(1, dimensions=1, # Represent a scalar\n", 58 | " encoders=[[1]]) # Sets the neurons firing rate to increase for positive input\n", 59 | " \n", 60 | " #Connecting input to ensemble\n", 61 | " nengo.Connection(cos, neuron)" 62 | ] 63 | }, 64 | { 65 | "cell_type": "markdown", 66 | "metadata": {}, 67 | "source": [ 68 | "## Run the Model" 69 | ] 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "metadata": {}, 74 | "source": [ 75 | "In order to run the model, import the nengo_gui visualizer as follows." 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": null, 81 | "metadata": { 82 | "collapsed": false 83 | }, 84 | "outputs": [], 85 | "source": [ 86 | "from nengo_gui.ipython import IPythonViz\n", 87 | "IPythonViz(model, \"singleneuron.py.cfg\")" 88 | ] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "metadata": {}, 93 | "source": [ 94 | "Press the play button in the visualizer to run the simulation. You should see the graphs as shown in the figure below.\n", 95 | "\n", 96 | "The graph on the top left shows the input signal and the graph on the top right shows the value represented by the neuron. The filtered spikes from the neuron are shown in the graph on the bottom right." 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 13, 102 | "metadata": { 103 | "collapsed": false 104 | }, 105 | "outputs": [ 106 | { 107 | "data": { 108 | "image/png": "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\njD7H6z/6a2vdBSwQAywnFy9eZBhmATNJ5iIpKWlgYKCvr0+MBwdYAEarT+93u8NL2jznFfpJGCI+\nOLEuHfQGZ3otZPXaRK/TO9GAwntdXKpWx4paMMQiBO7lIDHtobWhnq4r45/2OH7+84YeStNOvvF6\nT1cPZeSvTSS6fvXq9cSMR0r+5sU36j58NafrP37RhcQNsIz88Y9/VKlUd7/fQq1atcrj8Yj3+ADz\nwujLrA+0VZTXuXmioNtm1etMtV4ihtWz/a56N09EXH11nXumb1YZys3MxxVVDo4nnquvrPitylxu\nwNI2TIXAvSxojd/N+arurV9c+ObqN3/4xeuVP/1tiBK13/1uzld1b/3Ke5Xo6oUzP/1FX/73jBn0\nTcO+ku++/IsLV4noek/7H/oo7YG0JTKqBQDuKhAIxMXFrVy5UrynSE5O7unpWRo7ZGApYPSV9R9Z\ng5V6ZVycWl8ZtNrtZVoiRl9R/Q+qOoOK1eosdn25OZ1m6MNWmWodNbp6y1plnFJrdRp+5qg1Im/D\nNDjafTZnz57t7e29//77pS4kAnocbxx44xe/uxJSrH3key8dfHHTmsk3UvK3/qf15Zesj6whom+a\n3jrw+n80XwkRKdY+Uvq/Xn2xJCN2E/f58+fvv/9+g8EgdSEAscHtdvt8Po1GI+qz/OlPf/r2t7+d\nnp4u6rMAAMgEAvdsllLgXrYQuAHm5b/+679WrFgh9hEE/f39f/EXf/HQQw+J+iwAADKBlhIAALgl\nEAjEx4s+MXblypVXr8byhH8AgPlA4AYAgHE3b968efOmqA3cgvj4+FAoJPazAADIBAI3AACMu379\negSPlpxFfHw8joAFgOUDgRsAAMatWLHixo0bUXiisbExkeZ8w5xwjiqjKk5XNX3SXdBRYdJpdTqd\nzlheP/tpiwAwZ/h7BwAA4xITE0dHR6PwRKOjo6tWrYrCE8EMeFeFpSpoNn1r+vQ63llhrTfa3G63\n2252lpXXB2f4fgCYN9F3xgAAwHxdvXp1cHAwFApdv3795s2b8fHxiYmJCoVCo9GI3fKRmJg4MjIi\n9rOMjo4qlUpRnwLuiNFV1Ncz7nJ73dSv8G6bQ2Wx6xki0pmtbLXNzZtwigvA4iFwAwDIRTAYvHLl\nis/nGxkZWbly5c2bNxMSElauXDkyMjI6OqpQKK5du6ZWq9evX5+ZmSlSJlar1VEI3KFQaO3ataI+\n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\nXu/Nmze7uroCgcDg4GA4HBaJROnp6QzD5Obmzpo1KyMjI4oFj8rj8TQ3N3u9XqVSmZmZOcaZaWlp\naWlpRDQ4OPjJJ59kZ2frdLr09HShKwQAmCwE7sSVmppaWFgoxDSMoaEhu93+gx/8YOQrR48e/da3\nvhX1vgDgAQzDFBcXX7lyRalURrflvr6+559/fmrXfvHFF19++WVkRopUKhWLxVlZWWKxeGhoKBQK\n+Xy+7u7uUCgklUrnzZsn3PSwjo6OlpaW9PR0lmUnflUkeft8vr/85S9f/epXZ/RvBQEgKSFwAwDE\n2vz583t6eqI7saSrq6ukpGTsIeFRXb58+dy5cxkZGVlZWQ/vT5mSkhJ5MTJP2u/3t7W1tbS06HS6\nUad5TEdLS8uVK1dyc3OndnlGRkZGRsbp06efeeaZp556Krq1AQBMB37FDwAQB1/72tdSUlL6+/uj\n0tr169eLioom+5j18PCw3W5vbW2dM2eOUqmcyG7wMpksJydn9uzZn3/++V//+tep1juK1tbWy5cv\nTzlt38Wy7Llz565duxaVqgAAogKBGwAgPlasWBEOh6efuW/duvXMM8/Mnz9/Ulf19fV9+OGHUqk0\nJydnss9XiMXiSDI+fvy43++f1LWj+vLLL7/88stJTSMZQ15e3tmzZ69fvx6V1gAApg+BGwAgblau\nXJmVleXxeKZ2ud/v5zju6aefnjt37mQv/NOf/pSfny+TTX1Pq/T09Nzc3IaGhmAwOOVGiMjtdre0\ntER3jZHZs2d/+umnPp8vim0CAEwZAjcAQDw999xz8+bNa29v7+npmfhVoVCoq6trcHDw+eefn+xc\n6oGBgcbGxvz8/ElWOgqxWPzkk08eP358OlvW/8d//EdOTs70i3mASqVqamqKerMAAFOAhyYBAOJs\n7ty5Go3m4sWLX375JRGlp6c/aieXUCjk9Xr9fr9YLNbpdHl5eVPo7k9/+lO0Jm9EzJ49+49//OPq\n1auncO3ly5eJSIg1SWUymcfjuXHjxtT+lgAAogiBGwAg/kQikVarnTdvXmdn5/Xr169duyYSiSQS\nyfDwcEpKSjgcjiyJHQ6Hn3zySZZlp7x5e1NTU3Z2dnQXxZfJZDzPNzc3l5SUTPbas2fPRn21k7tU\nKtXZs2cRuAEg7hC4AQAShVQqzc/Pz8/PHx4ejoxk+/3+oaEh6R1TWPVvpO7ubrfbLcQy1dnZ2R0d\n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\n", 109 | "text/plain": [ 110 | "" 111 | ] 112 | }, 113 | "execution_count": 13, 114 | "metadata": {}, 115 | "output_type": "execute_result" 116 | } 117 | ], 118 | "source": [ 119 | "from IPython.display import Image\n", 120 | "Image(filename='singleneuron.png')" 121 | ] 122 | } 123 | ], 124 | "metadata": { 125 | "kernelspec": { 126 | "display_name": "Python 2", 127 | "language": "python", 128 | "name": "python2" 129 | }, 130 | "language_info": { 131 | "codemirror_mode": { 132 | "name": "ipython", 133 | "version": 2 134 | }, 135 | "file_extension": ".py", 136 | "mimetype": "text/x-python", 137 | "name": "python", 138 | "nbconvert_exporter": "python", 139 | "pygments_lexer": "ipython2", 140 | "version": "2.7.10" 141 | } 142 | }, 143 | "nbformat": 4, 144 | "nbformat_minor": 0 145 | } 146 | -------------------------------------------------------------------------------- /chapter1/singleneuron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter1/singleneuron.png -------------------------------------------------------------------------------- /chapter1/singleneuron.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_1 = nengo_gui.components.Slider(cos) 2 | _viz_config[_viz_1].label_visible = True 3 | _viz_config[_viz_1].width = 0.05138746145940392 4 | _viz_config[_viz_1].x = 0.1684073117076286 5 | _viz_config[_viz_1].y = 0.7092560792046692 6 | _viz_config[_viz_1].max_value = 1 7 | _viz_config[_viz_1].min_value = -1 8 | _viz_config[_viz_1].height = 0.17145593138946888 9 | _viz_2 = nengo_gui.components.Value(cos) 10 | _viz_config[_viz_2].label_visible = True 11 | _viz_config[_viz_2].width = 0.138881091974467 12 | _viz_config[_viz_2].x = 0.20334187977862464 13 | _viz_config[_viz_2].y = 0.22179341491190846 14 | _viz_config[_viz_2].max_value = 1 15 | _viz_config[_viz_2].min_value = -1 16 | _viz_config[_viz_2].height = 0.22662621793848467 17 | _viz_6 = nengo_gui.components.Value(neuron) 18 | _viz_config[_viz_6].label_visible = True 19 | _viz_config[_viz_6].width = 0.14246482426514165 20 | _viz_config[_viz_6].x = 0.9736553177544159 21 | _viz_config[_viz_6].y = 0.24753530303789228 22 | _viz_config[_viz_6].max_value = 1 23 | _viz_config[_viz_6].min_value = -1 24 | _viz_config[_viz_6].height = 0.24147425820419094 25 | _viz_7 = nengo_gui.components.Raster(neuron) 26 | _viz_config[_viz_7].label_visible = True 27 | _viz_config[_viz_7].width = 0.13913195057919456 28 | _viz_config[_viz_7].x = 0.9795766065093924 29 | _viz_config[_viz_7].y = 0.7692224969772854 30 | _viz_config[_viz_7].height = 0.23580206248378663 31 | _viz_ace_editor = nengo_gui.components.AceEditor() 32 | _viz_net_graph = nengo_gui.components.NetGraph() 33 | _viz_sim_control = nengo_gui.components.SimControl() 34 | _viz_config[_viz_sim_control].kept_time = 4.0 35 | _viz_config[_viz_sim_control].shown_time = 0.5 36 | _viz_config[cos].pos=(0.16801736510464935, 0.7693955811175494) 37 | _viz_config[cos].size=(0.1, 0.19400826446280975) 38 | _viz_config[model].pos=(0.05651288211487787, 0.1150862610568701) 39 | _viz_config[model].size=(0.7757364659745797, 0.7757364659745797) 40 | _viz_config[model].expanded=True 41 | _viz_config[model].has_layout=True 42 | _viz_config[neuron].pos=(0.6394640033427806, 0.7655498679981659) 43 | _viz_config[neuron].size=(0.08547936308538644, 0.17184177744231613) 44 | _viz_config[stim].pos=(0.16925003093129565, 0.7630848187816568) 45 | _viz_config[stim].size=(0.1, 0.16921487603305788) -------------------------------------------------------------------------------- /chapter2/scalars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter2/scalars.png -------------------------------------------------------------------------------- /chapter2/scalars.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_0 = nengo_gui.components.Raster(x) 2 | _viz_config[_viz_0].label_visible = True 3 | _viz_config[_viz_0].width = 0.10277492291880781 4 | _viz_config[_viz_0].x = 0.8286617459279337 5 | _viz_config[_viz_0].y = 0.6618773946360152 6 | _viz_config[_viz_0].height = 0.19157088122605365 7 | _viz_1 = nengo_gui.components.Value(x) 8 | _viz_config[_viz_1].label_visible = True 9 | _viz_config[_viz_1].width = 0.10277492291880781 10 | _viz_config[_viz_1].x = 0.829689495157122 11 | _viz_config[_viz_1].y = 0.25766283524904093 12 | _viz_config[_viz_1].max_value = 1 13 | _viz_config[_viz_1].min_value = -1 14 | _viz_config[_viz_1].height = 0.19157088122605365 15 | _viz_2 = nengo_gui.components.Value(input) 16 | _viz_config[_viz_2].label_visible = True 17 | _viz_config[_viz_2].width = 0.1079136690647482 18 | _viz_config[_viz_2].x = 0.14963094459497311 19 | _viz_config[_viz_2].y = 0.19712643678160896 20 | _viz_config[_viz_2].max_value = 1 21 | _viz_config[_viz_2].min_value = -1 22 | _viz_config[_viz_2].height = 0.17337164020172938 23 | _viz_4 = nengo_gui.components.Slider(input) 24 | _viz_config[_viz_4].label_visible = True 25 | _viz_config[_viz_4].width = 0.051387461459403906 26 | _viz_config[_viz_4].x = 0.14857844772335296 27 | _viz_config[_viz_4].y = 0.6221548073425336 28 | _viz_config[_viz_4].max_value = 1 29 | _viz_config[_viz_4].min_value = -1 30 | _viz_config[_viz_4].height = 0.17337164750957854 31 | _viz_ace_editor = nengo_gui.components.AceEditor() 32 | _viz_net_graph = nengo_gui.components.NetGraph() 33 | _viz_sim_control = nengo_gui.components.SimControl() 34 | _viz_config[_viz_sim_control].kept_time = 4.0 35 | _viz_config[_viz_sim_control].shown_time = 0.5 36 | _viz_config[input].pos=(0.14815160858326318, 0.6735537190082654) 37 | _viz_config[input].size=(0.09808776355538941, 0.2) 38 | _viz_config[model].pos=(0.06784816133519866, 0.05542832753041693) 39 | _viz_config[model].size=(0.937236735041147, 0.937236735041147) 40 | _viz_config[model].expanded=True 41 | _viz_config[model].has_layout=True 42 | _viz_config[x].pos=(0.5486779407642745, 0.671487603305786) 43 | _viz_config[x].size=(0.08717711545049715, 0.17525482093663994) -------------------------------------------------------------------------------- /chapter2/vectors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter2/vectors.png -------------------------------------------------------------------------------- /chapter2/vectors.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_0 = nengo_gui.components.Slider(cos) 2 | _viz_config[_viz_0].label_visible = True 3 | _viz_config[_viz_0].width = 0.051387461459403906 4 | _viz_config[_viz_0].x = 0.15744913326748294 5 | _viz_config[_viz_0].y = 0.2675779609619647 6 | _viz_config[_viz_0].max_value = 1 7 | _viz_config[_viz_0].min_value = -1 8 | _viz_config[_viz_0].height = 0.12260536398467432 9 | _viz_3 = nengo_gui.components.Value(x) 10 | _viz_config[_viz_3].label_visible = True 11 | _viz_config[_viz_3].width = 0.10277492291880781 12 | _viz_config[_viz_3].x = 0.9563240524241664 13 | _viz_config[_viz_3].y = 0.21346874475112512 14 | _viz_config[_viz_3].max_value = 1 15 | _viz_config[_viz_3].min_value = -1 16 | _viz_config[_viz_3].height = 0.19157088122605365 17 | _viz_4 = nengo_gui.components.XYValue(x) 18 | _viz_config[_viz_4].index_x = 0 19 | _viz_config[_viz_4].index_y = 1 20 | _viz_config[_viz_4].max_value = 1 21 | _viz_config[_viz_4].min_value = -1 22 | _viz_config[_viz_4].height = 0.19157088122605365 23 | _viz_config[_viz_4].label_visible = True 24 | _viz_config[_viz_4].width = 0.10277492291880781 25 | _viz_config[_viz_4].y = 0.6866488213794786 26 | _viz_config[_viz_4].x = 0.9614917320223004 27 | _viz_5 = nengo_gui.components.Slider(sin) 28 | _viz_config[_viz_5].label_visible = True 29 | _viz_config[_viz_5].width = 0.051387461459403906 30 | _viz_config[_viz_5].x = 0.16243787159204243 31 | _viz_config[_viz_5].y = 0.685355028761505 32 | _viz_config[_viz_5].max_value = 1 33 | _viz_config[_viz_5].min_value = -1 34 | _viz_config[_viz_5].height = 0.11877394636015326 35 | _viz_6 = nengo_gui.components.Value(cos) 36 | _viz_config[_viz_6].label_visible = True 37 | _viz_config[_viz_6].width = 0.09506680369989723 38 | _viz_config[_viz_6].x = 0.6803371664602977 39 | _viz_config[_viz_6].y = 0.22905230343410674 40 | _viz_config[_viz_6].max_value = 1 41 | _viz_config[_viz_6].min_value = -1 42 | _viz_config[_viz_6].height = 0.17624520342012018 43 | _viz_7 = nengo_gui.components.Value(sin) 44 | _viz_config[_viz_7].label_visible = True 45 | _viz_config[_viz_7].width = 0.09352519553832381 46 | _viz_config[_viz_7].x = 0.690144485895704 47 | _viz_config[_viz_7].y = 0.7303586229725564 48 | _viz_config[_viz_7].max_value = 1 49 | _viz_config[_viz_7].min_value = -1 50 | _viz_config[_viz_7].height = 0.17049808429118773 51 | _viz_ace_editor = nengo_gui.components.AceEditor() 52 | _viz_net_graph = nengo_gui.components.NetGraph() 53 | _viz_sim_control = nengo_gui.components.SimControl() 54 | _viz_config[_viz_sim_control].kept_time = 4.0 55 | _viz_config[_viz_sim_control].shown_time = 0.5 56 | _viz_config[cos].pos=(0.158683206004854, 0.29482572763205167) 57 | _viz_config[cos].size=(0.09268484673910363, 0.1489399928135105) 58 | _viz_config[model].pos=(-0.012575869799372974, 0.02104806676576866) 59 | _viz_config[model].size=(0.9067702162817995, 0.9067702162817995) 60 | _viz_config[model].expanded=True 61 | _viz_config[model].has_layout=True 62 | _viz_config[sin].pos=(0.15728561783718234, 0.7427892113138089) 63 | _viz_config[sin].size=(0.09192126818026093, 0.14480776140855187) 64 | _viz_config[x].pos=(0.5042331252103648, 0.4927395121394793) 65 | _viz_config[x].size=(0.15151515151515152, 0.10869565217391303) -------------------------------------------------------------------------------- /chapter3/addition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter3/addition.png -------------------------------------------------------------------------------- /chapter3/addition.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_config[A].pos=(0.4907154829089512, 0.6523597382709181) 2 | _viz_config[A].size=(0.09433962264150943, 0.1) 3 | _viz_config[B].pos=(0.48763223522138693, 0.1760450811891716) 4 | _viz_config[B].size=(0.09433962264150943, 0.1) 5 | _viz_config[Sum].pos=(0.6714905707594025, 0.4078094743902903) 6 | _viz_config[Sum].size=(0.09433962264150943, 0.1) 7 | _viz_0 = nengo_gui.components.Value(B) 8 | _viz_config[_viz_0].label_visible = True 9 | _viz_config[_viz_0].width = 0.09352517985611511 10 | _viz_config[_viz_0].x = 0.8806833152994353 11 | _viz_config[_viz_0].y = 0.22812483497914146 12 | _viz_config[_viz_0].max_value = 1 13 | _viz_config[_viz_0].min_value = -1 14 | _viz_config[_viz_0].height = 0.16475095785440613 15 | _viz_1 = nengo_gui.components.Value(A) 16 | _viz_config[_viz_1].label_visible = True 17 | _viz_config[_viz_1].width = 0.09146968139773895 18 | _viz_config[_viz_1].x = 0.8806187858685105 19 | _viz_config[_viz_1].y = 0.6347544196253067 20 | _viz_config[_viz_1].max_value = 1 21 | _viz_config[_viz_1].min_value = -1 22 | _viz_config[_viz_1].height = 0.1685823754789272 23 | _viz_2 = nengo_gui.components.Value(input_B) 24 | _viz_config[_viz_2].label_visible = True 25 | _viz_config[_viz_2].width = 0.0914696892388433 26 | _viz_config[_viz_2].x = 0.31219337198704633 27 | _viz_config[_viz_2].y = 0.3478160919540228 28 | _viz_config[_viz_2].max_value = 1 29 | _viz_config[_viz_2].min_value = -1 30 | _viz_config[_viz_2].height = 0.1724137931034483 31 | _viz_3 = nengo_gui.components.Value(input_A) 32 | _viz_config[_viz_3].label_visible = True 33 | _viz_config[_viz_3].width = 0.09146968531829112 34 | _viz_config[_viz_3].x = 0.2803331458822161 35 | _viz_config[_viz_3].y = 0.8074503763942428 36 | _viz_config[_viz_3].max_value = 1 37 | _viz_config[_viz_3].min_value = -1 38 | _viz_config[_viz_3].height = 0.16570882687623473 39 | _viz_4 = nengo_gui.components.Value(Sum) 40 | _viz_config[_viz_4].label_visible = True 41 | _viz_config[_viz_4].width = 0.10277492291880781 42 | _viz_config[_viz_4].x = 0.6728763350918053 43 | _viz_config[_viz_4].y = 0.7719532015513442 44 | _viz_config[_viz_4].max_value = 2 45 | _viz_config[_viz_4].min_value = -2 46 | _viz_config[_viz_4].height = 0.19157088122605365 47 | _viz_5 = nengo_gui.components.Slider(input_B) 48 | _viz_config[_viz_5].label_visible = True 49 | _viz_config[_viz_5].width = 0.05555826826078726 50 | _viz_config[_viz_5].x = 0.03132823692380007 51 | _viz_config[_viz_5].y = 0.16362930428713893 52 | _viz_config[_viz_5].max_value = 1 53 | _viz_config[_viz_5].min_value = -1 54 | _viz_config[_viz_5].height = 0.09422320521312268 55 | _viz_6 = nengo_gui.components.Slider(input_A) 56 | _viz_config[_viz_6].label_visible = True 57 | _viz_config[_viz_6].width = 0.05555826402202794 58 | _viz_config[_viz_6].x = 0.027774405034539415 59 | _viz_config[_viz_6].y = 0.6138412219826299 60 | _viz_config[_viz_6].max_value = 1 61 | _viz_config[_viz_6].min_value = -1 62 | _viz_config[_viz_6].height = 0.10977334201709764 63 | _viz_ace_editor = nengo_gui.components.AceEditor() 64 | _viz_net_graph = nengo_gui.components.NetGraph() 65 | _viz_sim_control = nengo_gui.components.SimControl() 66 | _viz_config[_viz_sim_control].kept_time = 4.0 67 | _viz_config[_viz_sim_control].shown_time = 0.5 68 | _viz_config[input_A].pos=(0.028973109957715043, 0.6576658271423681) 69 | _viz_config[input_A].size=(0.07547170235196686, 0.12020857327275272) 70 | _viz_config[input_B].pos=(0.028082297510700047, 0.18308189791553256) 71 | _viz_config[input_B].size=(0.07547171082948549, 0.11350714439396066) 72 | _viz_config[model].pos=(0.08068844873759456, -0.018861559266866126) 73 | _viz_config[model].size=(0.9249291784702548, 0.9249291784702548) 74 | _viz_config[model].expanded=True 75 | _viz_config[model].has_layout=True -------------------------------------------------------------------------------- /chapter3/arbitrary_linear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter3/arbitrary_linear.png -------------------------------------------------------------------------------- /chapter3/arbitrary_linear.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_0 = nengo_gui.components.Slider(input) 2 | _viz_config[_viz_0].label_visible = True 3 | _viz_config[_viz_0].width = 0.05138746537995608 4 | _viz_config[_viz_0].x = 0.12308751381644006 5 | _viz_config[_viz_0].y = 0.47107279693486553 6 | _viz_config[_viz_0].max_value = 1 7 | _viz_config[_viz_0].min_value = -1 8 | _viz_config[_viz_0].height = 0.1752873563218391 9 | _viz_1 = nengo_gui.components.Value(input) 10 | _viz_config[_viz_1].label_visible = True 11 | _viz_config[_viz_1].width = 0.10277492291880781 12 | _viz_config[_viz_1].x = 0.12308751381644001 13 | _viz_config[_viz_1].y = 0.9339222950508212 14 | _viz_config[_viz_1].max_value = 1 15 | _viz_config[_viz_1].min_value = -1 16 | _viz_config[_viz_1].height = 0.19157088122605365 17 | _viz_2 = nengo_gui.components.Value(x) 18 | _viz_config[_viz_2].label_visible = True 19 | _viz_config[_viz_2].width = 0.10277492291880781 20 | _viz_config[_viz_2].x = 0.48297426748628175 21 | _viz_config[_viz_2].y = 0.9227304391881203 22 | _viz_config[_viz_2].max_value = 1 23 | _viz_config[_viz_2].min_value = -1 24 | _viz_config[_viz_2].height = 0.19157088122605365 25 | _viz_3 = nengo_gui.components.Value(z) 26 | _viz_config[_viz_3].label_visible = True 27 | _viz_config[_viz_3].width = 0.10277492291880781 28 | _viz_config[_viz_3].x = 0.8613605072815083 29 | _viz_config[_viz_3].y = 0.9242345080903078 30 | _viz_config[_viz_3].max_value = 1 31 | _viz_config[_viz_3].min_value = -1 32 | _viz_config[_viz_3].height = 0.19157088122605365 33 | _viz_ace_editor = nengo_gui.components.AceEditor() 34 | _viz_net_graph = nengo_gui.components.NetGraph() 35 | _viz_sim_control = nengo_gui.components.SimControl() 36 | _viz_config[_viz_sim_control].kept_time = 4.0 37 | _viz_config[_viz_sim_control].shown_time = 0.5 38 | _viz_config[input].pos=(0.12418313327774438, 0.49793388429752056) 39 | _viz_config[input].size=(0.07701332195698966, 0.20206611570247934) 40 | _viz_config[model].pos=(0.019527235354573482, -0.2376033057851238) 41 | _viz_config[model].size=(1, 1) 42 | _viz_config[model].expanded=True 43 | _viz_config[model].has_layout=True 44 | _viz_config[x].pos=(0.48113207547169806, 0.5) 45 | _viz_config[x].size=(0.08530318602261057, 0.1714876033057853) 46 | _viz_config[z].pos=(0.8584905660377359, 0.5) 47 | _viz_config[z].size=(0.08530318602261057, 0.1714876033057853) -------------------------------------------------------------------------------- /chapter3/non_linear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter3/non_linear.png -------------------------------------------------------------------------------- /chapter3/non_linear.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_config[X].pos=(0.27223387630404466, 0.084297520661157) 2 | _viz_config[X].size=(0.0684931506849315, 0.1) 3 | _viz_config[Y].pos=(0.2814836193667375, 0.3950413223140496) 4 | _viz_config[Y].size=(0.0684931506849315, 0.1) 5 | _viz_0 = nengo_gui.components.Value(result_product) 6 | _viz_config[_viz_0].label_visible = True 7 | _viz_config[_viz_0].width = 0.0986639260020555 8 | _viz_config[_viz_0].x = 0.8763392417181685 9 | _viz_config[_viz_0].y = 0.19042145593869794 10 | _viz_config[_viz_0].max_value = 1 11 | _viz_config[_viz_0].min_value = -1 12 | _viz_config[_viz_0].height = 0.18390804963093607 13 | _viz_1 = nengo_gui.components.Value(result_square) 14 | _viz_config[_viz_1].label_visible = True 15 | _viz_config[_viz_1].width = 0.10174717368961973 16 | _viz_config[_viz_1].x = 0.7760254700958763 17 | _viz_config[_viz_1].y = 0.6541571698798175 18 | _viz_config[_viz_1].max_value = 1 19 | _viz_config[_viz_1].min_value = -1 20 | _viz_config[_viz_1].height = 0.18869731800766285 21 | _viz_2 = nengo_gui.components.Value(X) 22 | _viz_config[_viz_2].label_visible = True 23 | _viz_config[_viz_2].width = 0.09558068223504344 24 | _viz_config[_viz_2].x = 0.1906756395275169 25 | _viz_config[_viz_2].y = 0.6688040277381959 26 | _viz_config[_viz_2].max_value = 1 27 | _viz_config[_viz_2].min_value = -1 28 | _viz_config[_viz_2].height = 0.17624521072796934 29 | _viz_3 = nengo_gui.components.Value(Y) 30 | _viz_config[_viz_3].label_visible = True 31 | _viz_config[_viz_3].width = 0.0986639260020555 32 | _viz_config[_viz_3].x = 0.4620014360331691 33 | _viz_config[_viz_3].y = 0.6705281656692305 34 | _viz_config[_viz_3].max_value = 1 35 | _viz_config[_viz_3].min_value = -1 36 | _viz_config[_viz_3].height = 0.18295016233948455 37 | _viz_4 = nengo_gui.components.Slider(inputX) 38 | _viz_config[_viz_4].label_visible = True 39 | _viz_config[_viz_4].width = 0.04779034111752172 40 | _viz_config[_viz_4].x = 0.047741063509270765 41 | _viz_config[_viz_4].y = 0.07409138406003633 42 | _viz_config[_viz_4].max_value = 1 43 | _viz_config[_viz_4].min_value = -1 44 | _viz_config[_viz_4].height = 0.10727968983266545 45 | _viz_5 = nengo_gui.components.Slider(inputY) 46 | _viz_config[_viz_5].label_visible = True 47 | _viz_config[_viz_5].width = 0.04316546958617537 48 | _viz_config[_viz_5].x = 0.04722718889467667 49 | _viz_config[_viz_5].y = 0.36412969823628133 50 | _viz_config[_viz_5].max_value = 1 51 | _viz_config[_viz_5].min_value = -1 52 | _viz_config[_viz_5].height = 0.10727970810228837 53 | _viz_ace_editor = nengo_gui.components.AceEditor() 54 | _viz_net_graph = nengo_gui.components.NetGraph() 55 | _viz_sim_control = nengo_gui.components.SimControl() 56 | _viz_config[_viz_sim_control].kept_time = 4.0 57 | _viz_config[_viz_sim_control].shown_time = 0.5 58 | _viz_config[inputX].pos=(0.04844499741692967, 0.08429752066115698) 59 | _viz_config[inputX].size=(0.061474886617115546, 0.12338842975206599) 60 | _viz_config[inputY].pos=(0.04998662322098785, 0.39917355371900876) 61 | _viz_config[inputY].size=(0.06198876319198567, 0.12132231404958671) 62 | _viz_config[model].pos=(0.0625448333434374, 0.10864964716978398) 63 | _viz_config[model].size=(0.9462602627257798, 0.9462602627257798) 64 | _viz_config[model].expanded=True 65 | _viz_config[model].has_layout=True 66 | _viz_config[result_product].pos=(0.6999324219684928, 0.18842975206611562) 67 | _viz_config[result_product].size=(0.0684931506849315, 0.1) 68 | _viz_config[result_square].pos=(0.5174295006265064, 0.0760330578512396) 69 | _viz_config[result_square].size=(0.04193216855087357, 0.08429752066115699) 70 | _viz_config[vector2D].pos=(0.5092075067930012, 0.3826446280991729) 71 | _viz_config[vector2D].size=(0.0684931506849315, 0.1) -------------------------------------------------------------------------------- /chapter4/.ipynb_checkpoints/wason-Copy1-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "name": "", 4 | "signature": "sha256:b070507b4cc690c1b40fbcc9393bef25543743632e5906183c5c8a127c0b2b8e" 5 | }, 6 | "nbformat": 3, 7 | "nbformat_minor": 0, 8 | "worksheets": [ 9 | { 10 | "cells": [ 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "# Structured Representations\n", 16 | "\n", 17 | "This demo shows a method for constructing structured representations using semantic pointers. It uses a convolution network to bind two Semantic Pointers and a Sum network to cojoin to semantic pointers." 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "collapsed": false, 23 | "input": [ 24 | "import numpy as np\n", 25 | "import matplotlib.pyplot as plt\n", 26 | "from nengo.dists import Uniform\n", 27 | "%matplotlib inline\n", 28 | "\n", 29 | "import nengo\n", 30 | "from nengo.spa import Vocabulary\n", 31 | "\n", 32 | "# Change the seed of this RNG to change the vocabulary\n", 33 | "rng = np.random.RandomState(0)" 34 | ], 35 | "language": "python", 36 | "metadata": {}, 37 | "outputs": [] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "collapsed": false, 42 | "input": [ 43 | "D=6 #128 # number of dimensions per ensemble\n", 44 | "N=20 # number of neurons per ensemble is N*D\n", 45 | "experiment=2 # 1 for learning in different contexts, 2 for generalization within a context\n", 46 | "learning_rate=5e-7\n", 47 | "stimulus_time=1.5\n", 48 | "\n", 49 | "mode_other=nengo.LIF() # mode to use for all neurons that aren't part of the learning system (or part of convolution)\n", 50 | "mode_conv=nengo.LIF() # mode to use for the convolution computation\n", 51 | "# Set both mode parameters to 'default' to use spiking neurons for everything. The resulting\n", 52 | "# model will run quite slowly....\n", 53 | "\n", 54 | "import random\n", 55 | "#import nef\n", 56 | "#import hrr\n", 57 | "\n", 58 | "\n", 59 | "# number of neurons to use for other neural groups\n", 60 | "N_other= N*D\n", 61 | "if mode_other==nengo.LIF(): N_other=1\n", 62 | "\n", 63 | "# number of neurons to use for convolution subcomponents\n", 64 | "N_conv=20 #300\n", 65 | "if mode_conv==nengo.LIF(): N_conv=1\n", 66 | "\n", 67 | " \n", 68 | "vocab = Vocabulary(dimensions=D, rng=rng, max_similarity=0.1)\n", 69 | " \n", 70 | "model = nengo.Network(label='Wason', seed=16)\n", 71 | "with model: \n", 72 | " context = nengo.Ensemble(label='context', n_neurons=N, dimensions=1, intercepts=Uniform(0.2,0.9))\n", 73 | " rule = nengo.Ensemble(label='rule', n_neurons=N_other, dimensions=D, neuron_type=mode_other)\n", 74 | " transform = nengo.Ensemble(label='transform', n_neurons=N_other, dimensions=D)\n", 75 | " answer = nengo.Ensemble(label='answer', n_neurons=N_other, dimensions=D, neuron_type=nengo.LIF()) # SS nengo.Direct())\n", 76 | " \n", 77 | " # computing T convolved with R\n", 78 | " cconv = nengo.networks.CircularConvolution(n_neurons=D*N_conv, dimensions=D)\n", 79 | " nengo.Connection(rule, cconv.A)\n", 80 | " nengo.Connection(transform, cconv.B)\n", 81 | " nengo.Connection(cconv.output, answer)\n", 82 | "\n", 83 | " \"\"\" SS I don't know what 'mode' maps to\n", 84 | " nef.convolution.make_convolution(net,'*',rule,transform,answer,N_conv,mode=mode_conv)\"\"\"\n", 85 | " \n", 86 | " correct_transform = nengo.Ensemble(label='correct transform', n_neurons=N_other, dimensions=D, neuron_type=mode_other)\n", 87 | " correct_answer = nengo.Ensemble(label='correct answer', n_neurons=N_other, dimensions=D, neuron_type=mode_other)\n", 88 | "\n", 89 | " # computing R' convolved with A* (correct answer)\n", 90 | " cconv2 = nengo.networks.CircularConvolution(n_neurons=D*N_conv, dimensions=D, invert_b=True)\n", 91 | " nengo.Connection(correct_answer, cconv.A)\n", 92 | " nengo.Connection(rule, cconv.B)\n", 93 | " nengo.Connection(cconv.output, correct_transform)\n", 94 | " \n", 95 | " \n", 96 | " conn = nengo.Connection(context, transform, function=lambda x: np.random.random(D))\n", 97 | " error = nengo.Ensemble(N_other, dimensions=D)\n", 98 | " \n", 99 | " # Error = pre - post\n", 100 | " #nengo.Connection(context, error)\n", 101 | " nengo.Connection(transform, error, transform=-1)\n", 102 | " nengo.Connection(correct_transform, error)\n", 103 | " \n", 104 | " # Modulatory connections don't impart current\n", 105 | " error_conn = nengo.Connection(error, transform, modulatory=True)\n", 106 | " # Add the learning rule to the connection\n", 107 | " conn.learning_rule_type = nengo.PES(error_conn)\n", 108 | " \n", 109 | " # -- inhibit error after 3 seconds\n", 110 | " inhib = nengo.Node(lambda t: 2.0 if t > 3.0 else 0.0)\n", 111 | " nengo.Connection(inhib, error.neurons, transform=[[-1]] * error.n_neurons)\n" 112 | ], 113 | "language": "python", 114 | "metadata": {}, 115 | "outputs": [] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "collapsed": false, 120 | "input": [ 121 | "#import random\n", 122 | "#random.seed(99) #seed for vocabulary items\n", 123 | "\n", 124 | "# Put possible answers in the vocabulary \n", 125 | "# our ground-truth to test the accuracy of the neural network.\n", 126 | " \n", 127 | "\n", 128 | "if experiment==1:\n", 129 | " \n", 130 | " vocab.add('ANSWER1', vocab.parse('VOWEL+EVEN')) \n", 131 | " vocab.add('ANSWER2', vocab.parse('DRINK+NOT*OVER18')) \n", 132 | "\n", 133 | " RULE1=vocab.parse('ANTE*VOWEL+CONS*EVEN')\n", 134 | " RULE2=vocab.parse('ANTE*DRINK+CONS*OVER18')\n", 135 | " ANSWER1=vocab.parse('VOWEL+EVEN')\n", 136 | " ANSWER2=vocab.parse('DRINK+NOT*OVER18')\n", 137 | " vocab.add('NOT_OVER18',vocab.parse('NOT*OVER18'))\n", 138 | " ANSWER1.normalize()\n", 139 | " ANSWER2.normalize()\n", 140 | " RULE1.normalize()\n", 141 | " RULE2.normalize()\n", 142 | "\n", 143 | " with model:\n", 144 | " abstract_context = nengo.Node(output=lambda t: -1 if t <= 1.5 or (t>3.0 and t<=4.5) else 0.0, size_out=1)\n", 145 | " familiar_context = nengo.Node(output=lambda t: 1 if (t>1.5 and t<=3.0) or (t>4.5 and t<=6) else 0.0, size_out=1)\n", 146 | " rule1 = nengo.Node(output=lambda t: RULE1.v if t <= 1.5 or (t>3.0 and t<=4.5) else 0.0, size_out=D)\n", 147 | " rule2 = nengo.Node(output=lambda t: RULE2.v if (t>1.5 and t<=3) or (t>4.5 and t<=6) else 0.0, size_out=D)\n", 148 | " answer1 = nengo.Node(output=lambda t: ANSWER1.v if t <= 1.5 else 0.0, size_out=D)\n", 149 | " answer2 = nengo.Node(output=lambda t: ANSWER2.v if (t>1.5 and t<=3.0) else 0.0, size_out=D)\n", 150 | "\n", 151 | " nengo.Connection(abstract_context, context)\n", 152 | " nengo.Connection(familiar_context, context)\n", 153 | " nengo.Connection(rule1, rule)\n", 154 | " nengo.Connection(rule2, rule)\n", 155 | " nengo.Connection(answer1, correct_answer)\n", 156 | " nengo.Connection(answer2, correct_answer)\n", 157 | " \n", 158 | " \n", 159 | "\n", 160 | "elif experiment==2:\n", 161 | " \n", 162 | " vocab.add('ANSWER1', vocab.parse('DRINK+NOT*OVER21')) \n", 163 | " vocab.add('ANSWER2', vocab.parse('VOTE+NOT*OVER18')) \n", 164 | " vocab.add('ANSWER3', vocab.parse('DRIVE+NOT*OVER16'))\n", 165 | "\n", 166 | " RULE1=vocab.parse('ANTE*DRINK+CONS*OVER21')\n", 167 | " RULE2=vocab.parse('ANTE*VOTE+CONS*OVER18')\n", 168 | " RULE3=vocab.parse('ANTE*DRIVE+CONS*OVER16')\n", 169 | "\n", 170 | " ANSWER1=vocab.parse('DRINK+NOT*OVER21')\n", 171 | " ANSWER2=vocab.parse('VOTE+NOT*OVER18')\n", 172 | " ANSWER3=vocab.parse('DRIVE+NOT*OVER16')\n", 173 | " vocab.add('NOT_OVER16',vocab.parse('NOT*OVER16'))\n", 174 | " vocab.add('NOT_OVER18',vocab.parse('NOT*OVER18'))\n", 175 | " vocab.add('NOT_OVER21',vocab.parse('NOT*OVER21'))\n", 176 | " \n", 177 | " \n", 178 | " ANSWER1.normalize()\n", 179 | " ANSWER2.normalize()\n", 180 | " ANSWER3.normalize()\n", 181 | " RULE1.normalize()\n", 182 | " RULE2.normalize()\n", 183 | " RULE3.normalize()\n", 184 | "\n", 185 | " with model:\n", 186 | " familiar_context = nengo.Node(output=lambda t: 1 if t<6 else 0.0, size_out=1)\n", 187 | " rule1 = nengo.Node(output=lambda t: RULE1.v if t <= 2 else 0.0, size_out=D)\n", 188 | " rule2 = nengo.Node(output=lambda t: RULE2.v if (t>2 and t<=4) else 0.0, size_out=D)\n", 189 | " rule3 = nengo.Node(output=lambda t: RULE3.v if (t>4 and t<=6) else 0.0, size_out=D)\n", 190 | " answer1 = nengo.Node(output=lambda t: ANSWER1.v if t <= 2 else 0.0, size_out=D)\n", 191 | " answer2 = nengo.Node(output=lambda t: ANSWER2.v if (t>2 and t<=4) else 0.0, size_out=D)\n", 192 | "\n", 193 | " nengo.Connection(familiar_context, context)\n", 194 | " nengo.Connection(rule1, rule)\n", 195 | " nengo.Connection(rule2, rule)\n", 196 | " nengo.Connection(rule3, rule)\n", 197 | " nengo.Connection(answer1, correct_answer)\n", 198 | " nengo.Connection(answer2, correct_answer)\n" 199 | ], 200 | "language": "python", 201 | "metadata": {}, 202 | "outputs": [] 203 | }, 204 | { 205 | "cell_type": "markdown", 206 | "metadata": {}, 207 | "source": [ 208 | "## Create and run the model" 209 | ] 210 | }, 211 | { 212 | "cell_type": "code", 213 | "collapsed": false, 214 | "input": [ 215 | "with model:\n", 216 | " # Probe the output\n", 217 | " answer_probe = nengo.Probe(answer, synapse=0.1)\n", 218 | " rule_probe = nengo.Probe(rule, synapse=0.1)\n", 219 | " transform_probe = nengo.Probe(transform, synapse=0.1)\n", 220 | " \n", 221 | " correct_answer_probe = nengo.Probe(correct_answer, synapse=0.1)\n", 222 | " correct_transform_probe = nengo.Probe(correct_transform, synapse=0.1)\n", 223 | " \n", 224 | " context_probe = nengo.Probe(context, synapse=0.1)\n", 225 | " \n", 226 | " error_probe = nengo.Probe(error, synapse=0.1)" 227 | ], 228 | "language": "python", 229 | "metadata": {}, 230 | "outputs": [] 231 | }, 232 | { 233 | "cell_type": "markdown", 234 | "metadata": {}, 235 | "source": [ 236 | "## Step 5: Run the model" 237 | ] 238 | }, 239 | { 240 | "cell_type": "code", 241 | "collapsed": false, 242 | "input": [ 243 | "sim = nengo.Simulator(model)\n", 244 | "sim.run(6.0)" 245 | ], 246 | "language": "python", 247 | "metadata": {}, 248 | "outputs": [] 249 | }, 250 | { 251 | "cell_type": "markdown", 252 | "metadata": {}, 253 | "source": [ 254 | "## Step 6: Plot the results" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "collapsed": false, 260 | "input": [ 261 | "plt.figure(figsize=(14, 3))\n", 262 | "plt.subplot(1, 3, 1)\n", 263 | "plt.plot(sim.trange(), sim.data[rule_probe])\n", 264 | "plt.title(\"Rule\")\n", 265 | "\n", 266 | "plt.subplot(1, 3, 2)\n", 267 | "plt.plot(sim.trange(), sim.data[transform_probe])\n", 268 | "plt.title(\"Transform\")\n", 269 | "\n", 270 | "plt.figure(figsize=(14, 3))\n", 271 | "plt.subplot(1, 3, 1)\n", 272 | "plt.plot(sim.trange(), sim.data[answer_probe])\n", 273 | "plt.title(\"Answer\")\n", 274 | "\n", 275 | "plt.subplot(1, 3, 2)\n", 276 | "plt.plot(sim.trange(), sim.data[context_probe])\n", 277 | "plt.title(\"Context\")\n", 278 | "\n", 279 | "plt.figure(figsize=(14, 3))\n", 280 | "plt.subplot(1, 3, 1)\n", 281 | "plt.plot(sim.trange(), sim.data[correct_answer_probe])\n", 282 | "plt.title(\"Correct Answer\")\n", 283 | "\n", 284 | "plt.subplot(1, 3, 2)\n", 285 | "plt.plot(sim.trange(), sim.data[correct_transform_probe])\n", 286 | "plt.title(\"Correct Transform\")\n" 287 | ], 288 | "language": "python", 289 | "metadata": {}, 290 | "outputs": [] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "collapsed": false, 295 | "input": [ 296 | "figure()\n", 297 | "plt.plot(sim.trange(), nengo.spa.similarity(sim.data[answer_probe], vocab))\n", 298 | "#plt.plot(sim.trange(), nengo.spa.similarity(sim.data[answer_probe], vocab, normalize=True))\n", 299 | "plt.xlabel(\"t [s]\")\n", 300 | "plt.ylabel(\"dot product\")\n", 301 | "plt.legend(vocab.keys, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.0)" 302 | ], 303 | "language": "python", 304 | "metadata": {}, 305 | "outputs": [] 306 | }, 307 | { 308 | "cell_type": "markdown", 309 | "metadata": {}, 310 | "source": [ 311 | "## Analyze the results\n", 312 | "\n", 313 | "We plot the dot product between the exact convolution of `A` and `B` (given by `vocab.parse('A * B')`), and the result of the neural convolution (given by `sim.data[out]`).\n", 314 | "\n", 315 | "The dot product is a common measure of similarity between semantic pointers, since it approximates the cosine similarity when the semantic pointer lengths are close to one. The cosine similarity is a common similarity measure for vectors; it is simply the cosine of the angle between the vectors.\n", 316 | "\n", 317 | "Both the dot product and the exact cosine similarity can be computed with `nengo.spa.similarity`. Normally, this function will compute the dot products between each data vector and each vocabulary vector, but setting `normalize=True` normalizes all vectors so that the exact cosine similarity is computed instead." 318 | ] 319 | }, 320 | { 321 | "cell_type": "code", 322 | "collapsed": false, 323 | "input": [ 324 | "plt.plot(sim.trange(), nengo.spa.similarity(sim.data[conv_probe], vocab))\n", 325 | "plt.legend(vocab.keys, loc=4)\n", 326 | "plt.xlabel(\"t [s]\")\n", 327 | "plt.ylabel(\"dot product\");" 328 | ], 329 | "language": "python", 330 | "metadata": {}, 331 | "outputs": [] 332 | }, 333 | { 334 | "cell_type": "markdown", 335 | "metadata": {}, 336 | "source": [ 337 | "The above plot shows that the neural output is much closer to `C = A * B` than to either `A` or `B`, suggesting that our network is correctly computing the convolution. It also highlights an important property of circular convolution: The circular convolution of two vectors is dissimilar to both of the vectors.\n", 338 | "\n", 339 | "The dot product between the neural output and `C` is not exactly one due in large part to the fact that the length of `C` is not exactly one (see below). To actually measure the cosine similarity between the vectors (that is, the cosine of the angle between the vectors), we have to divide the dot product by the lengths of both `C` and the neural output vector approximating `C`." 340 | ] 341 | }, 342 | { 343 | "cell_type": "code", 344 | "collapsed": false, 345 | "input": [ 346 | "# The length of `C` is not exactly one\n", 347 | "print(vocab['C'].length())" 348 | ], 349 | "language": "python", 350 | "metadata": {}, 351 | "outputs": [] 352 | }, 353 | { 354 | "cell_type": "markdown", 355 | "metadata": {}, 356 | "source": [ 357 | "Performing this normalization, we can see that the cosine similarity between the neural output vectors and `C` is almost exactly one, demonstrating that the neural population is quite accurate in computing the convolution." 358 | ] 359 | }, 360 | { 361 | "cell_type": "code", 362 | "collapsed": false, 363 | "input": [ 364 | "plt.plot(sim.trange(), nengo.spa.similarity(sim.data[conv_probe], vocab, normalize=True))\n", 365 | "plt.legend(vocab.keys, loc=4)\n", 366 | "plt.xlabel(\"t [s]\")\n", 367 | "plt.ylabel(\"cosine similarity\");" 368 | ], 369 | "language": "python", 370 | "metadata": {}, 371 | "outputs": [] 372 | }, 373 | { 374 | "cell_type": "code", 375 | "collapsed": false, 376 | "input": [], 377 | "language": "python", 378 | "metadata": {}, 379 | "outputs": [] 380 | } 381 | ], 382 | "metadata": {} 383 | } 384 | ] 385 | } -------------------------------------------------------------------------------- /chapter4/structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter4/structure.png -------------------------------------------------------------------------------- /chapter4/structure.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_config[Bind].expanded=False 2 | _viz_config[Bind].has_layout=False 3 | _viz_0 = nengo_gui.components.Pointer(model.C,target='default') 4 | _viz_config[_viz_0].label_visible = True 5 | _viz_config[_viz_0].width = 0.10355884195145255 6 | _viz_config[_viz_0].y = 0.7617507132092488 7 | _viz_config[_viz_0].x = 0.5660864354096186 8 | _viz_config[_viz_0].show_pairs = False 9 | _viz_config[_viz_0].height = 0.18856895774264887 10 | _viz_1 = nengo_gui.components.Pointer(model.A,target='default') 11 | _viz_config[_viz_1].label_visible = True 12 | _viz_config[_viz_1].width = 0.10954492150382379 13 | _viz_config[_viz_1].y = 0.7657705486299418 14 | _viz_config[_viz_1].x = 0.10416156478200632 15 | _viz_config[_viz_1].show_pairs = False 16 | _viz_config[_viz_1].height = 0.19972686721065205 17 | _viz_2 = nengo_gui.components.Pointer(model.B,target='default') 18 | _viz_config[_viz_2].label_visible = True 19 | _viz_config[_viz_2].width = 0.10595328473320662 20 | _viz_config[_viz_2].y = 0.7554522683501044 21 | _viz_config[_viz_2].x = 0.34361281316208914 22 | _viz_config[_viz_2].show_pairs = False 23 | _viz_config[_viz_2].height = 0.193032128340108 24 | _viz_3 = nengo_gui.components.Pointer(model.Sum,target='default') 25 | _viz_config[_viz_3].label_visible = True 26 | _viz_config[_viz_3].width = 0.10355886021946184 27 | _viz_config[_viz_3].y = 0.23246459138890763 28 | _viz_config[_viz_3].x = 0.5639618159091334 29 | _viz_config[_viz_3].show_pairs = False 30 | _viz_config[_viz_3].height = 0.18745316509328408 31 | _viz_4 = nengo_gui.components.SpaSimilarity(model.C,target='default') 32 | _viz_config[_viz_4].max_value = 2.5 33 | _viz_config[_viz_4].min_value = -2.5 34 | _viz_config[_viz_4].height = 0.21869535927549807 35 | _viz_config[_viz_4].label_visible = True 36 | _viz_config[_viz_4].width = 0.12091843794411151 37 | _viz_config[_viz_4].y = 0.76374396934249 38 | _viz_config[_viz_4].x = 0.8044855759760503 39 | _viz_config[_viz_4].show_pairs = False 40 | _viz_5 = nengo_gui.components.SpaSimilarity(model.Sum,target='default') 41 | _viz_config[_viz_5].max_value = 1.5 42 | _viz_config[_viz_5].min_value = -1.5 43 | _viz_config[_viz_5].height = 0.22315852987295723 44 | _viz_config[_viz_5].label_visible = True 45 | _viz_config[_viz_5].width = 0.12510868084316487 46 | _viz_config[_viz_5].y = 0.24035022881719625 47 | _viz_config[_viz_5].x = 0.7806428775259746 48 | _viz_config[_viz_5].show_pairs = False 49 | _viz_ace_editor = nengo_gui.components.AceEditor() 50 | _viz_net_graph = nengo_gui.components.NetGraph() 51 | _viz_sim_control = nengo_gui.components.SimControl() 52 | _viz_config[_viz_sim_control].kept_time = 4.0 53 | _viz_config[_viz_sim_control].shown_time = 0.5 54 | _viz_config[model].pos=(0.14870442095700895, 0.06128139535768197) 55 | _viz_config[model].size=(0.8584519773235366, 0.8584519773235366) 56 | _viz_config[model].expanded=True 57 | _viz_config[model].has_layout=True 58 | _viz_config[model.A].pos=(0.1579067935753088, 0.10579842539445442) 59 | _viz_config[model.A].size=(0.06248498195783131, 0.06647138291718163) 60 | _viz_config[model.A].expanded=False 61 | _viz_config[model.A].has_layout=True 62 | _viz_config[model.A.input].pos=(0.12745098039215685, 0.5) 63 | _viz_config[model.A.input].size=(0.07843137254901959, 0.08) 64 | _viz_config[model.A.output].pos=(0.872549019607843, 0.5) 65 | _viz_config[model.A.output].size=(0.07843137254901959, 0.08) 66 | _viz_config[model.A.state_ensembles].pos=(0.5, 0.5) 67 | _viz_config[model.A.state_ensembles].size=(0.4, 0.4) 68 | _viz_config[model.A.state_ensembles].expanded=True 69 | _viz_config[model.A.state_ensembles].has_layout=True 70 | _viz_config[model.A.state_ensembles.ea_ensembles[0]].pos=(0.49999999999999994, 0.7999999999999999) 71 | _viz_config[model.A.state_ensembles.ea_ensembles[0]].size=(0.09803921568627451, 0.1) 72 | _viz_config[model.A.state_ensembles.ea_ensembles[1]].pos=(0.49999999999999994, 0.2) 73 | _viz_config[model.A.state_ensembles.ea_ensembles[1]].size=(0.09803921568627451, 0.1) 74 | _viz_config[model.B].pos=(0.1540580267422167, 0.36086117288874436) 75 | _viz_config[model.B].size=(0.05412421296465561, 0.08203625898369697) 76 | _viz_config[model.B].expanded=False 77 | _viz_config[model.B].has_layout=True 78 | _viz_config[model.B.input].pos=(0.12745098039215685, 0.5) 79 | _viz_config[model.B.input].size=(0.07843137254901959, 0.08) 80 | _viz_config[model.B.output].pos=(0.872549019607843, 0.5) 81 | _viz_config[model.B.output].size=(0.07843137254901959, 0.08) 82 | _viz_config[model.B.state_ensembles].pos=(0.5, 0.5) 83 | _viz_config[model.B.state_ensembles].size=(0.4, 0.4) 84 | _viz_config[model.B.state_ensembles].expanded=True 85 | _viz_config[model.B.state_ensembles].has_layout=True 86 | _viz_config[model.B.state_ensembles.ea_ensembles[0]].pos=(0.49999999999999994, 0.2) 87 | _viz_config[model.B.state_ensembles.ea_ensembles[0]].size=(0.09803921568627451, 0.1) 88 | _viz_config[model.B.state_ensembles.ea_ensembles[1]].pos=(0.49999999999999994, 0.7999999999999999) 89 | _viz_config[model.B.state_ensembles.ea_ensembles[1]].size=(0.09803921568627451, 0.1) 90 | _viz_config[model.C].pos=(0.39543394062557585, 0.1040539799746083) 91 | _viz_config[model.C].size=(0.05889728854820028, 0.07367590522571739) 92 | _viz_config[model.C].expanded=False 93 | _viz_config[model.C].has_layout=True 94 | _viz_config[model.C.networks[1]].pos=(0.5264060780862777, 0.21052631578947367) 95 | _viz_config[model.C.networks[1]].size=(0.4, 0.21052631578947367) 96 | _viz_config[model.C.networks[1]].expanded=False 97 | _viz_config[model.C.networks[1]].has_layout=False 98 | _viz_config[model.C.networks[1].product].expanded=False 99 | _viz_config[model.C.networks[1].product].has_layout=False 100 | _viz_config[model.C.networks[1].product.sq1].expanded=False 101 | _viz_config[model.C.networks[1].product.sq1].has_layout=False 102 | _viz_config[model.C.networks[1].product.sq2].expanded=False 103 | _viz_config[model.C.networks[1].product.sq2].has_layout=False 104 | _viz_config[model.C.state_ensembles].pos=(0.4, 0.7894736842105263) 105 | _viz_config[model.C.state_ensembles].size=(0.4, 0.21052631578947367) 106 | _viz_config[model.C.state_ensembles].expanded=False 107 | _viz_config[model.C.state_ensembles].has_layout=False 108 | _viz_config[model.Sum].pos=(0.39610779846947053, 0.37715659639981636) 109 | _viz_config[model.Sum].size=(0.059491951315650236, 0.06755586723407084) 110 | _viz_config[model.Sum].expanded=False 111 | _viz_config[model.Sum].has_layout=True 112 | _viz_config[model.Sum.input].pos=(0.12745098039215685, 0.5) 113 | _viz_config[model.Sum.input].size=(0.07843137254901959, 0.08) 114 | _viz_config[model.Sum.output].pos=(0.872549019607843, 0.5) 115 | _viz_config[model.Sum.output].size=(0.07843137254901959, 0.08) 116 | _viz_config[model.Sum.state_ensembles].pos=(0.5858197537804012, 0.4) 117 | _viz_config[model.Sum.state_ensembles].size=(0.4, 0.4) 118 | _viz_config[model.Sum.state_ensembles].expanded=True 119 | _viz_config[model.Sum.state_ensembles].has_layout=True 120 | _viz_config[model.Sum.state_ensembles.ea_ensembles[0]].pos=(0.49999999999999994, 0.2) 121 | _viz_config[model.Sum.state_ensembles.ea_ensembles[0]].size=(0.09803921568627451, 0.1) 122 | _viz_config[model.Sum.state_ensembles.ea_ensembles[1]].pos=(0.49999999999999994, 0.7999999999999999) 123 | _viz_config[model.Sum.state_ensembles.ea_ensembles[1]].size=(0.09803921568627451, 0.1) 124 | _viz_config[model.cortical].pos=(-0.08643884043761879, 0.9819625094005835) 125 | _viz_config[model.cortical].size=(0.043731026210498916, 0.06389811386559383) 126 | _viz_config[model.cortical].expanded=True 127 | _viz_config[model.cortical].has_layout=True 128 | _viz_config[model.input].pos=(-0.05782465909961222, 0.23440431676790704) 129 | _viz_config[model.input].size=(0.052938826253825066, 0.07245665410289172) 130 | _viz_config[model.input].expanded=False 131 | _viz_config[model.input].has_layout=False -------------------------------------------------------------------------------- /chapter5/question-control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter5/question-control.png -------------------------------------------------------------------------------- /chapter5/question-control.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_0 = nengo_gui.components.SpaSimilarity(model.motor,target='default') 2 | _viz_config[_viz_0].max_value = 0.5 3 | _viz_config[_viz_0].min_value = -0.5 4 | _viz_config[_viz_0].height = 0.15899311166040117 5 | _viz_config[_viz_0].label_visible = True 6 | _viz_config[_viz_0].width = 0.24627951484231989 7 | _viz_config[_viz_0].y = 0.8576351416093368 8 | _viz_config[_viz_0].x = 0.6944521922637084 9 | _viz_config[_viz_0].show_pairs = False 10 | _viz_1 = nengo_gui.components.SpaSimilarity(model.memory,target='default') 11 | _viz_config[_viz_1].max_value = 1.5 12 | _viz_config[_viz_1].min_value = -1.5 13 | _viz_config[_viz_1].height = 0.1542138721255494 14 | _viz_config[_viz_1].label_visible = True 15 | _viz_config[_viz_1].width = 0.24570496022849284 16 | _viz_config[_viz_1].y = 0.547593828455851 17 | _viz_config[_viz_1].x = 0.693251502809896 18 | _viz_config[_viz_1].show_pairs = False 19 | _viz_2 = nengo_gui.components.SpaSimilarity(model.visual,target='default') 20 | _viz_config[_viz_2].max_value = 1.5 21 | _viz_config[_viz_2].min_value = -1.5 22 | _viz_config[_viz_2].height = 0.1608952108146776 23 | _viz_config[_viz_2].label_visible = True 24 | _viz_config[_viz_2].width = 0.24515616468757254 25 | _viz_config[_viz_2].y = 0.2306618748140602 26 | _viz_config[_viz_2].x = 0.6918752551257148 27 | _viz_config[_viz_2].show_pairs = False 28 | _viz_4 = nengo_gui.components.Pointer(model.visual,target='default') 29 | _viz_config[_viz_4].label_visible = True 30 | _viz_config[_viz_4].width = 0.1282677222497013 31 | _viz_config[_viz_4].y = 0.8088803196653078 32 | _viz_config[_viz_4].x = 0.30146155798765717 33 | _viz_config[_viz_4].show_pairs = False 34 | _viz_config[_viz_4].height = 0.11005002249742256 35 | _viz_ace_editor = nengo_gui.components.AceEditor() 36 | _viz_net_graph = nengo_gui.components.NetGraph() 37 | _viz_sim_control = nengo_gui.components.SimControl() 38 | _viz_config[_viz_sim_control].kept_time = 4.0 39 | _viz_config[_viz_sim_control].shown_time = 0.5 40 | _viz_config[model].pos=(0.014607332683119853, -0.0013214339690106325) 41 | _viz_config[model].size=(0.877036883715074, 0.877036883715074) 42 | _viz_config[model].expanded=True 43 | _viz_config[model].has_layout=True 44 | _viz_config[model.bg].pos=(0.09516957862281582, 0.337238438544048) 45 | _viz_config[model.bg].size=(0.032990750256937304, 0.0712370318269738) 46 | _viz_config[model.bg].expanded=False 47 | _viz_config[model.bg].has_layout=True 48 | _viz_config[model.bg.bias].pos=(0.5, 0.9403973509933775) 49 | _viz_config[model.bg.bias].size=(0.3076923076923077, 0.026490066225165587) 50 | _viz_config[model.bg.gpe].pos=(0.4006622516556292, 0.5629139072847682) 51 | _viz_config[model.bg.gpe].size=(0.06622516556291391, 0.13245033112582782) 52 | _viz_config[model.bg.gpe].expanded=False 53 | _viz_config[model.bg.gpe].has_layout=False 54 | _viz_config[model.bg.gpi].pos=(0.7980132450331127, 0.5099337748344371) 55 | _viz_config[model.bg.gpi].size=(0.06622516556291391, 0.13245033112582782) 56 | _viz_config[model.bg.gpi].expanded=False 57 | _viz_config[model.bg.gpi].has_layout=False 58 | _viz_config[model.bg.input].pos=(0.04304635761589404, 0.5099337748344371) 59 | _viz_config[model.bg.input].size=(0.026490066225165563, 0.026490066225165566) 60 | _viz_config[model.bg.output].pos=(0.9569536423841061, 0.5099337748344371) 61 | _viz_config[model.bg.output].size=(0.026490066225165563, 0.026490066225165566) 62 | _viz_config[model.bg.stn].pos=(0.5993377483443708, 0.7483443708609272) 63 | _viz_config[model.bg.stn].size=(0.06622516556291391, 0.13245033112582782) 64 | _viz_config[model.bg.stn].expanded=False 65 | _viz_config[model.bg.stn].has_layout=False 66 | _viz_config[model.bg.strD1].pos=(0.20198675496688742, 0.16556291390728478) 67 | _viz_config[model.bg.strD1].size=(0.06622516556291391, 0.13245033112582782) 68 | _viz_config[model.bg.strD1].expanded=False 69 | _viz_config[model.bg.strD1].has_layout=False 70 | _viz_config[model.bg.strD2].pos=(0.20198675496688742, 0.5629139072847682) 71 | _viz_config[model.bg.strD2].size=(0.06622516556291391, 0.13245033112582782) 72 | _viz_config[model.bg.strD2].expanded=False 73 | _viz_config[model.bg.strD2].has_layout=False 74 | _viz_config[model.input].pos=(0.09712230215827342, 0.8569764374890111) 75 | _viz_config[model.input].size=(0.033504624871531316, 0.07123703182697382) 76 | _viz_config[model.input].expanded=False 77 | _viz_config[model.input].has_layout=False 78 | _viz_config[model.memory].pos=(0.2061993949485511, 0.3828116611846322) 79 | _viz_config[model.memory].size=(0.029393627954779004, 0.06503868471953583) 80 | _viz_config[model.memory].expanded=False 81 | _viz_config[model.memory].has_layout=False 82 | _viz_config[model.memory.networks[1]].expanded=False 83 | _viz_config[model.memory.networks[1]].has_layout=False 84 | _viz_config[model.memory.state_ensembles].expanded=False 85 | _viz_config[model.memory.state_ensembles].has_layout=False 86 | _viz_config[model.motor].pos=(0.3321027517267419, 0.47617609029199126) 87 | _viz_config[model.motor].size=(0.030935251798561124, 0.0681378582732548) 88 | _viz_config[model.motor].expanded=False 89 | _viz_config[model.motor].has_layout=False 90 | _viz_config[model.motor.networks[1]].expanded=False 91 | _viz_config[model.motor.networks[1]].has_layout=False 92 | _viz_config[model.motor.networks[1].product].expanded=False 93 | _viz_config[model.motor.networks[1].product].has_layout=False 94 | _viz_config[model.motor.networks[1].product.sq1].expanded=False 95 | _viz_config[model.motor.networks[1].product.sq1].has_layout=False 96 | _viz_config[model.motor.networks[1].product.sq2].expanded=False 97 | _viz_config[model.motor.networks[1].product.sq2].has_layout=False 98 | _viz_config[model.motor.state_ensembles].expanded=False 99 | _viz_config[model.motor.state_ensembles].has_layout=False 100 | _viz_config[model.thalamus].pos=(0.20647482014388507, 0.14326353504037145) 101 | _viz_config[model.thalamus].size=(0.030421377183967122, 0.06710480042201514) 102 | _viz_config[model.thalamus].expanded=False 103 | _viz_config[model.thalamus].has_layout=True 104 | _viz_config[model.thalamus.actions].pos=(0.7093023255813954, 0.5) 105 | _viz_config[model.thalamus.actions].size=(0.23255813953488372, 0.4) 106 | _viz_config[model.thalamus.actions].expanded=False 107 | _viz_config[model.thalamus.actions].has_layout=False 108 | _viz_config[model.thalamus.bias].pos=(0.1511627906976744, 0.5) 109 | _viz_config[model.thalamus.bias].size=(0.09302325581395349, 0.08) 110 | _viz_config[model.visual].pos=(0.09537512846865356, 0.6245384209600854) 111 | _viz_config[model.visual].size=(0.0319630010277492, 0.07433620538069281) 112 | _viz_config[model.visual].expanded=False 113 | _viz_config[model.visual].has_layout=False 114 | _viz_config[model.visual.state_ensembles].expanded=False 115 | _viz_config[model.visual.state_ensembles].has_layout=False -------------------------------------------------------------------------------- /chapter5/question-control1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter5/question-control1.png -------------------------------------------------------------------------------- /chapter5/question-memory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter5/question-memory.png -------------------------------------------------------------------------------- /chapter5/question-memory.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_1 = nengo_gui.components.SpaSimilarity(model.A,target='default') 2 | _viz_config[_viz_1].max_value = 1 3 | _viz_config[_viz_1].min_value = -1 4 | _viz_config[_viz_1].height = 0.1596470066000821 5 | _viz_config[_viz_1].label_visible = True 6 | _viz_config[_viz_1].width = 0.4698763021365264 7 | _viz_config[_viz_1].y = 0.11691388988168111 8 | _viz_config[_viz_1].x = 0.9191377938126101 9 | _viz_config[_viz_1].show_pairs = False 10 | _viz_2 = nengo_gui.components.SpaSimilarity(model.C,target='default') 11 | _viz_config[_viz_2].max_value = 1 12 | _viz_config[_viz_2].min_value = -1 13 | _viz_config[_viz_2].height = 0.19687617503344976 14 | _viz_config[_viz_2].label_visible = True 15 | _viz_config[_viz_2].width = 0.4723582694470418 16 | _viz_config[_viz_2].y = 0.7884429357540527 17 | _viz_config[_viz_2].x = 0.921982206082644 18 | _viz_config[_viz_2].show_pairs = False 19 | _viz_4 = nengo_gui.components.SpaSimilarity(model.E,target='default') 20 | _viz_config[_viz_4].max_value = 1 21 | _viz_config[_viz_4].min_value = -1 22 | _viz_config[_viz_4].height = 0.2309807092912127 23 | _viz_config[_viz_4].label_visible = True 24 | _viz_config[_viz_4].width = 0.4657310098813645 25 | _viz_config[_viz_4].y = 1.1871871838783714 26 | _viz_config[_viz_4].x = 0.9252706060092224 27 | _viz_config[_viz_4].show_pairs = False 28 | _viz_6 = nengo_gui.components.SpaSimilarity(model.B,target='default') 29 | _viz_config[_viz_6].max_value = 1 30 | _viz_config[_viz_6].min_value = -1 31 | _viz_config[_viz_6].height = 0.15342196021922622 32 | _viz_config[_viz_6].label_visible = True 33 | _viz_config[_viz_6].width = 0.4698892968626565 34 | _viz_config[_viz_6].y = 0.4376248817976398 35 | _viz_config[_viz_6].x = 0.9226883451631783 36 | _viz_config[_viz_6].show_pairs = False 37 | _viz_ace_editor = nengo_gui.components.AceEditor() 38 | _viz_net_graph = nengo_gui.components.NetGraph() 39 | _viz_sim_control = nengo_gui.components.SimControl() 40 | _viz_config[_viz_sim_control].kept_time = 4.0 41 | _viz_config[_viz_sim_control].shown_time = 0.5 42 | _viz_config[model].pos=(0.08261372338184292, 0.06910557411671744) 43 | _viz_config[model].size=(0.6178884243249639, 0.6178884243249639) 44 | _viz_config[model].expanded=True 45 | _viz_config[model].has_layout=True 46 | _viz_config[model.A].pos=(0.18068398635098837, 0.9390426482739703) 47 | _viz_config[model.A].size=(0.06896551724137931, 0.09302325581395349) 48 | _viz_config[model.A].expanded=False 49 | _viz_config[model.A].has_layout=True 50 | _viz_config[model.A.input].pos=(0.12745098039215685, 0.5) 51 | _viz_config[model.A.input].size=(0.07843137254901959, 0.08) 52 | _viz_config[model.A.output].pos=(0.872549019607843, 0.5) 53 | _viz_config[model.A.output].size=(0.07843137254901959, 0.08) 54 | _viz_config[model.A.state_ensembles].pos=(0.5, 0.5) 55 | _viz_config[model.A.state_ensembles].size=(0.4, 0.4) 56 | _viz_config[model.A.state_ensembles].expanded=True 57 | _viz_config[model.A.state_ensembles].has_layout=True 58 | _viz_config[model.A.state_ensembles.ea_ensembles[0]].pos=(0.49999999999999994, 0.2) 59 | _viz_config[model.A.state_ensembles.ea_ensembles[0]].size=(0.09803921568627451, 0.1) 60 | _viz_config[model.A.state_ensembles.ea_ensembles[1]].pos=(0.49999999999999994, 0.7999999999999999) 61 | _viz_config[model.A.state_ensembles.ea_ensembles[1]].size=(0.09803921568627451, 0.1) 62 | _viz_config[model.B].pos=(0.009585418513664797, 0.9304871309995303) 63 | _viz_config[model.B].size=(0.06896551724137931, 0.09302325581395349) 64 | _viz_config[model.B].expanded=False 65 | _viz_config[model.B].has_layout=False 66 | _viz_config[model.B.state_ensembles].expanded=False 67 | _viz_config[model.B.state_ensembles].has_layout=False 68 | _viz_config[model.C].pos=(0.35069255555800655, 0.941027121370865) 69 | _viz_config[model.C].size=(0.06896551724137931, 0.09302325581395349) 70 | _viz_config[model.C].expanded=False 71 | _viz_config[model.C].has_layout=False 72 | _viz_config[model.C.state_ensembles].expanded=False 73 | _viz_config[model.C.state_ensembles].has_layout=False 74 | _viz_config[model.D].pos=(0.08702589454725078, 0.5165429712832411) 75 | _viz_config[model.D].size=(0.06896551724137931, 0.09302325581395349) 76 | _viz_config[model.D].expanded=False 77 | _viz_config[model.D].has_layout=False 78 | _viz_config[model.D.networks[1]].expanded=False 79 | _viz_config[model.D.networks[1]].has_layout=False 80 | _viz_config[model.D.networks[1].product].expanded=False 81 | _viz_config[model.D.networks[1].product].has_layout=False 82 | _viz_config[model.D.networks[1].product.sq1].expanded=False 83 | _viz_config[model.D.networks[1].product.sq1].has_layout=False 84 | _viz_config[model.D.networks[1].product.sq2].expanded=False 85 | _viz_config[model.D.networks[1].product.sq2].has_layout=False 86 | _viz_config[model.D.state_ensembles].expanded=False 87 | _viz_config[model.D.state_ensembles].has_layout=False 88 | _viz_config[model.E].pos=(0.34233768087205113, 0.5050249895430698) 89 | _viz_config[model.E].size=(0.06896551724137931, 0.09302325581395349) 90 | _viz_config[model.E].expanded=False 91 | _viz_config[model.E].has_layout=False 92 | _viz_config[model.E.networks[1]].expanded=False 93 | _viz_config[model.E.networks[1]].has_layout=False 94 | _viz_config[model.E.networks[1].product].expanded=False 95 | _viz_config[model.E.networks[1].product].has_layout=False 96 | _viz_config[model.E.networks[1].product.sq1].expanded=False 97 | _viz_config[model.E.networks[1].product.sq1].has_layout=False 98 | _viz_config[model.E.networks[1].product.sq2].expanded=False 99 | _viz_config[model.E.networks[1].product.sq2].has_layout=False 100 | _viz_config[model.E.state_ensembles].expanded=False 101 | _viz_config[model.E.state_ensembles].has_layout=False 102 | _viz_config[model.cortical].pos=(-0.026499095110583855, 0.044329538375883944) 103 | _viz_config[model.cortical].size=(0.042427698298504145, 0.06575330545812251) 104 | _viz_config[model.cortical].expanded=False 105 | _viz_config[model.cortical].has_layout=False 106 | _viz_config[model.input].pos=(0.1463780081475765, 1.3294765847626087) 107 | _viz_config[model.input].size=(0.06896551724137931, 0.09302325581395349) 108 | _viz_config[model.input].expanded=False 109 | _viz_config[model.input].has_layout=False 110 | _viz_config[model.memory].pos=(0.20427150398948696, 0.11469444529450423) 111 | _viz_config[model.memory].size=(0.06896551724137931, 0.09302325581395349) 112 | _viz_config[model.memory].expanded=False 113 | _viz_config[model.memory].has_layout=False 114 | _viz_config[model.memory.state_ensembles].expanded=False 115 | _viz_config[model.memory.state_ensembles].has_layout=False -------------------------------------------------------------------------------- /chapter5/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter5/question.png -------------------------------------------------------------------------------- /chapter5/question.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_10 = nengo_gui.components.SpaSimilarity(model.E,target='default') 2 | _viz_config[_viz_10].max_value = 1.5 3 | _viz_config[_viz_10].min_value = -1.5 4 | _viz_config[_viz_10].height = 0.17034687300447005 5 | _viz_config[_viz_10].label_visible = True 6 | _viz_config[_viz_10].width = 0.3616050736942534 7 | _viz_config[_viz_10].y = 0.9615283577618232 8 | _viz_config[_viz_10].x = 0.6775084747626152 9 | _viz_config[_viz_10].show_pairs = False 10 | _viz_5 = nengo_gui.components.SpaSimilarity(model.A,target='default') 11 | _viz_config[_viz_5].max_value = 1.5 12 | _viz_config[_viz_5].min_value = -1.5 13 | _viz_config[_viz_5].height = 0.11991025103767565 14 | _viz_config[_viz_5].label_visible = True 15 | _viz_config[_viz_5].width = 0.36171842882836597 16 | _viz_config[_viz_5].y = 0.20065262255931104 17 | _viz_config[_viz_5].x = 0.6723612609774876 18 | _viz_config[_viz_5].show_pairs = False 19 | _viz_6 = nengo_gui.components.SpaSimilarity(model.B,target='default') 20 | _viz_config[_viz_6].max_value = 1.5 21 | _viz_config[_viz_6].min_value = -1.5 22 | _viz_config[_viz_6].height = 0.11466229783468627 23 | _viz_config[_viz_6].label_visible = True 24 | _viz_config[_viz_6].width = 0.36265376091983564 25 | _viz_config[_viz_6].y = 0.4222913512142961 26 | _viz_config[_viz_6].x = 0.6743510844924752 27 | _viz_config[_viz_6].show_pairs = False 28 | _viz_7 = nengo_gui.components.SpaSimilarity(model.C,target='default') 29 | _viz_config[_viz_7].max_value = 1.5 30 | _viz_config[_viz_7].min_value = -1.5 31 | _viz_config[_viz_7].height = 0.12836331617177527 32 | _viz_config[_viz_7].label_visible = True 33 | _viz_config[_viz_7].width = 0.36165229423603984 34 | _viz_config[_viz_7].y = 0.6763421863305028 35 | _viz_config[_viz_7].x = 0.6752726215378012 36 | _viz_config[_viz_7].show_pairs = False 37 | _viz_ace_editor = nengo_gui.components.AceEditor() 38 | _viz_net_graph = nengo_gui.components.NetGraph() 39 | _viz_sim_control = nengo_gui.components.SimControl() 40 | _viz_config[_viz_sim_control].kept_time = 4.0 41 | _viz_config[_viz_sim_control].shown_time = 0.5 42 | _viz_config[model].pos=(0.04177471951368803, -0.05620406579316635) 43 | _viz_config[model].size=(0.8498583569405097, 0.8498583569405097) 44 | _viz_config[model].expanded=True 45 | _viz_config[model].has_layout=True 46 | _viz_config[model.A].pos=(0.02998553482364228, 0.6707911064482868) 47 | _viz_config[model.A].size=(0.04080460057206053, 0.05197937695857538) 48 | _viz_config[model.A].expanded=False 49 | _viz_config[model.A].has_layout=False 50 | _viz_config[model.A.state_ensembles].expanded=False 51 | _viz_config[model.A.state_ensembles].has_layout=False 52 | _viz_config[model.B].pos=(0.20172273530609192, 0.6689967715301904) 53 | _viz_config[model.B].size=(0.044568555061498955, 0.04961728148061608) 54 | _viz_config[model.B].expanded=False 55 | _viz_config[model.B].has_layout=False 56 | _viz_config[model.B.state_ensembles].expanded=False 57 | _viz_config[model.B.state_ensembles].has_layout=False 58 | _viz_config[model.C].pos=(0.17253547561920143, 0.39723002700860816) 59 | _viz_config[model.C].size=(0.04674917766033522, 0.0511140130311204) 60 | _viz_config[model.C].expanded=False 61 | _viz_config[model.C].has_layout=False 62 | _viz_config[model.C.state_ensembles].expanded=False 63 | _viz_config[model.C.state_ensembles].has_layout=False 64 | _viz_config[model.D].pos=(0.052940801420861806, 0.4121129910228683) 65 | _viz_config[model.D].size=(0.04286009903043672, 0.04991326125609604) 66 | _viz_config[model.D].expanded=False 67 | _viz_config[model.D].has_layout=False 68 | _viz_config[model.D.networks[1]].expanded=False 69 | _viz_config[model.D.networks[1]].has_layout=False 70 | _viz_config[model.D.networks[1].product].expanded=False 71 | _viz_config[model.D.networks[1].product].has_layout=False 72 | _viz_config[model.D.networks[1].product.sq1].expanded=False 73 | _viz_config[model.D.networks[1].product.sq1].has_layout=False 74 | _viz_config[model.D.networks[1].product.sq2].expanded=False 75 | _viz_config[model.D.networks[1].product.sq2].has_layout=False 76 | _viz_config[model.D.state_ensembles].expanded=False 77 | _viz_config[model.D.state_ensembles].has_layout=False 78 | _viz_config[model.E].pos=(0.11588994559158566, 0.17328647174829398) 79 | _viz_config[model.E].size=(0.04615188695210111, 0.04982941429420363) 80 | _viz_config[model.E].expanded=False 81 | _viz_config[model.E].has_layout=False 82 | _viz_config[model.E.networks[1]].expanded=False 83 | _viz_config[model.E.networks[1]].has_layout=False 84 | _viz_config[model.E.networks[1].product].expanded=False 85 | _viz_config[model.E.networks[1].product].has_layout=False 86 | _viz_config[model.E.networks[1].product.sq1].expanded=False 87 | _viz_config[model.E.networks[1].product.sq1].has_layout=False 88 | _viz_config[model.E.networks[1].product.sq2].expanded=False 89 | _viz_config[model.E.networks[1].product.sq2].has_layout=False 90 | _viz_config[model.E.state_ensembles].expanded=False 91 | _viz_config[model.E.state_ensembles].has_layout=False 92 | _viz_config[model.cortical].pos=(0.0006970647502990593, 1.1370805728956195) 93 | _viz_config[model.cortical].size=(0.029634905070911724, 0.038276220515964604) 94 | _viz_config[model.cortical].expanded=False 95 | _viz_config[model.cortical].has_layout=False 96 | _viz_config[model.input].pos=(0.10917096635970192, 0.9076500996745015) 97 | _viz_config[model.input].size=(0.04504072147016939, 0.05446472747051642) 98 | _viz_config[model.input].expanded=False 99 | _viz_config[model.input].has_layout=False -------------------------------------------------------------------------------- /chapter5/structure.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_0 = nengo_gui.components.Pointer(model.A,target=u'default') 2 | _viz_config[_viz_0].label_visible = True 3 | _viz_config[_viz_0].width = 0.10221475730901228 4 | _viz_config[_viz_0].y = 0.76984156430473 5 | _viz_config[_viz_0].x = 0.052666648749589505 6 | _viz_config[_viz_0].show_pairs = False 7 | _viz_config[_viz_0].height = 0.16133772848818653 8 | _viz_1 = nengo_gui.components.Pointer(model.B,target=u'default') 9 | _viz_config[_viz_1].label_visible = True 10 | _viz_config[_viz_1].width = 0.09606282384806444 11 | _viz_config[_viz_1].y = 0.7743814765288127 12 | _viz_config[_viz_1].x = 0.2367065596779881 13 | _viz_config[_viz_1].show_pairs = False 14 | _viz_config[_viz_1].height = 0.16863495082538557 15 | _viz_3 = nengo_gui.components.Pointer(model.C,target=u'default') 16 | _viz_config[_viz_3].label_visible = True 17 | _viz_config[_viz_3].width = 0.10065929845409391 18 | _viz_config[_viz_3].y = 0.7784079588321611 19 | _viz_config[_viz_3].x = 0.4879404586551155 20 | _viz_config[_viz_3].show_pairs = False 21 | _viz_config[_viz_3].height = 0.15636973180076635 22 | _viz_4 = nengo_gui.components.Pointer(model.D,target=u'default') 23 | _viz_config[_viz_4].label_visible = True 24 | _viz_config[_viz_4].width = 0.09116050017129158 25 | _viz_config[_viz_4].y = 0.1621788538873176 26 | _viz_config[_viz_4].x = 0.8874971787276077 27 | _viz_config[_viz_4].show_pairs = False 28 | _viz_config[_viz_4].height = 0.14907248560343977 29 | _viz_5 = nengo_gui.components.Pointer(model.E,target=u'default') 30 | _viz_config[_viz_5].label_visible = True 31 | _viz_config[_viz_5].width = 0.0917197670435081 32 | _viz_config[_viz_5].y = 0.5248492561658696 33 | _viz_config[_viz_5].x = 0.8882072829131656 34 | _viz_config[_viz_5].show_pairs = False 35 | _viz_config[_viz_5].height = 0.15324233716475102 36 | _viz_ace_editor = nengo_gui.components.AceEditor() 37 | _viz_net_graph = nengo_gui.components.NetGraph() 38 | _viz_sim_control = nengo_gui.components.SimControl() 39 | _viz_config[_viz_sim_control].kept_time = 4.0 40 | _viz_config[_viz_sim_control].shown_time = 0.5 41 | _viz_config[model].pos=(0.06618191161356668, 0.04434917355371937) 42 | _viz_config[model].size=(0.9188361408882079, 0.9188361408882079) 43 | _viz_config[model].expanded=True 44 | _viz_config[model].has_layout=True 45 | _viz_config[model.A].pos=(0.34490054622756455, 0.09297520661157041) 46 | _viz_config[model.A].size=(0.05546822653709842, 0.06865861411315954) 47 | _viz_config[model.A].expanded=False 48 | _viz_config[model.A].has_layout=False 49 | _viz_config[model.A.state_ensembles].expanded=False 50 | _viz_config[model.A.state_ensembles].has_layout=False 51 | _viz_config[model.B].pos=(0.3443866716129709, 0.3188175460902733) 52 | _viz_config[model.B].size=(0.051871104234940214, 0.0645263827082009) 53 | _viz_config[model.B].expanded=False 54 | _viz_config[model.B].has_layout=False 55 | _viz_config[model.B.state_ensembles].expanded=False 56 | _viz_config[model.B.state_ensembles].has_layout=False 57 | _viz_config[model.C].pos=(0.3438727969983766, 0.544818817546089) 58 | _viz_config[model.C].size=(0.052384978849534206, 0.06659249841068025) 59 | _viz_config[model.C].expanded=False 60 | _viz_config[model.C].has_layout=False 61 | _viz_config[model.C.state_ensembles].expanded=False 62 | _viz_config[model.C.state_ensembles].has_layout=False 63 | _viz_config[model.D].pos=(0.6084275436793418, 0.08296249205340132) 64 | _viz_config[model.D].size=(0.0503294843117102, 0.06659249841068025) 65 | _viz_config[model.D].expanded=False 66 | _viz_config[model.D].has_layout=False 67 | _viz_config[model.D.networks[1]].expanded=False 68 | _viz_config[model.D.networks[1]].has_layout=False 69 | _viz_config[model.D.networks[1].product].expanded=False 70 | _viz_config[model.D.networks[1].product].has_layout=False 71 | _viz_config[model.D.networks[1].product.sq1].expanded=False 72 | _viz_config[model.D.networks[1].product.sq1].has_layout=False 73 | _viz_config[model.D.networks[1].product.sq2].expanded=False 74 | _viz_config[model.D.networks[1].product.sq2].has_layout=False 75 | _viz_config[model.D.state_ensembles].expanded=False 76 | _viz_config[model.D.state_ensembles].has_layout=False 77 | _viz_config[model.E].pos=(0.6101200048364678, 0.5392561983471068) 78 | _viz_config[model.E].size=(0.04878786046792809, 0.06039415130324222) 79 | _viz_config[model.E].expanded=False 80 | _viz_config[model.E].has_layout=False 81 | _viz_config[model.E.networks[1]].expanded=False 82 | _viz_config[model.E.networks[1]].has_layout=False 83 | _viz_config[model.E.networks[1].product].expanded=False 84 | _viz_config[model.E.networks[1].product].has_layout=False 85 | _viz_config[model.E.networks[1].product.sq1].expanded=False 86 | _viz_config[model.E.networks[1].product.sq1].has_layout=False 87 | _viz_config[model.E.networks[1].product.sq2].expanded=False 88 | _viz_config[model.E.networks[1].product.sq2].has_layout=False 89 | _viz_config[model.E.state_ensembles].expanded=False 90 | _viz_config[model.E.state_ensembles].has_layout=False 91 | _viz_config[model.cortical].pos=(0.9342240493319636, 0.8976478067387137) 92 | _viz_config[model.cortical].size=(0.041829393627954486, 0.045931341385886844) 93 | _viz_config[model.cortical].expanded=False 94 | _viz_config[model.cortical].has_layout=False 95 | _viz_config[model.input].pos=(0.06937307493047089, 0.32859186268277213) 96 | _viz_config[model.input].size=(0.05775950864064583, 0.06762555626191986) 97 | _viz_config[model.input].expanded=False 98 | _viz_config[model.input].has_layout=True -------------------------------------------------------------------------------- /chapter6/learn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter6/learn.png -------------------------------------------------------------------------------- /chapter6/learn.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_0 = nengo_gui.components.Value(pre) 2 | _viz_config[_viz_0].label_visible = True 3 | _viz_config[_viz_0].width = 0.10277492291880781 4 | _viz_config[_viz_0].x = 0.8823508707710895 5 | _viz_config[_viz_0].y = 0.23846098757474785 6 | _viz_config[_viz_0].max_value = 1 7 | _viz_config[_viz_0].min_value = -1 8 | _viz_config[_viz_0].height = 0.19157088122605365 9 | _viz_1 = nengo_gui.components.Value(post) 10 | _viz_config[_viz_1].label_visible = True 11 | _viz_config[_viz_1].width = 0.10277492291880781 12 | _viz_config[_viz_1].x = 0.8870531754635435 13 | _viz_config[_viz_1].y = 0.6628352490421462 14 | _viz_config[_viz_1].max_value = 1 15 | _viz_config[_viz_1].min_value = -1 16 | _viz_config[_viz_1].height = 0.19157088122605365 17 | _viz_2 = nengo_gui.components.Value(input) 18 | _viz_config[_viz_2].label_visible = True 19 | _viz_config[_viz_2].width = 0.10277492291880781 20 | _viz_config[_viz_2].x = 0.1602796041053653 21 | _viz_config[_viz_2].y = 0.7003795609983174 22 | _viz_config[_viz_2].max_value = 1 23 | _viz_config[_viz_2].min_value = -1 24 | _viz_config[_viz_2].height = 0.19157088122605365 25 | _viz_3 = nengo_gui.components.Value(actual_error) 26 | _viz_config[_viz_3].label_visible = True 27 | _viz_config[_viz_3].width = 0.09455292908530319 28 | _viz_config[_viz_3].x = 0.6260193447378252 29 | _viz_config[_viz_3].y = 0.6822967021162294 30 | _viz_config[_viz_3].max_value = 1 31 | _viz_config[_viz_3].min_value = -1 32 | _viz_config[_viz_3].height = 0.19157088122605365 33 | _viz_4 = nengo_gui.components.Value(error) 34 | _viz_config[_viz_4].label_visible = True 35 | _viz_config[_viz_4].width = 0.10277492291880781 36 | _viz_config[_viz_4].x = 0.629651663931397 37 | _viz_config[_viz_4].y = 0.26229097289361497 38 | _viz_config[_viz_4].max_value = 1 39 | _viz_config[_viz_4].min_value = -1 40 | _viz_config[_viz_4].height = 0.19157088122605365 41 | _viz_ace_editor = nengo_gui.components.AceEditor() 42 | _viz_net_graph = nengo_gui.components.NetGraph() 43 | _viz_sim_control = nengo_gui.components.SimControl() 44 | _viz_config[_viz_sim_control].kept_time = 4.0 45 | _viz_config[_viz_sim_control].shown_time = 0.5 46 | _viz_config[actual_error].pos=(0.4537512846865371, 0.08422800648798665) 47 | _viz_config[actual_error].size=(0.33333333333333337, 0.04672897196261683) 48 | _viz_config[error].pos=(0.2425840149797967, 0.4081061249710355) 49 | _viz_config[error].size=(0.0684931506849315, 0.04672897196261682) 50 | _viz_config[inhibit].pos=(0.0761942266050078, 0.41103151309183605) 51 | _viz_config[inhibit].size=(0.05325289278361091, 0.03841623542133313) 52 | _viz_config[input].pos=(0.07259710822340168, 0.08695064493705107) 53 | _viz_config[input].size=(0.0547945205479452, 0.037383177570093455) 54 | _viz_config[model].pos=(0.014825216037169575, 0.028963141346166732) 55 | _viz_config[model].size=(0.9710184154213823, 0.9710184154213823) 56 | _viz_config[model].expanded=True 57 | _viz_config[model].has_layout=True 58 | _viz_config[post].pos=(0.47015303608385367, 0.4124121418089128) 59 | _viz_config[post].size=(0.0684931506849315, 0.04672897196261682) 60 | _viz_config[pre].pos=(0.30409410240887524, 0.08695064493705107) 61 | _viz_config[pre].size=(0.0684931506849315, 0.04672897196261682) -------------------------------------------------------------------------------- /chapter7/spa_sequence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter7/spa_sequence.png -------------------------------------------------------------------------------- /chapter7/spa_sequence.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_0 = nengo_gui.components.SpaSimilarity(model.state,target='default') 2 | _viz_config[_viz_0].max_value = 1.5 3 | _viz_config[_viz_0].min_value = -1.5 4 | _viz_config[_viz_0].height = 0.2011106118993978 5 | _viz_config[_viz_0].label_visible = True 6 | _viz_config[_viz_0].width = 0.16147473946541724 7 | _viz_config[_viz_0].y = 0.2828746596127453 8 | _viz_config[_viz_0].x = 0.761284621875361 9 | _viz_config[_viz_0].show_pairs = False 10 | _viz_1 = nengo_gui.components.Pointer(model.state,target='default') 11 | _viz_config[_viz_1].label_visible = True 12 | _viz_config[_viz_1].width = 0.10277491899825564 13 | _viz_config[_viz_1].y = 0.21940852490421378 14 | _viz_config[_viz_1].x = 0.20677867643773162 15 | _viz_config[_viz_1].show_pairs = False 16 | _viz_config[_viz_1].height = 0.1810344827586207 17 | _viz_2 = nengo_gui.components.Value(model.thal.actions) 18 | _viz_config[_viz_2].label_visible = True 19 | _viz_config[_viz_2].width = 0.16392600205549845 20 | _viz_config[_viz_2].x = 0.7651804655932694 21 | _viz_config[_viz_2].y = 0.6852512839541285 22 | _viz_config[_viz_2].max_value = 1 23 | _viz_config[_viz_2].min_value = -1 24 | _viz_config[_viz_2].height = 0.19157088122605365 25 | _viz_ace_editor = nengo_gui.components.AceEditor() 26 | _viz_net_graph = nengo_gui.components.NetGraph() 27 | _viz_sim_control = nengo_gui.components.SimControl() 28 | _viz_config[_viz_sim_control].kept_time = 4.0 29 | _viz_config[_viz_sim_control].shown_time = 0.5 30 | _viz_config[model].pos=(0.0062481804100234985, -0.004654349497230245) 31 | _viz_config[model].size=(1.002202311510873, 1.002202311510873) 32 | _viz_config[model].expanded=True 33 | _viz_config[model].has_layout=True 34 | _viz_config[model.BG].pos=(0.4033022029581308, 0.21080836776859493) 35 | _viz_config[model.BG].size=(0.07667902944724964, 0.140754132231405) 36 | _viz_config[model.BG].expanded=False 37 | _viz_config[model.BG].has_layout=True 38 | _viz_config[model.BG.bias].pos=(0.5, 0.04918032786885246) 39 | _viz_config[model.BG.bias].size=(0.3076923076923077, 0.021857923497267756) 40 | _viz_config[model.BG.gpe].pos=(0.5826447223220307, 0.4918032786885246) 41 | _viz_config[model.BG.gpe].size=(-9.422285723002799e-08, 0.10928961748633878) 42 | _viz_config[model.BG.gpe].expanded=False 43 | _viz_config[model.BG.gpe].has_layout=False 44 | _viz_config[model.BG.gpi].pos=(0.9173553719008265, 0.23138689427810097) 45 | _viz_config[model.BG.gpi].size=(0.08264462809917354, 0.10928961748633878) 46 | _viz_config[model.BG.gpi].expanded=False 47 | _viz_config[model.BG.gpi].has_layout=False 48 | _viz_config[model.BG.input].pos=(0.053719008264462804, 0.53551912568306) 49 | _viz_config[model.BG.input].size=(0.033057851239669415, 0.02185792349726776) 50 | _viz_config[model.BG.output].pos=(0.9462809917355373, 0.53551912568306) 51 | _viz_config[model.BG.output].size=(0.033057851239669415, 0.02185792349726776) 52 | _viz_config[model.BG.stn].pos=(0.08264462809917354, 0.10928961748633878) 53 | _viz_config[model.BG.stn].size=(0.08264462809917354, 0.10928961748633878) 54 | _viz_config[model.BG.stn].expanded=False 55 | _viz_config[model.BG.stn].has_layout=False 56 | _viz_config[model.BG.strD1].pos=(0.25206611570247933, 0.9726776298078822) 57 | _viz_config[model.BG.strD1].size=(0.08264462809917354, -3.417946700667862e-08) 58 | _viz_config[model.BG.strD1].expanded=False 59 | _viz_config[model.BG.strD1].has_layout=False 60 | _viz_config[model.BG.strD2].pos=(0.07378029099742638, 0.42973400171611786) 61 | _viz_config[model.BG.strD2].size=(0.07378029099742638, 0.10928961748633878) 62 | _viz_config[model.BG.strD2].expanded=False 63 | _viz_config[model.BG.strD2].has_layout=False 64 | _viz_config[model.input].pos=(0.10201528218419052, 0.6559271694214867) 65 | _viz_config[model.input].size=(0.08027615174940791, 0.143853305785124) 66 | _viz_config[model.input].expanded=False 67 | _viz_config[model.input].has_layout=True 68 | _viz_config[model.input.nodes[0]].pos=(0.5, 0.5) 69 | _viz_config[model.input.nodes[0]].size=(0.3076923076923077, 0.2222222222222222) 70 | _viz_config[model.state].pos=(0.3104696367129898, 0.6559271694214875) 71 | _viz_config[model.state].size=(0.081303900978596, 0.14591942148760334) 72 | _viz_config[model.state].expanded=False 73 | _viz_config[model.state].has_layout=True 74 | _viz_config[model.state.input].pos=(0.12745098039215685, 0.5) 75 | _viz_config[model.state.input].size=(0.07843137254901959, 0.2) 76 | _viz_config[model.state.output].pos=(0.872549019607843, 0.5) 77 | _viz_config[model.state.output].size=(0.07843137254901959, 0.2) 78 | _viz_config[model.state.state_ensembles].pos=(0.5, 0.5) 79 | _viz_config[model.state.state_ensembles].size=(0.4, 0.4) 80 | _viz_config[model.state.state_ensembles].expanded=False 81 | _viz_config[model.state.state_ensembles].has_layout=True 82 | _viz_config[model.state.state_ensembles.ea_ensembles[0]].pos=(0.49999999999999994, 0.5) 83 | _viz_config[model.state.state_ensembles.ea_ensembles[0]].size=(0.09803921568627451, 0.25) 84 | _viz_config[model.thal].pos=(0.5084677599535294, 0.6559271694214878) 85 | _viz_config[model.thal].size=(0.07308190714509136, 0.13558884297520668) 86 | _viz_config[model.thal].expanded=False 87 | _viz_config[model.thal].has_layout=True 88 | _viz_config[model.thal.actions].pos=(0.7093023255813954, 0.47355371900826443) 89 | _viz_config[model.thal.actions].size=(0.23255813953488372, 0.4) 90 | _viz_config[model.thal.actions].expanded=False 91 | _viz_config[model.thal.actions].has_layout=False 92 | _viz_config[model.thal.bias].pos=(0.1511627906976744, 0.5) 93 | _viz_config[model.thal.bias].size=(0.09302325581395349, 0.08) -------------------------------------------------------------------------------- /chapter7/spa_sequencerouted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter7/spa_sequencerouted.png -------------------------------------------------------------------------------- /chapter7/spa_sequencerouted.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_0 = nengo_gui.components.SpaSimilarity(model.vision,target='default') 2 | _viz_config[_viz_0].max_value = 1.5 3 | _viz_config[_viz_0].min_value = -1.5 4 | _viz_config[_viz_0].height = 0.19157088122605365 5 | _viz_config[_viz_0].label_visible = True 6 | _viz_config[_viz_0].width = 0.10277492291880781 7 | _viz_config[_viz_0].y = 0.5447621717596485 8 | _viz_config[_viz_0].x = 0.11952014742885458 9 | _viz_config[_viz_0].show_pairs = False 10 | _viz_2 = nengo_gui.components.Value(model.thal.actions) 11 | _viz_config[_viz_2].label_visible = True 12 | _viz_config[_viz_2].width = 0.14388489208633093 13 | _viz_config[_viz_2].x = 0.7424433010598622 14 | _viz_config[_viz_2].y = 0.6896531719813526 15 | _viz_config[_viz_2].max_value = 1 16 | _viz_config[_viz_2].min_value = -1 17 | _viz_config[_viz_2].height = 0.19061302681992337 18 | _viz_3 = nengo_gui.components.SpaSimilarity(model.state,target='default') 19 | _viz_config[_viz_3].max_value = 1.5 20 | _viz_config[_viz_3].min_value = -1.5 21 | _viz_config[_viz_3].height = 0.19157088122605365 22 | _viz_config[_viz_3].label_visible = True 23 | _viz_config[_viz_3].width = 0.14388489208633093 24 | _viz_config[_viz_3].y = 0.29394449116905036 25 | _viz_config[_viz_3].x = 0.7385441400574131 26 | _viz_config[_viz_3].show_pairs = False 27 | _viz_4 = nengo_gui.components.Pointer(model.state,target='default') 28 | _viz_config[_viz_4].label_visible = True 29 | _viz_config[_viz_4].width = 0.10277492291880781 30 | _viz_config[_viz_4].y = 0.7173161386786306 31 | _viz_config[_viz_4].x = 0.4548853528015069 32 | _viz_config[_viz_4].show_pairs = False 33 | _viz_config[_viz_4].height = 0.19157088122605365 34 | _viz_ace_editor = nengo_gui.components.AceEditor() 35 | _viz_net_graph = nengo_gui.components.NetGraph() 36 | _viz_sim_control = nengo_gui.components.SimControl() 37 | _viz_config[_viz_sim_control].kept_time = 4.0 38 | _viz_config[_viz_sim_control].shown_time = 0.5 39 | _viz_config[model].pos=(0.013199333249380496, 0.002290375911468301) 40 | _viz_config[model].size=(0.9878139248359064, 0.9878139248359064) 41 | _viz_config[model].expanded=True 42 | _viz_config[model].has_layout=True 43 | _viz_config[model.BG].pos=(0.41964064216607105, 0.41470973594033433) 44 | _viz_config[model.BG].size=(0.04481341035545945, 0.0775297319088894) 45 | _viz_config[model.BG].expanded=False 46 | _viz_config[model.BG].has_layout=True 47 | _viz_config[model.BG.bias].pos=(0.5, 0.9403973509933775) 48 | _viz_config[model.BG.bias].size=(0.3076923076923077, 0.026490066225165587) 49 | _viz_config[model.BG.gpe].pos=(0.4006622516556292, 0.16556291390728478) 50 | _viz_config[model.BG.gpe].size=(0.06622516556291391, 0.13245033112582782) 51 | _viz_config[model.BG.gpe].expanded=False 52 | _viz_config[model.BG.gpe].has_layout=False 53 | _viz_config[model.BG.gpi].pos=(0.7980132450331127, 0.456953642384106) 54 | _viz_config[model.BG.gpi].size=(0.06622516556291391, 0.13245033112582782) 55 | _viz_config[model.BG.gpi].expanded=False 56 | _viz_config[model.BG.gpi].has_layout=False 57 | _viz_config[model.BG.input].pos=(0.04304635761589404, 0.456953642384106) 58 | _viz_config[model.BG.input].size=(0.026490066225165563, 0.026490066225165566) 59 | _viz_config[model.BG.output].pos=(0.9569536423841061, 0.456953642384106) 60 | _viz_config[model.BG.output].size=(0.026490066225165563, 0.026490066225165566) 61 | _viz_config[model.BG.stn].pos=(0.5993377483443708, 0.456953642384106) 62 | _viz_config[model.BG.stn].size=(0.06622516556291391, 0.13245033112582782) 63 | _viz_config[model.BG.stn].expanded=False 64 | _viz_config[model.BG.stn].has_layout=False 65 | _viz_config[model.BG.strD1].pos=(0.20198675496688742, 0.7483443708609272) 66 | _viz_config[model.BG.strD1].size=(0.06622516556291391, 0.13245033112582782) 67 | _viz_config[model.BG.strD1].expanded=False 68 | _viz_config[model.BG.strD1].has_layout=False 69 | _viz_config[model.BG.strD2].pos=(0.20198675496688742, 0.16556291390728478) 70 | _viz_config[model.BG.strD2].size=(0.06622516556291391, 0.13245033112582782) 71 | _viz_config[model.BG.strD2].expanded=False 72 | _viz_config[model.BG.strD2].has_layout=False 73 | _viz_config[model.input].pos=(0.06513803735336851, 0.134725861721427) 74 | _viz_config[model.input].size=(0.04789665804302368, 0.07959584761136873) 75 | _viz_config[model.input].expanded=False 76 | _viz_config[model.input].has_layout=False 77 | _viz_config[model.state].pos=(0.3314491264131551, 0.14004233017536782) 78 | _viz_config[model.state].size=(0.0453272849700535, 0.08062890546260837) 79 | _viz_config[model.state].expanded=False 80 | _viz_config[model.state].has_layout=False 81 | _viz_config[model.state.networks[1]].expanded=False 82 | _viz_config[model.state.networks[1]].has_layout=False 83 | _viz_config[model.state.state_ensembles].expanded=False 84 | _viz_config[model.state.state_ensembles].has_layout=False 85 | _viz_config[model.thal].pos=(0.4841939256476615, 0.13575891957266695) 86 | _viz_config[model.thal].size=(0.04635503419924156, 0.0744305583551704) 87 | _viz_config[model.thal].expanded=False 88 | _viz_config[model.thal].has_layout=True 89 | _viz_config[model.thal.actions].pos=(0.7093023255813954, 0.5) 90 | _viz_config[model.thal.actions].size=(0.23255813953488372, 0.4) 91 | _viz_config[model.thal.actions].expanded=False 92 | _viz_config[model.thal.actions].has_layout=False 93 | _viz_config[model.thal.bias].pos=(0.1511627906976744, 0.5) 94 | _viz_config[model.thal.bias].size=(0.09302325581395349, 0.08) 95 | _viz_config[model.vision].pos=(0.1964950207321828, 0.1367919774239068) 96 | _viz_config[model.vision].size=(0.04738278342842964, 0.08166196331384809) 97 | _viz_config[model.vision].expanded=False 98 | _viz_config[model.vision].has_layout=False 99 | _viz_config[model.vision.state_ensembles].expanded=False 100 | _viz_config[model.vision.state_ensembles].has_layout=False -------------------------------------------------------------------------------- /chapter7/spa_sequencerouted_cleanup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter7/spa_sequencerouted_cleanup.png -------------------------------------------------------------------------------- /chapter7/spa_sequencerouted_cleanup.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_1 = nengo_gui.components.SpaSimilarity(model.vision,target='default') 2 | _viz_config[_viz_1].max_value = 1.5 3 | _viz_config[_viz_1].min_value = -1.5 4 | _viz_config[_viz_1].height = 0.17528734170614077 5 | _viz_config[_viz_1].label_visible = True 6 | _viz_config[_viz_1].width = 0.09198355895274714 7 | _viz_config[_viz_1].y = 0.45604206290140115 8 | _viz_config[_viz_1].x = 0.10564553283481573 9 | _viz_config[_viz_1].show_pairs = False 10 | _viz_2 = nengo_gui.components.Pointer(model.state,target='default') 11 | _viz_config[_viz_2].label_visible = True 12 | _viz_config[_viz_2].width = 0.08633093525179858 13 | _viz_config[_viz_2].y = 0.8041222194658079 14 | _viz_config[_viz_2].x = 0.11058936102349673 15 | _viz_config[_viz_2].show_pairs = False 16 | _viz_config[_viz_2].height = 0.15996168582375483 17 | _viz_3 = nengo_gui.components.SpaSimilarity(model.state,target='default') 18 | _viz_config[_viz_3].max_value = 1.5 19 | _viz_config[_viz_3].min_value = -1.5 20 | _viz_config[_viz_3].height = 0.19157088122605367 21 | _viz_config[_viz_3].label_visible = True 22 | _viz_config[_viz_3].width = 0.13206577595066807 23 | _viz_config[_viz_3].y = 0.3051571602201673 24 | _viz_config[_viz_3].x = 0.76516681217333 25 | _viz_config[_viz_3].show_pairs = False 26 | _viz_4 = nengo_gui.components.Value(model.thal.actions) 27 | _viz_config[_viz_4].label_visible = True 28 | _viz_config[_viz_4].width = 0.14080164439876675 29 | _viz_config[_viz_4].x = 0.4283120228338628 30 | _viz_config[_viz_4].y = 0.7549168776084366 31 | _viz_config[_viz_4].max_value = 1 32 | _viz_config[_viz_4].min_value = -1 33 | _viz_config[_viz_4].height = 0.19157088122605367 34 | _viz_6 = nengo_gui.components.Value(model.cleanup.state_ensembles) 35 | _viz_config[_viz_6].label_visible = True 36 | _viz_config[_viz_6].width = 0.13155190133607403 37 | _viz_config[_viz_6].x = 0.7677099395024414 38 | _viz_config[_viz_6].y = 0.7126358170233856 39 | _viz_config[_viz_6].max_value = 1 40 | _viz_config[_viz_6].min_value = -1 41 | _viz_config[_viz_6].height = 0.19157086661035536 42 | _viz_ace_editor = nengo_gui.components.AceEditor() 43 | _viz_net_graph = nengo_gui.components.NetGraph() 44 | _viz_sim_control = nengo_gui.components.SimControl() 45 | _viz_config[_viz_sim_control].kept_time = 4.0 46 | _viz_config[_viz_sim_control].shown_time = 0.5 47 | _viz_config[model].pos=(0.003556988143897571, -0.04903307050738465) 48 | _viz_config[model].size=(0.9999999999999998, 0.9999999999999998) 49 | _viz_config[model].expanded=True 50 | _viz_config[model].has_layout=True 51 | _viz_config[model.BG].pos=(0.3769890491547653, 0.43486533087579443) 52 | _viz_config[model.BG].size=(0.049438281886805796, 0.0678102146382068) 53 | _viz_config[model.BG].expanded=False 54 | _viz_config[model.BG].has_layout=False 55 | _viz_config[model.BG.gpe].expanded=False 56 | _viz_config[model.BG.gpe].has_layout=False 57 | _viz_config[model.BG.gpi].expanded=False 58 | _viz_config[model.BG.gpi].has_layout=False 59 | _viz_config[model.BG.stn].expanded=False 60 | _viz_config[model.BG.stn].has_layout=False 61 | _viz_config[model.BG.strD1].expanded=False 62 | _viz_config[model.BG.strD1].has_layout=False 63 | _viz_config[model.BG.strD2].expanded=False 64 | _viz_config[model.BG.strD2].has_layout=False 65 | _viz_config[model.cleanup].pos=(0.5491370450437706, 0.1715396278018907) 66 | _viz_config[model.cleanup].size=(0.04995215650139985, 0.06264492538200847) 67 | _viz_config[model.cleanup].expanded=False 68 | _viz_config[model.cleanup].has_layout=True 69 | _viz_config[model.cleanup.input].pos=(0.12745098039215685, 0.5) 70 | _viz_config[model.cleanup.input].size=(0.07843137254901959, 0.2) 71 | _viz_config[model.cleanup.output].pos=(0.872549019607843, 0.5) 72 | _viz_config[model.cleanup.output].size=(0.07843137254901959, 0.2) 73 | _viz_config[model.cleanup.state_ensembles].pos=(0.5, 0.5) 74 | _viz_config[model.cleanup.state_ensembles].size=(0.4, 0.4) 75 | _viz_config[model.cleanup.state_ensembles].expanded=False 76 | _viz_config[model.cleanup.state_ensembles].has_layout=True 77 | _viz_config[model.cleanup.state_ensembles.ea_ensembles[0]].pos=(0.49999999999999994, 0.5) 78 | _viz_config[model.cleanup.state_ensembles.ea_ensembles[0]].size=(0.09803921568627451, 0.25) 79 | _viz_config[model.input].pos=(0.0677074104263387, 0.16838842975206608) 80 | _viz_config[model.input].size=(0.049438281886805796, 0.06884327248944647) 81 | _viz_config[model.input].expanded=False 82 | _viz_config[model.input].has_layout=False 83 | _viz_config[model.state].pos=(0.38540596094552915, 0.17499554075747686) 84 | _viz_config[model.state].size=(0.05406315341815217, 0.07400856174564482) 85 | _viz_config[model.state].expanded=False 86 | _viz_config[model.state].has_layout=False 87 | _viz_config[model.state.networks[1]].expanded=False 88 | _viz_config[model.state.networks[1]].has_layout=False 89 | _viz_config[model.state.state_ensembles].expanded=False 90 | _viz_config[model.state.state_ensembles].has_layout=False 91 | _viz_config[model.thal].pos=(0.5617889924513606, 0.3859548724656638) 92 | _viz_config[model.thal].size=(0.044813410355459445, 0.06057880967952914) 93 | _viz_config[model.thal].expanded=False 94 | _viz_config[model.thal].has_layout=True 95 | _viz_config[model.thal.actions].pos=(0.7093023255813954, 0.5) 96 | _viz_config[model.thal.actions].size=(0.23255813953488372, 0.4) 97 | _viz_config[model.thal.actions].expanded=False 98 | _viz_config[model.thal.actions].has_layout=False 99 | _viz_config[model.thal.bias].pos=(0.1511627906976744, 0.5) 100 | _viz_config[model.thal.bias].size=(0.09302325581395349, 0.08) 101 | _viz_config[model.vision].pos=(0.21602225608675646, 0.16528925619834742) 102 | _viz_config[model.vision].size=(0.052521529574370035, 0.06987633034068616) 103 | _viz_config[model.vision].expanded=False 104 | _viz_config[model.vision].has_layout=False 105 | _viz_config[model.vision.state_ensembles].expanded=False 106 | _viz_config[model.vision.state_ensembles].has_layout=False -------------------------------------------------------------------------------- /chapter7/spa_sequencerouted_cleanupAll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter7/spa_sequencerouted_cleanupAll.png -------------------------------------------------------------------------------- /chapter7/spa_sequencerouted_cleanupAll.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_0 = nengo_gui.components.Value(model.cleanup.state_ensembles) 2 | _viz_config[_viz_0].label_visible = True 3 | _viz_config[_viz_0].width = 0.14953751284686537 4 | _viz_config[_viz_0].x = 0.7089837766253958 5 | _viz_config[_viz_0].y = 0.8504851291914297 6 | _viz_config[_viz_0].max_value = 1 7 | _viz_config[_viz_0].min_value = -1 8 | _viz_config[_viz_0].height = 0.19157088487997823 9 | _viz_1 = nengo_gui.components.Pointer(model.state,target='default') 10 | _viz_config[_viz_1].label_visible = True 11 | _viz_config[_viz_1].width = 0.10431654676258993 12 | _viz_config[_viz_1].y = 0.8878200968580258 13 | _viz_config[_viz_1].x = 0.40678314491264195 14 | _viz_config[_viz_1].show_pairs = False 15 | _viz_config[_viz_1].height = 0.1772030651340996 16 | _viz_2 = nengo_gui.components.SpaSimilarity(model.state,target='default') 17 | _viz_config[_viz_2].max_value = 1.5 18 | _viz_config[_viz_2].min_value = -1.5 19 | _viz_config[_viz_2].height = 0.1915708885339028 20 | _viz_config[_viz_2].label_visible = True 21 | _viz_config[_viz_2].width = 0.14902363823227133 22 | _viz_config[_viz_2].y = 0.44624921563196973 23 | _viz_config[_viz_2].x = 0.7022610483042154 24 | _viz_config[_viz_2].show_pairs = False 25 | _viz_3 = nengo_gui.components.SpaSimilarity(model.vision,target='default') 26 | _viz_config[_viz_3].max_value = 1.5 27 | _viz_config[_viz_3].min_value = -1.5 28 | _viz_config[_viz_3].height = 0.18869733262336116 29 | _viz_config[_viz_3].label_visible = True 30 | _viz_config[_viz_3].width = 0.10020554592528544 31 | _viz_config[_viz_3].y = 0.6694292922603233 32 | _viz_config[_viz_3].x = 0.07440904419321655 33 | _viz_config[_viz_3].show_pairs = False 34 | _viz_ace_editor = nengo_gui.components.AceEditor() 35 | _viz_net_graph = nengo_gui.components.NetGraph() 36 | _viz_sim_control = nengo_gui.components.SimControl() 37 | _viz_config[_viz_sim_control].kept_time = 4.0 38 | _viz_config[_viz_sim_control].shown_time = 0.5 39 | _viz_config[model].pos=(0.061664953751284696, -0.19834710743801653) 40 | _viz_config[model].size=(1.0, 1.0) 41 | _viz_config[model].expanded=True 42 | _viz_config[model].has_layout=True 43 | _viz_config[model.BG].pos=(0.3109969167523124, 0.31984053078803404) 44 | _viz_config[model.BG].size=(0.03299075025693728, 0.062332673728320326) 45 | _viz_config[model.BG].expanded=False 46 | _viz_config[model.BG].has_layout=False 47 | _viz_config[model.BG.gpe].expanded=False 48 | _viz_config[model.BG.gpe].has_layout=False 49 | _viz_config[model.BG.gpi].expanded=False 50 | _viz_config[model.BG.gpi].has_layout=False 51 | _viz_config[model.BG.stn].expanded=False 52 | _viz_config[model.BG.stn].has_layout=False 53 | _viz_config[model.BG.strD1].expanded=False 54 | _viz_config[model.BG.strD1].has_layout=False 55 | _viz_config[model.BG.strD2].expanded=False 56 | _viz_config[model.BG.strD2].has_layout=False 57 | _viz_config[model.cleanup].pos=(0.4928057553956875, 0.5625800256081959) 58 | _viz_config[model.cleanup].size=(0.03658787255909556, 0.053035153067163415) 59 | _viz_config[model.cleanup].expanded=False 60 | _viz_config[model.cleanup].has_layout=True 61 | _viz_config[model.cleanup.state_ensembles].pos=(0.47501705978238673, 0.5475547319845336) 62 | _viz_config[model.cleanup.state_ensembles].size=(0.26151685393258456, -0.19478740927613758) 63 | _viz_config[model.cleanup.state_ensembles].expanded=False 64 | _viz_config[model.cleanup.state_ensembles].has_layout=False 65 | _viz_config[model.input].pos=(0.02209660842754364, 0.30638167850075654) 66 | _viz_config[model.input].size=(0.036587872559095555, 0.050969037364683986) 67 | _viz_config[model.input].expanded=False 68 | _viz_config[model.input].has_layout=False 69 | _viz_config[model.state].pos=(0.35991778006166514, 0.5636130834594341) 70 | _viz_config[model.state].size=(0.03196300102774921, 0.052002095215923666) 71 | _viz_config[model.state].expanded=False 72 | _viz_config[model.state].has_layout=False 73 | _viz_config[model.state.networks[1]].expanded=False 74 | _viz_config[model.state.networks[1]].has_layout=False 75 | _viz_config[model.state.state_ensembles].expanded=False 76 | _viz_config[model.state.state_ensembles].has_layout=False 77 | _viz_config[model.thal].pos=(0.4916752312435772, 0.32688278430916073) 78 | _viz_config[model.thal].size=(0.040184994861253834, 0.06026655802584105) 79 | _viz_config[model.thal].expanded=False 80 | _viz_config[model.thal].has_layout=True 81 | _viz_config[model.thal.actions].pos=(0.7093023255813954, 0.5) 82 | _viz_config[model.thal.actions].size=(0.23255813953488372, 0.4) 83 | _viz_config[model.thal.actions].expanded=False 84 | _viz_config[model.thal.actions].has_layout=False 85 | _viz_config[model.thal.bias].pos=(0.1511627906976744, 0.5) 86 | _viz_config[model.thal.bias].size=(0.09302325581395349, 0.08) 87 | _viz_config[model.vision].pos=(0.14727646454265148, 0.3094808520544763) 88 | _viz_config[model.vision].size=(0.036587872559095555, 0.05200209521592365) 89 | _viz_config[model.vision].expanded=False 90 | _viz_config[model.vision].has_layout=True 91 | _viz_config[model.vision.state_ensembles].expanded=False 92 | _viz_config[model.vision.state_ensembles].has_layout=False -------------------------------------------------------------------------------- /chapter8/2D_decision_integrator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/s72sue/Nengo2-Tutorials/8edef94a7d170b0dc467178b74c09259ba146edd/chapter8/2D_decision_integrator.png -------------------------------------------------------------------------------- /chapter8/2D_decision_integrator.py.cfg: -------------------------------------------------------------------------------- 1 | _viz_config[LIP].pos=(0.49361248328526175, 0.4979338842975206) 2 | _viz_config[LIP].size=(0.03186022610483053, 0.06404958677685973) 3 | _viz_config[MT].pos=(0.37105615047132795, 0.49999999999999994) 4 | _viz_config[MT].size=(0.03186022610483042, 0.0640495867768595) 5 | _viz_0 = nengo_gui.components.Value(MT) 6 | _viz_config[_viz_0].label_visible = True 7 | _viz_config[_viz_0].width = 0.10277492291880781 8 | _viz_config[_viz_0].x = 0.27168495618251925 9 | _viz_config[_viz_0].y = 0.8922205563884715 10 | _viz_config[_viz_0].max_value = 1 11 | _viz_config[_viz_0].min_value = -1 12 | _viz_config[_viz_0].height = 0.19157088122605365 13 | _viz_1 = nengo_gui.components.Value(LIP) 14 | _viz_config[_viz_1].label_visible = True 15 | _viz_config[_viz_1].width = 0.10277492291880781 16 | _viz_config[_viz_1].x = 0.46412823658124297 17 | _viz_config[_viz_1].y = 0.9019653396442275 18 | _viz_config[_viz_1].max_value = 1 19 | _viz_config[_viz_1].min_value = -1 20 | _viz_config[_viz_1].height = 0.19157088122605365 21 | _viz_2 = nengo_gui.components.Value(output) 22 | _viz_config[_viz_2].label_visible = True 23 | _viz_config[_viz_2].width = 0.10277492291880781 24 | _viz_config[_viz_2].x = 0.8950093381515972 25 | _viz_config[_viz_2].y = 0.8943025043951867 26 | _viz_config[_viz_2].max_value = 1 27 | _viz_config[_viz_2].min_value = -1 28 | _viz_config[_viz_2].height = 0.19157088122605365 29 | _viz_3 = nengo_gui.components.Value(input) 30 | _viz_config[_viz_3].label_visible = True 31 | _viz_config[_viz_3].width = 0.10277492291880781 32 | _viz_config[_viz_3].x = 0.8921913160715659 33 | _viz_config[_viz_3].y = 0.4575208951997833 34 | _viz_config[_viz_3].max_value = 1 35 | _viz_config[_viz_3].min_value = -1 36 | _viz_config[_viz_3].height = 0.19157088122605365 37 | _viz_4 = nengo_gui.components.Slider(input2) 38 | _viz_config[_viz_4].label_visible = True 39 | _viz_config[_viz_4].width = 0.05138745753885173 40 | _viz_config[_viz_4].x = 0.09234824122268995 41 | _viz_config[_viz_4].y = 0.37772745858475576 42 | _viz_config[_viz_4].max_value = 1 43 | _viz_config[_viz_4].min_value = -1 44 | _viz_config[_viz_4].height = 0.1168582412018173 45 | _viz_5 = nengo_gui.components.Slider(input1) 46 | _viz_config[_viz_5].label_visible = True 47 | _viz_config[_viz_5].width = 0.05137943216855087 48 | _viz_config[_viz_5].x = 0.09440373968106619 49 | _viz_config[_viz_5].y = 0.728363951632998 50 | _viz_config[_viz_5].max_value = 1 51 | _viz_config[_viz_5].min_value = -1 52 | _viz_config[_viz_5].height = 0.11781609195402298 53 | _viz_6 = nengo_gui.components.Raster(output) 54 | _viz_config[_viz_6].label_visible = True 55 | _viz_config[_viz_6].width = 0.10277492291880781 56 | _viz_config[_viz_6].x = 0.6768060206212888 57 | _viz_config[_viz_6].y = 0.901530983819388 58 | _viz_config[_viz_6].height = 0.19157088122605365 59 | _viz_ace_editor = nengo_gui.components.AceEditor() 60 | _viz_net_graph = nengo_gui.components.NetGraph() 61 | _viz_sim_control = nengo_gui.components.SimControl() 62 | _viz_config[_viz_sim_control].kept_time = 4.0 63 | _viz_config[_viz_sim_control].shown_time = 0.5 64 | _viz_config[input].pos=(0.2443888207406425, 0.49999999999999994) 65 | _viz_config[input].size=(0.03597122302158273, 0.07231404958677685) 66 | _viz_config[input1].pos=(0.09353070538960541, 0.7723230326985265) 67 | _viz_config[input1].size=(0.05739924189680516, 0.13757635644987412) 68 | _viz_config[input2].pos=(0.09147520497095317, 0.39399928135106055) 69 | _viz_config[input2].size=(0.057399239936529074, 0.13241106719367576) 70 | _viz_config[model].pos=(-0.008221993833504625, -0.21694214876033055) 71 | _viz_config[model].size=(1.0, 1.0) 72 | _viz_config[model].expanded=True 73 | _viz_config[model].has_layout=True 74 | _viz_config[output].pos=(0.6398070483705184, 0.5000000000000002) 75 | _viz_config[output].size=(0.030832476875642518, 0.06198347107438052) --------------------------------------------------------------------------------