gnugo-devel
[Top][All Lists]
Advanced

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

[gnugo-devel] Patch: score.c 1-dimensional


From: Inge Wallin
Subject: [gnugo-devel] Patch: score.c 1-dimensional
Date: Fri, 19 Oct 2001 10:11:29 +0200 (CEST)

Here is a patch that makes score.c 1-dimensional.

Next, I will be working on influence.c so if anybody wants to work on
that file, be patient about one more day.

     -Inge

Index: engine/score.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/engine/score.c,v
retrieving revision 1.6
diff -u -r1.6 score.c
--- engine/score.c      2001/10/12 15:09:52     1.6
+++ engine/score.c      2001/10/19 08:07:44
@@ -25,10 +25,10 @@
 #include "gg_utils.h"
 
 static int dilate_erode(int dilations, int erosions, 
-                       int gb[MAX_BOARD][MAX_BOARD], int color);
+                       int gb[BOARDMAX], int color);
 static void print_new_moyo(int dilations, int erosions);
-static void close_bubbles(int gb[MAX_BOARD][MAX_BOARD]);
-static int captured_territory(int i, int j, int color);
+static void close_bubbles(int gb[BOARDMAX]);
+static int captured_territory(int pos, int color);
 
 #define ARRAYSIZE MAX_BOARD*MAX_BOARD
 
@@ -45,91 +45,100 @@
  */
 
 static int
