gnugo-devel
[Top][All Lists]
Advanced

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

[gnugo-devel] tuning patch


From: Gunnar Farneback
Subject: [gnugo-devel] tuning patch
Date: Thu, 23 May 2002 21:29:32 +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 does some mixed tuning.

- dragon with status UNKNOWN and owl status UNCHECKED gets
  matcher_status ALIVE
- find_neigbor_dragons() revised so that dragons with a common liberty
  always count as adjacent
- attack_move_reason_known() with relatives revised to return ko codes
- penalty for tactical defenses which are not owl defenses, when the
  string is owl critical
- do not award followup value for defense threats which look likely to
  end in gote
- if a dragon is a single tactically critical string, give a small
  penalty for owl attacks which are not tactical attacks
- bugfix in definition of legal_xmove autohelper
- new autohelpers x_suicide and o_suicide
- influence tuning
- tuning
- new test cases

I'm not sure exactly what this does to the regressions, but an
earlier and not very different version of the patch did fairly well:

./regress.sh . connection.tst
62 unexpected PASS!
./regress.sh . strategy.tst
34 unexpected FAIL: Correct 'E17', got 'R6'
./regress.sh . handtalk.tst
18 unexpected PASS!
./regress.sh . trevorb.tst
300 unexpected PASS!
./regress.sh . nngs.tst
320 unexpected PASS!
400 unexpected PASS!
1260 unexpected PASS!
./regress.sh . trevorc.tst
1310 unexpected FAIL: Correct '!N4', got 'N4'
1570 unexpected PASS!
1620 unexpected PASS!
./regress.sh . global.tst
31 unexpected PASS!
./regress.sh . 13x13.tst
15 unexpected PASS!
30 unexpected FAIL: Correct '!C11', got 'C11'

/Gunnar

Index: engine/dragon.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/engine/dragon.c,v
retrieving revision 1.63
diff -u -r1.63 dragon.c
--- engine/dragon.c     22 May 2002 19:22:25 -0000      1.63
+++ engine/dragon.c     23 May 2002 18:47:20 -0000
@@ -454,8 +454,12 @@
           */
          dragon[str].matcher_status = UNKNOWN;
        }
-       else
-         dragon[str].matcher_status = dragon[str].status;
+       else {
+         /* And if the static life and death analysis said UNKNOWN,
+           * we are most likely ALIVE.
+          */
+         dragon[str].matcher_status = ALIVE;
+       }
       }
     }
   time_report(2, "  compute matcher status", NO_MOVE, 1.0);
@@ -765,9 +769,9 @@
 find_neighbor_dragons()
 {
   int m, n;
-  int ii;
+  int pos;
+  int pos2;
   int i, j;
-  int jj;
   int d;
   int dragons[BOARDMAX];
   int distances[BOARDMAX];
@@ -778,19 +782,16 @@
   gg_assert(dragon2_initialized);
   
   /* Initialize the arrays. */
-  for (m = 0; m < board_size; m++)
-    for (n = 0; n < board_size; n++) {
-      ii = POS(m, n);
-
-      if (IS_STONE(board[ii])) {
-       dragons[ii] = dragon[ii].id;
-       distances[ii] = 0;
-      }
-      else {
-       dragons[ii] = -1;
-       distances[ii] = -1;
-      }
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (IS_STONE(board[pos])) {
+      dragons[pos] = dragon[pos].id;
+      distances[pos] = 0;
+    }
+    else if (ON_BOARD(pos)) {
+      dragons[pos] = -1;
+      distances[pos] = -1;
     }
+  }
 
   /* Expand from dist-1 to dist. Break out of the loop at the end if
      * we couldn't expand anything. Never expand more than five steps.
@@ -798,61 +799,61 @@
   for (dist = 1; dist <= 5; dist++) {
     int found_one = 0;
       
-    for (m = 0; m < board_size; m++)
-      for (n = 0; n < board_size; n++) {
-       ii = POS(m, n);
-
-       if (distances[ii] != dist-1 || dragons[ii] < 0)
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos))
+       continue;
+    
+      if (distances[pos] != dist-1 || dragons[pos] < 0)
+       continue;
+      
+      color = DRAGON(dragons[pos]).color;
+      for (k = 0; k < 4; k++) {
+       pos2 = pos + delta[k];
+       
+       if (!ON_BOARD1(pos2))
          continue;
-
-       color = DRAGON(dragons[ii]).color;
-       for (k = 0; k < 4; k++) {
-         jj = ii + delta[k];
-
-         if (!ON_BOARD1(jj))
-           continue;
-
-         /* Consider expansion from (ii) to adjacent intersection
-          * (jj).
+       
+       /* Consider expansion from (pos) to adjacent intersection
+        * (pos2).
+        */
+       if (distances[pos2] >= 0 && distances[pos2] < dist)
+         continue; /* (pos2) already occupied. */
+
+       /* We can always expand the first step, regardless of influence. */
+       if (dist == 1
+           || (influence_area_color(pos) == color
+               && influence_area_color(pos2) != OTHER_COLOR(color))) {
+         /* Expansion ok. Now see if someone else has tried to
+          * expand here. In that case we indicate a collision by
+          * setting the dragon number to -2.
           */
-         if (distances[jj] >= 0 && distances[jj] < dist)
-           continue; /* (jj) already occupied. */
-
-         if (influence_area_color(ii) == color
-             && influence_area_color(jj) != OTHER_COLOR(color)) {
-           /* Expansion ok. Now see if someone else has tried to
-            * expand here. In that case we indicate a collision by
-            * setting the dragon number to -2.
-            */
-           if (distances[jj] == dist) {
-             if (dragons[jj] != dragons[ii])
-               dragons[jj] = -2;
-           }
-           else {
-             dragons[jj] = dragons[ii];
-             distances[jj] = dist;
-             found_one = 1;
-           }
+         if (distances[pos2] == dist) {
+           if (dragons[pos2] != dragons[pos])
+             dragons[pos2] = -2;
+         }
+         else {
+           dragons[pos2] = dragons[pos];
+           distances[pos2] = dist;
+           found_one = 1;
          }
        }
       }
-    if (!found_one)
-      break;
+      if (!found_one)
+       break;
+    }
   }
