From bb9b3785455bcaa722deed5ad45f7a723a2ffac4 Mon Sep 17 00:00:00 2001 From: Roger Labbe Date: Sun, 5 Apr 2015 21:48:14 -0700 Subject: [PATCH] Fixed train example. May not be perfect, but the checked in version is wrong so I want to get it out there ASAP. --- 02_Discrete_Bayes.ipynb | 1096 +++++++++++++++++++-------------------- experiments/train.py | 70 +-- 2 files changed, 552 insertions(+), 614 deletions(-) diff --git a/02_Discrete_Bayes.ipynb b/02_Discrete_Bayes.ipynb index d071f22..72d35c8 100644 --- a/02_Discrete_Bayes.ipynb +++ b/02_Discrete_Bayes.ipynb @@ -16,11 +16,19 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + }, { "data": { "text/html": [ @@ -244,7 +252,7 @@ "" ] }, - "execution_count": 1, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -296,7 +304,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -316,7 +324,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 34, "metadata": { "collapsed": false }, @@ -334,7 +342,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -468,7 +476,7 @@ "QmCC\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -497,7 +505,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 36, "metadata": { "collapsed": false }, @@ -539,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -588,9 +596,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 38, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": true }, "outputs": [ { @@ -731,7 +740,7 @@ "hGsAAADAEMI1AAAAYAjhGgAAADCEcA0AAAAYQrgGAAAADPk/8V36YlZV3tsAAAAASUVORK5CYII=\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -739,12 +748,12 @@ } ], "source": [ - "def update(hallway, pos_belief, measure, p_hit, p_miss):\n", - " for i in range(len(hallway)):\n", - " if hallway[i] == measure:\n", - " pos_belief[i] *= p_hit\n", + "def update(map_, belief, z, p_hit, p_miss):\n", + " for i, val in enumerate(map_):\n", + " if val == z:\n", + " belief[i] *= p_hit\n", " else:\n", - " pos_belief[i] *= p_miss\n", + " belief[i] *= p_miss\n", "\n", "pos_belief = np.array([0.2] * 10)\n", "reading = 1 # 1 is 'door'\n", @@ -764,7 +773,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 39, "metadata": { "collapsed": false }, @@ -908,7 +917,7 @@ "DQAAABhCuAYAAAAM+X9QtfQM34Hr6AAAAABJRU5ErkJggg==\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -920,18 +929,16 @@ " \"\"\" Normalize probability distribution\"\"\"\n", " prob_dist /= sum(prob_dist) \n", "\n", - "\n", - "def update(hallway, pos_belief, measure, p_hit, p_miss):\n", - " for i in range(len(hallway)):\n", - " if hallway[i] == measure:\n", - " pos_belief[i] *= p_hit\n", + "def update(map_, belief, z, p_hit, p_miss):\n", + " for i, val in enumerate(map_):\n", + " if val == z:\n", + " belief[i] *= p_hit\n", " else:\n", - " pos_belief[i] *= p_miss\n", - " normalize(pos_belief)\n", + " belief[i] *= p_miss\n", "\n", + " belief = normalize(belief)\n", "\n", "pos_belief = np.array([0.2] * 10)\n", - "reading = 1 # 1 is 'door'\n", "update(hallway, pos_belief, 1, .6, .2)\n", "\n", "print('sum =', sum(pos_belief))\n", @@ -969,7 +976,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 40, "metadata": { "collapsed": false }, @@ -1137,7 +1144,7 @@ "mIRwDQAAAJiEcA0AAACYhHANAAAAmOT/Acy9IAmRNe9yAAAAAElFTkSuQmCC\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1192,7 +1199,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 41, "metadata": { "collapsed": false }, @@ -1325,7 +1332,7 @@ "HgQAAAAASUVORK5CYII=\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1358,7 +1365,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 42, "metadata": { "collapsed": false, "scrolled": true @@ -1493,7 +1500,7 @@ "+i0u/ROBBQAAAABJRU5ErkJggg==\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1518,7 +1525,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 43, "metadata": { "collapsed": false }, @@ -1645,7 +1652,7 @@ "+i0u/ROBBQAAAABJRU5ErkJggg==\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1665,7 +1672,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 44, "metadata": { "collapsed": false }, @@ -1806,7 +1813,7 @@ "AAAAgCGEawAAAMAQwjUAAABgyP8DiED2PiJDenEAAAAASUVORK5CYII=\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1862,7 +1869,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 63, "metadata": { "collapsed": true }, @@ -1890,7 +1897,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 46, "metadata": { "collapsed": false }, @@ -1901,7 +1908,7 @@ "array([ 0.05, 0.05, 0.05, 0.05, 0.1 , 0.45, 0.1 , 0.05, 0.05, 0.05])" ] }, - "execution_count": 15, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -1923,7 +1930,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 47, "metadata": { "collapsed": false }, @@ -1934,7 +1941,7 @@ "array([ 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.1 , 0.45, 0.1 , 0.05])" ] }, - "execution_count": 16, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -1960,7 +1967,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 48, "metadata": { "collapsed": false }, @@ -1971,7 +1978,7 @@ "0.36" ] }, - "execution_count": 17, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -2002,7 +2009,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 49, "metadata": { "collapsed": false, "scrolled": true @@ -2025,7 +2032,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 50, "metadata": { "collapsed": false }, @@ -2167,7 +2174,7 @@ "fvLDXPfLFAAAAABJRU5ErkJggg==\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2190,7 +2197,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 51, "metadata": { "collapsed": false }, @@ -2333,7 +2340,7 @@ "AAAAYAjhGgAAADCEcA0AAAAYQrgGAAAADCFcAwAAAIb8P90wDhJkBIBgAAAAAElFTkSuQmCC\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2355,7 +2362,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 52, "metadata": { "collapsed": false }, @@ -2492,7 +2499,7 @@ "EK4BAAAAQwjXAAAAgCH/B3pyCq6hZg7wAAAAAElFTkSuQmCC\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2514,7 +2521,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 53, "metadata": { "collapsed": false }, @@ -2651,7 +2658,7 @@ "wBDCNQAAAGAI4RoAAAAwhHANAAAAGEK4BgAAAAz5P8inCNIrsxwuAAAAAElFTkSuQmCC\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2697,7 +2704,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 54, "metadata": { "collapsed": false }, @@ -2840,7 +2847,7 @@ "AABDCNcAAACAIf8Hla8BCkseigwAAAAASUVORK5CYII=\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2869,7 +2876,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 55, "metadata": { "collapsed": false }, @@ -3004,7 +3011,7 @@ "QmCC\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -3026,7 +3033,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 56, "metadata": { "collapsed": false }, @@ -3491,7 +3498,7 @@ "RArh4pqIiIiISCFcXBMRERERKYSLayIiIiIihfx/3pDuDjpTJXEAAAAASUVORK5CYII=\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -3542,7 +3549,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 57, "metadata": { "collapsed": false }, @@ -3678,7 +3685,7 @@ "AABDCNcAAACAIf8Hla8BCkseigwAAAAASUVORK5CYII=\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -3708,11 +3715,11 @@ "\n", "So far we have been tracking an object which is moving independently. But consider this very similar problem. I am automating a warehouse and want to use robots to collect all of the items for a customer's order. Perhaps the easiest way to do this is to have the robots travel on a train track. I want to be able to send the robot a destination and have it go correctly to that point. But train tracks and robot motors are imperfect. Wheel slippage and imperfect motors means that the robot is unlikely to travel to exactly the position you command. \n", "\n", - "So, we add sensors. Our budget is limited, and Hall sensors are cheap (they detect when proximity to magnets), so we line the track with magnets in some non-uniform pattern and put a cheap Hall sensor on the robot. You already see where this is going. The hall sensor reports whether the robot is near a magnet or not, and using the code above we can determine the position of our robot.\n", + "So, we add sensors. We can add some sort of device to help the robot determine it's position. Perhaps we mount magnets on the track every few feet, and use a Hall sensor to count how many magnets are passed. If we have counted 10 magnets then the robot should be at the 10th magnet. Of course it is possible to either miss a magnet or to count it twice, so we have to accommodate some degree of error. In any case, is should be clear that we can use the code in the previous section to track our robot since the magnet counting is very similar to doorway sensing.\n", "\n", - "But we are not done. A key lesson from the g-h filters chapter is to never throw information away. If you have information you should use it to improve your knowledge. What information are we leaving out? Well, we know what our destination is, and we know what control inputs we are feeding to the wheels of the robot at each moment in time. For example, let's say that once a second we send a movement command to the robot - move left 1 unit, move right 1 unit, or stand still. This is obviously a simplification because I am not taking acceleration into account, but I am not trying to teach control theory here. If I send the command 'move left 1 unit' I expect that in one second from now the robot will be 1 unit to the left of where it is now. But, wheels and motors are imperfect. We will assume that it never makes a mistake and goes right when told to go left, so the errors should be relatively small. Thus the robot might end up 0.9 units away, or maybe 1.2 units away. \n", + "But we are not done. A key lesson from the g-h filters chapter is to never throw information away. If you have information you should use it to improve your knowledge. What information are we leaving out? Well, we know what our destination is, and we know what control inputs we are feeding to the wheels of the robot at each moment in time. For example, let's say that once a second we send a movement command to the robot - move left 1 unit, move right 1 unit, or stand still. This is obviously a simplification because I am not taking acceleration into account, but I am not trying to teach control theory. If I send the command 'move left 1 unit' I expect that in one second from now the robot will be 1 unit to the left of where it is now. But, wheels and motors are imperfect. We will assume that it never makes a mistake and goes right when told to go left, so the errors should be relatively small. Thus the robot might end up 0.9 units away, or maybe 1.2 units away. \n", "\n", - "Now the entire solution is clear. For the dog which was moving independently we assumed that he kept moving in whatever direction he was previously moving. That is a dubious assumption for my dog! Robots are far more predictable. Instead of feeding in a dubious prediction based on assumption of behavior we will feed in the command that we sent to the robot! " + "Now the entire solution is clear. For the dog which was moving independently we assumed that he kept moving in whatever direction he was previously moving. That is a dubious assumption for my dog! Robots are far more predictable. Instead of making a dubious prediction based on assumption of behavior we will feed in the command that we sent to the robot! In other words, when we call `predict()` we will pass in the commanded movement that we gave the robot along with a kernel that describes the likelihood of" ] }, { @@ -3726,41 +3733,43 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 76, "metadata": { "collapsed": false }, "outputs": [], "source": [ - "import random\n", - "\n", "class Train(object):\n", - " \n", - " def __init__(self, track, move_error=.1, sense_error=.1, no_sense_error=.05):\n", - " self.track = track \n", + "\n", + " def __init__(self, track, kernel=[1.], sense_error=.1, no_sense_error=.05):\n", + " self.track = track\n", " self.pos = 0\n", - " self.move_error = move_error\n", + " self.kernel = kernel\n", " self.sense_error = sense_error\n", " self.no_sense_error = no_sense_error\n", - " \n", - " \n", + "\n", + "\n", " def move(self, distance=1):\n", " \"\"\" move in the specified direction with some small chance of error\"\"\"\n", + "\n", " self.pos += distance\n", - " \n", - " # insert random movement error\n", + "\n", + " # insert random movement error according to kernel\n", " r = random.random()\n", - " if r < self.move_error:\n", - " self.pos -= 1\n", - " elif r > 1 - self.move_error:\n", - " self.pos += 1\n", - " \n", - " self.pos = self.pos % len(self.track)\n", + " s = 0\n", + " offset = -(len(self.kernel) - 1) / 2\n", + " for k in self.kernel:\n", + " s += k\n", + " if r <= s:\n", + " break\n", + " offset += 1\n", + "\n", + " self.pos = (self.pos + offset) % len(self.track)\n", " return self.pos\n", - " \n", + "\n", " def sense(self):\n", " pos = self.pos\n", - " \n", + "\n", " # insert random sensor error\n", " r = random.random()\n", " if r < self.sense_error:\n", @@ -3768,24 +3777,8 @@ " pos += 1\n", " else:\n", " pos -= 1\n", - " print('sense error')\n", - " return pos\n", - "\n", - "def predict(belief, U, kernel):\n", - " N = len(belief)\n", - " kN = len(kernel)\n", - " width = int((kN - 1) / 2)\n", - " \n", - " belief_k = np.zeros(N)\n", - "\n", - " for i in range(N):\n", - " for k in range (kN):\n", - " index = (i + (width-k)-U) % N\n", - " #print(i,k,index)\n", - " belief_k[i] += belief[index] * kernel[k]\n", - "\n", - " # copy results to the belief vector using swap-copy idiom\n", - " belief, belief_k = belief_k, belief" + " print(' ***sense error***')\n", + " return pos" ] }, { @@ -3797,27 +3790,22 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 77, "metadata": { "collapsed": false }, "outputs": [], "source": [ - "def simulate(iterations, move_error, sense_error, \n", + "def simulate(iterations, kernel, sense_error, \n", " no_sense_error, move_distance,\n", " do_print=True):\n", - " track = [True, False, True, False, False,\n", - " True, False, False, False, True]\n", + " track = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "\n", " pos_belief = np.array([0.01] * 10)\n", " pos_belief[0] = .9\n", " normalize(pos_belief)\n", " \n", - " p_correct = 1 - move_error\n", - "\n", - " robot = Train(track, move_error, sense_error, no_sense_error)\n", - " kernel = [move_error/2., p_correct, move_error/2.]\n", - " print(kernel)\n", + " robot = Train(track, kernel, sense_error, no_sense_error)\n", "\n", " for i in range(iterations):\n", " robot.move(distance=move_distance)\n", @@ -3826,9 +3814,6 @@ " print('time {}: pos {}, sense {}, at magnet {}'.format(\n", " i, robot.pos, m, track[robot.pos]))\n", "\n", - " predict(pos_belief, move_distance, kernel) \n", - " if do_print:\n", - " print(' predict', pos_belief)\n", "\n", " update(track, pos_belief, m, 1. - sense_error, no_sense_error)\n", " if do_print:\n", @@ -3838,9 +3823,15 @@ " print(' predicted position is {} with confidence {:.4}%:'.format(\n", " ind, pos_belief[ind]*100))\n", "\n", + " \n", + " if i < iterations - 1:\n", + " predict(pos_belief, move_distance, kernel) \n", + " if do_print:\n", + " print(' predict', pos_belief)\n", + "\n", " bp.bar_plot(pos_belief)\n", " print()\n", - " print('final position is :', robot.pos)\n", + " print('final position i', robot.pos)\n", " i = np.argmax(pos_belief)\n", " print('predicted position is {} with confidence {:.4}%:'.format(\n", " i, pos_belief[i]*100))" @@ -3855,7 +3846,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 80, "metadata": { "collapsed": false, "scrolled": false @@ -3865,160 +3856,156 @@ "name": "stdout", "output_type": "stream", "text": [ - "[0.025, 0.95, 0.025]\n", - "time 0: pos 1, sense 1, at magnet False\n", - " predict [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " update [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " predicted position is 0 with confidence 96.43%:\n", - "time 1: pos 2, sense 2, at magnet True\n", - " predict [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " update [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " predicted position is 0 with confidence 96.43%:\n", - "sense error\n", - "time 2: pos 3, sense 2, at magnet False\n", - " predict [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " update [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " predicted position is 0 with confidence 96.43%:\n", - "time 3: pos 4, sense 4, at magnet False\n", - " predict [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " update [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " predicted position is 0 with confidence 96.43%:\n", + "time 0: pos 4.0, sense 4.0, at magnet 4\n", + " update [ 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n", + " predicted position is 4 with confidence 100.0%:\n", + " predict [ 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n", + "time 1: pos 8.0, sense 8.0, at magnet 8\n", + " update [ 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n", + " predicted position is 8 with confidence 100.0%:\n", + " predict [ 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n", + "time 2: pos 2.0, sense 2.0, at magnet 2\n", + " update [ 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n", + " predicted position is 2 with confidence 100.0%:\n", + " predict [ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n", + "time 3: pos 6.0, sense 6.0, at magnet 6\n", + " update [ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n", + " predicted position is 6 with confidence 100.0%:\n", "\n", - "final position is : 4\n", - "predicted position is 0 with confidence 96.43%:\n" + "final position is : 6.0\n", + "predicted position is 6 with confidence 100.0%:\n" ] }, { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAAtcAAADaCAYAAABtj26qAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", - "AAALEgAACxIB0t1+/AAAGz9JREFUeJzt3X9UlvX9x/EXPxRvivhmCIKgQDlMJabcceLW0rNj95n9\n", - "MHcq0m2WaHOyMpW50yh2yolaucOmJtRaB6lW4U7nuE4yD3jUkEFnENLMzFlsZEfuu+kMyYUe4fr+\n", - "0Ve+u3cjoH7kuoHn4xzPkc91XVyv+x2cXlxeXHeQZVmWAAAAAFy2YLsDAAAAAIMF5RoAAAAwhHIN\n", - "AAAAGEK5BgAAAAyhXAMAAACGUK4BAAAAQyjXAAAAgCG9luuqqirNmTNH8fHxCg4OVmlpaa+f9MCB\n", - "A5oxY4bCw8MVHx+vNWvWGAkLAAAABLJey/Xp06d10003aePGjXI4HAoKCupx/1OnTun2229XbGys\n", - "6uvrtXHjRm3YsEGFhYXGQgMAAACBKOhi3qExIiJCW7Zs0YMPPnjBfYqLi5WXlyev16uwsDBJ0tq1\n", - "a1VcXKzPP//88hMDAAAAAcr4Pde1tbW69dZbu4q1JLndbh07dkzNzc2mTwcAAAAEDOPl2uPxKCYm\n", - "xmft/Mcej8f06QAAAICAEWr6E/Z2T/Z/am1tNX16AAAAoN9ERkb6fGz8yvXo0aP9rlB7vd6ubQAA\n", - "AMBgZbxcZ2Zmat++fTpz5kzXWmVlpcaMGaNx48aZPh0AAAAQMHq9LeT06dM6cuSIJKmzs1PNzc1q\n", - "bGzUddddp4SEBOXl5amurk67du2SJH3/+9/X6tWrtXDhQuXn5+vw4cN69tln9fTTT/d4nv++pG5a\n", - "fX29JMnpdF7R8wwkzMQfM/HHTPwxE3/MxB8z8cdM/DETXwNlHj3d2tzrleu6ujpNnTpVU6dOVXt7\n", - "u5566ilNnTpVTz31lKRvfkmxqampa/9rrrlGlZWVOnbsmJxOp5YtW6ZVq1Zp5cqVBl4KAAAAELh6\n", - "vXI9c+ZMdXZ2XnB7SUmJ39rkyZP17rvvXl4yAAAAYIAxfs81AAAAMFQZfxTfpapuPnlFP3/biOh+\n", - "Oc9/irsqVMlREf12PgAAANgrYMr1sqrj/XSmM73vYsjm26KUHNVvpwMAAIDNuC0EAAAAMIRyDQAA\n", - "ABhCuQYAAAAMoVwDAAAAhlCuAQAAAEMo1wAAAIAhlGsAAADAEMo1AAAAYAjlGgAAADCEcg0AAAAY\n", - "QrkGAAAADKFcAwAAAIZQrgEAAABDKNcAAACAIZRrAAAAwBDKNQAAAGAI5RoAAAAwhHINAAAAGEK5\n", - "BgAAAAyhXAMAAACGUK4BAAAAQyjXAAAAgCF9KtdFRUVKSkqSw+GQ0+lUdXV1j/uXl5frlltu0TXX\n", - "XKNRo0Zp7ty5OnLkiJHAAAAAQKDqtVyXlZVpxYoVys/PV2Njo1wul2bPnq2jR492u/8nn3yiuXPn\n", - "aubMmWpsbNSuXbvU3t6uO+64w3h4AAAAIJD0Wq4LCwuVnZ2txYsXKyUlRZs2bVJsbKyKi4u73b+x\n", - "sVGdnZ1av369kpOTlZaWpscff1yffvqp/vWvfxl/AQAAAECg6LFcnz17Vg0NDXK73T7rbrdbNTU1\n", - "3R4zbdo0XX311XrppZfU0dGhtrY2bd26VRkZGRo5cqS55AAAAECACbIsy7rQxmPHjik+Pl5VVVWa\n", - "Pn161/ovf/lLvf766/r444+7Pa6mpkZz587VyZMn1dnZqSlTpuhPf/qTRo0a5bNfa2tr199nvv3F\n", - "5b6WgLNuSphGtQ++1wUAADCUjR8/vuvvkZGRPtuMPy2kqalJc+fOVXZ2turr67V3715FREQoKytL\n", - "PfR4AAAAYMAL7WljVFSUQkJC5PV6fda9Xq9iY2O7PebFF19UQkKCnn322a611157TQkJCaqtrZXL\n", - "5TIQe2CIiIiQc/JYu2NcUH19vSTJ6XTanCRwMBN/zMQfM/HHTPwxE3/MxB8z8TVQ5vGfd1/8tx6v\n", - "XA8fPlzp6emqqKjwWa+srLxgSbYsS8HBvp/2/MednZ19CgwAAAAMRL3eFpKbm6utW7fq5Zdf1qFD\n", - "h7R8+XJ5PB4tXbpUkpSXl6dZs2Z17T9nzhw1NDRozZo1OnLkiBoaGpSdna2xY8cqPT39yr0SAAAA\n", - "wGY93hYiSVlZWTpx4oQKCgrU0tKi1NRUlZeXKyEhQZLk8XjU1NTUtf/06dNVVlamZ555Rs8995zC\n", - "w8OVmZmpnTt3yuFwXLlXAgAAANis13ItSTk5OcrJyel2W0lJid/afffdp/vuu+/ykgEAAAADjPGn\n", - "hQAAAABDFeUaAAAAMIRyDQAAABhCuQYAAAAMoVwDAAAAhlCuAQAAAEMo1wAAAIAhlGsAAADAEMo1\n", - "AAAAYAjlGgAAADCEcg0AAAAYQrkGAAAADKFcAwAAAIZQrgEAAABDKNcAAACAIZRrAAAAwBDKNQAA\n", - "AGAI5RoAAAAwhHINAAAAGEK5BgAAAAyhXAMAAACGUK4BAAAAQyjXAAAAgCGUawAAAMAQyjUAAABg\n", - "SJ/KdVFRkZKSkuRwOOR0OlVdXd3rMb/5zW80YcIEjRgxQnFxccrLy7vssAAAAEAgC+1th7KyMq1Y\n", - "sULFxcWaPn26tmzZotmzZ+ujjz5SQkJCt8fk5uZqx44d+tWvfqXU1FS1traqpaXFeHgAAAAgkPRa\n", - "rgsLC5Wdna3FixdLkjZt2qSdO3equLhY69at89v/8OHDev7553XgwAGlpKR0raelpRmMDQAAAASe\n", - "Hm8LOXv2rBoaGuR2u33W3W63ampquj3mj3/8o5KTk1VeXq7k5GQlJSVp4cKF+uc//2kuNQAAABCA\n", - "erxyffz4cXV0dCgmJsZnPTo6Wh6Pp9tjmpqa1NzcrG3btumVV16RJK1atUp33323amtrFRQUZCh6\n", - "4Gtra1N9/ad2x+hVfX293RECDjPxx0z8MRN/zMQfM/HHTPwxE1+BPo/x48dfcFuvt4VcrM7OTp05\n", - "c0avvvqqbrjhBknSq6++qpSUFNXX1+vmm282fUoAAAAgIPRYrqOiohQSEiKv1+uz7vV6FRsb2+0x\n", - "sbGxCg0N7SrWknTDDTcoJCREn3322ZAq1xEREXJOHmt3jAs6/1Oh0+m0OUngYCb+mIk/ZuKPmfhj\n", - "Jv6YiT9m4mugzKO1tfWC23q853r48OFKT09XRUWFz3plZaVcLle3x0yfPl3nzp1TU1NT11pTU5M6\n", - "Ojo0bty4i8kNAAAADCi9Puc6NzdXW7du1csvv6xDhw5p+fLl8ng8Wrp0qSQpLy9Ps2bN6tp/1qxZ\n", - "mjp1qhYtWqTGxkbt379fixYt0i233BLwP4UAAAAAl6PXe66zsrJ04sQJFRQUqKWlRampqSovL+96\n", - "xrXH4/G5Sh0UFKR33nlHjz32mG677TY5HA653W4VFhZeuVcBAAAABIA+/UJjTk6OcnJyut1WUlLi\n", - "tzZ69Ght27bt8pIBAAAAA0yf3v4cAAAAQO8o1wAAAIAhlGsAAADAEMo1AAAAYAjlGgAAADCEcg0A\n", - "AAAYQrkGAAAADKFcAwAAAIZQrgEAAABDKNcAAACAIZRrAAAAwBDKNQAAAGAI5RoAAAAwhHINAAAA\n", - "GEK5BgAAAAyhXAMAAACGUK4BAAAAQyjXAAAAgCGUawAAAMAQyjUAAABgCOUaAAAAMIRyDQAAABhC\n", - "uQYAAAAMoVwDAAAAhlCuAQAAAEP6VK6LioqUlJQkh8Mhp9Op6urqPn3yI0eOKCIiQhEREZcVEgAA\n", - "ABgIei3XZWVlWrFihfLz89XY2CiXy6XZs2fr6NGjPR539uxZzZs3TzNmzFBQUJCxwAAAAECg6rVc\n", - "FxYWKjs7W4sXL1ZKSoo2bdqk2NhYFRcX93jc448/rm9/+9u6//77ZVmWscAAAABAoOqxXJ89e1YN\n", - "DQ1yu90+6263WzU1NRc8bseOHdqxY4c2b95MsQYAAMCQEdrTxuPHj6ujo0MxMTE+69HR0fJ4PN0e\n", - "c+zYMS1ZskTbt29XeHi4uaQDUFtbm+rrP7U7Rq/q6+vtjhBwmIk/ZuKPmfhjJv6YiT9m4o+Z+Ar0\n", - "eYwfP/6C24w/LWTBggXKycnRzTffbPpTAwAAAAGtxyvXUVFRCgkJkdfr9Vn3er2KjY3t9pg9e/ao\n", - "qqpKq1evliRZlqXOzk4NGzZMxcXFevjhhw1FD3wRERFyTh5rd4wLOv9TodPptDlJ4GAm/piJP2bi\n", - "j5n4Yyb+mIk/ZuJroMyjtbX1gtt6LNfDhw9Xenq6KioqdO+993atV1ZW6v777+/2mA8//NDn4+3b\n", - "t2vt2rWqq6tTXFzcxeQGAAAABpQey7Uk5ebmasGCBcrIyJDL5dILL7wgj8ejpUuXSpLy8vJUV1en\n", - "Xbt2SZImTpzoc/xf/vIXBQcH+60DAAAAg02v5TorK0snTpxQQUGBWlpalJqaqvLyciUkJEiSPB6P\n", - "mpqaevwcPOcaAAAAQ0Gv5VqScnJylJOT0+22kpKSHo9duHChFi5ceNHBAAAAgIHG+NNCAAAAgKGK\n", - "cg0AAAAYQrkGAAAADKFcAwAAAIZQrgEAAABDKNcAAACAIZRrAAAAwBDKNQAAAGAI5RoAAAAwhHIN\n", - "AAAAGEK5BgAAAAyhXAMAAACGUK4BAAAAQyjXAAAAgCGUawAAAMAQyjUAAABgCOUaAAAAMIRyDQAA\n", - "ABhCuQYAAAAMoVwDAAAAhlCuAQAAAEMo1wAAAIAhlGsAAADAEMo1AAAAYAjlGgAAADCkz+W6qKhI\n", - "SUlJcjgccjqdqq6uvuC+e/fu1T333KO4uDhdddVVSktLU0lJiZHAAAAAQKDqU7kuKyvTihUrlJ+f\n", - "r8bGRrlcLs2ePVtHjx7tdv/a2lqlpaXprbfe0sGDB5WTk6MlS5bojTfeMBoeAAAACCShfdmpsLBQ\n", - "2dnZWrx4sSRp06ZN2rlzp4qLi7Vu3Tq//fPy8nw+Xrp0qfbs2aO33npL8+fPNxAbAAAACDy9Xrk+\n", - "e/asGhoa5Ha7fdbdbrdqamr6fKLW1laNHDny4hMCAAAAA0SvV66PHz+ujo4OxcTE+KxHR0fL4/H0\n", - "6STvvPOOdu/efVFlfDBoa2tTff2ndsfoVX19vd0RAg4z8cdM/DETf8zEHzPxx0z8MRNfgT6P8ePH\n", - "X3DbFX9ayJ///Gf94Ac/0ObNm+V0Oq/06QAAAADb9HrlOioqSiEhIfJ6vT7rXq9XsbGxPR5bXV2t\n", - "O++8U2vWrNGPf/zjy0s6AEVERMg5eazdMS7o/E+F/NDz/5iJP2bij5n4Yyb+mIk/ZuKPmfgaKPNo\n", - "bW294LZer1wPHz5c6enpqqio8FmvrKyUy+W64HFVVVW64447tHr1aj322GMXERcAAAAYmPr0tJDc\n", - "3FwtWLBAGRkZcrlceuGFF+TxeLR06VJJ3zwdpK6uTrt27ZL0zXOu77zzTj366KOaP39+173ZISEh\n", - "GjVq1BV6KQAAAIC9+lSus7KydOLECRUUFKilpUWpqakqLy9XQkKCJMnj8aipqalr/9LSUrW3t2vD\n", - "hg3asGFD13piYqLPfgAAAMBg0qdyLUk5OTnKycnpdtt/v/tiSUkJ78gIAACAIeeKPy0EAAAAGCoo\n", + "AAALEgAACxIB0t1+/AAAGztJREFUeJzt3X9QVXX+x/EXYOKlyK+mIAoJlIupxCo3Jq6Wzo7eWfth\n", + "7lSku2uJtq5smcq601LslCtq5Q67akJt2yDVVrjTjNsk64Cjhiw0CwGtmbkWu2Qj97a6huSGjnC+\n", + "f/SV7969yA/94LkXno8ZZ+Rzz7nnxXuuMy+Oh3NCLMuyBAAAAOCyhdodAAAAABgoKNcAAACAIZRr\n", + "AAAAwBDKNQAAAGAI5RoAAAAwhHINAAAAGEK5BgAAAAzpsVxXVFRo3rx5io2NVWhoqIqLi3t804MH\n", + "D2rmzJmKiIhQbGys1q1bZyQsAAAAEMh6LNdnzpzRzTffrM2bN8vhcCgkJKTb7U+fPq05c+YoJiZG\n", + "tbW12rx5szZt2qT8/HxjoQEAAIBAFNKXJzRGRkZq27ZtevDBBy+6TWFhoXJycuT1ehUeHi5JWr9+\n", + "vQoLC/X5559ffmIAAAAgQBm/5rq6ulq33XZbZ7GWJLfbrePHj6upqcn04QAAAICAYbxcezweRUdH\n", + "+6xd+Nrj8Zg+HAAAABAwhph+w56uyf5PLS0tpg8PAAAAXDHDhw/3+dr4mesxY8b4naH2er2drwEA\n", + "AAADlfFynZ6ergMHDujs2bOda+Xl5Ro3bpzGjx9v+nAAAABAwOjxspAzZ87o6NGjkqSOjg41NTWp\n", + "oaFB1113neLi4pSTk6Oamhrt2bNHkvT9739fa9eu1eLFi5Wbm6sjR47o2Wef1dNPP93tcf77lLpp\n", + "tbW1kiSn09mvxwkmzMQfM/HHTPwxE3/BMpPKplNaUXHC7hj9YuvtozRj/Ai7Y3QrWD4nVxIz8RUs\n", + "8+ju0uYez1zX1NRo2rRpmjZtmtra2vTUU09p2rRpeuqppyR980uKjY2Nndtfe+21Ki8v1/Hjx+V0\n", + "OrVixQqtWbNGq1evNvCtAAAAAIGrxzPXs2bNUkdHx0VfLyoq8lubMmWK3n333ctLBgAAAAQZ49dc\n", + "AwAAAIMV5RoAAAAwhHINAAAAGEK5BgAAAAyhXAMAAACGUK4BAAAAQyjXAAAAgCGUawAAAMAQyjUA\n", + "AABgCOUaAAAAMIRyDQAAABhCuQYAAAAMoVwDAAAAhlCuAQAAAEMo1wAAAIAhlGsAAADAEMo1AAAA\n", + "YAjlGgAAADCEcg0AAAAYQrkGAAAADKFcAwAAAIZQrgEAAABDKNcAAACAIZRrAAAAwBDKNQAAAGBI\n", + "r8p1QUGBEhIS5HA45HQ6VVlZ2e32paWluvXWW3Xttddq9OjRmj9/vo4ePWokMAAAABCoeizXJSUl\n", + "WrVqlXJzc9XQ0CCXy6W5c+fq2LFjXW7/ySefaP78+Zo1a5YaGhq0Z88etbW16Y477jAeHgAAAAgk\n", + "PZbr/Px8ZWZmaunSpUpKStKWLVsUExOjwsLCLrdvaGhQR0eHNm7cqMTERKWkpOjxxx/Xp59+qn/9\n", + "61/GvwEAAAAgUHRbrs+dO6e6ujq53W6fdbfbraqqqi73mT59uq655hq99NJLam9vV2trq7Zv3660\n", + "tDSNHDnSXHIAAAAgwIRYlmVd7MXjx48rNjZWFRUVmjFjRuf6L3/5S73++uv6+OOPu9yvqqpK8+fP\n", + "16lTp9TR0aGpU6fqT3/6k0aPHu2zXUtLS+ffuSYbANDf/jksSk/Un7U7Rr/YMDVco9u+sDsGMChM\n", + "mDCh8+/Dhw/3ec343UIaGxs1f/58ZWZmqra2Vvv371dkZKQyMjLUTY8HAAAAgt6Q7l4cNWqUwsLC\n", + "5PV6fda9Xq9iYmK63OfFF19UXFycnn322c611157TXFxcaqurpbL5epyP6fT2dfsfVJbW3tFjhNM\n", + "mIk/ZuKPmfhjJv6CZSaVTackDcwz15GRkXJOud7uGN0Kls/JlcRMfAXLPP7z6ov/1u2Z66FDhyo1\n", + "NVVlZWU+6+Xl5RctyZZlKTTU920vfN3R0dGrwAAAAEAw6vGykOzsbG3fvl0vv/yyDh8+rJUrV8rj\n", + "8Wj58uWSpJycHM2ePbtz+3nz5qmurk7r1q3T0aNHVVdXp8zMTF1//fVKTU3tv+8EAAAAsFm3l4VI\n", + "UkZGhk6ePKm8vDw1NzcrOTlZpaWliouLkyR5PB41NjZ2bj9jxgyVlJTomWee0XPPPaeIiAilp6dr\n", + "9+7dcjgc/fedAAAAADbrsVxLUlZWlrKysrp8raioyG/tvvvu03333Xd5yQAAAIAgY/xuIQAAAMBg\n", + "RbkGAAAADKFcAwAAAIZQrgEAAABDKNcAAACAIZRrAAAAwBDKNQAAAGAI5RoAAAAwhHINAAAAGEK5\n", + "BgAAAAyhXAMAAACGUK4BAAAAQyjXAAAAgCGUawAAAMAQyjUAAABgCOUaAAAAMIRyDQAAABhCuQYA\n", + "AAAMoVwDAAAAhlCuAQAAAEMo1wAAAIAhlGsAAADAEMo1AAAAYAjlGgAAADCEcg0AAAAY0qtyXVBQ\n", + "oISEBDkcDjmdTlVWVva4z29+8xtNnDhRw4YN09ixY5WTk3PZYQEAAIBANqSnDUpKSrRq1SoVFhZq\n", + "xowZ2rZtm+bOnauPPvpIcXFxXe6TnZ2tXbt26Ve/+pWSk5PV0tKi5uZm4+EBAACAQNJjuc7Pz1dm\n", + "ZqaWLl0qSdqyZYt2796twsJCbdiwwW/7I0eO6Pnnn9fBgweVlJTUuZ6SkmIwNgAAABB4ur0s5Ny5\n", + "c6qrq5Pb7fZZd7vdqqqq6nKfP/7xj0pMTFRpaakSExOVkJCgxYsX65///Ke51AAAAEAA6vbM9YkT\n", + "J9Te3q7o6Gif9aioKHk8ni73aWxsVFNTk3bs2KFXXnlFkrRmzRrdfffdqq6uVkhISJf71dbWXkr+\n", + "PrtSxwkmzMQfM/HHTPwxE3+BPpPWYVF2R+g3ra2tqq391O4YvRLonxM7MBNfgT6PCRMmXPS1Hi8L\n", + "6auOjg6dPXtWr776qm688UZJ0quvvqqkpCTV1tbqlltuMX1IAAAAICB0W65HjRqlsLAweb1en3Wv\n", + "16uYmJgu94mJidGQIUM6i7Uk3XjjjQoLC9Nnn3120XLtdDr7mr1PLvwE1N/HCSbMxB8z8cdM/DET\n", + "f8Eyk8qmU5LO2h2jX0RGRso55Xq7Y3QrWD4nVxIz8RUs82hpabnoa91ecz106FClpqaqrKzMZ728\n", + "vFwul6vLfWbMmKHz58+rsbGxc62xsVHt7e0aP358X3IDAAAAQaXH+1xnZ2dr+/btevnll3X48GGt\n", + "XLlSHo9Hy5cvlyTl5ORo9uzZndvPnj1b06ZN05IlS9TQ0KD6+notWbJEt956a8D/FAIAAABcjh6v\n", + "uc7IyNDJkyeVl5en5uZmJScnq7S0tPMe1x6Px+csdUhIiN555x099thjuv322+VwOOR2u5Wfn99/\n", + "3wUAAAAQAHr1C41ZWVnKysrq8rWioiK/tTFjxmjHjh2XlwwAAAAIMr16/DkAAACAnlGuAQAAAEMo\n", "1wAAAIAhlGsAAADAEMo1AAAAYAjlGgAAADCEcg0AAAAYQrkGAAAADKFcAwAAAIZQrgEAAABDKNcA\n", "AACAIZRrAAAAwBDKNQAAAGAI5RoAAAAwhHINAAAAGEK5BgAAAAyhXAMAAACGUK4BAAAAQyjXAAAA\n", - "gCGUawAAAMAQyjUAAABgCOUaAAAAMIRyDQAAABhCuQYAAAAMoVwDAAAAhvSpXBcVFSkpKUkOh0NO\n", - "p1PV1dU97n/gwAHNmDFD4eHhio+P15o1a4yEBQAAAAJZr+W6rKxMK1asUH5+vhobG+VyuTR79mwd\n", - "PXq02/1PnTql22+/XbGxsaqvr9fGjRu1YcMGFRYWGg8PAAAABJJey3VhYaGys7O1ePFipaSkaNOm\n", - "TYqNjVVxcXG3+//+979Xe3u7SktLNXHiRN177716/PHHKdcAAAAY9Hos12fPnlVDQ4PcbrfPutvt\n", - "Vk1NTbfH1NbW6tZbb1VYWJjP/seOHVNzc7OByAAAAEBgCu1p4/Hjx9XR0aGYmBif9ejoaHk8nm6P\n", - "8Xg8Gjt2rM/a+eM9Ho/GjRt3OXkxRDUdb9Ox0+eu+HnaRkRLkqqbT17xc50Xd1WokqMi+u18GDr6\n", - "6/tG6v/vHb5vgP7F/4f7rsdyfSmCgoIu6bi9c6INJwkMra2tdke4oPHjx0sK7IznXTdMuu5/+uHh\n", - "Nv8TeeXP4aczoP8bDKSvk/4yUGbSb983kg3fO4H9fSMNnK+T/sRM/A2UmfD/4b7rcUpRUVEKCQmR\n", - "1+v1Wfd6vYqNje32mNGjR/td1T5//OjRoy8nKwAAABDQeizXw4cPV3p6uioqKnzWKysr5XK5uj0m\n", - "MzNT+/bt05kzZ3z2HzNmDLeEAAAAYFALsizL6mmHbdu2acGCBSoqKpLL5dILL7ygkpISHTx4UAkJ\n", - "CcrLy1NdXZ127dol6ZtH8aWkpGjmzJnKz8/X4cOHlZ2draefflorV67slxcFAAAA2KHXe66zsrJ0\n", - "4sQJFRQUqKWlRampqSovL1dCQoKkb35JsampqWv/a665RpWVlXrkkUfkdDo1cuRIrVq1imINAACA\n", - "Qa/XK9cAAAAA+qaffo3cfhf7Fu6DWVVVlebMmaP4+HgFBwertLTU7ki2W79+vW6++WZFRkYqOjpa\n", - "c+bM0cGDB+2OZastW7YoLS1NkZGRioyMlMvlUnl5ud2xAsb69esVHBysZcuW2R3FVk8//bSCg4N9\n", - "/sTFxdkdy1YtLS166KGHFB0dLYfDoUmTJqmqqsruWLZJTEz0+xoJDg7WXXfdZXc025w7d05PPPGE\n", - "kpOT5XA4lJycrF/84hfq6OiwO5qt2tratGLFCiUmJio8PFzTpk1TfX293bEu2pAo1xf7Fu6D3enT\n", - "p3XTTTdp48aNcjgcl/z4xMHk3Xff1aOPPqra2lrt3r1boaGhmjVrlk6e7L/nbAaahIQEPffcc9q/\n", - "f7/ef/99fec739HcuXP1wQcf2B3Ndu+9955eeukl3XTTTXz/SJowYYI8Hk/XnwMHDtgdyTZffvml\n", - "pk2bpqCgIJWXl+vjjz/W888/r+jowfm42b54//33fb4+GhoaFBQUpAceeMDuaLZZt26dXnzxRW3e\n", - "vFmHDx/Wxo0bVVRUpPXr19sdzVYPP/ywKisr9corr+jDDz+U2+3WrFmzdOzYMbujXRxrCMjIyLCW\n", - "LFniszZ+/HgrLy/PpkSB4+qrr7ZKS0vtjhFwvvrqKyskJMR655137I4SUEaOHGn99re/tTuGrb78\n", - "8kvr+uuvt/bu3WvNnDnTWrZsmd2RbPXUU09ZkydPtjtGwMjLy7OmT59ud4yAVlBQYF177bVWe3u7\n", - "3VFsc9ddd1kLFy70WXvwwQetu+++26ZE9vv3v/9thYaGWm+//bbPenp6upWfn29Tqksz6K9cX8pb\n", - "uAOnTp1SZ2enrr32WrujBISOjg69+eabam9v12233WZ3HFstWbJE999/v2bMmCGLX1mRJDU1NWnM\n", - "mDFKTk7W/Pnz9fe//93uSLbZvn27MjIy9MADDygmJkZTpkzRli1b7I4VMCzL0ssvv6wf/vCHCgsL\n", - "szuObWbPnq3du3fr8OHDkqSPPvpIe/bs0R133GFzMvucO3dOHR0dfl8XI0aMGHC38hp/h8ZAcylv\n", - "4Q4sX75cU6ZMUWZmpt1RbHXgwAFlZmbqzJkzcjgc2rZtm1JSUuyOZZuXXnpJTU1Nev311yVd+jvS\n", - "Dia33HKLSktLNWHCBHm9XhUUFMjlcungwYMaOXKk3fH6XVNTk4qKipSbm6snnnhC+/fv77ov/5FH\n", - "HrE5nf0qKyv1j3/8Qz/60Y/sjmKrn/zkJ/r888914403KjQ0VOfOnVN+fr6WLl1qdzTbREREKDMz\n", - "UwUFBZo8ebJiYmL0xhtv6L333ut6F8uBYtCXa+Bi5ebmqqamRtXV1UO+PE2YMEF//etf1draqj/8\n", - "4Q+aN2+e9uzZI6fTaXe0fnf48GE9+eSTqq6uVkhIiKRvrsIN9avX3/3ud7v+PnnyZGVmZiopKUml\n", - "paVD8hGsnZ2dysjI0Nq1ayVJaWlpOnLkiLZs2UK51jc/oGZkZCg1NdXuKLbatGmTSkpK9Oabb2rS\n", - "pEnav3+/li9frsTERC1atMjueLZ59dVXtWjRIsXHxyskJETp6emaP3++3n//fbujXZRBX64v5S3c\n", - "MXStXLlS27Zt0549e5SYmGh3HNsNGzZMycnJkqQpU6aorq5OW7ZsUUlJic3J+l9tba2OHz+uSZMm\n", - "da11dHRo3759evHFF3X69GkNGzbMxoSBITw8XJMmTdInn3xidxRbxMXFaeLEiT5rEyZM0GeffWZT\n", - "osDxxRdf6O2331ZRUZHdUWy3du1a5efnKysrS5I0adIkNTc3a/369UO6XCcnJ2vv3r36+uuvderU\n", - "KcXExOiBBx7Q9ddfb3e0izLo77m+lLdwx9C0fPlylZWVaffu3frWt75ld5yA1NHRoc7OTrtj2OJ7\n", - "3/uePvzwQ33wwQf64IMP1NjYKKfTqfnz56uxsZFi/X/a29t16NChIXvxYtq0afr444991v72t7/x\n", - "w7qkrVu3asSIEZo/f77dUWxnWZaCg30rWHBw8JD/l7DzHA6HYmJidPLkSVVUVOiee+6xO9JFGfRX\n", - "rqVv/pl/wYIFysjI6HoLd4/HM2TvbTp9+rSOHDki6Zt/wmxublZjY6Ouu+66rnfeHGoeeeQRvfba\n", - "a9q+fbsiIyO77sePiIjQVVddZXM6e/z85z/XXXfdpfj4eLW1ten111/Xu+++q507d9odzRbnn/f9\n", - "n8LDw3Xttdf6XakcSlatWqU5c+YoISFBX3zxhdasWaOvv/5aDz30kN3RbLFy5Uq5XC6tW7dOWVlZ\n", - "2r9/vzZv3jzkH7FmWZZ+97vfad68eQoPD7c7ju3mzp2rZ555RklJSZo4caL279+vX//610P2++a8\n", - "iooKdXR0aMKECfrkk0/0s5/9TDfeeKOys7PtjnZxbHxSSb8qKiqyEhMTrbCwMMvpdFr79u2zO5Jt\n", - "9uzZYwUFBVlBQUFWcHBw19+zs7Ptjmab/57F+T+rV6+2O5ptFi5caI0bN84KCwuzoqOjrdtvv92q\n", - "qKiwO1ZA4VF8ljVv3jwrLi7OGj58uDVmzBjrvvvusw4dOmR3LFvt2LHDSktLs0aMGGGlpKRYmzdv\n", - "tjuS7Xbv3m0FBwdbdXV1dkcJCF999ZX105/+1EpMTLQcDoeVnJxsPfnkk9aZM2fsjmarbdu2Wddf\n", - "f70VFhZmxcbGWsuWLbNOnTpld6yLxtufAwAAAIYM+nuuAQAAgP5CuQYAAAAMoVwDAAAAhlCuAQAA\n", - "AEMo1wAAAIAhlGsAAADAEMo1AAAAYAjlGgAAADCEcg0AAAAY8r8Bx5q9uizkvQAAAABJRU5ErkJg\n", - "gg==\n" + "gCGUawAAAMAQyjUAAABgCOUaAAAAMIRyDQAAABhCuQYAAAAMoVwDAAAAhvSqXBcUFCghIUEOh0NO\n", + "p1OVlZW9evOjR48qMjJSkZGRlxUSAAAACAY9luuSkhKtWrVKubm5amhokMvl0ty5c3Xs2LFu9zt3\n", + "7pwWLFigmTNnKiQkxFhgAAAAIFD1WK7z8/OVmZmppUuXKikpSVu2bFFMTIwKCwu73e/xxx/Xt7/9\n", + "bd1///2yLMtYYAAAACBQdVuuz507p7q6Orndbp91t9utqqqqi+63a9cu7dq1S1u3bqVYAwAAYNAY\n", + "0t2LJ06cUHt7u6Kjo33Wo6Ki5PF4utzn+PHjWrZsmXbu3KmIiIheB6mtre31tpfjSh0nmDATf8zE\n", + "HzPxx0z8BfpMWodF2R2h37S2tqq29lO7Y/RKoH9O7MBMfAX6PCZMmHDR14zfLWTRokXKysrSLbfc\n", + "YvqtAQAAgIDW7ZnrUaNGKSwsTF6v12fd6/UqJiamy3327duniooKrV27VpJkWZY6Ojp01VVXqbCw\n", + "UA8//HCX+zmdzkvJ32sXfgLq7+MEE2bij5n4Yyb+mIm/YJlJZdMpSWftjtEvIiMj5Zxyvd0xuhUs\n", + "n5MriZn4CpZ5tLS0XPS1bsv10KFDlZqaqrKyMt17772d6+Xl5br//vu73OfDDz/0+Xrnzp1av369\n", + "ampqNHbs2L7kBgAAAIJKt+VakrKzs7Vo0SKlpaXJ5XLphRdekMfj0fLlyyVJOTk5qqmp0Z49eyRJ\n", + "kyZN8tn/L3/5i0JDQ/3WAQAAgIGmx3KdkZGhkydPKi8vT83NzUpOTlZpaani4uIkSR6PR42Njd2+\n", + "B/e5BgAAwGDQY7mWpKysLGVlZXX5WlFRUbf7Ll68WIsXL+5zMAAAACDYGL9bCAAAADBYUa4BAAAA\n", + "QyjXAAAAgCGUawAAAMAQyjUAAABgCOUaAAAAMIRyDQAAABhCuQYAAAAMoVwDAAAAhlCuAQAAAEMo\n", + "1wAAAIAhlGsAAADAEMo1AAAAYAjlGgAAADCEcg0AAAAYQrkGAAAADKFcAwAAAIZQrgEAAABDKNcA\n", + "AACAIZRrAAAAwBDKNQAAAGAI5RoAAAAwhHINAAAAGEK5BgAAAAyhXAMAAACG9LpcFxQUKCEhQQ6H\n", + "Q06nU5WVlRfddv/+/brnnns0duxYXX311UpJSVFRUZGRwAAAAECg6lW5Likp0apVq5Sbm6uGhga5\n", + "XC7NnTtXx44d63L76upqpaSk6K233tKhQ4eUlZWlZcuW6Y033jAaHgAAAAgkQ3qzUX5+vjIzM7V0\n", + "6VJJ0pYtW7R7924VFhZqw4YNftvn5OT4fL18+XLt27dPb731lhYuXGggNgAAABB4ejxzfe7cOdXV\n", + "1cntdvusu91uVVVV9fpALS0tGjlyZN8TAgAAAEGixzPXJ06cUHt7u6Kjo33Wo6Ki5PF4enWQd955\n", + "R3v37u22jNfW1vbqvS7XlTpOMGEm/piJP2bij5n4C/SZtA6LsjtCv2ltbVVt7ad2x+iVQP+c2IGZ\n", + "+Ar0eUyYMOGir/X73UL+/Oc/6wc/+IG2bt0qp9PZ34cDAAAAbNPjmetRo0YpLCxMXq/XZ93r9Som\n", + "JqbbfSsrK3XnnXdq3bp1+vGPf9zttv1dvC/8BETB/3/MxB8z8cdM/DETf8Eyk8qmU5LO2h2jX0RG\n", + "Rso55Xq7Y3QrWD4nVxIz8RUs82hpabnoaz2euR46dKhSU1NVVlbms15eXi6Xy3XR/SoqKnTHHXdo\n", + "7dq1euyxx/oQFwAAAAhOvbpbSHZ2thYtWqS0tDS5XC698MIL8ng8Wr58uaRv7g5SU1OjPXv2SPrm\n", + "Ptd33nmnHn30US1cuLDz2uywsDCNHj26n74VAAAAwF69KtcZGRk6efKk8vLy1NzcrOTkZJWWliou\n", + "Lk6S5PF41NjY2Ll9cXGx2tratGnTJm3atKlzPT4+3mc7AAAAYCDpVbmWpKysLGVlZXX52n8/fbGo\n", + "qIgnMgIAAGDQ6fe7hQAAAACDBeUaAAAAMIRyDQAAABhCuQYAAAAMoVwDAAAAhlCuAQAAAEMo1wAA\n", + "AIAhlGsAAADAEMo1AAAAYAjlGgAAADCEcg0AAAAYQrkGAAAADKFcAwAAAIZQrgEAAABDKNcAAACA\n", + "IZRrAAAAwBDKNQAAAGAI5RoAAAAwhHINAAAAGEK5BgAAAAyhXAMAAACGUK4BAAAAQyjXAAAAgCGU\n", + "awAAAMCQXpXrgoICJSQkyOFwyOl0qrKystvtDx48qJkzZyoiIkKxsbFat26dkbAAAABAIOuxXJeU\n", + "lGjVqlXKzc1VQ0ODXC6X5s6dq2PHjnW5/enTpzVnzhzFxMSotrZWmzdv1qZNm5Sfn288PAAAABBI\n", + "eizX+fn5yszM1NKlS5WUlKQtW7YoJiZGhYWFXW7/+9//Xm1tbSouLtakSZN077336vHHH6dcAwAA\n", + "YMDrtlyfO3dOdXV1crvdPutut1tVVVVd7lNdXa3bbrtN4eHhPtsfP35cTU1NBiIDAAAAganbcn3i\n", + "xAm1t7crOjraZz0qKkoej6fLfTwej9/2F76+2D4AAADAQDDE9BuGhIRc0n4tLS2Gk/iaMGHCFTlO\n", + "MGEm/piJP2bij5n4C5aZJP9PqPbPi7I7Rr8J9PkHy+fkSmImvgbCPLo9cz1q1CiFhYXJ6/X6rHu9\n", + "XsXExHS5z5gxY/zOUF/Yf8yYMZeTFQAAAAho3ZbroUOHKjU1VWVlZT7r5eXlcrlcXe6Tnp6uAwcO\n", + "6OzZsz7bjxs3TuPHjzcQGQAAAAhMIZZlWd1tsGPHDi1atEgFBQVyuVx64YUXVFRUpEOHDikuLk45\n", + "OTmqqanRnj17JH1zK76kpCTNmjVLubm5OnLkiDIzM/X0009r9erVV+SbAgAAAOzQ4zXXGRkZOnny\n", + "pPLy8tTc3Kzk5GSVlpYqLi5O0je/pNjY2Ni5/bXXXqvy8nI98sgjcjqdGjlypNasWUOxBgAAwIDX\n", + "45lrAAAAAL3Tq8efDwR9fYT7QFZRUaF58+YpNjZWoaGhKi4utjuS7TZu3KhbbrlFw4cPV1RUlObN\n", + "m6dDhw7ZHctW27ZtU0pKioYPH67hw4fL5XKptLTU7lgBY+PGjQoNDdWKFSvsjmKrp59+WqGhoT5/\n", + "xo4da3csWzU3N+uhhx5SVFSUHA6HJk+erIqKCrtj2SY+Pt7vMxIaGqq77rrL7mi2OX/+vJ544gkl\n", + "JibK4XAoMTFRv/jFL9Te3m53NFu1trZq1apVio+PV0REhKZPn67a2lq7Y/XZoCjXfX2E+0B35swZ\n", + "3Xzzzdq8ebMcDscl3z5xIHn33Xf16KOPqrq6Wnv37tWQIUM0e/ZsnTp1yu5otomLi9Nzzz2n+vp6\n", + "vf/++/rOd76j+fPn64MPPrA7mu3ee+89vfTSS7r55pv59yNp4sSJ8ng8nX8OHjxodyTbfPnll5o+\n", + "fbpCQkJUWlqqjz/+WM8//7yiogbu7f968v777/t8Purq6hQSEqIHHnjA7mi22bBhg1588UVt3bpV\n", + "R44c0ebNm1VQUKCNGzfaHc1WDz/8sMrLy/XKK6/oww8/lNvt1uzZs3X8+HG7o/WNNQikpaVZy5Yt\n", + "81mbMGGClZOTY1OiwHHNNddYxcXFdscIOF999ZUVFhZmvfPOO3ZHCSgjR460fvvb39odw1Zffvml\n", + "dcMNN1j79++3Zs2aZa1YscLuSLZ66qmnrClTptgdI2Dk5ORYM2bMsDtGQMvLy7NGjBhhtbW12R3F\n", + "NnfddZe1ePFin7UHH3zQuvvuu21KZL9///vf1pAhQ6y3337bZz01NdXKzc21KdWlGfBnri/lEe7A\n", + "6dOn1dHRoREjRtgdJSC0t7frzTffVFtbm26//Xa749hq2bJluv/++zVz5kxZ/MqKJKmxsVHjxo1T\n", + "YmKiFi5cqL///e92R7LNzp07lZaWpgceeEDR0dGaOnWqtm3bZnesgGFZll5++WX98Ic/VHh4uN1x\n", + "bDN37lzt3btXR44ckSR99NFH2rdvn+644w6bk9nn/Pnzam9v9/tcDBs2LOgu5TX+hMZAcymPcAdW\n", + "rlypqVOnKj093e4otjp48KDS09N19uxZORwO7dixQ0lJSXbHss1LL72kxsZGvf7665Iu/Ym0A8mt\n", + "t96q4uJiTZw4UV6vV3l5eXK5XDp06JBGjhxpd7wrrrGxUQUFBcrOztYTTzyh+vr6zuvyH3nkEZvT\n", + "2a+8vFz/+Mc/9KMf/cjuKLb6yU9+os8//1w33XSThgwZovPnzys3N1fLly+3O5ptIiMjlZ6erry8\n", + "PE2ZMkXR0dF644039N5773U+tTFYDPhyDfRVdna2qqqqVFlZOejL08SJE/XXv/5VLS0t+sMf/qAF\n", + "CxZo3759cjqddke74o4cOaInn3xSlZWVCgsLk/TNWbjBfvb6u9/9buffp0yZovT0dCUkJKi4uHhQ\n", + "3oK1o6NDaWlpWr9+vSQpJSVFR48e1bZt2yjX+uYH1LS0NCUnJ9sdxVZbtmxRUVGR3nzzTU2ePFn1\n", + "9fVauXKl4uPjtWTJErvj2ebVV1/VkiVLFBsbq7CwMKWmpmrhwoV6//337Y7WJwO+XF/KI9wxeK1e\n", + "vVo7duzQvn37FB8fb3cc21111VVKTEyUJE2dOlU1NTXatm2bioqKbE525VVXV+vEiROaPHly51p7\n", + "e7sOHDigF198UWfOnNFVV11lY8LAEBERocmTJ+uTTz6xO4otxo4dq0mTJvmsTZw4UZ999plNiQLH\n", + "F198obffflsFBQV2R7Hd+vXrlZubq4yMDEnS5MmT1dTUpI0bNw7qcp2YmKj9+/fr66+/1unTpxUd\n", + "Ha0HHnhAN9xwg93R+mTAX3N9KY9wx+C0cuVKlZSUaO/evfrWt75ld5yA1N7ero6ODrtj2OJ73/ue\n", + "PvzwQ33wwQf64IMP1NDQIKfTqYULF6qhoYFi/X/a2tp0+PDhQXvyYvr06fr444991v72t7/xw7qk\n", + "7du3a9iwYVq4cKHdUWxnWZZCQ30rWGho6KD/n7ALHA6HoqOjderUKZWVlemee+6xO1KfDPgz19I3\n", + "/82/aNEipaWldT7C3ePxDNprm86cOaOjR49K+ua/MJuamtTQ0KDrrruu88mbg80jjzyi1157TTt3\n", + "7tTw4cM7r8ePjIzU1VdfbXM6e/z85z/XXXfdpdjYWLW2tur111/Xu+++q927d9sdzRYX7vf9nyIi\n", + "IjRixAi/M5WDyZo1azRv3jzFxcXpiy++0Lp16/T111/roYcesjuaLVavXi2Xy6UNGzYoIyND9fX1\n", + "2rp166C/xZplWfrd736nBQsWKCIiwu44tps/f76eeeYZJSQkaNKkSaqvr9evf/3rQfvv5oKysjK1\n", + "t7dr4sSJ+uSTT/Szn/1MN910kzIzM+2O1jc23qnkiiooKLDi4+Ot8PBwy+l0WgcOHLA7km327dtn\n", + "hYSEWCEhIVZoaGjn3zMzM+2OZpv/nsWFP2vXrrU7mm0WL15sjR8/3goPD7eioqKsOXPmWGVlZXbH\n", + "Cijcis+yFixYYI0dO9YaOnSoNW7cOOu+++6zDh8+bHcsW+3atctKSUmxhg0bZiUlJVlbt261O5Lt\n", + "9u7da4WGhlo1NTV2RwkIX331lfXTn/7Uio+PtxwOh5WYmGg9+eST1tmzZ+2OZqsdO3ZYN9xwgxUe\n", + "Hm7FxMRYK1assE6fPm13rD7j8ecAAACAIQP+mmsAAADgSqFcAwAAAIZQrgEAAABDKNcAAACAIZRr\n", + "AAAAwBDKNQAAAGAI5RoAAAAwhHINAAAAGEK5BgAAAAz5X4ZklNbxe8I2AAAAAElFTkSuQmCC\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -4028,8 +4015,8 @@ "source": [ "random.seed(3)\n", "np.set_printoptions(precision=2, suppress=True)\n", - "simulate(4, move_error=0.05, sense_error=0.1,\n", - " no_sense_error=0.05, move_distance=1,\n", + "simulate(4, kernel=[1.], sense_error=0.,\n", + " no_sense_error=0., move_distance=4,\n", " do_print=True)" ] }, @@ -4042,7 +4029,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 84, "metadata": { "collapsed": false, "scrolled": false @@ -4052,183 +4039,161 @@ "name": "stdout", "output_type": "stream", "text": [ - "[0.0, 1.0, 0.0]\n", - "time 0: pos 3, sense 3, at magnet False\n", - " predict [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " update [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " predicted position is 0 with confidence 90.91%:\n", - "time 1: pos 6, sense 6, at magnet False\n", - " predict [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " update [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " predicted position is 0 with confidence 90.91%:\n", - "time 2: pos 9, sense 9, at magnet True\n", - " predict [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " update [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " predicted position is 0 with confidence 90.91%:\n", - "time 3: pos 2, sense 2, at magnet True\n", - " predict [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " update [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " predicted position is 0 with confidence 90.91%:\n", - "time 4: pos 5, sense 5, at magnet True\n", - " predict [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " update [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " predicted position is 0 with confidence 90.91%:\n", - "time 5: pos 8, sense 8, at magnet False\n", - " predict [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " update [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " predicted position is 0 with confidence 90.91%:\n", - "time 6: pos 1, sense 1, at magnet False\n", - " predict [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " update [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " predicted position is 0 with confidence 96.45%:\n", - "time 7: pos 4, sense 4, at magnet False\n", - " predict [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " update [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " predicted position is 0 with confidence 96.45%:\n", - "time 8: pos 7, sense 7, at magnet False\n", - " predict [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " update [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " predicted position is 0 with confidence 96.45%:\n", - "time 9: pos 0, sense 0, at magnet True\n", - " predict [ 0.96 0. 0.01 0. 0. 0.01 0. 0. 0. 0.01]\n", - " update [ 0.91 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n", - " predicted position is 0 with confidence 90.91%:\n", + "time 0: pos 4.0, sense 4.0, at magnet 4\n", + " update [ 0.85 0.01 0.01 0.01 0.08 0.01 0.01 0.01 0.01 0.01]\n", + " predicted position is 0 with confidence 84.91%:\n", + " predict [ 0.01 0.01 0.01 0.09 0.68 0.09 0.01 0.02 0.06 0.02]\n", + "time 1: pos 8.0, sense 8.0, at magnet 8\n", + " update [ 0.01 0.01 0.01 0.07 0.47 0.07 0.01 0.01 0.35 0.01]\n", + " predicted position is 4 with confidence 47.44%:\n", + " predict [ 0.01 0.04 0.28 0.04 0.01 0.01 0.01 0.1 0.39 0.1 ]\n", + " ***sense error***\n", + "time 2: pos 2.0, sense 1.0, at magnet 2\n", + " update [ 0.01 0.27 0.21 0.03 0.01 0.01 0.01 0.08 0.3 0.08]\n", + " predicted position is 8 with confidence 29.96%:\n", + " predict [ 0.02 0.09 0.25 0.09 0.04 0.24 0.2 0.05 0.01 0.01]\n", + "time 3: pos 6.0, sense 6.0, at magnet 6\n", + " update [ 0.01 0.04 0.11 0.04 0.02 0.1 0.67 0.02 0. 0. ]\n", + " predicted position is 6 with confidence 66.84%:\n", "\n", - "final position is : 0\n", - "predicted position is 0 with confidence 90.91%:\n" + "final position is : 6.0\n", + "predicted position is 6 with confidence 66.84%:\n" ] }, { "data": { "image/png": [ "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\n", - "tVV/+MMfNH/+fO3du1dOp9PuaP3uyJEjeuKJJ1RdXa2QkBBJX1+FG+pXr7/73e92fTx58mRlZmYq\n", - "KSlJpaWlQ/IRrJ2dncrIyNC6deskSWlpaTp69Ki2bt1KudbXP6BmZGQoNTXV7ii22rx5s0pKSvTG\n", - "G29o0qRJOnDggFasWKHExEQtXrzY7ni2eeWVV7R48WLFx8crJCRE6enpWrBggd577z27o/XJoC/X\n", - "3+Qt3DF0rVq1Stu3b9fevXuVmJhodxzbDRs2TMnJyZKkKVOmqK6uTlu3blVJSYnNyfpfbW2tTpw4\n", - "oUmTJnWtdXR0aP/+/XrhhRd05swZDRs2zMaEgSE8PFyTJk3Sxx9/bHcUW8TFxWnixIk+axMmTNCn\n", - "n35qU6LA8fnnn+utt95SUVGR3VFst27dOuXn5ysrK0uSNGnSJDU3N2vDhg1DulwnJydr3759+uqr\n", - "r3T69GnFxMTo/vvv1/XXX293tD4Z9Pdcf5O3cMfQtGLFCpWVlWnPnj361re+ZXecgNTR0aHOzk67\n", - "Y9jie9/7nj744AO9//77ev/999XY2Cin06kFCxaosbGRYv1/2tvbdfjw4SF78WLatGn66KOPfNb+\n", - "9re/8cO6pG3btmnEiBFasGCB3VFsZ1mWgoN9K1hwcPCQ/5+wCxwOh2JiYnTq1ClVVFTo7rvvtjtS\n", - "nwz6K9fS1//Nv3DhQmVkZHS9hbvH4xmy9zadOXNGR48elfT1f2E2NzersbFR1113Xdc7bw41Dz/8\n", - "sF599VXt2LFDkZGRXffjR0RE6KqrrrI5nT1+/vOf684771R8fLza2tr02muv6Z133tGuXbvsjmaL\n", - "C8/7/k/h4eG69tpr/a5UDiWrV6/W3LlzlZCQoM8//1xr167VV199pQcffNDuaLZYtWqVXC6X1q9f\n", - "r6ysLB04cEBbtmwZ8o9YsyxLv/vd7zR//nyFh4fbHcd28+bN09NPP62kpCRNnDhRBw4c0K9//esh\n", - "+31zQUVFhTo6OjRhwgR9/PHH+tnPfqYbb7xR2dnZdkfrGxufVNKvioqKrMTERCssLMxyOp3W/v37\n", - "7Y5km71791pBQUFWUFCQFRwc3PVxdna23dFs89+zuPBnzZo1dkezzaJFi6xx48ZZYWFhVnR0tDV7\n", - "9myroqLC7lgBhUfxWdb8+fOtuLg4a/jw4daYMWOse++91zp8+LDdsWy1c+dOKy0tzRoxYoSVkpJi\n", - "bdmyxe5IttuzZ48VHBxs1dXV2R0lIHz55ZfWT3/6UysxMdFyOBxWcnKy9cQTT1hnz561O5qttm/f\n", - "bl1//fVWWFiYFRsbay1fvtw6ffq03bH6jLc/BwAAAAwZ9PdcAwAAAP2Fcg0AAAAYQrkGAAAADKFc\n", - "AwAAAIZQrgEAAABDKNcAAACAIZRrAAAAwBDKNQAAAGAI5RoAAAAw5H8B8xjaHb6AIv0AAAAASUVO\n", - "RK5CYII=\n" + "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\n", + "1hNPPKH9+/d33pf/yCOP2Fyd/crLy/XPf/5TP/3pT+0uxVY/+9nP9MUXX+iGG25QaGiozp07p9zc\n", + "XC1dutTu0mwTERGh9PR05eXlacqUKYqOjtZbb72lDz74oHPXxsFiyIdroK+ys7NVVVWlysrKYR+e\n", + "Jk6cqL/97W9qbm7WH//4R82bN0979uyR0+m0u7QBd+TIET355JOqrKxUSEiIpG+vwg33q9ff//73\n", + "O7+eMmWK0tPTlZCQoOLi4mH5CNaOjg6lpaVp7dq1kqSUlBQdPXpUW7ZsIVzr2w+oaWlpSk5OtrsU\n", + "W23atElFRUV6++23NXnyZO3fv1/Lly9XfHy8Fi1aZHd5tnn99de1aNEijRs3TiEhIUpNTdX8+fP1\n", + "4Ycf2l1anwz5cH0xW7hj+Fq5cqW2bdumPXv2KD4+3u5ybHfZZZcpMTFRkjR16lTV1NRoy5YtKioq\n", + "srmygVddXa0TJ05o8uTJnWPt7e3at2+fXn75ZZ05c0aXXXaZjRUGhvDwcE2ePFmffvqp3aXYIjY2\n", + "VpMmTfIZmzhxoj7//HObKgocX375pd59910VFBTYXYrt1q5dq9zcXGVkZEiSJk+erMbGRq1fv35Y\n", + "h+vExETt3btX33zzjU6fPq3o6Gjdf//9uu666+wurU+G/D3XF7OFO4an5cuXq6SkRLt379Z3vvMd\n", + "u8sJSO3t7ero6LC7DFv84Ac/0Mcff6yPPvpIH330kerr6+V0OjV//nzV19cTrP+f1tZWHTp0aNhe\n", + "vJg+fboOHz7sM/b3v/+dD+uStm7dqpEjR2r+/Pl2l2I7y7IUHOwbwYKDg4f9v4Sd53A4FB0drVOn\n", + "TqmsrEz33HOP3SX1yZC/ci19+8/8CxYsUFpaWucW7h6PZ9je23TmzBkdPXpU0rf/hNnY2Kj6+npd\n", + "ffXVnTtvDjePPPKI3njjDW3fvl2jRo3qvB8/IiJCl19+uc3V2eNXv/qV7rrrLo0bN04tLS168803\n", + "9f7772vnzp12l2aL88/7/m/h4eG66qqr/K5UDierVq3SnDlzFBcXpy+//FJr1qzRN998owcffNDu\n", + "0myxcuVKuVwurVu3ThkZGdq/f782b9487B+xZlmWfv/732vevHkKDw+3uxzbzZ07V88++6wSEhI0\n", + "adIk7d+/X7/97W+H7d+b88rKytTe3q6JEyfq008/1S9+8QvdcMMNyszMtLu0vrHxSSUDqqCgwIqP\n", + "j7fCwsIsp9Np7du3z+6SbLNnzx4rKCjICgoKsoKDgzu/zszMtLs02/xvL87/Wb16td2l2WbhwoXW\n", + "+PHjrbCwMCsqKsq6/fbbrbKyMrvLCig8is+y5s2bZ8XGxlojRoywxo4da917773WoUOH7C7LVjt2\n", + "7LBSUlKskSNHWklJSdbmzZvtLsl2u3fvtoKDg62amhq7SwkIX3/9tfXzn//cio+PtxwOh5WYmGg9\n", + "+eSTVltbm92l2Wrbtm3WddddZ4WFhVkxMTHWsmXLrNOnT9tdVp+x/TkAAABgyJC/5xoAAAAYKIRr\n", + "AAAAwBDCNQAAAGAI4RoAAAAwhHANAAAAGEK4BgAAAAwhXAMAAACGEK4BAAAAQwjXAAAAgCH/F5TL\n", + "EYbY5kJbAAAAAElFTkSuQmCC\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -4236,20 +4201,25 @@ } ], "source": [ - "simulate(10, move_error=0.0, sense_error=.05,\n", - " no_sense_error=0.05, move_distance=3)" + "random.seed(3)\n", + "np.set_printoptions(precision=2, suppress=True)\n", + "simulate(4, kernel=[.1, .8, .1], sense_error=0.2,\n", + " no_sense_error=0.1, move_distance=4,\n", + " do_print=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Ypi " + "Here we see that there was a sense error at time 1, but we are still quite confident in our position. \n", + "\n", + "Now lets run a very long simulation to see if the estimate degrades or fails over time." ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 83, "metadata": { "collapsed": false, "scrolled": false @@ -4259,146 +4229,143 @@ "name": "stdout", "output_type": "stream", "text": [ - "[0.025, 0.95, 0.025]\n", - "sense error\n", - "sense error\n", - "sense error\n", - "sense error\n", - "sense error\n", "\n", - "final position is : 4\n", - "predicted position is 1 with confidence 16.67%:\n" + "final position is : 6.0\n", + "predicted position is 6 with confidence 43.52%:\n" ] }, { "data": { "image/png": [ "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\n", - "x3ZXXXWVEhISJElTpkxRbW2tNm/erOLiYpsr6381NTU6fvy4Jk2a1DnW3t6uffv26eWXX9aZM2d0\n", - "1VVX2VhhYAgLC9OkSZP08ccf212KLaKjozVx4kSfsQkTJuiTTz6xqaLA8dlnn+ntt99WYWGh3aXY\n", - "bs2aNcrLy1NGRoYkadKkSTp69KjWrVs3pMN1QkKC9u7dqy+//FKnTp1SZGSkHnzwQd144412l9Yn\n", - "g/6c60u5hTuGpmXLlqm0tFS7d+/Wt7/9bbvLCUjt7e3q6OiwuwxbfP/739eHH36oDz74QB988IEa\n", - "GhrkdDo1f/58NTQ0EKz/v7a2Nh06dGjIHryYNm2aDh8+7DP2j3/8gx/WJW3ZskUjRozQ/Pnz7S7F\n", - "dpZlKTjYN4IFBwcP+d+EXeBwOBQZGamTJ0+qvLxc9957r90l9cmgP3ItffVr/gULFig1NbXzFu4e\n", - "j2fIntt05swZNTY2SvrqV5hHjx5VQ0ODrr/++s47bw41jz76qF5//XVt375dERERnefjh4eH6+qr\n", - "r7a5Onv88pe/1D333KOYmBidPn1aW7du1bvvvqudO3faXZotLlzv++vCwsJ03XXX+R2pHEpWrlyp\n", - "OXPmKDY2Vp999plWr16tL7/8Ug8//LDdpdlixYoVcrlcWrt2rTIyMrR//35t2rRpyF9izbIs/f73\n", - "v9e8efMUFhZmdzm2mzt3rp577jnFx8dr4sSJ2r9/v37zm98M2e+bC8rLy9Xe3q4JEybo448/1i9+\n", - "8QvdfPPNyszMtLu0vrHxSiX9qrCw0IqLi7OGDx9uOZ1Oa9++fXaXZJs9e/ZYQUFBVlBQkBUcHNz5\n", - "ODMz0+7SbPPNXlz4WrVqld2l2WbhwoXWuHHjrOHDh1ujR4+2Zs2aZZWXl9tdVkDhUnyWNW/ePCs6\n", - "OtoaNmyYNXbsWOv++++3Dh06ZHdZttqxY4eVnJxsjRgxwkpMTLQ2bdpkd0m22717txUcHGzV1tba\n", - "XUpA+OKLL6yf//znVlxcnOVwOKyEhATrqaeess6ePWt3abbatm2bdeONN1rDhw+3oqKirKVLl1qn\n", - "Tp2yu6w+4/bnAAAAgCGD/pxrAAAAoL8QrgEAAABDCNcAAACAIYRrAAAAwBDCNQAAAGAI4RoAAAAw\n", - "hHANAAAAGEK4BgAAAAwhXAMAAACG/D9dBMMLaZEUIQAAAABJRU5ErkJggg==\n" + "hHANAAAAGEK4BgAAAAwhXAMAAACGEK4BAAAAQ/ztLgAYiOYTHWo5c/6Kn6djbJgkqfrYqSt+rgsi\n", + "x/krLjR4yM4HAACuHMI1hoWWM+e1vOrEEJ7x7JCdacudoYoLHbLTAQCAK4htIQAAAIAhXLkGMCIM\n", + "1dYhaei3D7F1CACGD8I1gBFh6LcOSUO1fYitQwAwfLAtBAAAADCEcA0AAAAYMqBwXVRUpNjYWAUG\n", + "BsrhcKi6urrP+QcPHtTs2bMVFBSkqKgorV271kixAAAAgDfrd891WVmZVq5cqeLiYqWmpqqwsFDp\n", + "6en6+OOPFR0d7TH/9OnTuuuuuzRnzhzV19fr8OHDyszM1Lhx45STk3NFXsRIwz2d0Z+R/Mt7Eu8T\n", + "AMDw1W+4LigoUGZmppYuXSpJ2rx5s3bt2qXi4mKtX7/eY/4f//hHdXZ2qrS0VAEBAZo6daqOHDmi\n", + "goICwvUAcU9n9Gck//KexPsEADB89bkt5Ny5c2poaFBaWprbeFpammpqanpdU1tbqzvuuEMBAQFu\n", + "81taWnTs2DEDJQMAAADeqc9wfeLECXV1dSk8PNxtPCwsTC6Xq9c1LpfLY/6Fzy+2BgAAABgJjN/n\n", + "2sfH55LWtbe3G67E3eTJk4fkPCYk/B9f7ZsXZncZV8yl/B3QE3cjvR8SPfk2vm880RNP3v5v3HD6\n", + "t3io0BN3I6EffV65Dg0NlZ+fn9ra2tzG29raFBER0euaCRMmeFyhvrB+woQJl1MrAAAA4NX6DNdj\n", + "xoxRUlKSKioq3MYrKyvldDp7XZOSkqL9+/fr7NmzbvMnTpyoSZMmGSgZAAAA8E4+lmVZfU3Yvn27\n", + "Fi1apKKiIjmdTr388ssqKSnRoUOHFB0drdzcXNXV1Wn37t2SvrkVX3x8vObMmaO8vDwdPXpUmZmZ\n", + "euaZZ7Rq1aoheVEAAACAHfrdc52RkaGTJ08qPz9fra2tSkhIUHl5ec89rl0ul5qbm3vmX3PNNaqs\n", + "rNSjjz4qh8Oh8ePHa/Xq1QRrAAAAjHj9XrkGAAAAMDADevz5SDDYR7iPZFVVVZo3b56ioqLk6+ur\n", + "0tJSu0uy3YYNG3TbbbcpJCREYWFhmjdvng4dOmR3WbYqLCxUYmKiQkJCFBISIqfTqfLycrvL8hob\n", + "NmyQr6+vli9fbncptnrmmWfk6+vr9icyMtLusmzV2tqqhx9+WGFhYQoMDNS0adNUVVVld1m2iYmJ\n", + "8XiP+Pr66t5777W7NNucP39eTz75pOLi4hQYGKi4uDj9+te/VldXl92l2aqjo0MrV65UTEyMgoKC\n", + "NGvWLNXX19td1qCNinB94RHueXl5amxslNPpVHp6uo4fP253abY4c+aMbrnlFm3atEmBgYGXfPvE\n", + "keS9997TY489ptraWu3Zs0f+/v6aO3euTp0aukd+e5vo6Gi98MILOnDggD744AN997vf1fz58/Xh\n", + "hx/aXZrt3n//fb366qu65ZZb+P6RNGXKFLlcrp4/Bw8etLsk23z55ZeaNWuWfHx8VF5eriNHjuil\n", + "l15SWNjIvf1ffz744AO390dDQ4N8fHz04IMP2l2abdavX69XXnlFW7Zs0dGjR7Vp0yYVFRVpw4YN\n", + "dpdmq0ceeUSVlZX6wx/+oI8++khpaWmaO3euWlpa7C5tcKxRIDk52Vq2bJnb2OTJk63c3FybKvIe\n", + "V199tVVaWmp3GV7nq6++svz8/Kx3333X7lK8yvjx463f/e53dpdhqy+//NK68cYbrX379llz5syx\n", + "li9fbndJtnr66aet6dOn212G18jNzbVSU1PtLsOr5efnW9dee63V2dlpdym2uffee63Fixe7jT30\n", + "0EPW97//fZsqst9///tfy9/f33rnnXfcxpOSkqy8vDybqro0I/7K9aU8wh04ffq0uru7de2119pd\n", + "ilfo6urSW2+9pc7OTt155512l2OrZcuW6YEHHtDs2bNl8SsrkqTm5mZNnDhRcXFxWrhwof75z3/a\n", + "XZJtduzYoeTkZD344IMKDw/XjBkzVFhYaHdZXsOyLL322mv6yU9+ooCAALvLsU16err27Nmjo0eP\n", + "SpI+/vhj7d27V3fffbfNldnn/Pnz6urq8nhfjB07dtht5TX+hEZvcymPcAdWrFihGTNmKCUlxe5S\n", + "bHXw4EGlpKTo7NmzCgwM1Pbt2xUfH293WbZ59dVX1dzcrG3btkm69CfSjiS33367SktLNWXKFLW1\n", + "tSk/P19Op1OHDh3S+PHj7S5vyDU3N6uoqEg5OTl68skndeDAgZ59+Y8++qjN1dmvsrJS//rXv/TT\n", + "n/7U7lJs9fOf/1yff/65br75Zvn7++v8+fPKy8tTVlaW3aXZJjg4WCkpKcrPz9f06dMVHh6uN998\n", + "U++//37PUxuHixEfroHBysnJUU1Njaqrq0d9eJoyZYr+/ve/q729XX/605+0YMEC7d27Vw6Hw+7S\n", + "htzRo0f11FNPqbq6Wn5+fpK+uQo32q9ef+973+v5ePr06UpJSVFsbKxKS0tH5S1Yu7u7lZycrHXr\n", + "1kmSEhMT1dTUpMLCQsK1vvkBNTk5WQkJCXaXYqvNmzerpKREb731lqZNm6YDBw5oxYoViomJ0ZIl\n", + "S+wuzzavv/66lixZoqioKPn5+SkpKUkLFy7UBx98YHdpgzLiw/WlPMIdo9eqVau0fft27d27VzEx\n", + "MXaXY7urrrpKcXFxkqQZM2aorq5OhYWFKikpsbmyoVdbW6sTJ05o2rRpPWNdXV3av3+/XnnlFZ05\n", + "c0ZXXXWVjRV6h6CgIE2bNk2ffPKJ3aXYIjIyUlOnTnUbmzJlij777DObKvIeX3zxhd555x0VFRXZ\n", + "XYrt1q1bp7y8PGVkZEiSpk2bpmPHjmnDhg2jOlzHxcVp3759+vrrr3X69GmFh4frwQcf1I033mh3\n", + "aYMy4vdcX8oj3DE6rVixQmVlZdqzZ4++853v2F2OV+rq6lJ3d7fdZdjiBz/4gT766CN9+OGH+vDD\n", + "D9XY2CiHw6GFCxeqsbGRYP3/dHZ26vDhw6P24sWsWbN05MgRt7F//OMf/LAuaevWrRo7dqwWLlxo\n", + "dym2syxLvr7uEczX13fU/0/YBYGBgQoPD9epU6dUUVGh++67z+6SBmXEX7mWvvlv/kWLFik5Obnn\n", + "Ee4ul2vU7m06c+aMmpqaJH3zX5jHjh1TY2Ojrrvuup4nb442jz76qN544w3t2LFDISEhPfvxg4OD\n", + "NW7cOJurs8evfvUr3XvvvYqKilJHR4e2bdum9957T7t27bK7NFtcuN/3/woKCtK1117rcaVyNFm9\n", + "erXmzZun6OhoffHFF1q7dq2+/vprPfzww3aXZotVq1bJ6XRq/fr1ysjI0IEDB7Rly5ZRf4s1y7L0\n", + "+9//XgsWLFBQUJDd5dhu/vz5eu655xQbG6upU6fqwIED+u1vfztqv28uqKioUFdXl6ZMmaJPPvlE\n", + "v/zlL3XzzTcrMzPT7tIGx8Y7lQypoqIiKyYmxgoICLAcDoe1f/9+u0uyzd69ey0fHx/Lx8fH8vX1\n", + "7fk4MzPT7tJs8+1eXPizZs0au0uzzeLFi61JkyZZAQEBVlhYmHXXXXdZFRUVdpflVbgVn2UtWLDA\n", + "ioyMtMaMGWNNnDjRuv/++63Dhw/bXZatdu7caSUmJlpjx4614uPjrS1btthdku327Nlj+fr6WnV1\n", + "dXaX4hW++uor6xe/+IUVExNjBQYGWnFxcdZTTz1lnT171u7SbLV9+3brxhtvtAICAqyIiAhr+fLl\n", + "1unTp+0ua9B4/DkAAABgyIjfcw0AAAAMFcI1AAAAYAjhGgAAADCEcA0AAAAYQrgGAAAADCFcAwAA\n", + "AIYQrgEAAABDCNcAAACAIYRrAAAAwJD/CyhV7PZJCBFFAAAAAElFTkSuQmCC\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -4406,8 +4373,9 @@ } ], "source": [ - "simulate(133, move_error=0.05, sense_error=.05,\n", - " no_sense_error=0.05, move_distance=4, do_print=False)" + "simulate(4, kernel=[.1, .8, .1], sense_error=0.2,\n", + " no_sense_error=0.1, move_distance=4,\n", + " do_print=False)" ] }, { diff --git a/experiments/train.py b/experiments/train.py index 33db650..a0a51b4 100644 --- a/experiments/train.py +++ b/experiments/train.py @@ -38,18 +38,17 @@ def update(map_, belief, z, p_hit, p_miss): belief = normalize(belief) -def predict(belief, U, kernel): - N = len(belief) +def predict(prob_dist, offset, kernel): + N = len(prob_dist) kN = len(kernel) width = int((kN - 1) / 2) - belief_k = np.zeros(N) - + result = np.zeros(N) for i in range(N): for k in range (kN): - index = (i + (width-k)-U) % N - belief_k[i] += belief[index] * kernel[k] - belief[:] = belief_k[:] + index = (i + (width-k) - offset) % N + result[i] += prob_dist[index] * kernel[k] + prob_dist[:] = result[:] # update belief def add_noise (Z, count): @@ -102,10 +101,10 @@ import random class Train(object): - def __init__(self, track, move_error=.1, sense_error=.1, no_sense_error=.05): + def __init__(self, track, kernel=[1.], sense_error=.1, no_sense_error=.05): self.track = track self.pos = 0 - self.move_error = move_error + self.kernel = kernel self.sense_error = sense_error self.no_sense_error = no_sense_error @@ -115,14 +114,17 @@ class Train(object): self.pos += distance - # insert random movement error + # insert random movement error according to kernel r = random.random() - if r < self.move_error: - self.pos -= 1 - elif r > 1 - self.move_error: - self.pos += 1 + s = 0 + offset = -(len(self.kernel) - 1) / 2 + for k in self.kernel: + s += k + if r <= s: + break + offset += 1 - self.pos = self.pos % len(self.track) + self.pos = (self.pos + offset) % len(self.track) return self.pos def sense(self): @@ -141,14 +143,12 @@ class Train(object): def animate_train(loops=5): world = np.array([1,2,3,4,5,6,7,8,9,10]) - #world = np.array([1,1,1,1,1]) - #world = np.array([1,0,1,0,1,0]) N = len(world) belief = np.zeros(N) belief[0] = 1.0 - robot = Train(world, .0, 0, 0) + robot = Train(world, [.1, .8, .1], .1, .1) for i in range(N*loops): robot.move(1) @@ -157,43 +157,13 @@ def animate_train(loops=5): predict(belief, 1, (.05, .9, .05)) bar_plot(belief) - plt.pause(0.5) + plt.pause(0.1) print(belief) -#animate_train(1) +animate_train(3) world = np.array([1,2,3,4,5,6,7,8,9,10]) #world = np.array([1,1,1,1,1]) #world = np.array([1,0,1,0,1,0]) -def predict_old(pos_belief, move, p_correct, p_under, p_over): - n = len(pos_belief) - result = np.zeros(n) - for i in range(n): - result[i] = ( - pos_belief[(i-move) % n] * p_correct + - pos_belief[(i-move-1) % n] * p_over + - pos_belief[(i-move+1) % n] * p_under) - pos_belief[:] = result - - -N = len(world) - -belief = np.ones(N) -belief[0] = 10.0 -normalize(belief) - -belief2 = belief.copy() - -predict(belief, 3, (.05, .9, .05)) -predict_old(belief2, 3, .9, .05, .05) - -''' -print(belief) -update(world, belief, 1, .8, .2) -print(belief) - -predict(belief, 3, (.05, .9, .05)) -print(belief) -'''