From 86341c51abd6b257eaed292353aaa70a7b2e3993 Mon Sep 17 00:00:00 2001 From: vik Date: Mon, 6 Nov 2017 11:01:38 +0100 Subject: [PATCH] more stable learning due to target network --- reinforcement_learning/deep_Q_bridge.ipynb | 1595 ++++++++++++++++---- 1 file changed, 1336 insertions(+), 259 deletions(-) diff --git a/reinforcement_learning/deep_Q_bridge.ipynb b/reinforcement_learning/deep_Q_bridge.ipynb index d4b5ce3..40e2ee0 100644 --- a/reinforcement_learning/deep_Q_bridge.ipynb +++ b/reinforcement_learning/deep_Q_bridge.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": { "collapsed": true }, @@ -26,20 +26,43 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[ 0. 0. 0. 0. 1. 0. 0. 0.] 8\n", - "(array([ 0., 2., 0., 0., 1., 0., 0., 0.]), -0.1, False)\n", - "[[ 0. 2. 3. 0.]\n", - " [ 1. 0. 0. 0.]] \n", - "\n", - "[[ 0. 2. 3. 0.]\n", - " [ 1. 0. 0. 4.]]\n" + "(array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -1.,\n", + " 1., 0., 0.]), -0.1, False)\n", + "[[ 0. 0. 0. 0.]\n", + " [ 0. 0. 0. 0.]\n", + " [ 0. 0. 0. 0.]\n", + " [ 1. 2. 0. 0.]]\n", + "(array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., -1.,\n", + " -1., 0., 0.]), -0.1, False)\n", + "[[ 0. 0. 0. 0.]\n", + " [ 0. 0. 0. 0.]\n", + " [ 0. 3. 0. 0.]\n", + " [ 1. 2. 0. 0.]]\n", + "(array([ 0., 0., 0., 0., 0., 0., 1., 0., 0., -1., 0., 0., -1.,\n", + " -1., 0., 0.]), -0.1, False)\n", + "[[ 0. 0. 0. 0.]\n", + " [ 0. 0. 4. 0.]\n", + " [ 0. 3. 0. 0.]\n", + " [ 1. 2. 0. 0.]]\n", + "(array([ 0., 0., 0., 0., 0., 0., -1., 0., 0., -1., 0., 1., -1.,\n", + " -1., 0., 0.]), -0.1, False)\n", + "[[ 0. 0. 0. 0.]\n", + " [ 0. 0. 4. 0.]\n", + " [ 0. 3. 0. 5.]\n", + " [ 1. 2. 0. 0.]]\n", + "(array([ 0., 0., 0., 0., 0., 0., -1., 0., 0., -1., 0., -1., -1.,\n", + " -1., 0., 1.]), 4.8895833333333334, True)\n", + "[[ 0. 0. 0. 0.]\n", + " [ 0. 0. 4. 0.]\n", + " [ 0. 3. 0. 5.]\n", + " [ 1. 2. 0. 6.]]\n" ] } ], @@ -57,7 +80,9 @@ " self.valid_actions = None\n", " self.optimize = optimize\n", " self.result_map = {}\n", - " \n", + " self.ss = None\n", + " self.current_distance = length - 1\n", + "\n", " # actions\n", " right = 0\n", " left = 4\n", @@ -84,41 +109,27 @@ " self.actions_chosen = 0\n", " self.state[-1][0] = self.n\n", " self.det_valid_actions()\n", - " \n", " return self.state.ravel()\n", - "# # valid action encoding\n", - "# a = np.zeros(8)\n", - "# a[np.array(self.valid_actions)] = 1\n", - " \n", - "# return np.concatenate((self.state.ravel(), a))\n", " \n", " def return_action(self, r):\n", " done = False\n", - " \n", + " self.det_valid_actions()\n", + " s = np.array(self.state.ravel())\n", + " i = np.where(s == self.n)\n", + " s[s > 0] = -1\n", + " s[i] = 1\n", + " \n", " # Bridge is build\n", " if self.state[-1][-1] != 0:\n", - " r = r + 10 - self.structure()**2 # that is moment to the power 2\n", + " r = r + 5 - self.structure() / (0.5*5*self.length**2) # that is moment to the power 2\n", " done = True\n", - " return self.state, r, done\n", - "\n", - " s = self.state / np.max(self.state)\n", - " zero_mask = np.where(s == 0)\n", - " s[s < 1] = 0.5\n", - " s[zero_mask] = 0\n", - " self.det_valid_actions()\n", + " return s, r , done\n", " \n", - " # valid action encoding\n", - " a = np.zeros(8)\n", - " \n", - " try:\n", - " a[np.array(self.valid_actions)] = 1\n", - " except IndexError:\n", + " if len(self.valid_actions) == 0:\n", " done = True\n", " r -= 2\n", " \n", - " return self.state.ravel(), r, done\n", - " \n", - "# return np.concatenate((self.state.ravel(), a)), r, done\n", + " return s, r , done\n", " \n", " def det_valid_actions(self):\n", " no_action = set()\n", @@ -198,20 +209,27 @@ " self.actions_chosen += 1\n", "\n", " flat_location_index = np.argwhere(self.state.ravel() == self.n)\n", - " \n", + " \n", " if a in self.no_action:\n", " return self.return_action(-0.2)\n", " \n", - " # there is a valid action\n", + " # there is a valid action, make a move\n", " self.n += 1\n", - " \n", " move = self.move_map[a]\n", " self.state.ravel()[flat_location_index + move] = self.n\n", - " \n", - " return self.return_action(-0.1)\n", + " \n", + " row, col = np.where(self.state == self.n)\n", + " y = self.height - 1 - row[0]\n", + " x = self.length - 1 - col[0]\n", + " \n", + "# distance = (x**2 + y**2)**0.5\n", + "# d_distance = self.current_distance - distance\n", + "# self.current_distance = distance\n", + "\n", + " return self.return_action(-0.1 )\n", " \n", " def structure(self):\n", - " ss = SystemElements()\n", + " self.ss = SystemElements()\n", " last_loc = [0, 0]\n", " for i in range(2, self.n + 1):\n", " row, col = np.where(i == self.state)\n", @@ -220,45 +238,55 @@ " x = col[0] \n", "\n", " current_loc = [x, y]\n", - " ss.add_element([last_loc, [x, y]])\n", + " self.ss.add_element([last_loc, [x, y]])\n", " last_loc = current_loc\n", " \n", - " n_nodes = len(ss.node_map)\n", - " forces = -5 / (n_nodes - 2)\n", + " n_nodes = len(self.ss.node_map)\n", + " forces = -1 / (n_nodes - 2)\n", " for i in range(2, n_nodes):\n", - " ss.point_load(node_id=i, Fz=forces)\n", + " self.ss.point_load(node_id=i, Fz=forces)\n", " \n", - " ss.add_support_hinged(1)\n", - " ss.add_support_hinged(len(ss.node_map))\n", - " ss.solve()\n", + " self.ss.add_support_hinged(1)\n", + " self.ss.add_support_hinged(len(self.ss.node_map))\n", + " self.ss.solve()\n", " \n", - " f_max = np.max(np.abs(ss.get_element_result_range(self.optimize)))\n", - "# if f_max not in self.result_map:\n", - "# self.result_map[f_max] = ss\n", + " f_max = np.max(np.abs(self.ss.get_element_result_range(self.optimize)))\n", " \n", " return f_max\n", + " \n", + " def sample_action(self):\n", + " return np.random.randint(0, 8) #self.valid_actions[np.random.randint(0, len(self.valid_actions))]\n", "\n", " \n", "\n", " \n", "def test_env():\n", - " env = Environment(4, 2)\n", + " env = Environment(4, 4)\n", " s = env.reset()\n", - " print(s, s.size)\n", - " print(env.step(1))\n", "\n", - " env.step(0)\n", - " print(env.state, \"\\n\")\n", - " env.step(7)\n", + " print(env.step(0))\n", " print(env.state)\n", - " env.structure()\n", + " print(env.step(2))\n", + " print(env.state)\n", + " print(env.step(1))\n", + " print(env.state)\n", + " print(env.step(7))\n", + " print(env.state)\n", + " print(env.step(6))\n", + " print(env.state)\n", + "\n", + "# env.step(0)\n", + "# print(env.state, \"\\n\")\n", + "# env.step(7)\n", + "# print(env.state)\n", + "# env.structure()\n", " \n", "test_env()" ] }, { "cell_type": "code", - "execution_count": 158, + "execution_count": 7, "metadata": { "collapsed": true }, @@ -266,56 +294,110 @@ "source": [ "# https://theneuralperspective.com/2016/11/25/reinforcement-learning-rl-policy-gradients-i/\n", "\n", + "def leaky_relu(x, alpha=0.1):\n", + " return tf.maximum(x, alpha * x)\n", + "\n", "class Agent:\n", - " def __init__(self, data_size, hidden_size, action_space, learning_rate):\n", + " def __init__(self, data_size, hidden_size, action_space, learning_rate, name):\n", " \"\"\"\n", " :param data_size: (int) Columns of the data vector.\n", " :param hidden_size: (int) No. of hidden nodes.\n", " :param action_space: (int) No. of outputs.\n", " :param learning_rate: (flt)\n", " \"\"\"\n", + " \n", + " if len(hidden_size) == 1:\n", + " one_hidden_layer = True\n", + " hidden_size.append(hidden_size[0])\n", + " else:\n", + " one_hidden_layer = False\n", + "\n", + " \n", " # Step 1: Feed forward\n", " # The argmax is the maximum Q-value.\n", " self.input_s = tf.placeholder(tf.float32, [None, data_size], name=\"input_s\")\n", - " self.w1 = tf.get_variable(\"w1\", shape=[data_size, hidden_size[0]], initializer=tf.contrib.layers.xavier_initializer())\n", - " self.b1 = tf.get_variable(\"b1\", shape=(hidden_size[0], ), initializer=tf.zeros_initializer())\n", - " self.layer_1 = tf.nn.relu(tf.matmul(self.input_s, self.w1) + self.b1)\n", + " self.w1 = tf.get_variable(f\"{name}_w1\", shape=[data_size, hidden_size[0]], initializer=tf.contrib.layers.xavier_initializer())\n", + " self.b1 = tf.get_variable(f\"{name}_b1\", shape=(hidden_size[0], ), initializer=tf.zeros_initializer())\n", + " self.layer_1 = leaky_relu(tf.matmul(self.input_s, self.w1) + self.b1)\n", " \n", - " self.w2 = tf.get_variable(\"w2\", shape=[hidden_size[0], hidden_size[1]], initializer=tf.contrib.layers.xavier_initializer())\n", - " self.b2 = tf.get_variable(\"b2\", shape=(hidden_size[1], ), initializer=tf.zeros_initializer())\n", - " self.layer_2 = tf.nn.relu(tf.matmul(self.layer_1, self.w2) + self.b2)\n", - " \n", - " self.w_out = tf.get_variable(\"w_out\", shape=[hidden_size[1], action_space], initializer=tf.contrib.layers.xavier_initializer())\n", - " self.b_out = tf.get_variable(\"b_out\", shape=(action_space, ), initializer=tf.zeros_initializer())\n", + " self.w2 = tf.get_variable(f\"{name}_w2\", shape=[hidden_size[0], hidden_size[1]], initializer=tf.contrib.layers.xavier_initializer())\n", + " self.b2 = tf.get_variable(f\"{name}_b2\", shape=(hidden_size[1], ), initializer=tf.zeros_initializer())\n", + " self.layer_2 = leaky_relu(tf.matmul(self.layer_1, self.w2) + self.b2)\n", + " \n", + " self.w_out = tf.get_variable(f\"{name}_w_out\", shape=[hidden_size[1], action_space], initializer=tf.contrib.layers.xavier_initializer())\n", + " self.b_out = tf.get_variable(f\"{name}_b_out\", shape=(action_space, ), initializer=tf.zeros_initializer())\n", + " \n", + " if one_hidden_layer:\n", + " hidden_layer = self.layer_1\n", + " else:\n", + " hidden_layer = self.layer_2\n", " \n", " # argmax(Q(s, a)) \n", - " self.predict_Q = tf.matmul(self.layer_2, self.w_out) + self.b_out # actual Q-value\n", + " self.predict_Q = tf.matmul(hidden_layer, self.w_out) + self.b_out # actual Q-value\n", " self.p = tf.nn.softmax(self.predict_Q)\n", " self.Q_a = tf.argmax(self.predict_Q, 1)\n", " self.saver = tf.train.Saver()\n", - "\n", " \n", " # Step 2: Determine loss / gradients. \n", " # One hot encoded actions\n", - " self.executed_actions = tf.placeholder(tf.int32, name=\"executed_actions\")\n", + " self.executed_actions = tf.placeholder(tf.int32)\n", " \n", " self.one_hot = tf.one_hot(self.executed_actions, 8)\n", " self.Q = tf.reduce_sum(tf.multiply(self.predict_Q, self.one_hot), axis=1)\n", - " self.next_Q_r = tf.placeholder(tf.float32, name=\"next_Q\")\n", + " self.next_Q_r = tf.placeholder(tf.float32)\n", "\n", " # Loss\n", " # mse: ( target - prediction)^2\n", " # r + max(Q(s', a') - Q(s, a) )^2\n", " \n", - " self.loss = tf.reduce_sum(tf.square(self.next_Q_r - self.Q)) \n", + " #self.loss = tf.losses.huber_loss(self.next_Q_r, - self.Q, delta=2)\n", + "# self.clipped_error = tf.maximum(tf.abs(self.next_Q_r - self.Q), tf.ones(tf.shape(self.Q)))\n", + "# self.loss = tf.reduce_sum(tf.square(self.clipped_error)) \n", + " self.loss = tf.reduce_sum(tf.square(self.next_Q_r - self.Q)) \n", " optimizer = tf.train.AdamOptimizer(learning_rate)\n", " self.train_count = tf.Variable(0, trainable=False)\n", - " self.train = optimizer.minimize(self.loss, self.train_count)\n" + " self.train = optimizer.minimize(self.loss, self.train_count)\n", + " \n", + " \n", + " \n", + " \n", + "class FrozenAgent:\n", + " def __init__(self, data_size):\n", + " \"\"\"\n", + " :param data_size: (int) Columns of the data vector.\n", + " \"\"\"\n", + " # Step 1: Feed forward\n", + " # The argmax is the maximum Q-value.\n", + " self.input_s = tf.placeholder(tf.float32, [None, data_size], name=\"input_s\")\n", + " \n", + " # weights and biases\n", + " self.wb = tuple([tf.placeholder(dtype=tf.float32) for _ in range(6)])\n", + " \n", + " w1 = self.wb[0]\n", + " b1 = self.wb[1]\n", + " w2 = self.wb[2]\n", + " b2 = self.wb[3]\n", + " w_out = self.wb[4]\n", + " b_out = self.wb[5]\n", + " \n", + " self.layer_1 = leaky_relu(tf.matmul(self.input_s, w1) + b1)\n", + "# self.layer_2 = leaky_relu(tf.matmul(self.layer_1, w2) + b2)\n", + " \n", + " self.predict_Q = tf.matmul(self.layer_1, w_out) + b_out # actual Q-value\n" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 155, "metadata": { "collapsed": true }, @@ -328,33 +410,37 @@ " :param r: (array) Rewards.\n", " :param gamma: (flt) Discount factor\n", " \"\"\"\n", - " return np.cumsum(r * gamma**(np.arange(len(r)))[::-1])[::-1]\n" + " return np.cumsum(r * gamma**(np.arange(len(r)))[::-1])[::-1]\n", + "\n", + "def prepare_update_target(trainables, tau=0.05):\n", + " \"\"\"\n", + " The weights and biases of the target will be a depended of the primary network.\n", + " \n", + " wb[target] = t\n", + " \n", + " This is a tensorflow operation and still needs to be run with Session.run(operation_holder)\n", + " \n", + " :trainables (tf.trainable_variables)\n", + " :tau (flt) Rate to update the target graph\n", + " \"\"\"\n", + " \n", + " operation_holder = []\n", + " n_variables = len(trainables) // 2 # the agent has half and the target has half\n", + " \n", + " for i, v in enumerate(trainables[0: n_variables]):\n", + " operation_holder.append(trainables[i + n_variables].assign(v.value() * tau) +\n", + " ((1 - tau) * trainables[i + n_variables].value()))\n", + " return operation_holder\n", + "\n", + "def update_target(operation_holder, session):\n", + " for op in operation_holder:\n", + " session.run(op)\n", + " " ] }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "env = Environment(4, 2)\n", - "env.reset().size" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 157, "metadata": { "scrolled": false }, @@ -363,21 +449,31 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.3054 train_count 15 loss 3898.21\n", - "0.4478 train_count 70 loss 16990.0\n", - "0.7954 train_count 107 loss 48269.6\n", - "0.9927 train_count 130 loss 88762.8\n", - "1.2139 train_count 144 loss 129566.0\n", - "1.2376 train_count 145 loss 131087.0\n", - "1.2771 train_count 148 loss 135273.0\n", - "1.2852 train_count 152 loss 153039.0\n", - "1.3482 train_count 154 loss 163115.0\n", - "1.3247 train_count 158 loss 173414.0\n", - "1.4037 train_count 159 loss 180652.0\n" + "0.116247427468 train_count 0 target_count 0 loss 0 eps 0.2714376441341128\n", + "0.0162883100961 train_count 0 target_count 0 loss 0 eps 0.2455946488435909\n", + "0.0599824019159 train_count 63 target_count 20 loss 770.631 eps 0.22221210964683\n", + "0.148132212666 train_count 163 target_count 43 loss 416.57 eps 0.20105577180202236\n", + "1.67631473098 train_count 263 target_count 48 loss 221.547 eps 0.18191368345835565\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 88\u001b[0m \u001b[0mbatch\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mbatch\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m5000\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1000\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 89\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 90\u001b[1;33m \u001b[0ms\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvstack\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 91\u001b[0m \u001b[0ms_new\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvstack\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 92\u001b[0m \u001b[0mr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mbatch\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\numpy\\core\\shape_base.py\u001b[0m in \u001b[0;36mvstack\u001b[1;34m(tup)\u001b[0m\n\u001b[0;32m 228\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 229\u001b[0m \"\"\"\n\u001b[1;32m--> 230\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0m_nx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconcatenate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0matleast_2d\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m_m\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0m_m\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mtup\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 231\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 232\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mhstack\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtup\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\numpy\\core\\shape_base.py\u001b[0m in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 228\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 229\u001b[0m \"\"\"\n\u001b[1;32m--> 230\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0m_nx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconcatenate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0matleast_2d\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m_m\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0m_m\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mtup\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 231\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 232\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mhstack\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtup\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\numpy\\core\\shape_base.py\u001b[0m in \u001b[0;36matleast_2d\u001b[1;34m(*arys)\u001b[0m\n\u001b[0;32m 98\u001b[0m \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 99\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mary\u001b[0m \u001b[1;32min\u001b[0m \u001b[0marys\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 100\u001b[1;33m \u001b[0mary\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0masanyarray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mary\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 101\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 102\u001b[0m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\numpy\\core\\numeric.py\u001b[0m in \u001b[0;36masanyarray\u001b[1;34m(a, dtype, order)\u001b[0m\n\u001b[0;32m 531\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 532\u001b[0m \"\"\"\n\u001b[1;32m--> 533\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0morder\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0morder\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msubok\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 534\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 535\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mascontiguousarray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ + "\n", "from collections import deque\n", "# %matplotlib inline\n", "# %matplotlib notebook\n", @@ -390,162 +486,111 @@ "# fig.show()\n", "# fig.canvas.draw()\n", "\n", + "env = Environment(3, 2, \"moment\")\n", + "env.reset()\n", "\n", - "env = Environment(3, 1, \"moment\")\n", - "\n", - "H = [16, 16] # hidden neurons\n", - "D = 3 # input (state of the environment)\n", + "H = [16] # hidden neurons\n", + "D = env.state.size # input (state of the environment)\n", "learning_rate = 1e-3\n", "gamma = 0.99 # discount factor\n", "epochs = 50000\n", - "max_frames = 50\n", + "max_frames = 500\n", "action_space = 8\n", "\n", "contin = 0\n", "\n", "if not contin:\n", + " eps = 0.3\n", " tf.reset_default_graph()\n", - " agent = Agent(D, H, action_space, learning_rate)\n", + " agent = Agent(D, H, action_space, learning_rate, \"agent\")\n", + " target = Agent(D, H, action_space, 0, \"target\")\n", + " \n", " init = tf.global_variables_initializer()\n", - " #with tf.Session() as sess:\n", " sess = tf.Session()\n", " sess.run(init)\n", " buffer = deque()\n", + " \n", + " # the first half of the list are the variables of the agent.\n", + " # The last half the variables of the target\n", + " variables = tf.trainable_variables() \n", + " operation_holder = prepare_update_target(variables)\n", + " \n", "\n", "scores= []\n", "n_done = 0\n", "\n", "last_ep = 0\n", "\n", + "\n", "#https://github.com/awjuliani/DeepRL-Agents/blob/master/Q-Network.ipynb\n", - "n_updates = 0\n", + "train_count = 0\n", + "target_update_count = 0\n", + "loss = 0\n", + "variable_update_help = None\n", "for ep in range(epochs):\n", - " if (ep + 1) % 300 == 0:\n", - " print(np.mean(scores[-500:]), \"train_count\", train_count, \"loss\", loss)\n", + " if eps > 0.001:\n", + " eps *= 0.999\n", + "\n", + " if (ep + 1) % 100 == 0:\n", + " print(np.mean(scores), \"train_count\", train_count, \"target_count\", target_update_count,\n", + " \"loss\", loss, \"eps\", eps)\n", + " scores = []\n", " \n", " s = env.reset()\n", " s = [s]\n", " for c in range(max_frames):\n", " \n", - " p, Q = sess.run([agent.p, agent.predict_Q], {agent.input_s: s})\n", + " Q = sess.run(agent.predict_Q, {agent.input_s: s})\n", + " \n", + " if np.random.rand(1) < eps:\n", + " a = env.sample_action()\n", + " else:\n", + " a = np.argmax(Q)\n", " \n", - " a = np.random.choice(np.arange(8), p=p[0]) # choose an action index\n", " s_new, r, done = env.step(a)\n", " scores.append(r)\n", "\n", - " buffer.append([s, a, r, s_new])\n", + " buffer.append([s, a, r, s_new, done])\n", " \n", " if len(buffer) > 5000:\n", " buffer.pop()\n", " s = [s_new]\n", " \n", " if done:\n", - " \n", - " if len(buffer) > 2000 and c % 5 == 0:\n", + " \n", + " if len(buffer) >= 5000:\n", " batch = np.vstack(buffer)\n", - " batch = batch[np.random.randint(0, 2000, size=1500)]\n", + " batch = batch[np.random.randint(0, 5000, size=1000)]\n", "\n", " s = np.vstack(batch[:, 0])\n", " s_new = np.vstack(batch[:, 3])\n", " r = batch[:, 2]\n", - " a = batch[:, 1] \n", + " a = batch[:, 1]\n", + " done_ = np.array(batch[:, 4], dtype=bool)\n", " Q = sess.run(agent.predict_Q, {agent.input_s: s})\n", - " Q_new = sess.run(agent.predict_Q, {agent.input_s: s_new})\n", + " Q_new = sess.run(target.predict_Q, {target.input_s: s_new})\n", " max_Q_new = np.max(Q_new, 1)\n", "\n", " target_Q = (r + gamma * max_Q_new)\n", - " \n", - " \n", - " train_count, Q_, one_hot, loss, _ = sess.run([agent.train_count, agent.Q, agent.one_hot, agent.loss, agent.train], \n", + " target_Q[done_] = r[done_]\n", + " \n", + " train_count, loss, _ = sess.run([agent.train_count, agent.loss, agent.train], \n", " feed_dict={agent.input_s: s, \n", " agent.executed_actions: a, \n", " agent.next_Q_r: target_Q})\n", - " \n", - "# print(one_hot.shape)\n", - "# print(one_hot[0, :])\n", - "# print(\"predict_Q\", Q[0,:])\n", - "# print(Q_.shape)\n", - "# print(Q_[0])\n", - " \n", "\n", + " if c % 3 == 0:\n", + " # update target network\n", + " target_update_count += 1\n", + " update_target(operation_holder, sess)\n", + " \n", + " \n", + " \n", " break\n", + " \n", "\n" ] }, - { - "cell_type": "code", - "execution_count": 140, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 0.26007631, -0.34215826, 0.26007631, ..., 0.52565402,\n", - " 0.80317271, 0.80317271])" - ] - }, - "execution_count": 140, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.sum(Q * np.eye(8)[np.array(a, dtype=int)], 1)" - ] - }, - { - "cell_type": "code", - "execution_count": 138, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 0. , 0. , 0. , ..., 0. ,\n", - " -0. , 0.26007631],\n", - " [ 0. , 0. , 0. , ..., 0. ,\n", - " -0.34215826, 0. ],\n", - " [ 0. , 0. , 0. , ..., 0. ,\n", - " -0. , 0.26007631],\n", - " ..., \n", - " [ 0. , 0.52565402, 0. , ..., 0. ,\n", - " -0. , 0. ],\n", - " [ 0.80317271, 0. , 0. , ..., 0. ,\n", - " -0. , 0. ],\n", - " [ 0.80317271, 0. , 0. , ..., 0. ,\n", - " -0. , 0. ]])" - ] - }, - "execution_count": 138, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = Q * np.eye(8)[np.array(a, dtype=int)]\n", - "x" - ] - }, - { - "cell_type": "code", - "execution_count": 136, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "7" - ] - }, - "execution_count": 136, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a" - ] - }, { "cell_type": "code", "execution_count": 161, @@ -588,7 +633,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -596,46 +641,47 @@ "output_type": "stream", "text": [ "\n", - " [[ 1. 0. 0.]]\n", - "5\n", - "[[-0.10357568 -0.11130837 0.08943851 -0.03797921 -0.03640079 0.09984766\n", - " 0.0517213 -0.13007079]]\n", + " [[ 0. 0. 0.]\n", + " [ 1. 0. 0.]]\n", + "[[ 0.0157699 -0.00472315 -0.00631001 -0.0119287 -0.01288951 -0.00707795\n", + " 0.01728024 0.0105312 ]]\n", + "action 6\n", + "-0.2\n", "\n", - " [[ 1. 0. 0.]]\n", - "5\n", - "[[-0.10357568 -0.11130837 0.08943851 -0.03797921 -0.03640079 0.09984766\n", - " 0.0517213 -0.13007079]]\n", + " [[ 0. 0. 0.]\n", + " [ 1. 0. 0.]]\n", + "[[ 0.0157699 -0.00472315 -0.00631001 -0.0119287 -0.01288951 -0.00707795\n", + " 0.01728024 0.0105312 ]]\n", + "action 6\n", + "-0.2\n", "\n", - " [[ 1. 0. 0.]]\n", - "5\n", - "[[-0.10357568 -0.11130837 0.08943851 -0.03797921 -0.03640079 0.09984766\n", - " 0.0517213 -0.13007079]]\n", + " [[ 0. 0. 0.]\n", + " [ 1. 0. 0.]]\n", + "[[ 0.0157699 -0.00472315 -0.00631001 -0.0119287 -0.01288951 -0.00707795\n", + " 0.01728024 0.0105312 ]]\n", + "action 6\n", + "-0.2\n", "\n", - " [[ 1. 0. 0.]]\n", - "5\n", - "[[-0.10357568 -0.11130837 0.08943851 -0.03797921 -0.03640079 0.09984766\n", - " 0.0517213 -0.13007079]]\n", + " [[ 0. 0. 0.]\n", + " [ 1. 0. 0.]]\n", + "[[ 0.0157699 -0.00472315 -0.00631001 -0.0119287 -0.01288951 -0.00707795\n", + " 0.01728024 0.0105312 ]]\n", + "action 6\n", + "-0.2\n", "\n", - " [[ 1. 0. 0.]]\n", - "5\n", - "[[-0.10357568 -0.11130837 0.08943851 -0.03797921 -0.03640079 0.09984766\n", - " 0.0517213 -0.13007079]]\n", - "\n", - " [[ 1. 0. 0.]]\n", - "5\n", - "[[-0.10357568 -0.11130837 0.08943851 -0.03797921 -0.03640079 0.09984766\n", - " 0.0517213 -0.13007079]]\n", - "\n", - " [[ 1. 0. 0.]]\n", - "5\n", - "[[-0.10357568 -0.11130837 0.08943851 -0.03797921 -0.03640079 0.09984766\n", - " 0.0517213 -0.13007079]]\n", + " [[ 0. 0. 0.]\n", + " [ 1. 0. 0.]]\n", + "[[ 0.0157699 -0.00472315 -0.00631001 -0.0119287 -0.01288951 -0.00707795\n", + " 0.01728024 0.0105312 ]]\n", + "action 6\n", + "-0.2\n", "\r", - " -1.4" + " -1.0" ] } ], "source": [ + "env = Environment(3, 2)\n", "s = env.reset()\n", "\n", "\n", @@ -650,19 +696,25 @@ " ↘ 7\n", "\"\"\"\n", "\n", + "bot = target\n", + "\n", "total_r = 0\n", "j = 0\n", - "for a in [0, 0, 1, 1, 0, 0, 0]:\n", + "for a in [1, 0, 0, 0, 0]:\n", " j += 1\n", "\n", " print(\"\\n\", env.state)\n", - " a_dst = sess.run(agent.predict_Q, {agent.input_s: [s]})\n", + " \n", + " \n", + " a_dst = sess.run(bot.predict_Q, {bot.input_s: [s]})\n", " a = np.argmax(a_dst)\n", " #a = np.random.choice(np.arange(8), p=a_dst[0])\n", "\n", " s, r, d = env.step(a)\n", - " print(a)\n", + "\n", " print(a_dst)\n", + " print(\"action\", a)\n", + " print(r)\n", " total_r += r\n", " \n", "# if d == True:\n", @@ -676,23 +728,50 @@ }, { "cell_type": "code", - "execution_count": 50, - "metadata": {}, + "execution_count": 82, + "metadata": { + "run_control": { + "marked": true + } + }, "outputs": [ { "data": { "text/plain": [ - "array([ 0.76904085, 0.296608 , 0.9456555 , 0.73741889, 0.83164985,\n", - " 0.82735085, 0.58143395, 0.64800572])" + "array([[-1.47237194, -0.45450115, -1.1099143 , 0.40738916, -0.14500076,\n", + " -1.27405345, -1.88907146, -1.09437132, -1.61892748, -1.89695144,\n", + " -0.40908128, -0.8260721 , -1.37111664, -1.85722709, -0.28329837,\n", + " 0.00418878],\n", + " [-0.82942849, -0.06093037, -0.98205984, -1.03273547, -0.73091006,\n", + " -1.58550084, 0.10534322, -0.96237028, -0.77367294, -0.5560708 ,\n", + " -0.57345325, -1.33160257, -0.61364865, 0.44076538, -0.6399169 ,\n", + " -1.78533554],\n", + " [-0.37469065, -1.39439011, -1.14717066, -0.95678383, -0.83726352,\n", + " -0.88811439, -1.0354259 , -1.96661639, -0.09760374, -1.15479875,\n", + " -0.92978543, -1.10216045, -0.7275157 , -0.92905378, 0.5746758 ,\n", + " -0.68988132],\n", + " [-1.44932294, -0.95880038, -0.84693551, -0.9915266 , -1.32087588,\n", + " -1.57927155, -1.47370005, -0.30102974, -1.3647579 , -0.76708555,\n", + " -1.69573951, -1.70829821, -1.13219559, -1.22856677, -0.95958227,\n", + " -0.4713431 ],\n", + " [-1.27410245, -0.45723015, 0.74974871, -1.06617165, -0.26810974,\n", + " -0.57501745, -0.57527494, -1.18630826, -1.31585658, -1.45227206,\n", + " -1.09144866, -0.74763477, 0.50344932, -1.14395046, -0.56995487,\n", + " -0.84480089],\n", + " [-1.20297003, -1.69174564, -1.67804408, -1.90985036, -0.87092429,\n", + " -1.15351367, -1.55876327, -0.29219115, -1.46831954, -1.04226673,\n", + " -0.86516273, -1.35606909, -1.72454762, -1.71955156, -0.82059425,\n", + " -0.60765541]], dtype=float32)" ] }, - "execution_count": 50, + "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "np.random.random(8)" + "#update_target(operation_holder, sess)\n", + "sess.run(variables[0].value() - variables[6].value())" ] }, { @@ -758,24 +837,1022 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1.0" + "[array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.1266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-0.96334002]),\n", + " array([-1.19628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.28920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.07098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.17098354]),\n", + " array([-1.1266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.1]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-0.96334002]),\n", + " array([-1.19628939]),\n", + " array([-3.29628939]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-0.91649658]),\n", + " array([-1.1266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.07098354]),\n", + " array([-1.28920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.38920712]),\n", + " array([-1.19628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.19628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-0.96334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-0.96334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-0.91649658]),\n", + " array([-1.1266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.1]),\n", + " array([-3.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.1266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.19628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-0.96334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.07098354]),\n", + " array([-1.28920712]),\n", + " array([-1.19628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.29628939]),\n", + " array([-1.1266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.2266901]),\n", + " array([-1.1]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-1.2]),\n", + " array([-0.96334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-1.06334002]),\n", + " array([-0.67735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.91649658]),\n", + " array([-0.78658905]),\n", + " array([-0.91649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-1.01649658]),\n", + " array([-0.67735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " array([-0.77735027]),\n", + " ...]" ] }, - "execution_count": 55, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "noise = np.random.random(8)\n", - "noise /= noise.sum()\n", - "noise.sum()" + "scores" ] }, { @@ -826,7 +1903,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.1" }, "latex_envs": { "bibliofile": "biblio.bib",