gnugo-devel
[Top][All Lists]
Advanced

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

[gnugo-devel] arend_1_24.5: dfa 1D conversion


From: Arend Bayer
Subject: [gnugo-devel] arend_1_24.5: dfa 1D conversion
Date: Sat, 2 Feb 2002 19:25:32 +0100 (CET)

- internal dfa structure rewritten 1D

I did a little 1D conversion as well, hope it does not overlap what Inge
started to do. This small patch saves about 3.7% time for the nngs test
suite (according to gprof output), by eliminating the function read_board.

Arend

Index: engine/matchpat.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/engine/matchpat.c,v
retrieving revision 1.20
diff -u -r1.20 matchpat.c
--- engine/matchpat.c   31 Jan 2002 08:29:17 -0000      1.20
+++ engine/matchpat.c   2 Feb 2002 18:20:03 -0000
@@ -637,13 +637,12 @@
 /* data */
 extern int board_size;
 static int dfa_board_size = -1;
-extern int dfa_p[DFA_MAX_BOARD * 4][DFA_MAX_BOARD * 4];
-extern order_t spiral[8][MAX_ORDER];
+extern int dfa_p[DFA_MAX_BOARD * 4 * DFA_MAX_BOARD * 4];
+extern int spiral[8][MAX_ORDER];
 const int convert[3][4];
 
 /* Forward declarations. */
 static void dfa_prepare_for_match(int color);
-static int read_board(int ll, int m, int n, int row);
 static int scan_for_patterns(dfa_t *pdfa, int l, int m, int n, 
                             int *pat_list);
 #if DFA_SORT
@@ -716,49 +715,24 @@
 dfa_prepare_for_match(int color)
 {
   int i, j;
+  int ii;
     
   if (dfa_board_size != board_size) {
     dfa_board_size = board_size;
     /* clean up the board */
-    for (i = 0; i != DFA_MAX_BOARD * 4; i++)
-      for (j = 0; j != DFA_MAX_BOARD * 4; j++)
-       dfa_p[i][j] = OUT_BOARD;
+    for (ii = 0; ii < 4 * DFA_MAX_BOARD * 4 * DFA_MAX_BOARD; ii++)
+      dfa_p[ii] = OUT_BOARD;
   }
 
   /* copy the board */
-  for (i = 0; i != dfa_board_size; i++)
-    for (j = 0; j != dfa_board_size; j++)
-      dfa_p[DFA_MAX_BOARD+i][DFA_MAX_BOARD+j] = 
+  for (i = 0; i < dfa_board_size; i++)
+    for (j = 0; j < dfa_board_size; j++)
+      dfa_p[DFA_POS(i, j) + DFA_OFFSET] = 
        EXPECTED_COLOR(color, p[i][j]);
 
   prepare_for_match(color);
 }
 
-
-/*
- * A function to read the board's values folowing order
- * spiral[ll] from anchor (m, n).
- * 
- */
-static int
-read_board(int ll, int m, int n, int row)
-{
-  int i2, j2;
-
-  i2 = DFA_MAX_BOARD + m + spiral[ll][row].i;
-  j2 = DFA_MAX_BOARD + n + spiral[ll][row].j;
-
-#ifdef DFA_TRACE
-  gg_assert(row < MAX_ORDER);
-  gg_assert(i2 < DFA_MAX_BOARD*4 && j2 < DFA_MAX_BOARD*4);
-  gg_assert(i2 >= 0 && j2 >= 0);
-  fprintf(stderr, "(%d,%d)=%c ", m, n, VAL2ASC(dfa_p[i2][j2]));
-#endif
-
-  return dfa_p[i2][j2];
-}
-
-
 #if 0
 /* debug function */
 static void
@@ -769,7 +743,7 @@
   for (i = DFA_MAX_BOARD / 2; i < DFA_MAX_BOARD*1.5 ; i++) {
     for (j = DFA_MAX_BOARD / 2 ; j < DFA_MAX_BOARD*1.5 ; j++)
       if (i != (m+DFA_MAX_BOARD) || j != (n+DFA_MAX_BOARD))
-       fprintf(stderr, "%1d", dfa_p[i][j]);
+       fprintf(stderr, "%1d", dfa_p[DFA_PSO(i, j)]);
       else
        fprintf(stderr, "*");
     fprintf(stderr, "\n");
@@ -788,7 +762,9 @@
 scan_for_patterns(dfa_t *pdfa, int l, int m, int n, int *pat_list)
 {
   int state, att, id, row;
+  int dfa_pos;
 
+  dfa_pos = DFA_POS(m, n) + DFA_OFFSET;
   state = 1; /* initial state */
   row = 0; /* initial row */
   id = 0; /* position in id_list */ 
@@ -803,13 +779,14 @@
     }
       
     /* go to next state */
-    state = pdfa->states[state].next[read_board(l, m, n, row)];
+    state = pdfa->states[state].next[dfa_p[dfa_pos + spiral[l][row]]];
     row++;
   }
 
   ASSERT2(row < MAX_ORDER, m, n);
   return id;
 }
