mfinzi/OMGchess

View on GitHub
testing.ipynb

Summary

Maintainability
Test Coverage
{
 "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
}