-
+  
   if (0) {
     for (m = 0; m < board_size; m++) {
-      for (n = 0; n < board_size; n++) {
+      for (n = 0; n < board_size; n++)
        fprintf(stderr, "%3d", dragons[POS(m, n)]);
-      }
       fprintf(stderr, "\n");
     }
     fprintf(stderr, "\n");
       
     for (m = 0; m < board_size; m++) {
-      for (n = 0; n < board_size; n++) {
+      for (n = 0; n < board_size; n++)
        fprintf(stderr, "%3d", distances[POS(m, n)]);
-      }
       fprintf(stderr, "\n");
     }
     fprintf(stderr, "\n");
@@ -863,38 +864,37 @@
    * where dragons==-2 we set all the neighbors of this intersection
    * as adjacent to each other.
    */
-  for (m = 0; m < board_size; m++)
-    for (n = 0; n < board_size; n++) {
-      ii = POS(m, n);
-
-      if (dragons[ii] == -2) {
-       int neighbors = 0;
-       int adjacent[4];
-
-       for (k = 0; k < 4; k++) {
-         jj = ii + delta[k];
-
-         if (ON_BOARD1(jj) && dragons[jj] >= 0)
-           adjacent[neighbors++] = dragons[jj];
-       }
-       for (i = 0; i < neighbors; i++)
-         for (j = i+1; j < neighbors; j++)
-           add_adjacent_dragons(adjacent[i], adjacent[j]);
-      }
-      else if (dragons[ii] >= 0) {
-       if (ON_BOARD(NORTH(ii))) {
-         if (dragons[NORTH(ii)] >= 0
-             && dragons[NORTH(ii)] != dragons[ii])
-           add_adjacent_dragons(dragons[ii], dragons[NORTH(ii)]);
-       }
-       if (ON_BOARD(EAST(ii))) {
-         if (dragons[EAST(ii)] >= 0
-             && dragons[EAST(ii)] != dragons[ii])
-           add_adjacent_dragons(dragons[ii], dragons[EAST(ii)]);
-       }
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    if (dragons[pos] == -2) {
+      int neighbors = 0;
+      int adjacent[4];
+
+      for (k = 0; k < 4; k++) {
+       pos2 = pos + delta[k];
+
+       if (ON_BOARD1(pos2) && dragons[pos2] >= 0)
+         adjacent[neighbors++] = dragons[pos2];
+      }
+      for (i = 0; i < neighbors; i++)
+       for (j = i+1; j < neighbors; j++)
+         add_adjacent_dragons(adjacent[i], adjacent[j]);
+    }
+    else if (dragons[pos] >= 0) {
+      if (ON_BOARD(NORTH(pos))) {
+       if (dragons[NORTH(pos)] >= 0
+           && dragons[NORTH(pos)] != dragons[pos])
+         add_adjacent_dragons(dragons[pos], dragons[NORTH(pos)]);
+      }
+      if (ON_BOARD(EAST(pos))) {
+       if (dragons[EAST(pos)] >= 0
+           && dragons[EAST(pos)] != dragons[pos])
+         add_adjacent_dragons(dragons[pos], dragons[EAST(pos)]);
       }
     }
-
+  }
+  
   if (0) {
     for (d = 0; d < number_of_dragons; d++) {
       gprintf("dragon %d at %1m:", d, dragon2[d].origin);
Index: engine/move_reasons.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/engine/move_reasons.c,v
retrieving revision 1.87
diff -u -r1.87 move_reasons.c
--- engine/move_reasons.c       16 May 2002 19:14:41 -0000      1.87
+++ engine/move_reasons.c       23 May 2002 18:47:20 -0000
@@ -504,9 +504,13 @@
 int
 attack_move_reason_known(int pos, int what)
 {
-  return (move_reason_known(pos, ATTACK_MOVE, what)
-         || move_reason_known(pos, ATTACK_MOVE_GOOD_KO, what)
-         || move_reason_known(pos, ATTACK_MOVE_BAD_KO, what));
+  if (move_reason_known(pos, ATTACK_MOVE, what))
+    return WIN;
+  if (move_reason_known(pos, ATTACK_MOVE_GOOD_KO, what))
+    return KO_A;
+  if (move_reason_known(pos, ATTACK_MOVE_BAD_KO, what))
+    return KO_B;
+  return 0;
 }
 
 /*
@@ -516,9 +520,13 @@
 int
 defense_move_reason_known(int pos, int what)
 {
-  return (move_reason_known(pos, DEFEND_MOVE, what)
-         || move_reason_known(pos, DEFEND_MOVE_GOOD_KO, what)
-         || move_reason_known(pos, DEFEND_MOVE_BAD_KO, what));
+  if (move_reason_known(pos, DEFEND_MOVE, what))
+    return WIN;
+  if (move_reason_known(pos, DEFEND_MOVE_GOOD_KO, what))
+    return KO_A;
+  if (move_reason_known(pos, DEFEND_MOVE_BAD_KO, what))
+    return KO_B;
+  return 0;
 }
 
 /* Check whether a dragon consists of only one worm. If so, check
@@ -540,9 +548,13 @@
 int
 owl_attack_move_reason_known(int pos, int what)
 {
-  return (move_reason_known(pos, OWL_ATTACK_MOVE, what)
-         || move_reason_known(pos, OWL_ATTACK_MOVE_GOOD_KO, what)
-         || move_reason_known(pos, OWL_ATTACK_MOVE_BAD_KO, what));
+  if (move_reason_known(pos, OWL_ATTACK_MOVE, what))
+    return WIN;
+  if (move_reason_known(pos, OWL_ATTACK_MOVE_GOOD_KO, what))
+    return KO_A;
+  if (move_reason_known(pos, OWL_ATTACK_MOVE_BAD_KO, what))
+    return KO_B;
+  return 0;
 }
 
 /*
@@ -552,9 +564,13 @@
 int
 owl_defense_move_reason_known(int pos, int what)
 {
-  return (move_reason_known(pos, OWL_DEFEND_MOVE, what)
-         || move_reason_known(pos, OWL_DEFEND_MOVE_GOOD_KO, what)
-         || move_reason_known(pos, OWL_DEFEND_MOVE_BAD_KO, what));
+  if (move_reason_known(pos, OWL_DEFEND_MOVE, what))
+    return WIN;
+  if (move_reason_known(pos, OWL_DEFEND_MOVE_GOOD_KO, what))
+    return KO_A;
+  if (move_reason_known(pos, OWL_DEFEND_MOVE_BAD_KO, what))
+    return KO_B;
+  return 0;
 }
 
 /*
Index: engine/value_moves.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/engine/value_moves.c,v
retrieving revision 1.37
diff -u -r1.37 value_moves.c
--- engine/value_moves.c        16 May 2002 19:14:41 -0000      1.37
+++ engine/value_moves.c        23 May 2002 18:47:20 -0000
@@ -1303,6 +1303,21 @@
       }        
     
       tot_value -= this_value;
+
+      /* If a move tactically defends an owl critical string, but
+       * this move is not listed as an owl defense, it probably is
+       * ineffective. The 0.45 factor is chosen so that even in
+       * combination with bad ko it still has a positive net impact.
+       */
+      if (dragon[aa].owl_status == CRITICAL
+         && (owl_defense_move_reason_known(pos, find_dragon(aa))
+             < defense_move_reason_known(pos, find_worm(aa)))) {
+       this_value = 0.45 * (2 * worm[aa].effective_size);
+       TRACE("  %1m: -%f - suspected ineffective defense of worm %1m\n",
+             pos, this_value, aa);
+       tot_value -= this_value;
+      }
+
       does_block = 1;
       break;
 
@@ -1435,6 +1450,34 @@
       /* Make sure this is a threat to defend our stones. */
       ASSERT1(board[aa] == color, aa);
       
+      /* No followup value if string can be attacked with threat
+       * against our move. An exception to this is when our move
+       * isn't safe anyway and we play this only for the followup
+       * value, typically as a ko threat.
+       *
+       * FIXME: This is somewhat halfhearted since only one attack
+       * move is tested.
+       */
+      if (trymove(pos, color, "estimate_territorial_value-A",
+                 NO_MOVE, EMPTY, NO_MOVE)) {
+       int attack_move;
+       if (move[pos].move_safety == 1
+           && attack(aa, &attack_move) == WIN
+           && attack_move != NO_MOVE) {
+         if (trymove(attack_move, other,
+                     "estimate_territorial_value-b", NO_MOVE,
+                     EMPTY, NO_MOVE)) {
+           if (board[pos] == EMPTY || attack(pos, NULL) == WIN) {
+             popgo();
+             popgo();
+             break;
+           }
+           popgo();
+         }
+       }
+       popgo();
+      }
+      
       add_followup_value(pos, 2 * worm[aa].effective_size);
 
       TRACE("  %1m: %f (followup) - threatens to defend %1m\n",
@@ -1533,6 +1576,30 @@
       }
       
       tot_value -= this_value;
+
+      /* If the dragon is a single string which can be tactically
+       * attacked, but this owl attack does not attack tactically, it
+       * can be suspected to leave some unnecessary aji or even be an
+       * owl misread. Therefore we give it a small penalty to favor
+       * the moves which do attack tactically as well.
+       *
+       * One example is manyfaces:2 where the single stone S15 can be
+       * tactically attacked at S16 but where 3.3.2 finds additional
+       * owl attacks at R14 (clearly ineffective) and T15 (might work,
+       * but leaves huge amounts of aji).
+       */
+      if ((move_reasons[r].type == OWL_ATTACK_MOVE
+          || move_reasons[r].type == OWL_ATTACK_MOVE_GOOD_KO
+          || move_reasons[r].type == OWL_ATTACK_MOVE_BAD_KO)
+         && dragon[aa].size == worm[aa].size
+         && worm[aa].attack_codes[0] == WIN
+         && attack_move_reason_known(pos, find_worm(aa)) != WIN) {
+       this_value = 0.05 * (2 * worm[aa].effective_size);
+       TRACE("  %1m: -%f - suspected ineffective owl attack of worm %1m\n",
+             pos, this_value, aa);
+       tot_value -= this_value;
+      }
+      
       does_block = 1;
       break;
 
@@ -2089,7 +2156,7 @@
            || (color == WHITE && score < 0.0))
          this_value = 0.0;
        else 
-         this_value = gg_min(2*dragon[aa].effective_size, gg_abs(.65*score));
+         this_value = gg_min(2*dragon[aa].effective_size, gg_abs(0.65*score));
        
        if (this_value > dragon_value[d1]) {
          dragon_value[d1] = this_value;
Index: patterns/barriers.db
===================================================================
RCS file: /cvsroot/gnugo/gnugo/patterns/barriers.db,v
retrieving revision 1.32
diff -u -r1.32 barriers.db
--- patterns/barriers.db        11 May 2002 15:40:11 -0000      1.32
+++ patterns/barriers.db        23 May 2002 18:47:20 -0000
@@ -1808,7 +1808,7 @@
 ;!oplay_attack_either(a,b,c,c,d)
 
 
-Pattern Intrusion 51
+Pattern Intrusion51
 
 ?Q?
 X.X
@@ -1822,6 +1822,30 @@
 
 ;oplay_break_through(a,b,c,b,d)
 >return(!xplay_attack(a,b));
+
+
+Pattern Intrusion52
+# gf New pattern. (3.3.3)
+
+X.x
+Q!.
+.X.
+
+:8,B,value(30)
+
+
+Pattern Intrusion53
+# gf New pattern. (3.3.3)
+
+X!.
+QX!
+
+:8,B,value(50)
+
+Xa.
+QB!
+
+;!oplay_defend(a,B)
 
 
 Pattern Nonterritory1
Index: patterns/mkpat.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/patterns/mkpat.c,v
retrieving revision 1.71
diff -u -r1.71 mkpat.c
--- patterns/mkpat.c    22 May 2002 19:22:25 -0000      1.71
+++ patterns/mkpat.c    23 May 2002 18:47:21 -0000
@@ -200,8 +200,10 @@
   {"weak",                     1, 0.01, "DRAGON_WEAK(%s)"},
   {"safe_xmove",               1, 1.00, "safe_move(%s,OTHER_COLOR(color))"},
   {"safe_omove",               1, 1.00, "safe_move(%s,color)"},
-  {"legal_xmove",              1, 0.05, "is_legal(%s,other)"},
+  {"legal_xmove",              1, 0.05, "is_legal(%s,OTHER_COLOR(color))"},
   {"legal_omove",              1, 0.05, "is_legal(%s,color)"},
+  {"x_suicide",                 1, 0.05, "is_suicide(%s, OTHER_COLOR(color))"},
+  {"o_suicide",                        1, 0.05, "is_suicide(%s, color)"},
   {"x_somewhere",             -1, 0.01, "somewhere(OTHER_COLOR(color), %d"},
   {"o_somewhere",             -1, 0.01, "somewhere(color, %d"},
   {"xmoyo",                    1, 0.01,
Index: patterns/patterns.db
===================================================================
RCS file: /cvsroot/gnugo/gnugo/patterns/patterns.db,v
retrieving revision 1.74
diff -u -r1.74 patterns.db
--- patterns/patterns.db        16 May 2002 19:20:30 -0000      1.74
+++ patterns/patterns.db        23 May 2002 18:47:21 -0000
@@ -3349,15 +3349,16 @@
 ####################
 
 
-Pattern EB101
-
-?..XXX             jump out from below
-?.*.O.
-?....O
-?.....
-------
-
-:8,OXe
+# Pattern EB101
+# # gf Redundant (special case of EB102). (3.3.3)
+#
+# ?..XXX             jump out from below
+# ?.*.O.
+# ?....O
+# ?.....
+# ------
+# 
+# :8,OXe
 
 
 Pattern EB102
@@ -3371,15 +3372,16 @@
 :8,OXe
 
 
-Pattern EB103
-
-..X.O  jump under a stone on 4-th row
-.*..O
-....O
-.....
------
-
-:8,OXe
+# Pattern EB103
+# # gf Redundant (special case of EB104). (3.3.3)
+# 
+# ..X.O  jump under a stone on 4-th row
+# .*..O
+# ....O
+# .....
+# -----
+# 
+# :8,OXe
 
 
 Pattern EB104
@@ -4036,6 +4038,7 @@
 
 Pattern EB412
 # db added (3.1.8)
+# gf Added OX classification. (3.3.3)
 
 X???            push along the edge
 OXX.
@@ -4043,7 +4046,7 @@
 ....
 ----
 
-:8,eEd,shape(3)
+:8,OXeEd,shape(3)
 
 
 ##############################
@@ -7811,19 +7814,20 @@
 :8,OXe
 
 
-Pattern CB243
-
-?..?            Push into enemy area
-?*.?
-?OX?
-
-:8,OXe
-
-?ab?
-?*.?
-?OX?
-
-;xarea(a) || xarea(b)
+# Pattern CB243
+# # gf Redundant (subset of CB242). (3.3.3)
+# 
+# ?..?            Push into enemy area
+# ?*.?
+# ?OX?
+# 
+# :8,OXe
+# 
+# ?ab?
+# ?*.?
+# ?OX?
+# 
+# ;xarea(a) || xarea(b)
 
 
 Pattern CB244
@@ -8813,6 +8817,7 @@
 # gf Reduced shape value. (3.1.23)
 # See nngs:1750
 # ab increased shape value (3.1.29)
+# gf Added constraint. (3.3.3)
 
 ?.?         seal opponent in
 ...      
@@ -8821,6 +8826,13 @@
 
 :8,OXeEcd,shape(3)
 
+?.?
+...      
+.*O
+OA?
+
+;!attack(A) || !oplay_defend(*,A)
+
 
 Pattern CB328
 #ab Revised constraint (3.3.3)
@@ -8969,6 +8981,29 @@
 :8,OXeda,shape(3)
 
 
+Pattern CB338
+# gf New pattern. (3.3.3)
+# see e.g. trevorb:440
+# The diagonal move is potentially very problematic since X often
+# can play either b or c threatening to cut off *. If that move
+# simultaneously threatens something more, we're in trouble. This
+# pattern has a very conservative constraint, where it is required
+# that neither b nor c is a threat against the connection.
+
+xxx      diagonal push
+.*x
+O.x
+
+:/,OXe
+
+def
+c*g
+abh
+
+;(x_somewhere(d,e,f,g,h) || xarea(f))
+;&& !oplay_disconnect(*,b,*,a) && !oplay_disconnect(*,c,*,a)
+
+
 ######################################################################
 #
 # Edge defend/attack patterns
@@ -9253,20 +9288,40 @@
 
 Pattern ED22
 # gf Added b classification. (3.1.18)
+# gf Split pattern and revised constraint. (3.3.3)
 
-??*?          sente endgame (maybe rather middle game) move
+??*X          sente endgame (maybe rather middle game) move
 ..XO
 ..X?
 ----
 
 :8,OXed,followup(5)
 
-??*?
-..AO
+??*X
+..Ab
 ..A?
 ----
 
-;oplay_attack(*,A)
+;oplay_attack(*,A) && !oplay_attack_either(*,*,b)
+
+
+Pattern ED22b
+# gf Added b classification. (3.1.18)
+# gf Split pattern and revised constraint. (3.3.3)
+
+??*.          sente endgame (maybe rather middle game) move
+..XO
+..X?
+----
+
+:8,OXed,followup(5)
+
+??*c
+..Ab
+..A?
+----
+
+;oplay_attack(*,A) && oplay_defend_both(*,c,*,b)
 
 
 Pattern ED23
@@ -12748,7 +12803,7 @@
 |...........
 |...X.*..xxx
 |....XO..xxx
-|.....ba....
+|......a....
 |...........
 +-----------
 
@@ -12778,6 +12833,7 @@
 -----
 
 > replace(a,*)
+
 
 ######################################################################
 #
Index: patterns/patterns2.db
===================================================================
RCS file: /cvsroot/gnugo/gnugo/patterns/patterns2.db,v
retrieving revision 1.39
diff -u -r1.39 patterns2.db
--- patterns/patterns2.db       16 May 2002 09:02:29 -0000      1.39
+++ patterns/patterns2.db       23 May 2002 18:47:21 -0000
@@ -240,6 +240,7 @@
 
 
 Pattern Conn303
+# gf Revised constraint. (3.3.3)
 
 O..*        kosumi connection
 ..O?
@@ -247,12 +248,14 @@
 :8,C
 
 Obc*
-eaO?
+eaf?
 
 ;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,b,a,e,b,e)
+;&& oplay_defend_both(*,c,*,f)
 
 
 Pattern Conn304
+# gf Revised constraint. (3.3.3)
 
 O..*        kosumi connection
 X.O?
@@ -260,9 +263,10 @@
 :8,C
 
 Obc*
-EaO?
+Eaf?
 
 ;oplay_attack_either(*,a,b,c,a,c) && !oplay_defend_both(*,b,a,b,E)
+;&& oplay_defend_both(*,c,*,f)
 
 
 Pattern Conn305
@@ -603,6 +607,24 @@
 ;&& !oplay_attack_either(*,b,a,*,a) && !oplay_attack_either(*,b,a,c,a)
 
 
+Pattern Conn509b
+# gf New pattern. (3.3.3)
+
+?.X?
+OX*O
+....
+----
+
+:8,C
+
+?.X?
+aX*b
+....
+----
+
+;!oplay_disconnect(*,a,b)
+
+
 Pattern Conn510
 
 O..O
@@ -1028,16 +1050,17 @@
 
 
 Pattern Cut303
+# gf Pattern and constraint revised. (3.3.3)
 
 X*O         cut through keima
-.OX
+?OX
 
-:8,OB
+:8,B
 
-X*a
-.bX
+C*a
+?bD
 
-;!xplay_defend_both(*,a,b)
+;(alive(a) || alive(b)) && !xplay_disconnect(*,C,D) && !oplay_connect(*,C,D)
 
 
 #######################################
@@ -2552,6 +2575,40 @@
 |b??
 
 ;!weak(A) && lib(A)==2 && xterri(b)
+
+
+Pattern Shape83
+# gf New pattern. (3.3.3) (see trevorc:310)
+
+*X?        don't leave double atari behind
+.OX
+..O
+
+:8,sX,shape(-2)
+
+*X?
+daX
+.cb
+
+;!oplay_defend_both(*,c,a,b) && oplay_attack(d,c,c)
+
+
+Pattern Shape84
+# gf New pattern. (3.3.3) (see trevorc:1310)
+
+OX?        connect correctly
+.OX
+.*O
+---
+
+:8,sX,shape(-2)
+
+OX?
+bOX
+.*a
+---
+
+;lib(a)>1 && xlib(b)>1 && oplay_attack(*,b,*)
 
 
 ###########################
Index: regression/BREAKAGE
===================================================================
RCS file: /cvsroot/gnugo/gnugo/regression/BREAKAGE,v
retrieving revision 1.56
diff -u -r1.56 BREAKAGE
--- regression/BREAKAGE 21 May 2002 22:40:54 -0000      1.56
+++ regression/BREAKAGE 23 May 2002 18:47:22 -0000
@@ -1,4 +1,4 @@
-======================= 3.3.2 pre 1 =========================
+======================= 3.3.3 pre 1 =========================
 
 ./regress.sh . owl.tst 
 23 unexpected PASS!
Index: regression/connection.tst
===================================================================
RCS file: /cvsroot/gnugo/gnugo/regression/connection.tst,v
retrieving revision 1.27
diff -u -r1.27 connection.tst
--- regression/connection.tst   17 May 2002 19:34:45 -0000      1.27
+++ regression/connection.tst   23 May 2002 18:47:22 -0000
@@ -278,6 +278,12 @@
 87 disconnect R12 R9
 #? [1 S10]*
 
+# See also trevorb:670.
+loadsgf games/trevor/auto/b64.sgf 44
+88 disconnect E6/H5
+#? [0]*
+
+
 # Report number of nodes visited by the tactical reading
 10000 get_reading_node_counter
 #? [0]&
Index: regression/manyfaces.tst
===================================================================
RCS file: /cvsroot/gnugo/gnugo/regression/manyfaces.tst,v
retrieving revision 1.15
diff -u -r1.15 manyfaces.tst
--- regression/manyfaces.tst    21 May 2002 22:40:54 -0000      1.15
+++ regression/manyfaces.tst    23 May 2002 18:47:22 -0000
@@ -8,6 +8,7 @@
 1 gg_genmove black
 #? [S13]
 
+#See also owl1:265.
 loadsgf games/mfgg1.sgf 49
 2 gg_genmove black
 #? [S16]
Index: regression/owl1.tst
===================================================================
RCS file: /cvsroot/gnugo/gnugo/regression/owl1.tst,v
retrieving revision 1.2
diff -u -r1.2 owl1.tst
--- regression/owl1.tst 21 May 2002 22:40:54 -0000      1.2
+++ regression/owl1.tst 23 May 2002 18:47:22 -0000
@@ -14,6 +14,14 @@
 264 owl_attack D18
 #? [2 A18]*
 
+# 3.3.2 comes up with R14, which of course doesn't work. T15 might
+# work, but is so much worse than S16 that there's no reason to allow
+# it.
+# See also manyfaces:2.
+loadsgf games/mfgg1.sgf 49
+265 owl_attack S15
+#? [1 S16]
+
 ########### end of tests #####################
 
 # Report number of nodes visited by the tactical reading
Index: regression/trevorb.tst
===================================================================
RCS file: /cvsroot/gnugo/gnugo/regression/trevorb.tst,v
retrieving revision 1.18
diff -u -r1.18 trevorb.tst
--- regression/trevorb.tst      6 May 2002 23:38:36 -0000       1.18
+++ regression/trevorb.tst      23 May 2002 18:47:22 -0000
@@ -404,6 +404,7 @@
 # games/trevor/auto/b64.sgf problems:
 
 #L5 locally better than N6
+# See also connection:88
 loadsgf games/trevor/auto/b64.sgf 44
 670 gg_genmove white
 #? [L5]



reply via email to

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