47c967fea4c7

Explicitly error on grounding problems, clean up stat dumps
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Fri, 19 May 2017 17:28:31 +0000
parents fd5861c11c5f
children b79af8708c02
branches/tags (none)
files src/grounders/fluxplayer.lisp src/players/random-zdd.lisp src/zdd.lisp

Changes

--- a/src/grounders/fluxplayer.lisp	Wed May 17 13:36:59 2017 +0000
+++ b/src/grounders/fluxplayer.lisp	Fri May 19 17:28:31 2017 +0000
@@ -146,6 +146,7 @@
 
 
 ;; (dump-grounded "buttons")
+;; (dump-grounded "pennies")
 ;; (dump-grounded "8puzzle")
 ;; (dump-grounded "tictactoe")
 ;; (dump-grounded "stratego")
--- a/src/players/random-zdd.lisp	Wed May 17 13:36:59 2017 +0000
+++ b/src/players/random-zdd.lisp	Fri May 19 17:28:31 2017 +0000
@@ -1,6 +1,7 @@
 (in-package :scully.players.random-zdd)
 
 (defvar *data-file* nil)
+(defparameter *current-game* 'pennies)
 
 
 ;;;; Random Incomplete-Information Player -------------------------------------
@@ -23,6 +24,8 @@
                                (dump-gdl <> s))
                              (ground-gdl-string <>)))
            (reasoner (make-zdd-reasoner grounded-rules)))
+      (when (null grounded-rules)
+        (error "Could not ground rules.  Are they valid GDL?"))
       (setf (rp-role player) role
             (rp-turn player) 0
             (rp-reasoner player) reasoner)
@@ -46,43 +49,57 @@
   (format t "~2%=====================================~%")
   (pr percepts)
 
-  (let ((max-size 0))
+  (let ((state-count 0)
+        (node-count 0)
+        (max-node-count 0)
+        (object-size 0))
     (scully.zdd::with-zdd
       (with-random-zdd-player (player)
         (setf iset
               (if move
                 (-<> iset
                   (progn
+                    (setf state-count (scully.zdd:zdd-count <>)
+                          node-count (scully.zdd:zdd-node-count <>)
+                          object-size (information-set-objects (scully.zdd::zdd-enumerate <>)))
                     (format t "Information set size: ~D states, ~D ZDD nodes~%"
-                            (scully.zdd:zdd-count <>)
-                            (scully.zdd:zdd-node-count <>))
-                    (format t "      Iset cons size: ~D things~%"
-                            (information-set-objects (scully.zdd::zdd-enumerate <>)))
+                            state-count node-count)
+                    (format t "      Iset cons size: ~D things~%" object-size)
                     <>)
+                  ;; (progn (dump-iset reasoner <>)
+                  ;;        (finish-output)
+                  ;;        <>)
                   (sprout reasoner <> (rp-role player) move)
-                  (progn (format t "After sprouting size: ~D states~%"
-                                 (scully.zdd:zdd-count <>))
-                         <>)
+                  ;; (progn (format t "After sprouting size: ~D states~%"
+                  ;;                (scully.zdd:zdd-count <>))
+                  ;;        <>)
                   (apply-happens reasoner <>)
                   (progn
-                    (setf max-size (scully.zdd:zdd-node-count <>))
-                    (format t "          Max size: ~D ZDD nodes~%" max-size)
+                    (setf max-node-count (scully.zdd:zdd-node-count <>))
+                    (format t "            Max size: ~D ZDD nodes~%" max-node-count)
                     <>)
                   (filter-iset-for-percepts reasoner <> role percepts)
-                  (progn (format t "After filtering size: ~D states~%"
-                                 (scully.zdd:zdd-count <>))
-                         <>)
+                  ;; (progn (format t "After filtering size: ~D states~%"
+                  ;;                (scully.zdd:zdd-count <>))
+                  ;;        <>)
                   (compute-next-iset reasoner <>)
                   ;; (progn (dump-iset reasoner <>)
                   ;;        <>)
                   (apply-possible reasoner <>))
-                (apply-possible reasoner (initial-iset reasoner))))
-        (let ((object-size (information-set-objects (scully.zdd::zdd-enumerate iset))))
-          (format *data-file* "~D,~D,~D,~D,~D~%" turn
-                  (scully.zdd:zdd-count iset)
-                  (scully.zdd:zdd-node-count iset)
-                  max-size
-                  object-size))))))
+                (-<> (initial-iset reasoner)
+                  (progn (setf state-count 1
+                               node-count (scully.zdd:zdd-node-count <>)
+                               max-node-count 0
+                               object-size (information-set-objects (scully.zdd::zdd-enumerate <>)))
+                         <>)
+                  (apply-possible reasoner <>))))
+        (format *data-file* "~A,~D,~D,~D,~D,~D~%"
+                *current-game*
+                turn
+                state-count
+                node-count
+                max-node-count
+                object-size)))))
 
 (defmethod ggp:player-select-move ((player random-zdd-player) timeout)
   (scully.zdd::with-zdd
@@ -92,15 +109,15 @@
       ;; (dump-iset reasoner iset)
       ;; (format t "LEGAL MOVES:~%")
       ;; (pr (legal-moves-for reasoner iset role))
-      (random-elt (legal-moves-for reasoner iset role)))))
+      (pr (random-elt (legal-moves-for reasoner iset role))))))
 
 
 ;;;; Run ----------------------------------------------------------------------
 (setf hunchentoot:*default-connection-timeout* nil) ; its_fine
 
 (defvar *player* (make-instance 'random-zdd-player
-                                :name "Scully-Random-ZDD"
-                                :port 5003))
+                         :name "Scully-Random-ZDD"
+                         :port 5003))
 
 ;; (ggp:start-player *player* :server :hunchentoot :use-thread t)
 ;; (ggp:kill-player *player*)