+
 
 #if DFA_SORT
 /* used to sort patterns */
Index: patterns/dfa.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/patterns/dfa.c,v
retrieving revision 1.12
diff -u -r1.12 dfa.c
--- patterns/dfa.c      31 Jan 2002 08:22:00 -0000      1.12
+++ patterns/dfa.c      2 Feb 2002 18:20:06 -0000
@@ -69,8 +69,7 @@
  *********************/
 
 /* the private board */
-int dfa_p[DFA_MAX_BOARD * 4][DFA_MAX_BOARD * 4];
-int reverse_spiral[8][DFA_MAX_BOARD * 4][DFA_MAX_BOARD * 4];
+int dfa_p[DFA_MAX_BOARD * 4 * DFA_MAX_BOARD * 4];
 
 /* auxiliary dfa's for high level functions */
 static dfa_t aux_dfa1;         /* used to store strings */
@@ -121,7 +120,7 @@
  *                                6        dfa.
  */
 
-order_t spiral[8][MAX_ORDER];
+int spiral[8][MAX_ORDER];
 
 /*
  * Build the spiral order for each
@@ -142,17 +141,18 @@
  * 
  */
 
-static const order_t generator[4] =
-  { { 1, 0}, { 0,  1}, {-1, 0}, {0, -1}  };
+static const int generator[4] =
+  { 4 * DFA_MAX_BOARD, 1, -4 * DFA_MAX_BOARD, -1 };
 
 void
