gnugo-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnugo-devel] influence patch


From: Gunnar Farneback
Subject: [gnugo-devel] influence patch
Date: Sun, 07 Apr 2002 15:17:03 +0200
User-agent: EMH/1.14.1 SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.3 Emacs/20.7 (sparc-sun-solaris2.7) (with unibyte mode)

This patch adds a cache for recent results of
compute_escape_influence(). This gives a speedup which usually
probably is minor but substantial when running aftermath scoring.

- caching of recent compute_escape_influence() results

/Gunnar

Index: engine/influence.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/engine/influence.c,v
retrieving revision 1.48
diff -u -r1.48 influence.c
--- engine/influence.c  1 Apr 2002 21:36:04 -0000       1.48
+++ engine/influence.c  4 Apr 2002 09:24:39 -0000
@@ -1805,9 +1825,47 @@
                         int dragons_known)
 {
   int i, j;
+  int k;
   int ii;
   int save_experimental_influence;
 
+  /* IMPORTANT: This caching relies on the fact that the goal
+   * parameter currently is not used.
+   */
+  static int cached_board[BOARDMAX];
+  static int escape_values[BOARDMAX][4];
+  static int active_caches[4];
+
+  /* Encode the values of color and dragons_known into an integer
+   * between 0 and 3.
+   */
+  int cache_number = 2 * (color == WHITE) + dragons_known;
+
+  int board_was_cached = 1;
+
+  /* Notice that we compare the out of board markers as well, in case
+   * the board size should have changed between calls.
+   */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++) {
+    if (cached_board[ii] != board[ii]) {
+      cached_board[ii] = board[ii];
+      board_was_cached = 0;
+    }
+  }
+
+  if (!board_was_cached)
+    for (k = 0; k < 4; k++)
+      active_caches[k] = 0;
+  
+  if (active_caches[cache_number]) {
+    for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+      if (ON_BOARD(ii))
+       escape_value[ii] = escape_values[ii][cache_number];
+    
+    return;
+  }
+
+  
   /* Use traditional influence for escape influence. */
   save_experimental_influence = experimental_influence;
   experimental_influence = 0;
@@ -1837,6 +1895,12 @@
                            "%3.0f", 3, 1);
   }    
   experimental_influence = save_experimental_influence;
+
+  /* Save the computed values in the cache. */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii))
+      escape_values[ii][cache_number] = escape_value[ii];
+  active_caches[cache_number] = 1;
 }
 
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]