--- a/src/zdd.lisp	Wed May 17 13:36:59 2017 +0000
+++ b/src/zdd.lisp	Fri May 19 17:28:31 2017 +0000
@@ -270,55 +270,6 @@
       ((sink nil) (sink nil))
 
       ;; If Z = {∅}, the only set ∅ can match is the empty set.
-      ((sink t) (if set
-                  (sink nil)
-                  (sink t)))
-
-      ;; Otherwise Z is a real node.
-      ((node var hi lo)
-       (cond
-         ;; If we're below the lower bound of the universe, just recur down.
-         ((< var lower-bound) (zdd-node var
-                                        (recur hi set)
-                                        (recur lo set)))
-
-         ;; If we're above the upper bound of the universe, we're never gonna
-         ;; see anything more we might need to match.
-         ;;
-         ;; If our target set is empty, that's perfect.  But if it's NOT empty,
-         ;; we're never gonna satisfy it.
-         ((> var upper-bound) (if set
-                                (sink nil)
-                                zdd))
-
-         ;; Otherwise Z's var is within the universe.
-         (t (ematch set
-              ;; If our target is empty, only the lo branch of Z can possibly
-              ;; match.
-              (nil (recur lo set))
-
-              ;; Otherwise we've got a target element.  Almost there!
-              ((list* element remaining)
-               (cond
-                 ;; If we're below the target element, we recur down the lo
-                 ;; branch because the hi branch contains something unwanted.
-                 ((< var element) (recur lo set))
-                 ;; If we're above the target element, we can never match.
-                 ((> var element) (sink nil))
-                 ;; Otherwise, we recur down the hi branch with the rest of our
-                 ;; target (the lo branch is always missing this element).
-                 ((= var element) (zdd-node var
-                                            (recur hi remaining)
-                                            ;        jeeeeeeeesus
-                                            (sink nil))))))))))))
-
-(defun zdd-match% (zdd set universe)
-  (recursively ((zdd zdd) (set set))
-    (ematch zdd
-      ;; If Z = ∅, there are no candidates for matching.
-      ((sink nil) (sink nil))
-
-      ;; If Z = {∅}, the only set ∅ can match is the empty set.
       ((sink t) (if (null set)
                   (sink t)
                   (sink nil)))
@@ -368,8 +319,3 @@
 
 
 ;;;; Scratch ------------------------------------------------------------------
-(defun test ()
-  (with-zdd
-    (let ((z (zdd-set '(2 3 4 5 8))))
-      (zdd-enumerate z)
-      )))