diff --git a/main.ipynb b/main.ipynb index 58f288c..c0b88b3 100644 --- a/main.ipynb +++ b/main.ipynb @@ -954,7 +954,7 @@ " raise InvalidTurn(\"An action should be taken. A turn is possible.\")\n", " return\n", "\n", - " # noinspection PyTypeChecker\n", + " # noinspection PyTypeChecker \n", " if _board[tuple(move.tolist())] != 0:\n", " raise InvalidTurn(\"This turn is not possible.\")\n", "\n", @@ -1961,29 +1961,28 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([ 0.09677184, 0.0037773 , 0.12190913, 0.03519891, 0.16118614,\n", - " 0.00617017, 0.12490022, -0.03918723, 0.14632847, -0.01240192,\n", - " 0.1016851 , 0.00991888, 0.1295861 , -0.03332988, 0.07552515,\n", - " -0.10090606, 0.14730492, -0.08930635, 0.08367957, -0.09071304,\n", - " 0.1600462 , 0.08287025, 0.22077531, -0.07559336, 0.1789458 ,\n", - " 0.02836975, 0.23077469, 0.01503086, 0.13597608, -0.18159241,\n", - " -0.03167801, -0.23491001, 0.05792499, -0.04478127, 0.06121092,\n", - " -0.04067385, 0.37884519, 0.04386898, 0.17202373, -0.05840784,\n", - " 0.0441777 , -0.14009038, 0.02019953, -0.09193809, 0.15851489,\n", - " 0.08095611, 0.45275764, 0.13625955, 0.36563693, -0.05076633,\n", - " 0.28810459, -0.22580677, -0.16507096, -0.5579012 , -0.033314 ,\n", - " -0.15883 , 0.23115 , -0.45325 , -0.37125 , -0.58125 ,\n", - " -0.21875 , -0.21875 , -0.21875 , -0.21875 , -0.21875 ,\n", - " -0.21875 , -0.21875 , -0.21875 , -0.21875 , -0.21875 ])" + "array([[ 2.26795474e-10, -4.53590947e-11, -2.26795474e-11, ...,\n", + " 0.00000000e+00, 6.80386421e-11, -4.53590947e-11],\n", + " [ 3.23993534e-10, -6.47987067e-11, -3.23993534e-11, ...,\n", + " 0.00000000e+00, 9.71980601e-11, -6.47987067e-11],\n", + " [ 4.62847905e-10, -9.25695810e-11, -4.62847905e-11, ...,\n", + " 0.00000000e+00, 1.38854372e-10, -9.25695810e-11],\n", + " ...,\n", + " [ 4.46428571e-01, -8.92857143e-02, -4.46428571e-02, ...,\n", + " 0.00000000e+00, 1.33928571e-01, -8.92857143e-02],\n", + " [ 4.46428571e-01, -8.92857143e-02, -4.46428571e-02, ...,\n", + " 0.00000000e+00, 1.33928571e-01, -8.92857143e-02],\n", + " [ 4.46428571e-01, -8.92857143e-02, -4.46428571e-02, ...,\n", + " 0.00000000e+00, 1.33928571e-01, -8.92857143e-02]])" ] }, - "execution_count": 44, + "execution_count": 98, "metadata": {}, "output_type": "execute_result" } @@ -2002,10 +2001,10 @@ " gama_table = get_gamma_table(board_history, gamma)\n", " combined_score = np.zeros_like(gama_table)\n", " combined_score += calculate_direct_score(board_history) * (\n", - " 1 - who_won_fraction + final_score_fraction\n", + " 1 - (who_won_fraction + final_score_fraction)\n", " )\n", " combined_score[-1] += (\n", - " calculate_final_evaluation_for_history(board_history) * final_score_fraction\n", + " calculate_final_evaluation_for_history(board_history) * final_score_fraction / 0.7\n", " )\n", " combined_score[-1] += calculate_who_won(board_history) * who_won_fraction\n", " for turn in range(SIMULATE_TURNS - 1, 0, -1):\n", @@ -2016,39 +2015,39 @@ "\n", "\n", "calculate_q_reword(\n", - " _board_history, gamma=0.8, who_won_fraction=0, final_score_fraction=1\n", - ")[:, 0]" + " _board_history, gamma=0.7, who_won_fraction=0, final_score_fraction=1\n", + ")" ] }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([-1.53249554e-06, -1.91561943e-06, -2.39452428e-06, -2.99315535e-06,\n", - " -3.74144419e-06, -4.67680524e-06, -5.84600655e-06, -7.30750819e-06,\n", - " -9.13438523e-06, -1.14179815e-05, -1.42724769e-05, -1.78405962e-05,\n", - " -2.23007452e-05, -2.78759315e-05, -3.48449144e-05, -4.35561430e-05,\n", - " -5.44451787e-05, -6.80564734e-05, -8.50705917e-05, -1.06338240e-04,\n", - " -1.32922800e-04, -1.66153499e-04, -2.07691874e-04, -2.59614843e-04,\n", - " -3.24518554e-04, -4.05648192e-04, -5.07060240e-04, -6.33825300e-04,\n", - " -7.92281625e-04, -9.90352031e-04, -1.23794004e-03, -1.54742505e-03,\n", - " -1.93428131e-03, -2.41785164e-03, -3.02231455e-03, -3.77789319e-03,\n", - " -4.72236648e-03, -5.90295810e-03, -7.37869763e-03, -9.22337204e-03,\n", - " -1.15292150e-02, -1.44115188e-02, -1.80143985e-02, -2.25179981e-02,\n", - " -2.81474977e-02, -3.51843721e-02, -4.39804651e-02, -5.49755814e-02,\n", - " -6.87194767e-02, -8.58993459e-02, -1.07374182e-01, -1.34217728e-01,\n", - " -1.67772160e-01, -2.09715200e-01, -2.62144000e-01, -3.27680000e-01,\n", - " -4.09600000e-01, -5.12000000e-01, -6.40000000e-01, -8.00000000e-01,\n", - " -1.00000000e+00, -1.00000000e+00, -1.00000000e+00, -1.00000000e+00,\n", - " -1.00000000e+00, -1.00000000e+00, -1.00000000e+00, -1.00000000e+00,\n", - " -1.00000000e+00, -1.00000000e+00])" + "array([1.53249554e-06, 1.91561943e-06, 2.39452428e-06, 2.99315535e-06,\n", + " 3.74144419e-06, 4.67680524e-06, 5.84600655e-06, 7.30750819e-06,\n", + " 9.13438523e-06, 1.14179815e-05, 1.42724769e-05, 1.78405962e-05,\n", + " 2.23007452e-05, 2.78759315e-05, 3.48449144e-05, 4.35561430e-05,\n", + " 5.44451787e-05, 6.80564734e-05, 8.50705917e-05, 1.06338240e-04,\n", + " 1.32922800e-04, 1.66153499e-04, 2.07691874e-04, 2.59614843e-04,\n", + " 3.24518554e-04, 4.05648192e-04, 5.07060240e-04, 6.33825300e-04,\n", + " 7.92281625e-04, 9.90352031e-04, 1.23794004e-03, 1.54742505e-03,\n", + " 1.93428131e-03, 2.41785164e-03, 3.02231455e-03, 3.77789319e-03,\n", + " 4.72236648e-03, 5.90295810e-03, 7.37869763e-03, 9.22337204e-03,\n", + " 1.15292150e-02, 1.44115188e-02, 1.80143985e-02, 2.25179981e-02,\n", + " 2.81474977e-02, 3.51843721e-02, 4.39804651e-02, 5.49755814e-02,\n", + " 6.87194767e-02, 8.58993459e-02, 1.07374182e-01, 1.34217728e-01,\n", + " 1.67772160e-01, 2.09715200e-01, 2.62144000e-01, 3.27680000e-01,\n", + " 4.09600000e-01, 5.12000000e-01, 6.40000000e-01, 8.00000000e-01,\n", + " 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,\n", + " 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,\n", + " 1.00000000e+00, 1.00000000e+00])" ] }, - "execution_count": 45, + "execution_count": 99, "metadata": {}, "output_type": "execute_result" } @@ -2061,33 +2060,33 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([ 3.09670969, 0.12088712, 3.9011089 , 1.12638612,\n", - " 5.15798265, 0.19747831, 3.99684789, -1.25394014,\n", - " 4.68257483, -0.39678147, 3.25402317, 0.31752896,\n", - " 4.1469112 , -1.066361 , 2.41704875, -3.22868907,\n", - " 4.71413867, -2.85732667, 2.67834167, -2.90207292,\n", - " 5.12240885, 2.65301107, 7.06626383, -2.41717021,\n", - " 5.72853724, 0.91067155, 7.38833944, 0.4854243 ,\n", - " 4.35678037, -5.80402453, -1.00503067, -7.50628834,\n", - " 1.86713958, -1.41607552, 1.9799056 , -1.27511801,\n", - " 12.15610249, 1.44512812, 5.55641015, -1.80448732,\n", - " 1.49439085, -4.38201144, 0.77248571, -2.78439287,\n", - " 5.26950892, 2.83688614, 14.79610768, 4.7451346 ,\n", - " 12.18141825, -1.02322719, 9.97096602, -6.28629248,\n", - " -4.1078656 , -16.384832 , 0.76896 , -2.7888 ,\n", - " 10.264 , -10.92 , -7.4 , -13. ,\n", - " 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. ,\n", - " 0. , 0. ])" + "array([ 1.80163817e+00, -1.49795229e+00, 1.87755963e+00, -1.40305046e+00,\n", + " 1.99618693e+00, -1.25476634e+00, 4.68154208e+00, -3.98072406e-01,\n", + " 3.25240949e+00, -2.18448813e+00, 3.51938983e+00, -4.35076271e+00,\n", + " 8.11546612e-01, -2.73556673e+00, 2.83054158e+00, -2.11823023e-01,\n", + " 3.48522122e+00, -1.89347347e+00, 1.38315816e+00, -2.02105230e+00,\n", + " 3.72368462e+00, 9.04605778e-01, 4.88075722e+00, -2.64905347e+00,\n", + " 4.38683161e-01, -3.20164605e+00, -2.52057562e-01, -9.06507195e+00,\n", + " -8.13399398e-02, -3.85167492e+00, 6.43540634e+00, 1.79425793e+00,\n", + " 1.09928224e+01, -5.00897198e+00, -1.12149805e-02, -6.26401873e+00,\n", + " 3.41997659e+00, -9.47502926e+00, -8.09378657e+00, -1.38672332e+01,\n", + " -6.08404152e+00, -1.13550519e+01, -2.94381488e+00, -7.42976860e+00,\n", + " 1.96278926e+00, -1.12965134e+01, 2.12935821e+00, -6.08830224e+00,\n", + " -1.36037779e+00, -1.04504722e+01, 3.18690970e+00, -7.26636288e+00,\n", + " 4.66704640e+00, -1.04161920e+01, -6.77024000e+00, -1.22128000e+01,\n", + " 9.84000000e-01, -2.52000000e+00, 6.00000000e-01, -3.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00])" ] }, - "execution_count": 46, + "execution_count": 100, "metadata": {}, "output_type": "execute_result" } @@ -2813,20 +2812,16 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 86, "metadata": { "tags": [] }, "outputs": [ { "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "1cc65e04021b411da613d29ff2eda0c8", - "version_major": 2, - "version_minor": 0 - }, + "image/png": "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KQAAExMTqFQqWFlZ5Xvhs729faHCDxEREVF+tHoKLCgoCKmpqejQoQOsra2l18aNG7VZFhEREVVwWh0Bepuzb1o8Y0dEREQVRJm4CJqIiIioNDEAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7BQ5ADk4OGDOnDlISkoqiXqIiIiISlyRA9C4ceOwZcsW1KpVC507d8aGDRuQnZ1dErURERERlYi3CkDR0dE4deoUnJycMGbMGFhbW8PPzw9nz54tiRqJiIiIipVCCCH+ywJycnKwYsUKTJkyBTk5OXB2doa/vz8+/fRTKBSK4qrzraWlpcHExASpqakwNjbWdjlERERUCCV9/K70tjPm5OQgNDQUwcHB2L9/P1q2bIlhw4bh9u3bmD59Og4cOIB169YVZ61ERERExaLIAejs2bMIDg7G+vXroaOjg8GDB2Pp0qVo0KCB1OeDDz6Au7t7sRZKREREVFyKHIDc3d3RuXNnBAUFoVevXtDT08vTx9HRER9//HGxFEhERERU3IocgK5fv46aNWu+tk+VKlUQHBz81kURERERlaQi3wX2pvBDREREVNbxSdBEREQkOwxAREREJDsMQERERCQ7/zkA5ebmIjo6Go8ePSqOeoiIiIhK3Ft9FMbq1asBvAg/7du3h6urK+zs7BAeHl7c9REREREVuyIHoD/++AMuLi4AgB07diAxMRFXrlzB+PHj8cUXXxR7gURERETFrcgB6P79+7CysgIA7N69G3379kW9evUwdOhQXLx4sdgLJCIiIipuRQ5A1atXR0xMDHJzc7F371507twZAJCZmQldXd1iL5CIiIiouBX5SdCffvop+vXrB2traygUCnTq1AkAcPLkSY3PAyMiIiIqq4ocgAICAtC4cWPcunULffv2hVKpBADo6upi6tSpxV4gERERUXF7q9vgP/zwQ4wfPx62trZS25AhQ+Dt7V2k5QQGBsLd3R1GRkawtLREr169EBcXJ01/+PAhxowZg/r160OlUsHe3h7+/v5ITU19m7KJiIiIABRyBGjZsmUYOXIk9PX1sWzZstf29ff3L/TKIyIi4OvrC3d3dzx//hzTp09Hly5dEBMTgypVquDu3bu4e/cuFi1ahIYNG+LmzZsYPXo07t69iz/++KPQ6yEiIiJ6lUIIId7UydHREWfOnIG5uTkcHR0LXphCgevXr791Mf/88w8sLS0RERGBdu3a5dtn8+bN+OSTT5CRkYFKld6c39LS0mBiYoLU1FQYGxu/dW1ERERUekr6+F2oEaDExMR8vy5uL09tmZmZvbaPsbFxgeEnOzsb2dnZ0vu0tLTiLZKIiIjKvSJfA5SVlVXgtOTk5LcuRK1WY9y4cWjTpg0aN26cb5/79+9j7ty5GDlyZIHLCQwMhImJifSys7N765qIiIioYipyAHJ1dUV0dHSe9j///BNNmjR560J8fX1x6dIlbNiwId/paWlp6N69Oxo2bIiAgIAClzNt2jSkpqZKr1u3br11TURERFQxFTkAdejQAS1btsTChQsBABkZGfDx8cGgQYMwffr0tyrCz88PO3fuRFhYmMadZS89efIEnp6eMDIyQmhoKPT09ApcllKphLGxscaLiIiI6FVFfg7QihUr0L17dwwfPhw7d+5EcnIyDA0NcerUqQJPXRVECIExY8YgNDQU4eHh+V5gnZaWBg8PDyiVSmzfvh36+vpFLZmIiIhIQ5EDEAB07doVvXv3RlBQECpVqoQdO3YUOfwAL057rVu3Dtu2bYORkRFSUlIAACYmJlCpVEhLS0OXLl2QmZmJ33//HWlpadJFzdWqVeNHbxAREdFbKXIASkhIwIABA5CSkoJ9+/YhIiICPXv2xNixYzFv3rzXnp76t6CgIAAvTqu9Kjg4GD4+Pjh79ixOnjwJAKhTp45Gn8TERDg4OBS1fCIiIqLCPQfoVUZGRujevTt+/PFHmJqaAgCOHz+OwYMHw8jICOfOnSuJOt8anwNERERU/pT08bvIF0GvWLECGzZskMIPALRu3Rrnzp2Dq6trcdZGREREVCKKPAJU3nAEiIiIqPwpE0+Czk9MTAySkpLw7NkzqU2hUMDLy6tYCiMiIiIqKUUOQNevX8cHH3yAixcvQqFQ4OUAkkKhAADk5uYWb4VERERExazI1wCNHTsWjo6OuHfvHgwMDHD58mUcPnwY77zzDsLDw0ugRCIiIqLiVeQRoMjISBw6dAgWFhbQ0dGBjo4O3n33XQQGBsLf37/M3QVGRERE9G9FHgHKzc2FkZERAMDCwgJ3794FANSsWRNxcXHFWx0RERFRCSjyCFDjxo1x/vx5ODo6okWLFvj6669RuXJl/Pzzz6hVq1ZJ1EhERERUrIocgL788ktkZGQAAObMmYMePXqgbdu2MDc3x8aNG4u9QCIiIqLiVizPAXr48CGqVq0q3QlWlvA5QEREROVPmX0O0KvMzMyKYzFEREREpaLIF0ETERERlXcMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7Wg1AgYGBcHd3h5GRESwtLdGrVy/ExcVp9MnKyoKvry/Mzc1haGiIPn364O+//9ZSxURERFQRaDUARUREwNfXFydOnMD+/fuRk5ODLl26ICMjQ+ozfvx47NixA5s3b0ZERATu3r2L3r17a7FqIiIiKu8UQgih7SJe+ueff2BpaYmIiAi0a9cOqampqFatGtatW4cPP/wQAHDlyhU4OTkhMjISLVu2fOMy09LSYGJigtTUVBgbG5f0JhAREVExKOnjd5m6Big1NRUAYGZmBgCIiopCTk4OOnXqJPVp0KAB7O3tERkZme8ysrOzkZaWpvEiIiIielWZCUBqtRrjxo1DmzZt0LhxYwBASkoKKleuDFNTU42+1atXR0pKSr7LCQwMhImJifSys7Mr6dKJiIionCkzAcjX1xeXLl3Chg0b/tNypk2bhtTUVOl169atYqqQiIiIKopK2i4AAPz8/LBz504cPnwYtra2UruVlRWePXuGx48fa4wC/f3337Cyssp3WUqlEkqlsqRLJiIionJMqyNAQgj4+fkhNDQUhw4dgqOjo8Z0Nzc36Onp4eDBg1JbXFwckpKS0KpVq9Iul4iIiCoIrY4A+fr6Yt26ddi2bRuMjIyk63pMTEygUqlgYmKCYcOGYcKECTAzM4OxsTHGjBmDVq1aFeoOMCIiIqL8aPU2eIVCkW97cHAwfHx8ALx4EOLEiROxfv16ZGdnw8PDAytWrCjwFNi/8TZ4IiKi8qekj99l6jlAJYEBiIiIqPyR1XOAiIiIiEoDAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJjlYD0OHDh+Hl5QUbGxsoFAps3bpVY3p6ejr8/Pxga2sLlUqFhg0b4scff9ROsURERFRhaDUAZWRkwMXFBcuXL893+oQJE7B37178/vvviI2Nxbhx4+Dn54ft27eXcqVERERUkVTS5sq7du2Krl27Fjj9+PHjGDJkCDp06AAAGDlyJH766SecOnUKPXv2LKUqiYiIqKIp09cAtW7dGtu3b8edO3cghEBYWBiuXr2KLl26FDhPdnY20tLSNF5EREREryrTAej7779Hw4YNYWtri8qVK8PT0xPLly9Hu3btCpwnMDAQJiYm0svOzq4UKyYiIqLyoMwHoBMnTmD79u2IiorC4sWL4evriwMHDhQ4z7Rp05Camiq9bt26VYoVExERUXmg1WuAXufp06eYPn06QkND0b17dwBAkyZNEB0djUWLFqFTp075zqdUKqFUKkuzVCIiIipnyuwIUE5ODnJycqCjo1mirq4u1Gq1lqoiIiKiikCrI0Dp6em4du2a9D4xMRHR0dEwMzODvb092rdvj8mTJ0OlUqFmzZqIiIjAr7/+iiVLlmixaiIiIirv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\n", "text/plain": [ - " 0%| | 0/200 [00:00" ] }, "metadata": {}, @@ -2835,7 +2830,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "2e88df0594314308b045b579431a574b", + "model_id": "616f06c422444f12bdc42677b1ad8ef4", "version_major": 2, "version_minor": 0 }, @@ -2845,6 +2840,27 @@ }, "metadata": {}, "output_type": "display_data" + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[86], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mql_policy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m200\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m10\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1000\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m100\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mRandomPolicy\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mGreedyPolicy\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[1;32mIn[55], line 191\u001b[0m, in \u001b[0;36mQLPolicy.train\u001b[1;34m(self, epochs, batches, batch_size, eval_batch_size, compare_with, save_every_epoch, live_plot)\u001b[0m\n\u001b[0;32m 189\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m _ \u001b[38;5;129;01min\u001b[39;00m tqdm(\u001b[38;5;28mrange\u001b[39m(epochs)):\n\u001b[0;32m 190\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m _ \u001b[38;5;129;01min\u001b[39;00m tqdm(\u001b[38;5;28mrange\u001b[39m(batches)):\n\u001b[1;32m--> 191\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrain_batch\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 192\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtraining_results\u001b[38;5;241m.\u001b[39mappend(\n\u001b[0;32m 193\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mevaluate_model(compare_with, eval_batch_size)\n\u001b[0;32m 194\u001b[0m )\n\u001b[0;32m 195\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m save_every_epoch:\n", + "Cell \u001b[1;32mIn[55], line 106\u001b[0m, in \u001b[0;36mQLPolicy.train_batch\u001b[1;34m(self, nr_of_games)\u001b[0m\n\u001b[0;32m 105\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtrain_batch\u001b[39m(\u001b[38;5;28mself\u001b[39m, nr_of_games: \u001b[38;5;28mint\u001b[39m):\n\u001b[1;32m--> 106\u001b[0m x_train, y_train \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate_trainings_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnr_of_games\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 107\u001b[0m y_pred \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mneural_network\u001b[38;5;241m.\u001b[39mforward(x_train)\n\u001b[0;32m 108\u001b[0m loss_score \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mloss(y_pred, y_train)\n", + "Cell \u001b[1;32mIn[55], line 71\u001b[0m, in \u001b[0;36mQLPolicy.generate_trainings_data\u001b[1;34m(self, generate_data_size)\u001b[0m\n\u001b[0;32m 68\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mgenerate_trainings_data\u001b[39m(\n\u001b[0;32m 69\u001b[0m \u001b[38;5;28mself\u001b[39m, generate_data_size: \u001b[38;5;28mint\u001b[39m\n\u001b[0;32m 70\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mtuple\u001b[39m[torch\u001b[38;5;241m.\u001b[39mTensor, torch\u001b[38;5;241m.\u001b[39mTensor]:\n\u001b[1;32m---> 71\u001b[0m train_boards, train_actions \u001b[38;5;241m=\u001b[39m \u001b[43msimulate_game\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgenerate_data_size\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 72\u001b[0m action_possible \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m~\u001b[39mnp\u001b[38;5;241m.\u001b[39mall(train_actions[:, :] \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\n\u001b[0;32m 73\u001b[0m q_leaning_formatted_action \u001b[38;5;241m=\u001b[39m build_symetry_action(train_boards, train_actions)\n", + "Cell \u001b[1;32mIn[23], line 25\u001b[0m, in \u001b[0;36msimulate_game\u001b[1;34m(nr_of_games, policies, tqdm_on)\u001b[0m\n\u001b[0;32m 23\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m policy_index \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m 24\u001b[0m current_boards \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m\n\u001b[1;32m---> 25\u001b[0m current_boards, action_taken \u001b[38;5;241m=\u001b[39m \u001b[43msingle_turn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcurrent_boards\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpolicy\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 26\u001b[0m action_history_stack[turn_index, :] \u001b[38;5;241m=\u001b[39m action_taken\n\u001b[0;32m 28\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m policy_index \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n", + "Cell \u001b[1;32mIn[22], line 15\u001b[0m, in \u001b[0;36msingle_turn\u001b[1;34m(current_boards, policy)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msingle_turn\u001b[39m(\n\u001b[0;32m 2\u001b[0m current_boards: np, policy: GamePolicy\n\u001b[0;32m 3\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mtuple\u001b[39m[np\u001b[38;5;241m.\u001b[39mndarray, np\u001b[38;5;241m.\u001b[39mndarray]:\n\u001b[0;32m 4\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Execute a single turn on a board.\u001b[39;00m\n\u001b[0;32m 5\u001b[0m \n\u001b[0;32m 6\u001b[0m \u001b[38;5;124;03m Places a new stone on the board. Turns captured enemy stones.\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[38;5;124;03m The new game board and the policy vector containing the index of the action used.\u001b[39;00m\n\u001b[0;32m 14\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m---> 15\u001b[0m policy_results \u001b[38;5;241m=\u001b[39m \u001b[43mpolicy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_policy\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcurrent_boards\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 17\u001b[0m \u001b[38;5;66;03m# if the constant VERIFY_POLICY is set to true the policy is verified. Should be good though.\u001b[39;00m\n\u001b[0;32m 18\u001b[0m \u001b[38;5;66;03m# todo deactivate the policy verification after some testing.\u001b[39;00m\n\u001b[0;32m 19\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m VERIFY_POLICY:\n", + "Cell \u001b[1;32mIn[19], line 64\u001b[0m, in \u001b[0;36mGamePolicy.get_policy\u001b[1;34m(self, boards)\u001b[0m\n\u001b[0;32m 59\u001b[0m policies[random_choices] \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mrandom\u001b[38;5;241m.\u001b[39mrand(np\u001b[38;5;241m.\u001b[39msum(random_choices), \u001b[38;5;241m8\u001b[39m ,\u001b[38;5;241m8\u001b[39m)\n\u001b[0;32m 61\u001b[0m \u001b[38;5;66;03m# todo talk to team about backpropagation of score and epsilon for greedy factor\u001b[39;00m\n\u001b[0;32m 62\u001b[0m \n\u001b[0;32m 63\u001b[0m \u001b[38;5;66;03m# todo possibly change this function to only validate the purpose turn and not all turns\u001b[39;00m\n\u001b[1;32m---> 64\u001b[0m possible_turns \u001b[38;5;241m=\u001b[39m \u001b[43mget_possible_turns\u001b[49m\u001b[43m(\u001b[49m\u001b[43mboards\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 65\u001b[0m policies[possible_turns \u001b[38;5;241m==\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1.0\u001b[39m\n\u001b[0;32m 66\u001b[0m max_indices \u001b[38;5;241m=\u001b[39m [\n\u001b[0;32m 67\u001b[0m np\u001b[38;5;241m.\u001b[39munravel_index(policy\u001b[38;5;241m.\u001b[39margmax(), policy\u001b[38;5;241m.\u001b[39mshape) \u001b[38;5;28;01mfor\u001b[39;00m policy \u001b[38;5;129;01min\u001b[39;00m policies\n\u001b[0;32m 68\u001b[0m ]\n", + "Cell \u001b[1;32mIn[13], line 60\u001b[0m, in \u001b[0;36mget_possible_turns\u001b[1;34m(boards, tqdm_on)\u001b[0m\n\u001b[0;32m 58\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m poss_turns[game, idx, idy]:\n\u001b[0;32m 59\u001b[0m position \u001b[38;5;241m=\u001b[39m idx, idy\n\u001b[1;32m---> 60\u001b[0m poss_turns[game, idx, idy] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43many\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[0;32m 61\u001b[0m \u001b[43m \u001b[49m\u001b[43m_recursive_steps\u001b[49m\u001b[43m(\u001b[49m\u001b[43mboards\u001b[49m\u001b[43m[\u001b[49m\u001b[43mgame\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdirection\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mposition\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m>\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\n\u001b[0;32m 62\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mdirection\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mDIRECTIONS\u001b[49m\n\u001b[0;32m 63\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 64\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m poss_turns\n", + "Cell \u001b[1;32mIn[13], line 61\u001b[0m, in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 58\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m poss_turns[game, idx, idy]:\n\u001b[0;32m 59\u001b[0m position \u001b[38;5;241m=\u001b[39m idx, idy\n\u001b[0;32m 60\u001b[0m poss_turns[game, idx, idy] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28many\u001b[39m(\n\u001b[1;32m---> 61\u001b[0m \u001b[43m_recursive_steps\u001b[49m\u001b[43m(\u001b[49m\u001b[43mboards\u001b[49m\u001b[43m[\u001b[49m\u001b[43mgame\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdirection\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mposition\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m 62\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m direction \u001b[38;5;129;01min\u001b[39;00m DIRECTIONS\n\u001b[0;32m 63\u001b[0m )\n\u001b[0;32m 64\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m poss_turns\n", + "Cell \u001b[1;32mIn[13], line 19\u001b[0m, in \u001b[0;36m_recursive_steps\u001b[1;34m(board, rec_direction, rec_position, step_one)\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Check if a player can place a stone on the board specified in the direction specified and direction specified.\u001b[39;00m\n\u001b[0;32m 8\u001b[0m \n\u001b[0;32m 9\u001b[0m \u001b[38;5;124;03mArgs:\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 16\u001b[0m \u001b[38;5;124;03m True if a turn is possible for possition and direction on the board defined.\u001b[39;00m\n\u001b[0;32m 17\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 18\u001b[0m rec_position \u001b[38;5;241m=\u001b[39m rec_position \u001b[38;5;241m+\u001b[39m rec_direction\n\u001b[1;32m---> 19\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43many\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrec_position\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m>\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mBOARD_SIZE\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m|\u001b[39;49m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43mrec_position\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m<\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[0;32m 20\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m 21\u001b[0m next_field \u001b[38;5;241m=\u001b[39m board[\u001b[38;5;28mtuple\u001b[39m(rec_position\u001b[38;5;241m.\u001b[39mtolist())]\n", + "File \u001b[1;32m<__array_function__ internals>:180\u001b[0m, in \u001b[0;36many\u001b[1;34m(*args, **kwargs)\u001b[0m\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + ] } ], "source": [