-dilate_erode(int dilations, int erosions, int gb[MAX_BOARD][MAX_BOARD],
+dilate_erode(int dilations, int erosions, int gb[BOARDMAX],
             int color)
 {
   int i, j;
-  int work[MAX_BOARD][MAX_BOARD];
+  int ii;
+  int work[BOARDMAX];
   int n;
   int critical_found = 0;
   
   for (i = 0; i < board_size; i++)
     for (j = 0; j < board_size; j++) {
-      if (BOARD(i, j) && dragon[POS(i, j)].matcher_status == CRITICAL)
+      ii = POS(i, j);
+
+      if (board[ii] && dragon[ii].matcher_status == CRITICAL)
        critical_found = 1;
-      if (BOARD(i, j) == WHITE && !captured_territory(i, j, color))
-       gb[i][j] = 128;
-      else if (BOARD(i, j) == BLACK && !captured_territory(i, j, color))      
-       gb[i][j] = -128;
+      if (board[ii] == WHITE && !captured_territory(ii, color))
+       gb[ii] = 128;
+      else if (board[ii] == BLACK && !captured_territory(ii, color))      
+       gb[ii] = -128;
       else
-       gb[i][j] = 0;
+       gb[ii] = 0;
     }
   /* dilate */
   memcpy(work, gb, sizeof(work));
   for (n = 0; n < dilations; n++) {
     for (i = 0; i < board_size; i++)
       for (j = 0; j < board_size; j++) {
-       if (gb[i][j] >= 0
-           && (i == 0 || gb[i-1][j] >= 0)
-           && (i == board_size-1 || gb[i+1][j] >= 0)
-           && (j == 0 || gb[i][j-1] >= 0)
-           && (j == board_size-1 || gb[i][j+1] >= 0)) {
-         if (i > 0 && gb[i-1][j] > 0)
-           work[i][j]++;
-         if (i < board_size-1 && gb[i+1][j] > 0)
-           work[i][j]++;
-         if (j > 0 && gb[i][j-1] > 0)
-           work[i][j]++;
-         if (j < board_size-1 && gb[i][j+1] > 0)
-           work[i][j]++;
-       }
-       if (gb[i][j] <= 0
-           && (i == 0 || gb[i-1][j] <= 0)
-           && (i == board_size-1 || gb[i+1][j] <= 0)
-           && (j == 0 || gb[i][j-1] <= 0)
-           && (j == board_size-1 || gb[i][j+1] <= 0)) {
-         if (i > 0 && gb[i-1][j] < 0)
-           work[i][j]--;
-         if (i < board_size-1 && gb[i+1][j] < 0)
-           work[i][j]--;
-         if (j > 0 && gb[i][j-1] < 0)
-           work[i][j]--;
-         if (j < board_size-1 && gb[i][j+1] < 0)
-           work[i][j]--;
+       ii = POS(i, j);
+
+       if (gb[ii] >= 0
+           && (i == 0 || gb[ii-NS] >= 0)
+           && (i == board_size-1 || gb[ii+NS] >= 0)
+           && (j == 0 || gb[ii-1] >= 0)
+           && (j == board_size-1 || gb[ii+1] >= 0)) {
+         if (i > 0 && gb[ii-NS] > 0)
+           work[ii]++;
+         if (i < board_size-1 && gb[ii+NS] > 0)
+           work[ii]++;
+         if (j > 0 && gb[ii-1] > 0)
+           work[ii]++;
+         if (j < board_size-1 && gb[ii+1] > 0)
+           work[ii]++;
+       }
+       if (gb[ii] <= 0
+           && (i == 0 || gb[ii-NS] <= 0)
+           && (i == board_size-1 || gb[ii+NS] <= 0)
+           && (j == 0 || gb[ii-1] <= 0)
+           && (j == board_size-1 || gb[ii+1] <= 0)) {
+         if (i > 0 && gb[ii-NS] < 0)
+           work[ii]--;
+         if (i < board_size-1 && gb[ii+NS] < 0)
+           work[ii]--;
+         if (j > 0 && gb[i-1] < 0)
+           work[ii]--;
+         if (j < board_size-1 && gb[ii+1] < 0)
+           work[ii]--;
        }
       }
     memcpy(gb, work, sizeof(work));
   }
+
   /* erode */
   for (n = 0; n < erosions; n++) {
     for (i = 0; i < board_size; i++)
       for (j = 0; j < board_size; j++) {
-       if (work[i][j] > 0) {
-         if (i > 0 && gb[i-1][j] <= 0)
-           work[i][j]--;
-         if (i < board_size-1 && gb[i+1][j] <= 0 && work[i][j] > 0)
-           work[i][j]--;
-         if (j > 0 && gb[i][j-1] <= 0 && work[i][j] > 0)
-           work[i][j]--;
-         if (j < board_size-1 && gb[i][j+1] <= 0 && work[i][j] > 0)
-           work[i][j]--;
-       }
-       if (work[i][j] < 0) {
-         if (i > 0 && gb[i-1][j] >= 0)
-           work[i][j]++;
-         if (i < board_size-1 && gb[i+1][j] >= 0 && work[i][j] < 0)
-           work[i][j]++;
-         if (j > 0 && gb[i][j-1] >= 0 && work[i][j] < 0)
-           work[i][j]++;
-         if (j < board_size-1 && gb[i][j+1] >= 0 && work[i][j] < 0)
-           work[i][j]++;
+       ii = POS(i, j);
+
+       if (work[ii] > 0) {
+         if (i > 0 && gb[ii-NS] <= 0)
+           work[ii]--;
+         if (i < board_size-1 && gb[ii+NS] <= 0 && work[ii] > 0)
+           work[ii]--;
+         if (j > 0 && gb[ii-1] <= 0 && work[ii] > 0)
+           work[ii]--;
+         if (j < board_size-1 && gb[ii+1] <= 0 && work[ii] > 0)
+           work[ii]--;
+       }
+       if (work[ii] < 0) {
+         if (i > 0 && gb[ii-NS] >= 0)
+           work[ii]++;
+         if (i < board_size-1 && gb[ii+NS] >= 0 && work[ii] < 0)
+           work[ii]++;
+         if (j > 0 && gb[ii-1] >= 0 && work[ii] < 0)
+           work[ii]++;
+         if (j < board_size-1 && gb[ii+1] >= 0 && work[ii] < 0)
+           work[ii]++;
        }
       }
     memcpy(gb, work, sizeof(work));
   }
   return critical_found;
 }
-    
+
+
 /* For scoring, it is assumed that any region completely
  * surrounded by territory is territory. This assumption
  * is particularly valid at the end of the game when
@@ -145,10 +154,11 @@
  */
 
 static void
-close_bubbles(int gb[MAX_BOARD][MAX_BOARD])
+close_bubbles(int gb[BOARDMAX])
 {
-  int bubbles[MAX_BOARD][MAX_BOARD];
+  int bubbles[BOARDMAX];
   int i, j;
+  int ii;
   int found_one = 1;
 
   memset(bubbles, 0, sizeof(bubbles));
@@ -160,37 +170,39 @@
        int black_neighbor = 0;
        int new_color = 0;
 
-       if (gb[i][j] || bubbles[i][j] == GRAY)
+       ii = POS(i, j);
+
+       if (gb[ii] || bubbles[ii] == GRAY)
          continue;
        /* If any neighbor is gray, mark the spot gray */
-       if ((i > 0 && bubbles[i-1][j] == GRAY)
-           || (i < board_size-1 && bubbles[i+1][j] == GRAY)
-           || (j > 0 && bubbles[i][j-1] == GRAY)
-           || (j < board_size-1 && bubbles[i][j+1] == GRAY)) {
+       if ((i > 0 && bubbles[ii-NS] == GRAY)
+           || (i < board_size-1 && bubbles[ii+NS] == GRAY)
+           || (j > 0 && bubbles[ii-1] == GRAY)
+           || (j < board_size-1 && bubbles[ii+1] == GRAY)) {
          found_one = 1;
-         bubbles[i][j] = GRAY;
+         bubbles[ii] = GRAY;
        }
        else {
          /* Look for white neighbors, including the spot itself */
-         if (bubbles[i][j] == WHITE
+         if (bubbles[ii] == WHITE
              || (i > 0 
-                 && (gb[i-1][j] > 0 || bubbles[i-1][j] == WHITE))
+                 && (gb[ii-NS] > 0 || bubbles[ii-NS] == WHITE))
              || (i < board_size-1
-                 && (gb[i+1][j] > 0 || bubbles[i+1][j] == WHITE))
+                 && (gb[ii+NS] > 0 || bubbles[ii+NS] == WHITE))
              || (j > 0 
-                 && (gb[i][j-1] > 0 || bubbles[i][j-1] == WHITE))
+                 && (gb[ii-1] > 0 || bubbles[ii-1] == WHITE))
              || (j < board_size-1
-                 && (gb[i][j+1] > 0 || bubbles[i][j+1] == WHITE)))
+                 && (gb[ii+1] > 0 || bubbles[ii+1] == WHITE)))
            white_neighbor = 1;
-         if (bubbles[i][j] == BLACK
+         if (bubbles[ii] == BLACK
              || (i > 0 
-                 && (gb[i-1][j] < 0 || bubbles[i-1][j] == BLACK))
+                 && (gb[ii-NS] < 0 || bubbles[ii-NS] == BLACK))
              || (i < board_size-1
-                 && (gb[i+1][j] < 0 || bubbles[i+1][j] == BLACK))
+                 && (gb[ii+NS] < 0 || bubbles[ii+NS] == BLACK))
              || (j > 0 
-                 && (gb[i][j-1] < 0 || bubbles[i][j-1] == BLACK))
+                 && (gb[ii-1] < 0 || bubbles[ii-1] == BLACK))
              || (j < board_size-1
-                 && (gb[i][j+1] < 0 || bubbles[i][j+1] == BLACK)))
+                 && (gb[ii+1] < 0 || bubbles[ii+1] == BLACK)))
            black_neighbor = 1;
          if (white_neighbor) {
            if (black_neighbor)
@@ -200,9 +212,9 @@
          }
          else if (black_neighbor)
            new_color = BLACK;
