r5103: *** empty log message ***
[reversi.git] / strategies.lisp
index e7d2fe681063a35c0c402e28b0a035c7cb99a2dc..c2cade730dbc034d99bba3498b72fec6842ff592 100644 (file)
@@ -8,9 +8,9 @@
 ;;;;  Programer:      Kevin Rosenberg based on code by Peter Norvig
 ;;;;  Date Started:   1 Nov 2001
 ;;;;
 ;;;;  Programer:      Kevin Rosenberg based on code by Peter Norvig
 ;;;;  Date Started:   1 Nov 2001
 ;;;;
-;;;; $Id: strategies.lisp,v 1.5 2003/05/06 15:51:20 kevin Exp $
+;;;; $Id: strategies.lisp,v 1.6 2003/06/12 12:42:13 kevin Exp $
 ;;;;
 ;;;;
-;;;; This file is Copyright (c) 2001-2002 by Kevin M. Rosenberg 
+;;;; This file is Copyright (c) 2001-2003 by Kevin M. Rosenberg 
 ;;;; and Copyright (c) 1998-2002 Peter Norvig
 ;;;;
 ;;;; Reversi users are granted the rights to distribute and use this software
 ;;;; and Copyright (c) 1998-2002 Peter Norvig
 ;;;;
 ;;;; Reversi users are granted the rights to distribute and use this software
@@ -20,9 +20,6 @@
 
 (in-package #:reversi)
 
 
 (in-package #:reversi)
 
-(eval-when (:compile-toplevel)
-  (declaim (optimize (safety 1) (space 0) (speed 3) (compilation-speed 0))))
-
 (defun random-strategy (player board)
   "Make any legal move."
   (declare (type player player)
 (defun random-strategy (player board)
   "Make any legal move."
   (declare (type player player)
   searching PLY levels deep and backing up values."
   (declare (type player player)
           (type board board)
   searching PLY levels deep and backing up values."
   (declare (type player player)
           (type board board)
-          (fixnum ply))
+          (fixnum ply)
+          (optimize (speed 3) (space 0) (safety 0)))
   (if (= ply 0)
       (funcall eval-fn player board)
       (let ((moves (legal-moves player board)))
   (if (= ply 0)
       (funcall eval-fn player board)
       (let ((moves (legal-moves player board)))
   using cutoffs whenever possible."
   (declare (type player player)
           (type board board)
   using cutoffs whenever possible."
   (declare (type player player)
           (type board board)
-          (fixnum achievable cutoff ply))
+          (fixnum achievable cutoff ply)
+          (optimize (speed 3) (safety 0) (space 0)))
   (if (= ply 0)
       (funcall eval-fn player board)
       (let ((moves (legal-moves player board)))
   (if (= ply 0)
       (funcall eval-fn player board)
       (let ((moves (legal-moves player board)))
   "Like WEIGHTED-SQUARES, but don't take off for moving
   near an occupied corner."
   (declare (type player player)
   "Like WEIGHTED-SQUARES, but don't take off for moving
   near an occupied corner."
   (declare (type player player)
-          (type board board))
+          (type board board)
+          (optimize (speed 3) (safety 0) (space 0)))
   (let ((w (weighted-squares player board)))
     (declare (fixnum w))
     (dolist (corner '(11 18 81 88))
   (let ((w (weighted-squares player board)))
     (declare (fixnum w))
     (dolist (corner '(11 18 81 88))
 (defun alpha-beta2 (player node achievable cutoff ply eval-fn)
   "A-B search, sorting moves by eval-fn"
   ;; Returns two values: achievable-value and move-to-make
 (defun alpha-beta2 (player node achievable cutoff ply eval-fn)
   "A-B search, sorting moves by eval-fn"
   ;; Returns two values: achievable-value and move-to-make
+  (declare (fixnum ply)
+          (optimize (speed 3) (space 0) (safety 0)))
   (if (= ply 0)
       (values (node-value node) node)
       (let* ((board (node-board node))
   (if (= ply 0)
       (values (node-value node) node)
       (let* ((board (node-board node))
 
 (defun negate-value (node)
   "Set the value of a node to its negative."
 
 (defun negate-value (node)
   "Set the value of a node to its negative."
+  (declare (fixnum node)
+          (speed 3) (safety 0) (space 0))
   (setf (node-value node) (- (node-value node)))
   node)
 
   (setf (node-value node) (- (node-value node)))
   node)
 
                     killer)
   (declare (type board board)
           (type player player)
                     killer)
   (declare (type board board)
           (type player player)
-          (type fixnum achievable cutoff ply))
+          (type fixnum achievable cutoff ply)
+          (optimize (speed 3) (space 0) (safety 0)))
   "A-B search, putting killer move first."
   (if (= ply 0)
       (funcall eval-fn player board)
   "A-B search, putting killer move first."
   (if (= ply 0)
       (funcall eval-fn player board)
   (declare (type board board)
           (type player player)
           (type fixnum achievable cutoff ply)
   (declare (type board board)
           (type player player)
           (type fixnum achievable cutoff ply)
-          (type move killer))
+          (type move killer)
+          (optimize (speed 3) (safety 0) (space 0)))
   "A-B search, putting killer move first."
   (if (= ply 0)
       (funcall eval-fn player board)
   "A-B search, putting killer move first."
   (if (= ply 0)
       (funcall eval-fn player board)
   Returns current and potential mobility for player."
   (declare (type board board)
           (type player player)
   Returns current and potential mobility for player."
   (declare (type board board)
           (type player player)
-          (optimize (speed 3) (safety 0 )))
+          (optimize (speed 3) (safety 0) (space 0)))
   (let ((opp (opponent player))
         (current 0)    ; player's current mobility
         (potential 0))                 ; player's potential mobility
   (let ((opp (opponent player))
         (current 0)    ; player's current mobility
         (potential 0))                 ; player's potential mobility
   (declare (type board board)
           (type player opp)
           (type cons neighbors)
   (declare (type board board)
           (type player opp)
           (type cons neighbors)
-          (optimize (speed 3) (safety 0)))
+          (optimize (speed 3) (safety 0) (space 0)))
   (block search
     (dolist (sq neighbors)
       (declare (type square sq))
   (block search
     (dolist (sq neighbors)
       (declare (type square sq))
 (defun edge-stability (player board)
   "Total edge evaluation for player to move on board."
   (declare (type board board)
 (defun edge-stability (player board)
   "Total edge evaluation for player to move on board."
   (declare (type board board)
-          (type player player))
+          (type player player)
+          (optimize (speed 3) (safety 0) (space 0))
   (loop for edge-list in *edge-and-x-lists*
         sum (aref *edge-table*
                   (edge-index player board edge-list))))
   (loop for edge-list in *edge-and-x-lists*
         sum (aref *edge-table*
                   (edge-index player board edge-list))))
   ;; The three factors are multiplied by coefficients
   ;; that vary by move number:
   (declare (type board board)
   ;; The three factors are multiplied by coefficients
   ;; that vary by move number:
   (declare (type board board)
-          (type player player))
+          (type player player)
+          (optimize (speed 3) (safety 0) (space 0)))
   (let ((c-edg  (+ 312000 (* 6240 *move-number*)))
         (c-cur (if (< *move-number* 25)
                   (+ 50000 (* 2000 *move-number*))
   (let ((c-edg  (+ 312000 (* 6240 *move-number*)))
         (c-cur (if (< *move-number* 25)
                   (+ 50000 (* 2000 *move-number*))