testing.ipynb
{
"cells": [
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The autoreload extension is already loaded. To reload it, use:\n",
" %reload_ext autoreload\n",
"The line_profiler extension is already loaded. To reload it, use:\n",
" %reload_ext line_profiler\n",
"The memory_profiler extension is already loaded. To reload it, use:\n",
" %reload_ext memory_profiler\n"
]
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import sys,os\n",
"sys.path.append(os.path.expanduser(\"~/games\"))\n",
"from connect4 import Connect4Game,Connect4Board, Connect4BitBoard\n",
"from mcts import SearchNode,MCTS\n",
"#%matplotlib inline\n",
"%load_ext autoreload\n",
"%autoreload 2\n",
"%load_ext line_profiler\n",
"%load_ext memory_profiler"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"87994\n"
]
}
],
"source": [
"M = MCTS(Connect4BitBoard);M.compute_move(10);print(M.searchTree.num_visits)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0.48733495014820805,\n",
" 0.5180415172263885,\n",
" 0.54846175614489,\n",
" 0.5632913343747431,\n",
" 0.545972406540301,\n",
" 0.5132714856332947,\n",
" 0.4909943251912164]"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[c.win_ratio() for c in M.searchTree.children]"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Timer unit: 1e-06 s\n",
"\n",
"Total time: 6.57932 s\n",
"File: /home/marc/games/mcts.py\n",
"Function: update_path at line 74\n",
"\n",
"Line # Hits Time Per Hit % Time Line Contents\n",
"==============================================================\n",
" 74 def update_path(self,board):\n",
" 75 380778 444972.0 1.2 6.8 color = board.color_to_move()\n",
" 76 \n",
" 77 # leaf node, either terminal or unvisited\n",
" 78 380778 193290.0 0.5 2.9 if len(self.children)==0:\n",
" 79 47288 157891.0 3.3 2.4 terminal_outcome = self.terminal_outcome(board)\n",
" 80 47288 18802.0 0.4 0.3 if terminal_outcome is not None: outcome = terminal_outcome\n",
" 81 else:\n",
" 82 46035 94794.0 2.1 1.4 self.moves = board.get_moves()\n",
" 83 46035 682640.0 14.8 10.4 self.children = [SearchNode() for m in self.moves]\n",
" 84 46035 616140.0 13.4 9.4 self.unvisited = np.random.permutation(len(self.children))\n",
" 85 46035 308261.0 6.7 4.7 outcome = self.rollout(board)\n",
" 86 #Node.num_rollouts +=1\n",
" 87 #Node.sqrtlog_num_rollouts = Node.temperature*np.sqrt(2*np.log(Node.num_rollouts))\n",
" 88 \n",
" 89 # Node has not been fully expanded\n",
" 90 333490 158932.0 0.5 2.4 elif len(self.unvisited):#np.any(self.unvisited):\n",
" 91 66067 374798.0 5.7 5.7 child = self.expand_unvisited(board)\n",
" 92 66067 32875.0 0.5 0.5 outcome = child.update_path(board)\n",
" 93 \n",
" 94 # Node has been fully expanded and we use the (ucb) policy \n",
" 95 else:\n",
" 96 267423 1571321.0 5.9 23.9 m = self.best_child_id()\n",
" 97 267423 379783.0 1.4 5.8 board.make_move(self.moves[m])\n",
" 98 267423 131456.0 0.5 2.0 outcome = self.children[m].update_path(board)\n",
" 99 \n",
" 100 380778 1281531.0 3.4 19.5 self.update_statistics(color,outcome)\n",
" 101 380778 131838.0 0.3 2.0 return outcome"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#%lprun -f MCTS.ponder M = MCTS(Connect4BitBoard); M.compute_move(10)\n",
"#%lprun -f SearchNode.update_path M = MCTS(Connect4BitBoard); M.compute_move(10)\n",
"%lprun -f SearchNode.update_path M = MCTS(Connect4BitBoard); M.compute_move(10)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%lprun -f Connect4BitBoard.make_move M = MCTS(Connect4BitBoard); M.compute_move(1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sys.getsizeof(B)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%memit M=MCTS(Connect4BitBoard);M.compute_move(10)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n",
"#%lprun -f M.searchTree.ucb M.compute_move(1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"M = MCTS();M.compute_move(1);print(M.searchTree.num_visits)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"M.compute_move(1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"SearchNode.reused"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"import chess\n",
"import chess.uci\n",
"import chess.pgn"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"game_pgn = \"1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e6 7.Be2 \\\n",
"Qc7 8.Qd2 b5 9.a3 Bb7 10.f3 Nc6 11.O-O-O b4 12.axb4 Nxb4 13.g4 \\\n",
"Be7 14.g5 Nd7 15.h4 Nc5 16.Kb1 Rb8 17.h5 O-O 18.g6 Bf6 19.Rdg1 \\\n",
"Ba8 20.Bg5 Be5 21.gxh7+ Kxh7 22.Nb3 Nxc2 23.Nxc5 Na3+ 24.Ka2 \\\n",
"Qxc5 25.Na4 Nc2 26.Kb1 Qa3 0-1 \\\n",
"\""
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"import io"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Game at 0x7f5906301320 ('?' vs. '?', ????.??.??)>"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chess.pgn.read_game(io.StringIO(game_pgn))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"M = MCTS(Connect4BitBoard)\n",
"for i in range(42):\n",
" move = M.compute_move(1)\n",
" print([c.win_ratio() for c in M.searchTree.children])\n",
" print([c.num_visits for c in M.searchTree.children])\n",
" print(M.searchTree.num_visits)\n",
" outcome = M.make_move(move)\n",
" plt.imshow(M.gameBoard.data(),vmin=-1,vmax=1,interpolation=None)\n",
" plt.grid(which='minor', color='k',linestyle='-', linewidth=2)\n",
" plt.gca().set_xticks(np.arange(-.5, 7, 1), minor=True);\n",
" plt.gca().set_yticks(np.arange(-.5, 6, 1), minor=True);\n",
" #plt.minorticks_on()\n",
" #plt.gca().grid(which='minor', color='k', linestyle='-', linewidth=2)\n",
" plt.show()\n",
" if outcome: \n",
" print(outcome)\n",
" break"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"C = Connect4BitBoard()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import time"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for i in range(42):\n",
" print(C.get_moves())\n",
" C.make_move(np.random.choice(C.get_moves()))\n",
" time.sleep(.2)\n",
" plt.imshow(C.data(),vmin=-1,vmax=1,interpolation=None)\n",
" plt.grid(which='minor', color='k',linestyle='-', linewidth=2)\n",
" plt.gca().set_xticks(np.arange(-.5, 7, 1), minor=True);\n",
" plt.gca().set_yticks(np.arange(-.5, 6, 1), minor=True);\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"Node.reused"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"[c.win_ratio() for c in M.searchTree.children]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"[c.num_visits for c in M.searchTree.children[4].children[4].children]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"C.engine.searchTree.num_visits"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"C.engine.searchTree.num_visits"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"M.compute_move(10)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"[c.num_visits for c in M.searchTree.children[3].children]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"M.searchTree.num_visits"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"M.make_move(5)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"M.gameBoard.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import multiprocessing\n",
"multiprocessing.cpu_count()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"C = Connect4Game(True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"C.engine.searchTree.num_visits"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print([c.num_visits for c in C.engine.searchTree.children])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print([c.num_wins/c.num_visits for c in C.engine.searchTree.children[0].children])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"C.engine.searchTree.num_wins/C.engine.searchTree.num_visits"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(C.engine.searchTree.terminal_outcome(C.engine.gameBoard))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"testboard = copy.deepcopy(C.engine.gameBoard)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"testboard.make_move(4)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"testboard.data()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"testboard.move_won(4)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"C.engine.searchTree.children[5].children[4].move"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(C.engine.searchTree.children[5].children[4].terminal_outcome(testboard))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(C.engine.searchTree.children)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"c=1;b=2"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"a=c=b"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"a"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"c"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}