RCS file: /sources/gnugo/gnugo/engine/persistent.c,v
retrieving revision 1.40
diff -u -r1.40 persistent.c
|
|
|
|
| 224 | 224 | verify_stored_board(Intersection p[BOARDMAX]) |
| 225 | 225 | { |
| 226 | 226 | int pos; |
| 227 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 228 | | if (!ON_BOARD(pos)) |
| | 227 | scan_board(pos, |
| | 228 | if (p[pos] == GRAY) |
| 229 | 229 | continue; |
| 230 | | else if (p[pos] == GRAY) |
| 231 | | continue; |
| 232 | | else if ((p[pos] & 3) != board[pos]) |
| | 230 | if ((p[pos] & 3) != board[pos]) |
| 233 | 231 | return 0; |
| 234 | 232 | else if (!(p[pos] & (HIGH_LIBERTY_BIT | HIGH_LIBERTY_BIT2))) |
| 235 | 233 | continue; |
| 236 | 234 | else if (((p[pos] & HIGH_LIBERTY_BIT) && countlib(pos) <= 4) |
| 237 | 235 | || (p[pos] & HIGH_LIBERTY_BIT2 && countlib(pos) <= 3)) |
| 238 | 236 | return 0; |
| 239 | | } |
| | 237 | ) |
| 240 | 238 | |
| 241 | 239 | return 1; |
| 242 | 240 | } |
| … |
… |
|
| 645 | 643 | active[entry->move] = 1; |
| 646 | 644 | |
| 647 | 645 | /* Add adjacent strings and empty. */ |
| 648 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 649 | | if (!ON_BOARD(pos)) |
| 650 | | continue; |
| | 646 | scan_board(pos, |
| 651 | 647 | if (active[pos] != 0) |
| 652 | 648 | continue; |
| 653 | 649 | if ((ON_BOARD(SOUTH(pos)) && active[SOUTH(pos)] == 1) |
| … |
… |
|
| 659 | 655 | else |
| 660 | 656 | active[pos] = 2; |
| 661 | 657 | } |
| 662 | | } |
| | 658 | ) |
| 663 | 659 | |
| 664 | 660 | /* Remove invincible strings. No point adding their liberties and |
| 665 | 661 | * neighbors. |
| 666 | 662 | */ |
| 667 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 668 | | if (!ON_BOARD(pos)) |
| 669 | | continue; |
| | 663 | scan_board(pos, |
| 670 | 664 | if (IS_STONE(board[pos]) && worm[pos].invincible) |
| 671 | 665 | active[pos] = 0; |
| 672 | | } |
| | 666 | ) |
| 673 | 667 | |
| 674 | 668 | /* Expand empty to empty. */ |
| 675 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 669 | scan_board(pos, |
| 676 | 670 | if (IS_STONE(board[pos]) || active[pos] != 0) |
| 677 | 671 | continue; |
| 678 | 672 | if ((board[SOUTH(pos)] == EMPTY && active[SOUTH(pos)] == 2) |
| … |
… |
|
| 680 | 674 | || (board[NORTH(pos)] == EMPTY && active[NORTH(pos)] == 2) |
| 681 | 675 | || (board[EAST(pos)] == EMPTY && active[EAST(pos)] == 2)) |
| 682 | 676 | active[pos] = 3; |
| 683 | | } |
| | 677 | ) |
| 684 | 678 | |
| 685 | 679 | /* Add neighbors of active area so far. */ |
| 686 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 687 | | if (!ON_BOARD(pos)) |
| 688 | | continue; |
| | 680 | scan_board(pos, |
| 689 | 681 | if (active[pos] != 0) |
| 690 | 682 | continue; |
| 691 | 683 | if ((ON_BOARD(SOUTH(pos)) && active[SOUTH(pos)] > 0 |
| … |
… |
|
| 697 | 689 | || (ON_BOARD(EAST(pos)) && active[EAST(pos)] > 0 |
| 698 | 690 | && active[EAST(pos)] < 4)) |
| 699 | 691 | active[pos] = 4; |
| 700 | | } |
| | 692 | ) |
| 701 | 693 | |
| 702 | 694 | /* Also add the previously played stones to the active area. */ |
| 703 | 695 | for (r = 0; r < stackp; r++) |
| 704 | 696 | active[entry->stack[r]] = 5; |
| 705 | 697 | |
| 706 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 707 | | if (!ON_BOARD(pos)) |
| 708 | | continue; |
| | 698 | scan_board(pos, |
| 709 | 699 | entry->board[pos] = |
| 710 | 700 | active[pos] != 0 ? board[pos] : GRAY; |
| 711 | | } |
| | 701 | ) |
| 712 | 702 | } |
| 713 | 703 | |
| 714 | 704 | |
| … |
… |
|
| 870 | 860 | |
| 871 | 861 | /* Distance two expansion through empty intersections and own stones. */ |
| 872 | 862 | for (k = 1; k < 3; k++) { |
| 873 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 874 | | if (!ON_BOARD(pos) || board[pos] == other || active[pos] != 0) |
| | 863 | scan_board(pos, |
| | 864 | if (board[pos] == other || active[pos] != 0) |
| 875 | 865 | continue; |
| 876 | 866 | if ((ON_BOARD(SOUTH(pos)) && active[SOUTH(pos)] == k) |
| 877 | 867 | || (ON_BOARD(WEST(pos)) && active[WEST(pos)] == k) |
| … |
… |
|
| 882 | 872 | else |
| 883 | 873 | mark_string(pos, active, (signed char) (k + 1)); |
| 884 | 874 | } |
| 885 | | } |
| | 875 | ) |
| 886 | 876 | } |
| 887 | 877 | |
| 888 | 878 | /* Adjacent opponent strings. */ |
| 889 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 879 | scan_board(pos, |
| 890 | 880 | if (board[pos] != other || active[pos] != 0) |
| 891 | 881 | continue; |
| 892 | 882 | for (r = 0; r < 4; r++) { |
| … |
… |
|
| 895 | 885 | mark_string(pos, active, 1); |
| 896 | 886 | break; |
| 897 | 887 | } |
| 898 | | } |
| 899 | | } |
| | 888 | } |
| | 889 | ) |
| 900 | 890 | |
| 901 | 891 | /* Liberties of adjacent opponent strings with less than five liberties + |
| 902 | 892 | * liberties of low liberty neighbors of adjacent opponent strings |
| 903 | 893 | * with less than five liberties. |
| 904 | 894 | */ |
| 905 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 895 | scan_board(pos, |
| 906 | 896 | if (board[pos] == other && active[pos] > 0 && countlib(pos) < 5) { |
| 907 | 897 | int libs[4]; |
| 908 | 898 | int liberties = findlib(pos, 4, libs); |
| … |
… |
|
| 930 | 920 | } |
| 931 | 921 | } |
| 932 | 922 | } |
| 933 | | } |
| | 923 | ) |
| 934 | 924 | |
| 935 | 925 | /* Also add the previously played stones to the active area. */ |
| 936 | 926 | for (r = 0; r < stackp; r++) |
| 937 | 927 | active[entry->stack[r]] = 1; |
| 938 | 928 | |
| 939 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 929 | scan_board(pos, |
| 940 | 930 | int value = board[pos]; |
| 941 | | if (!ON_BOARD(pos)) |
| 942 | | continue; |
| | 931 | |
| 943 | 932 | if (!active[pos]) |
| 944 | 933 | value = GRAY; |
| 945 | 934 | else if (IS_STONE(board[pos]) && countlib(pos) > 4 && active[pos] > 0) |
| 946 | 935 | value |= HIGH_LIBERTY_BIT; |
| 947 | 936 | |
| 948 | 937 | entry->board[pos] = value; |
| 949 | | } |
| | 938 | ) |
| 950 | 939 | |
| 951 | 940 | } |
| 952 | 941 | |
| … |
… |
|
| 1018 | 1007 | |
| 1019 | 1008 | /* Distance two expansion through empty intersections and own stones. */ |
| 1020 | 1009 | for (k = 1; k < 3; k++) { |
| 1021 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 1022 | | if (!ON_BOARD(pos) || board[pos] == other || active[pos] != 0) |
| | 1010 | scan_board(pos, |
| | 1011 | if (board[pos] == other || active[pos] != 0) |
| 1023 | 1012 | continue; |
| 1024 | 1013 | if ((ON_BOARD(SOUTH(pos)) && active[SOUTH(pos)] == k) |
| 1025 | 1014 | || (ON_BOARD(WEST(pos)) && active[WEST(pos)] == k) |
| … |
… |
|
| 1030 | 1019 | else |
| 1031 | 1020 | mark_string(pos, active, (signed char) (k + 1)); |
| 1032 | 1021 | } |
| 1033 | | } |
| | 1022 | ) |
| 1034 | 1023 | } |
| 1035 | 1024 | |
| 1036 | 1025 | /* Adjacent opponent strings. */ |
| 1037 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 1026 | scan_board(pos, |
| 1038 | 1027 | if (board[pos] != other || active[pos] != 0) |
| 1039 | 1028 | continue; |
| 1040 | 1029 | for (r = 0; r < 4; r++) { |
| … |
… |
|
| 1046 | 1035 | break; |
| 1047 | 1036 | } |
| 1048 | 1037 | } |
| 1049 | | } |
| | 1038 | ) |
| 1050 | 1039 | |
| 1051 | 1040 | /* Liberties of adjacent opponent strings with less than four liberties + |
| 1052 | 1041 | * liberties of low liberty neighbors of adjacent opponent strings |
| 1053 | 1042 | * with less than five liberties. |
| 1054 | 1043 | */ |
| 1055 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 1044 | scan_board(pos, |
| 1056 | 1045 | if (board[pos] == other && active[pos] > 0 && countlib(pos) < 4) { |
| 1057 | 1046 | int libs[4]; |
| 1058 | 1047 | int liberties = findlib(pos, 3, libs); |
| … |
… |
|
| 1080 | 1069 | } |
| 1081 | 1070 | } |
| 1082 | 1071 | } |
| 1083 | | } |
| | 1072 | ) |
| 1084 | 1073 | |
| 1085 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 1074 | scan_board(pos, |
| 1086 | 1075 | Intersection value = board[pos]; |
| 1087 | | if (!ON_BOARD(pos)) |
| 1088 | | continue; |
| | 1076 | |
| 1089 | 1077 | if (!active[pos]) |
| 1090 | 1078 | value = GRAY; |
| 1091 | 1079 | else if (IS_STONE(board[pos]) && countlib(pos) > 3 && active[pos] > 0) |
| 1092 | 1080 | value |= HIGH_LIBERTY_BIT2; |
| 1093 | 1081 | |
| 1094 | 1082 | entry->board[pos] = value; |
| 1095 | | } |
| | 1083 | ) |
| 1096 | 1084 | } |
| 1097 | 1085 | |
| 1098 | 1086 | |
| … |
… |
|
| 1146 | 1134 | * liberties and neighbors of low liberty neighbors of adjacent opponent |
| 1147 | 1135 | * strings with less than five liberties. |
| 1148 | 1136 | */ |
| 1149 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| 1150 | | if (ON_BOARD(pos) && goal[pos]) |
| | 1137 | scan_board(pos, |
| | 1138 | if (goal[pos]) |
| 1151 | 1139 | active[pos] = 1; |
| | 1140 | ) |
| 1152 | 1141 | |
| 1153 | 1142 | /* Distance four expansion through empty intersections and own stones. */ |
| 1154 | 1143 | for (k = 1; k < 5; k++) { |
| 1155 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 1156 | | if (!ON_BOARD(pos) || board[pos] == other || active[pos] > 0) |
| | 1144 | scan_board(pos, |
| | 1145 | if (board[pos] == other || active[pos] > 0) |
| 1157 | 1146 | continue; |
| 1158 | 1147 | if ((ON_BOARD(SOUTH(pos)) && active[SOUTH(pos)] == k) |
| 1159 | 1148 | || (ON_BOARD(WEST(pos)) && active[WEST(pos)] == k) |
| … |
… |
|
| 1164 | 1153 | else |
| 1165 | 1154 | mark_string(pos, active, (signed char) (k + 1)); |
| 1166 | 1155 | } |
| 1167 | | } |
| | 1156 | ) |
| 1168 | 1157 | } |
| 1169 | 1158 | |
| 1170 | 1159 | /* Adjacent opponent strings. */ |
| 1171 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 1160 | scan_board(pos, |
| 1172 | 1161 | if (board[pos] != other || active[pos] != 0) |
| 1173 | 1162 | continue; |
| 1174 | 1163 | for (r = 0; r < 4; r++) { |
| … |
… |
|
| 1178 | 1167 | break; |
| 1179 | 1168 | } |
| 1180 | 1169 | } |
| 1181 | | } |
| | 1170 | ) |
| 1182 | 1171 | |
| 1183 | 1172 | /* Liberties of adjacent opponent strings with less than five liberties + |
| 1184 | 1173 | * liberties of low liberty neighbors of adjacent opponent strings |
| 1185 | 1174 | * with less than five liberties. |
| 1186 | 1175 | */ |
| 1187 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 1176 | scan_board(pos, |
| 1188 | 1177 | if (board[pos] == other && active[pos] > 0 && countlib(pos) < 5) { |
| 1189 | 1178 | int libs[4]; |
| 1190 | 1179 | int liberties = findlib(pos, 4, libs); |
| … |
… |
|
| 1212 | 1201 | } |
| 1213 | 1202 | } |
| 1214 | 1203 | } |
| 1215 | | } |
| | 1204 | ) |
| 1216 | 1205 | } |
| 1217 | 1206 | |
| 1218 | 1207 | static void |
| … |
… |
|
| 1232 | 1221 | |
| 1233 | 1222 | compute_active_owl_type_area(goal, goal_color, active); |
| 1234 | 1223 | |
| 1235 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 1224 | scan_board(pos, |
| 1236 | 1225 | int value = board[pos]; |
| 1237 | | if (!ON_BOARD(pos)) |
| 1238 | | continue; |
| | 1226 | |
| 1239 | 1227 | if (!active[pos]) |
| 1240 | 1228 | value = GRAY; |
| 1241 | 1229 | else if (IS_STONE(board[pos]) && countlib(pos) > 4 && active[pos] > 0) |
| 1242 | 1230 | value |= HIGH_LIBERTY_BIT; |
| 1243 | 1231 | |
| 1244 | 1232 | entry->board[pos] = value; |
| 1245 | | } |
| | 1233 | ) |
| 1246 | 1234 | } |
| 1247 | 1235 | |
| 1248 | 1236 | |
| … |
… |
|
| 1279 | 1267 | signed char goal[BOARDMAX]; |
| 1280 | 1268 | int pos; |
| 1281 | 1269 | |
| 1282 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| 1283 | | if (ON_BOARD(pos)) |
| 1284 | | goal[pos] = goala[pos] || goalb[pos]; |
| | 1270 | scan_board(pos, |
| | 1271 | goal[pos] = goala[pos] || goalb[pos]; |
| | 1272 | ) |
| 1285 | 1273 | |
| 1286 | 1274 | store_persistent_cache(&semeai_cache, routine, |
| 1287 | 1275 | apos, bpos, cpos, color, goal_hash, |
| … |
… |
|
| 1315 | 1303 | compute_active_owl_type_area(goal, BLACK, active_b); |
| 1316 | 1304 | compute_active_owl_type_area(goal, WHITE, active_w); |
| 1317 | 1305 | |
| 1318 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 1306 | scan_board(pos, |
| 1319 | 1307 | int value = board[pos]; |
| 1320 | | if (!ON_BOARD(pos)) |
| 1321 | | continue; |
| | 1308 | |
| 1322 | 1309 | if (!active_b[pos] && !active_w[pos]) |
| 1323 | 1310 | value = GRAY; |
| 1324 | 1311 | else if (IS_STONE(board[pos]) && countlib(pos) > 4 |
| … |
… |
|
| 1326 | 1313 | value |= HIGH_LIBERTY_BIT; |
| 1327 | 1314 | |
| 1328 | 1315 | entry->board[pos] = value; |
| 1329 | | } |
| | 1316 | ) |
| 1330 | 1317 | } |
| 1331 | 1318 | |
| 1332 | 1319 | |
| … |
… |
|
| 1341 | 1328 | int k; |
| 1342 | 1329 | if (!IS_STONE(board[dr])) |
| 1343 | 1330 | return; |
| 1344 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 1331 | scan_board(pos, |
| 1345 | 1332 | if (board[pos] != EMPTY) |
| 1346 | 1333 | continue; |
| 1347 | 1334 | for (k = 0; k < 8; k++) { |
| … |
… |
|
| 1380 | 1367 | if (k == 8 && active_board[pos] == EMPTY) { |
| 1381 | 1368 | values[pos] -= 0.5 * contribution; |
| 1382 | 1369 | } |
| 1383 | | } |
| | 1370 | ) |
| 1384 | 1371 | } |
| 1385 | 1372 | |
| 1386 | 1373 | |