-buildSpiralOrder(order_t order[8][MAX_ORDER])
+buildSpiralOrder(int order[8][MAX_ORDER])
 {
-  int Mark[DFA_MAX_BOARD * 4][DFA_MAX_BOARD * 4];
-  order_t fifo[8 * MAX_ORDER];
+  int Mark[DFA_MAX_BOARD * 4 * DFA_MAX_BOARD * 4];
+  int fifo[8 * MAX_ORDER];
   int top = 0, end = 0;
-  int i, j, k, ll;
-  int di, dj;
+  int i, j, i0, j0;
+  int k, ll;
+  int ii;
   int delta;
 
   
@@ -164,40 +164,30 @@
 
   /* initialization */
 
-  for (i = 0; i != DFA_MAX_BOARD * 4; i++)
-    for (j = 0; j != DFA_MAX_BOARD * 4; j++) {
-      for (ll = 0; ll != 8; ll++)
-       reverse_spiral[ll][i][j] = MAX_ORDER;
-      Mark[i][j] = 1;
-    }
+  for (ii = 0; ii < DFA_MAX_BOARD * 4 * DFA_MAX_BOARD * 4; ii++)
+    Mark[ii] = 1;
 
-  for (i = DFA_MAX_BOARD; i != DFA_MAX_BOARD * 3; i++)
-    for (j = DFA_MAX_BOARD; j != DFA_MAX_BOARD * 3; j++)
-      Mark[i][j] = 0;
+  for (i = DFA_MAX_BOARD; i < DFA_MAX_BOARD * 3; i++)
+    for (j = DFA_MAX_BOARD; j < DFA_MAX_BOARD * 3; j++)
+      Mark[DFA_POS(i, j)] = 0;
 
   end = 0;
   top = 1;
-  fifo[end].i = DFA_MAX_BOARD * 2;
-  fifo[end].j = DFA_MAX_BOARD * 2;
-  Mark[fifo[end].i][fifo[end].j] = 1;
+  fifo[end] = 2 * DFA_OFFSET;
+  Mark[fifo[end]] = 1;
 
   /* generation */
   while (end < MAX_ORDER) {
-    i = fifo[end].i;
-    j = fifo[end].j;
-    order[0][end].i = i - DFA_MAX_BOARD * 2;
-    order[0][end].j = j - DFA_MAX_BOARD * 2;
-    reverse_spiral[0][i][j] = end;
+    ii = fifo[end];
+    order[0][end] = ii - 2 * DFA_OFFSET;
     end++;
     
     for (k = 0; k != 4; k++) {
-      di = generator[k].i;
-      dj = generator[k].j;
+      delta = generator[k];
       
-      if (!Mark[i + di][j + dj]) {
-       fifo[top].i = i + di;
-       fifo[top].j = j + dj;
-       Mark[i + di][j + dj] = 1;
+      if (!Mark[ii + delta]) {
+       fifo[top] = ii + delta;
+       Mark[ii + delta] = 1;
        top++;
       }
     }
@@ -205,13 +195,18 @@
 
   /* Then we compute all the geometric transformations
      on this order */
-  for (ll = 1; ll != 8; ll++)
-    for (k = 0; k != MAX_ORDER; k++) {
-      delta = DFA_MAX_BOARD * 2;
-      TRANSFORM(order[0][k].i, order[0][k].j,
-               &(order[ll][k].i), &(order[ll][k].j), ll);
-      reverse_spiral[ll][order[ll][k].i + delta][order[ll][k].j + delta] = k;
+  for (k = 0; k < MAX_ORDER; k++) {
+    j0 = order[0][k] % (4 * DFA_MAX_BOARD);
+    if (j0 >= 2 * DFA_MAX_BOARD)
+      j0 -= 4 * DFA_MAX_BOARD;
+    if (j0 < - 2 * DFA_MAX_BOARD)
+      j0 += 4 * DFA_MAX_BOARD;
+    i0 = (order[0][k] - j0) / (4 * DFA_MAX_BOARD);
+    for (ll = 1; ll != 8; ll++) {
+      TRANSFORM(i0, j0, &i, &j, ll);
+      order[ll][k] = DFA_POS(i, j);
     }
+  }
 
 }
 
@@ -792,7 +787,7 @@
 void
 dfa_init(void)
 {
-  int i, j;
+  int ii;
 
   if (dfa_verbose > 1)
     fprintf(stderr, "dfa: init\n");
@@ -802,9 +797,8 @@
   new_dfa(&aux_dfa2, "copyAux ");
 
   /* set the private board to OUT_BOARD */
-  for (i =0; i!= DFA_MAX_BOARD*4; i++)
-    for (j =0; j!= DFA_MAX_BOARD*4; j++)
-      dfa_p[i][j] = OUT_BOARD;
+  for (ii = 0; ii < 4 * DFA_MAX_BOARD * 4 * DFA_MAX_BOARD; ii++)
+    dfa_p[ii] = OUT_BOARD;
 }
 
 void
@@ -980,8 +974,12 @@
   for (k = 0;
        (k != MAX_ORDER - 1) && ((borders > 0) || edges || to_test > 0);
        k++) {
-    i = spiral[trans][k].i;
-    j = spiral[trans][k].j;
+    j = spiral[trans][k] % (4 * DFA_MAX_BOARD);
+    if (j >= 2 * DFA_MAX_BOARD)
+      j -= 4 * DFA_MAX_BOARD;
+    if (j <  - 2 * DFA_MAX_BOARD)
+      j += 4 * DFA_MAX_BOARD;
+    i = (spiral[trans][k] - j) / (4 * DFA_MAX_BOARD);
 
     if (i == pat->maxi)
       borders &= ~SOUTH_EDGE;
Index: patterns/dfa.h
===================================================================
RCS file: /cvsroot/gnugo/gnugo/patterns/dfa.h,v
retrieving revision 1.10
diff -u -r1.10 dfa.h
--- patterns/dfa.h      14 Jan 2002 22:38:55 -0000      1.10
+++ patterns/dfa.h      2 Feb 2002 18:20:07 -0000
@@ -98,12 +98,14 @@
 
 /* scan order */
 
+#if 0
 typedef struct
 {
   int i;
   int j;
 }
 order_t;
+#endif
 
 
 /********************************
@@ -112,7 +114,7 @@
 
 void dfa_init(void);   /* Every call to a fda function must be done */
 void dfa_end(void);    /* between calls of those 2 functions. */
-void buildSpiralOrder(order_t order[8][MAX_ORDER]); /* Needed by matchpat */
+void buildSpiralOrder(int order[8][MAX_ORDER]); /* Needed by matchpat */
 
 /* basic dfa manipulation */
 void print_c_dfa(FILE* of, const char *name, dfa_t *pdfa);
@@ -143,16 +145,11 @@
 #define ASC2VAL(c) (c < 90 ? dfa_asc2val[(int)c] : 3)
 #define VAL2ASC(n) (n < 4 ? dfa_val2asc[n] : '!')
 
-extern int reverse_spiral[8][DFA_MAX_BOARD * 4][DFA_MAX_BOARD * 4];
-
 /* incremental macro */
 
 #define BASE DFA_MAX_BOARD * 2
-
-/* Give the row in spiral order of (i,j) when the scan start at (i0,j0) */
-#define GIVE_SPIRAL_ROW(ll, i0, j0, i, j) \
- (reverse_spiral[ll][BASE + (i) - (i0)][BASE + (j) - (j0)])
-
+#define DFA_POS(i, j)  (4 * DFA_MAX_BOARD * (i) + (j))
+#define DFA_OFFSET DFA_POS(DFA_MAX_BOARD, DFA_MAX_BOARD)
 
 
 /********************************
@@ -162,12 +159,5 @@
 extern int dfa_verbose;                /* the verbose level */
 
 #endif /* _DFA_H_ */
-
-
-
-
-
-
-
 
 




reply via email to

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