-         if (new_color && new_color != bubbles[i][j]) {
+         if (new_color && new_color != bubbles[ii]) {
            found_one = 1;
-           bubbles[i][j] = new_color;
+           bubbles[ii] = new_color;
          }
        }
       }
@@ -211,12 +223,14 @@
 
   for (i = 0; i < board_size; i++)
     for (j = 0; j < board_size; j++) {
-      if (gb[i][j])
+      ii = POS(i, j);
+
+      if (gb[ii])
        continue;
-      if (bubbles[i][j] == WHITE)
-       gb[i][j] = 1;
-      if (bubbles[i][j] == BLACK)
-       gb[i][j] = -1;
+      if (bubbles[ii] == WHITE)
+       gb[ii] = 1;
+      if (bubbles[ii] == BLACK)
+       gb[ii] = -1;
     }
 }
 
@@ -228,40 +242,43 @@
  */
 
 static void
-print_regions(int gb[MAX_BOARD][MAX_BOARD])
+print_regions(int gb[BOARDMAX])
 {
   int i, j, k;
+  int ii;
 
   start_draw_board();
   for (i = 0; i < board_size; i++) {
     for (j = 0; j < board_size; j++) {
-      if (BOARD(i, j) && dragon[POS(i, j)].matcher_status != DEAD)
-       k = BOARD(i, j);
+      ii = POS(i, j);
+
+      if (board[ii] && dragon[ii].matcher_status != DEAD)
+       k = board[ii];
       else
        k = EMPTY;
 
       switch (k) {
       case EMPTY:
-       if (gb[i][j] > 0)
-         draw_color_char(i, j, 'w', GG_COLOR_GREEN);
-       else if (gb[i][j] < 0)
-         draw_color_char(i, j, 'b', GG_COLOR_MAGENTA);
+       if (gb[ii] > 0)
+         draw_color_char(I(ii), J(ii), 'w', GG_COLOR_GREEN);
+       else if (gb[ii] < 0)
+         draw_color_char(I(ii), J(ii), 'b', GG_COLOR_MAGENTA);
        else
-         draw_color_char(i, j, '.', GG_COLOR_BLACK);
+         draw_color_char(I(ii), J(ii), '.', GG_COLOR_BLACK);
        break;
 
       case BLACK:
-       if (dragon[POS(i, j)].matcher_status == CRITICAL)
-         draw_color_char(i, j, 'X', GG_COLOR_RED);
+       if (dragon[ii].matcher_status == CRITICAL)
+         draw_color_char(I(ii), J(ii), 'X', GG_COLOR_RED);
        else
-         draw_color_char(i, j, 'X', GG_COLOR_BLACK);
+         draw_color_char(I(ii), J(ii), 'X', GG_COLOR_BLACK);
        break;
 
       case WHITE:
-       if (dragon[POS(i, j)].matcher_status == CRITICAL)
-         draw_color_char(i, j, 'O', GG_COLOR_RED);
+       if (dragon[ii].matcher_status == CRITICAL)
+         draw_color_char(I(ii), J(ii), 'O', GG_COLOR_RED);
        else
-         draw_color_char(i, j, 'O', GG_COLOR_BLACK);
+         draw_color_char(I(ii), J(ii), 'O', GG_COLOR_BLACK);
        break;
       }
     }
@@ -269,6 +286,7 @@
   end_draw_board();
 }
 
+
 /* Print the moyo regions after a specified number
  * of dilations and erosions.
  */
@@ -289,12 +307,13 @@
 static void
 print_new_moyo(int dilations, int erosions)
 {
-  int gb[MAX_BOARD][MAX_BOARD];
+  int gb[BOARDMAX];
   dilate_erode(dilations, erosions, gb, WHITE);
   close_bubbles(gb);
   print_regions(gb);
 }
-  
+
+
 /* Put upper and lower score estimates into *upper, *lower and
  * return the average. A positive score favors white. In computing
  * the upper bound, CRITICAL dragons are awarded to white; in
@@ -304,13 +323,14 @@
 float
 estimate_score(float *upper, float *lower)
 {
-  int gb[MAX_BOARD][MAX_BOARD];
+  int gb[BOARDMAX];
 
   float white_territory = 0.0;
   float black_territory = 0.0;
   float white_area = 0.0;
   float black_area = 0.0;
   int i, j;
+  int ii;
   float u, l;
   int critical;
 
@@ -318,16 +338,18 @@
   close_bubbles(gb);
   for (i = 0; i < board_size; i++) {
     for (j = 0; j < board_size; j++) {
-      if (BOARD(i, j) == BLACK) {
-       if (captured_territory(i, j, WHITE)) {
+      ii = POS(i, j);
+
+      if (board[ii] == BLACK) {
+       if (captured_territory(ii, WHITE)) {
          white_territory += 2;
          white_area++;
        }
        else
          black_area++;
       }
-      else if (BOARD(i, j) == WHITE) {
-       if (captured_territory(i, j, WHITE)) {
+      else if (board[ii] == WHITE) {
+       if (captured_territory(ii, WHITE)) {
          black_territory += 2;
          black_area++;
        }
@@ -335,11 +357,11 @@
          white_area++;
       }
       else {
-       if (gb[i][j] > 0.0) {
+       if (gb[ii] > 0.0) {
          white_territory++;
          white_area++;
        }
-       else if (gb[i][j] < 0.0) {
+       else if (gb[ii] < 0.0) {
          black_territory++;
          black_area++;
        }
@@ -369,26 +391,28 @@
     close_bubbles(gb);
     for (i = 0; i < board_size; i++) {
       for (j = 0; j < board_size; j++) {
-       if (BOARD(i, j) == BLACK) {
-         if (captured_territory(i, j, BLACK)) {
+       ii = POS(i, j);
+
+       if (board[ii] == BLACK) {
+         if (captured_territory(ii, BLACK)) {
            white_territory += 2;
            white_area++;
          }
          else
            black_area++;
        }
-       else if (BOARD(i, j) == WHITE) {
-         if (captured_territory(i, j, BLACK)) {
+       else if (board[ii] == WHITE) {
+         if (captured_territory(ii, BLACK)) {
            black_territory += 2;
            black_area++;
          }
        }
        else {
-         if (gb[i][j] > 0.0) {
+         if (gb[ii] > 0.0) {
            white_territory++;
            white_area++;
          }
-         else if (gb[i][j] < 0.0) {
+         else if (gb[ii] < 0.0) {
            black_territory++;
            black_area++;
            
@@ -418,11 +442,12 @@
   return (u + l) / 2;
 }
 
+
 /* We do not count dead stones inside the eyespace as territory. Such a stone
  * is characterized as having matcher_status DEAD yet having only DEAD
  * dragons as neighbors.
  *
- * If (i, j) is the location of a stone which is DEAD and which is
+ * If (pos) is the location of a stone which is DEAD and which is
  * not an exception of this type then it is safe to count it as
  * two points territory for the opponent. This function tests for
  * this condition.
@@ -431,10 +456,9 @@
  */
 
 static int
-captured_territory(int i, int j, int color)
+captured_territory(int pos, int color)
 {
   int d;
-  int pos = POS(i, j);
 
   if (board[pos] == EMPTY 
       || dragon[pos].matcher_status == ALIVE



reply via email to

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