gnugo-devel
[Top][All Lists]
Advanced

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

[gnugo-devel] floating point exceptions in 3.1.24


From: Teun Burgers
Subject: [gnugo-devel] floating point exceptions in 3.1.24
Date: Tue, 05 Feb 2002 12:51:22 +0100

After my previous readconnect patch there where still
floating point exceptions caused by accessing uninitialised
values in the conn->distances array.

This patch fixes all cases in compute_connection_distances
to test whether a  point is onboard before accessing
the conn->distances array.

It superceedes the previous patch.

Teun
--- readconnect.c.orig  Mon Feb  4 15:49:54 2002
+++ readconnect.c       Tue Feb  5 09:02:18 2002
@@ -2376,8 +2376,8 @@
        }
        
        /* Case 2. "a" is empty and would be self atari for the opponent. */
-       if (conn->distances[apos] > distance + 0.1
-           && board[apos] == EMPTY
+       if (board[apos] == EMPTY
+           && conn->distances[apos] > distance + 0.1
            && is_self_atari(apos, other)) {
          ENQUEUE(conn, apos, distance + 0.1, 0.1);
        }
@@ -2398,9 +2398,11 @@
        /* Case 4. Diagonal connection to another stone "b" through
         * empty vertices "a" and "g".
         */
-       if (conn->distances[bpos] > distance + 0.2
-           && board[bpos] == color
-           && board[apos] == EMPTY && board[gpos] == EMPTY) {
+       if (board[bpos] == color
+           && board[apos] == EMPTY
+           && board[gpos] == EMPTY
+           && conn->distances[bpos] > distance + 0.2
+           ) {
          ENQUEUE(conn, apos, distance + 0.2, 0.2);
          ENQUEUE(conn, gpos, distance + 0.2, 0.2);
        }
@@ -2408,9 +2410,9 @@
        /* Case 5. Almost bamboo joint.
         * 
         */
-       if (conn->distances[gpos] > distance + 0.2
-           && board[gpos] == EMPTY
+       if (   board[gpos] == EMPTY
            && board[epos] == color
+            && conn->distances[gpos] > distance + 0.2
            && approxlib(gpos, other, 3, NULL) <= 2
            && ((board[bpos] == EMPTY
                 && approxlib(bpos, color, 3, NULL) >= 3
@@ -2434,17 +2436,18 @@
        /* Case 6. "a" is empty and an opponent move can be captured in
         * a ladder.
         */
-       if (conn->distances[apos] > distance + 0.7
-           && board[apos] == EMPTY
+       if (board[apos] == EMPTY
+           && conn->distances[apos] > distance + 0.7
            && ladder_capturable(apos, other)) {
          ENQUEUE(conn, apos, distance + 0.7, 0.7);
        }
 
        /* Case 7. "a" is empty or occupied by opponent.
         */
-       if (conn->distances[apos] > distance + 1.0
-           && (board[apos] == EMPTY
-               || board[apos] == other)) {
+       if ((board[apos] == EMPTY
+               || board[apos] == other)
+           && conn->distances[apos] > distance + 1.0
+           ) {
          ENQUEUE(conn, apos, distance + 1.0, 1.0);
        }
 
@@ -2452,60 +2455,64 @@
         * empty vertex "a" or "g", which makes "a" or "g" self_atari
         * for opponent.
         */
-       if (conn->distances[bpos] > distance + 1.1
-           && board[bpos] == EMPTY
-           && board[apos] == EMPTY && does_secure(color, bpos, apos)) {
+       if (   board[bpos] == EMPTY
+           && board[apos] == EMPTY
+           && conn->distances[bpos] > distance + 1.1
+           && does_secure(color, bpos, apos)) {
          ENQUEUE(conn, bpos, distance + 1.1, 1.0);
        }
 
-       if (conn->distances[bpos] > distance + 1.1
-           && board[bpos] == EMPTY
-           && board[gpos] == EMPTY && does_secure(color, bpos, gpos)) {
+       if (   board[bpos] == EMPTY
+           && board[gpos] == EMPTY
+           &&conn->distances[bpos] > distance + 1.1
+           && does_secure(color, bpos, gpos)) {
          ENQUEUE(conn, bpos, distance + 1.1, 1.0);
        }
 
        /* Case 9. One-space jump to empty vertex "e" through empty
         * vertex "g", which makes "g" self_atari for opponent.
         */
-       if (conn->distances[epos] > distance + 1.1
-           && board[gpos] == EMPTY
-           && board[epos] == EMPTY && does_secure(color, epos, gpos)) {
+       if (   board[gpos] == EMPTY
+           && board[epos] == EMPTY
+           && conn->distances[epos] > distance + 1.1
+           && does_secure(color, epos, gpos)) {
          ENQUEUE(conn, epos, distance + 1.1, 1.0);
        }
 
        /* Case 10. Diagonal connection to empty vertex "b" through
         * empty vertices "a" and "g".
         */
-       if (conn->distances[bpos] > distance + 1.3
-           && board[bpos] == EMPTY
-           && board[apos] == EMPTY && board[gpos] == EMPTY) {
+       if (   board[bpos] == EMPTY
+           && board[apos] == EMPTY && board[gpos] == EMPTY
+            && conn->distances[bpos] > distance + 1.3
+           ) {
          ENQUEUE(conn, bpos, distance + 1.3, 1.0);
        }
 
        /* Case 11. Keima to f or j on edge and one space jump on
         * first or second line.
         */
-       if ((conn->distances[fpos] > distance + 1.3
-            || conn->distances[epos] > distance + 1.5)
-           && countlib(pos) >= 3
-           && board[apos] == EMPTY
+       if (   board[apos] == EMPTY
            && board[bpos] == EMPTY
            && board[gpos] == EMPTY
            && board[epos] == EMPTY
            && board[fpos] == EMPTY
+           && (conn->distances[fpos] > distance + 1.3
+            || conn->distances[epos] > distance + 1.5)
+           && countlib(pos) >= 3
            && (!ON_BOARD(cpos) || !ON_BOARD(hpos))) {
          ENQUEUE(conn, fpos, distance + 1.3, 1.0);
          ENQUEUE(conn, epos, distance + 1.3, 1.0);
        }
 
-       if ((conn->distances[jpos] > distance + 1.3
-            || conn->distances[epos] > distance + 1.5)
-           && countlib(pos) >= 3
+       if (countlib(pos) >= 3
            && board[hpos] == EMPTY
            && board[ipos] == EMPTY
            && board[gpos] == EMPTY
            && board[epos] == EMPTY
            && board[jpos] == EMPTY
+           && (conn->distances[jpos] > distance + 1.3
+            || conn->distances[epos] > distance + 1.5)
            && (!ON_BOARD(apos) || !ON_BOARD(kpos))) {
          ENQUEUE(conn, jpos, distance + 1.3, 1.0);
          ENQUEUE(conn, epos, distance + 1.3, 1.0);
@@ -2515,16 +2522,16 @@
         * empty vertex "a" or "g", which allows opponent move at "a"
         * or "g" to be captured in a ladder.
         */
-       if (conn->distances[bpos] > distance + 1.2
-           && board[bpos] == EMPTY
+       if (   board[bpos] == EMPTY
            && board[apos] == EMPTY
+           && conn->distances[bpos] > distance + 1.2
            && does_secure_through_ladder(color, bpos, apos)) {
          ENQUEUE(conn, bpos, distance + 1.2, 1.0);
        }
 
-       if (conn->distances[bpos] > distance + 1.2
-           && board[bpos] == EMPTY
+       if (   board[bpos] == EMPTY
            && board[gpos] == EMPTY
+           && conn->distances[bpos] > distance + 1.2
            && does_secure_through_ladder(color, bpos, gpos)) {
          ENQUEUE(conn, bpos, distance + 1.2, 1.0);
        }
@@ -2532,15 +2539,16 @@
        /* Case 13. Diagonal connection to empty vertex "b" through
         * empty vertex "a" or "g", with no particular properties.
         */
-       if (conn->distances[bpos] > distance + 1.8
-           && board[bpos] == EMPTY
-           && board[apos] == EMPTY) {
+       if (   board[bpos] == EMPTY
+           && board[apos] == EMPTY
+           && conn->distances[bpos] > distance + 1.8
+           ) {
          ENQUEUE(conn, bpos, distance + 1.8, 0.9);
        }
 
-       if (conn->distances[bpos] > distance + 1.8
-           && board[bpos] == EMPTY
+       if (   board[bpos] == EMPTY
            && board[gpos] == EMPTY
+           && conn->distances[bpos] > distance + 1.8
            && does_secure_through_ladder(color, bpos, gpos)) {
          ENQUEUE(conn, bpos, distance + 1.8, 0.9);
        }
@@ -2548,10 +2556,10 @@
        /* Case 14. Diagonal connection to empty vertex "b" through
         * opponent stones "a" or "g" with few liberties.
         */
-       if (conn->distances[bpos] > distance + 2.0
-           && board[bpos] == EMPTY
+       if (   board[bpos] == EMPTY
            && board[apos] == other
            && board[gpos] == other
+           && conn->distances[bpos] > distance + 2.0
            && (countlib(apos) + countlib(gpos) <= 6)) {
          ENQUEUE(conn, bpos, distance + 2.0, 1.0);
        }
@@ -2559,18 +2567,18 @@
        /* Case 15. Diagonal connection to own stone "b" through
         * opponent stones "a" or "g" with few liberties.
         */
-       if (conn->distances[bpos] > distance + 2.0
-           && board[bpos] == color
+       if (   board[bpos] == color
            && board[apos] == other
            && board[gpos] == other
+           && conn->distances[bpos] > distance + 2.0
            && (countlib(apos) + countlib(gpos) <= 5)) {
          ENQUEUE(conn, bpos, distance + 2.0, 1.0);
        }
 
        /* Case 16. Adjacent opponent stone at "a" which can't avoid atari.
         */
-       if (conn->distances[apos] > distance + 0.1
-           && board[apos] == other
+       if (board[apos] == other
+           && conn->distances[apos] > distance + 0.1
            && no_escape_from_atari(apos)) {
          ENQUEUE(conn, apos, distance + 0.1, 0.1);
        }
@@ -2578,8 +2586,8 @@
        /* Case 17. Adjacent opponent stone at "a" which can't avoid
         * ladder capture.
         */
-       if (conn->distances[apos] > distance + 0.3
-           && board[apos] == other
+       if (board[apos] == other
+           && conn->distances[apos] > distance + 0.3
            && no_escape_from_ladder(apos)) {
          ENQUEUE(conn, apos, distance + 0.3, 0.3);
        }
@@ -2627,18 +2635,20 @@
        /* Case 1. Diagonal connection to empty vertex "b" through
         * empty vertices "a" and "g".
         */
-       if (conn->distances[bpos] > distance + 1.5
-           && board[bpos] == EMPTY
-           && board[apos] == EMPTY && board[gpos] == EMPTY) {
+       if (   board[bpos] == EMPTY
+           && board[apos] == EMPTY
+           && board[gpos] == EMPTY
+            && conn->distances[bpos] > distance + 1.5) {
          ENQUEUE(conn, bpos, distance + 1.5, 1.0);
        }
        
        /* Case 2. Diagonal connection to friendly stone at "b" through
         * empty vertices "a" and "g".
         */
-       if (conn->distances[bpos] > distance + 1.3
-           && board[bpos] == color
-           && board[apos] == EMPTY && board[gpos] == EMPTY) {
+       if (   board[bpos] == color
+           && board[apos] == EMPTY
+           && board[gpos] == EMPTY
+           && conn->distances[bpos] > distance + 1.3) {
          ENQUEUE(conn, bpos, distance + 1.3, 1.0);
        }
       }

reply via email to

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