[Top][All Lists]
[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]
- [gnugo-devel] tuning patch,
Gunnar Farneback <=