3 Copyright (c) Scott Gasch
11 An eval term storage and dumping mechanism. Also code to sanity
12 check the evaluator routines.
20 $Id: testeval.c 345 2007-12-02 22:56:42Z scott $
27 typedef struct _EVALTERM
29 CHAR szMessage[SMALL_STRING_LEN_CHAR];
36 static EVALTERM g_EvalData[2][8][32];
37 static ULONG g_EvalCounts[2][8];
55 memset(g_EvalData, 0, sizeof(g_EvalData));
56 memset(g_EvalCounts, 0, sizeof(g_EvalCounts));
60 EvalTrace(IN ULONG uColor,
69 Add a term to the current positions evaluation trace database.
85 if ((iVal == 0) && (c != ILLEGAL_COOR)) return;
92 // Note: The square control code in eval does this to avoid an if.
93 // Just ignore anything that is passed to us that is not BLACK or
96 if (!IS_VALID_COLOR(uColor))
100 g_EvalData[uColor][p][g_EvalCounts[uColor][p]].cLoc = c;
101 g_EvalData[uColor][p][g_EvalCounts[uColor][p]].iVal = iVal;
102 strncpy(g_EvalData[uColor][p][g_EvalCounts[uColor][p]].szMessage,
104 SMALL_STRING_LEN_CHAR);
105 g_EvalCounts[uColor][p]++;
110 EvalSigmaForPiece(IN POSITION *pos, IN COOR c)
126 SCORE iSum[2] = {0, 0};
130 FOREACH_COLOR(uColor)
132 for (u = 0; u < 8; u++)
134 for (v = 0; v < g_EvalCounts[uColor][u]; v++)
136 if (g_EvalData[uColor][u][v].cLoc == c)
138 Trace("%s %-30s%-3s%4d\n",
139 (uColor == WHITE) ? "white" : "black",
140 g_EvalData[uColor][u][v].szMessage,
141 CoorToString(g_EvalData[uColor][u][v].cLoc),
142 g_EvalData[uColor][u][v].iVal);
143 iSum[uColor] += g_EvalData[uColor][u][v].iVal;
148 Trace("Totals are BLACK: %d, WHITE: %d.\n", iSum[BLACK], iSum[WHITE]);
152 if (pos->rgSquare[c].pPiece)
154 return(iSum[GET_COLOR(pos->rgSquare[c].pPiece)]);
162 EvalTraceReport(void)
178 ULONG uWhitePtr, uBlackPtr;
179 CHAR szLine[SMALL_STRING_LEN_CHAR];
180 SCORE iPieceTotal[2];
183 "--- WHITE -------------------LOC--VAL---- BLACK --------------------LOC--VAL-\n"
190 if ((g_EvalCounts[WHITE][p] + g_EvalCounts[BLACK][p]) == 0)
196 iPieceTotal[WHITE] = iPieceTotal[BLACK] = 0;
198 Trace("%s:\n---------------\n", g_PieceData[p].szName);
200 for (uWhitePtr = 0, uBlackPtr = 0;
201 ((uWhitePtr < g_EvalCounts[WHITE][p]) ||
202 (uBlackPtr < g_EvalCounts[BLACK][p]));
203 uWhitePtr++, uBlackPtr++)
205 memset(szLine, 0, sizeof(szLine));
207 if (uWhitePtr < g_EvalCounts[WHITE][p])
209 sprintf(szLine, "%-30s%-3s%4d",
210 g_EvalData[WHITE][p][uWhitePtr].szMessage,
211 CoorToString(g_EvalData[WHITE][p][uWhitePtr].cLoc),
212 g_EvalData[WHITE][p][uWhitePtr].iVal);
213 iPieceTotal[WHITE] +=
214 g_EvalData[WHITE][p][uWhitePtr].iVal;
218 sprintf(szLine, " ");
221 if (uBlackPtr < g_EvalCounts[BLACK][p])
223 sprintf(szLine, "%s %-30s%-3s%4d",
225 g_EvalData[BLACK][p][uBlackPtr].szMessage,
226 CoorToString(g_EvalData[BLACK][p][uBlackPtr].cLoc),
227 g_EvalData[BLACK][p][uBlackPtr].iVal);
228 iPieceTotal[BLACK] +=
229 g_EvalData[BLACK][p][uBlackPtr].iVal;
231 strcat(szLine, "\n");
235 if ((iPieceTotal[WHITE] != 0) || (iPieceTotal[BLACK] != 0))
237 Trace(" TOTAL WHITE . . . . . . . %4d"
238 " TOTAL BLACK . . . . . . . %4d\n",
239 iPieceTotal[WHITE], iPieceTotal[BLACK]);
246 TestEvalWithSymmetry(void)
261 SEARCHER_THREAD_CONTEXT *ctx = malloc(sizeof(SEARCHER_THREAD_CONTEXT));
265 GenerateRandomLegalSymetricPosition(&pos);
266 InitializeSearcherContext(&pos, ctx);
268 i = Eval(ctx, -INFINITY, INFINITY);
271 DumpPosition(&ctx->sPosition);
274 Trace("Eval: %s\n", ScoreToString(i));
278 typedef struct _EVAL_TEST
285 TestEvalWithKnownPositions(void)
300 static const EVAL_TEST x[] =
304 "r1br2k1/pp2pp1p/6p1/3P4/4P3/8/P2KBPPP/1R5R w - - 0 1",
305 { "w>b", NULL, NULL, NULL, NULL }
309 "r1r3k1/p2qpp1p/np1p2p1/3P4/PP1QP3/4BP2/6PP/2RR2K1 w - - 0 1",
310 { "w>b", "E3>A6", NULL, NULL, NULL }
314 "2r1b1k1/1qr2p2/p1p1p1p1/2R4p/1P5P/P1R1PBP1/5P2/2Q3K1 w - - 0 1",
315 { "w>b", "F3>E8", NULL, NULL, NULL }
319 "8/4b3/pp2kppp/2p1p3/P1K1P1PP/1PP1NP2/8/8 w - - 0 1",
320 { "w>b", "E3>E7", NULL, NULL, NULL }
324 "1q1rrbk1/1p3p1p/p2p2p1/3Pp3/1P2P3/P3BP2/3Q2PP/R2R2K1 w - - 0 1",
325 { "w>b", "E3>F8", NULL, NULL, NULL }
329 "4r2k/4qp1p/p4p2/2b2P2/2p5/3brRP1/PP1Q2BP/3R2NK w - - 0 1",
330 { "b>w", NULL, NULL, NULL, NULL }
334 "r2r2k1/pbq3bp/1p4p1/4n3/3BP1Q1/2P3NP/P7/1B1R1RK1 b - - 0 1",
335 { "b>w", "B7>B1", "e5>g3", NULL, NULL }
339 "r2r2k1/pb1q2bp/1p2p1p1/n1p2p2/3PPPP1/2PBB1NP/P7/2R1QRK1 b - - 0 1",
340 { "b>w", NULL, NULL, NULL, NULL }
344 "6rr/1pqbkn1p/1Pp1p1pP/2Pp1pP1/3P1P2/Q2BPN2/5K1R/7R b - - 0 1",
345 { "w>b", "F3>D7", "d3>d7", NULL, NULL }
349 "r4rk1/pp1bqn1p/2p1pnp1/3pNp2/2PP1P2/3BP3/PPQN2PP/1R3RK1 b - - 0 1",
350 { "w>b", "E5>D7", "d2>d7", "d3>d7", NULL }
354 "6k1/5ppp/8/P7/2p5/8/5PPP/6K1 w - - 0 1",
355 { "w>b", NULL, NULL, NULL, NULL }
359 "r4rk1/pp3ppp/5n2/2pPp3/2P1B2n/P3PP2/5P1P/R1B2RK1 b - - 0 1",
360 { "b>w", "H4>E4", "h4>c1", "f6>c1", NULL }
364 "8/1p6/npn2k2/3p3p/P2P1B2/2K5/7P/1B6 b - - 0 1",
365 { "w>b", NULL, NULL, NULL, NULL }
369 "4r1k1/1p1rq1pp/2p1p3/p1P1Ppb1/P2P4/1PNR1QP1/6KP/3R4 b - - 0 1",
370 { "g5>c3", NULL, NULL, NULL, NULL }
373 "4rqk1/1pbr2pp/2pNp3/p1P1Pp2/P2P4/1P1R1QP1/6KP/3R4 b - - 0 1",
374 { "w>b", "D6>C7", NULL, NULL, NULL }
378 "r2q1rk1/pb3ppp/1p6/3p4/3N4/1Q6/PP2RPPP/R5K1 b - - 0 1",
379 { "d4>b7", NULL, NULL, NULL, NULL }
383 "r2q1rk1/pb2nppp/1p2p3/8/3P4/1QN2N2/PP2RPPP/R5K1 b - - 0 1",
384 { "b7>c3", "B7>F3", NULL, NULL, NULL }
388 "r3r1k1/pp3ppp/3p1b2/3NpP2/2q1P3/8/PPP3PP/R3QRK1 w - - 0 1",
389 { "d5>f6", "w>b", NULL, NULL, NULL }
393 "2rbr1k1/p4ppp/3p4/1pqNpP2/4P3/1PP2R2/P5PP/R3Q2K b - - 0 1",
394 { "w>b", NULL, NULL, NULL, NULL }
398 "2br2k1/5pp1/1p3q1p/2pBpP2/2P1P3/P6P/2Q3P1/5RK1 w - - 0 1",
399 { "d5>c8", NULL, NULL, NULL, NULL }
403 "k5B1/n7/7P/2p5/1p4P1/p7/7K/8 w - - 0 1",
404 { "g8>a7", NULL, NULL, NULL, NULL }
408 "2br2k1/5pp1/1p3q1p/2p1pP2/2P1P3/P2B3P/2Q3P1/5RK1 w - - 0 1",
409 { "b>w", "c8>d3", NULL, NULL, NULL }
414 SEARCHER_THREAD_CONTEXT ctx;
417 SCORE i, w, b, i1st, i2nd;
420 Trace("Testing static eval code...\n");
426 if (FALSE == FenToPosition(&(ctx.sPosition), x[u].szFen))
428 UtilPanic(INCONSISTENT_STATE,
429 NULL, NULL, NULL, NULL,
433 i = Eval(&ctx, -INFINITY, +INFINITY);
434 Trace("Position %u: SCORE %d for side to move.\n", u, i);
435 if (ctx.sPosition.uToMove == WHITE)
447 v < ARRAY_LENGTH(x[u].szFeature);
450 p = x[u].szFeature[v];
453 Trace("Testing feature \"%s\"\n", p);
456 i1st = INVALID_SCORE;
457 i2nd = INVALID_SCORE;
463 if (LooksLikeCoor(p))
467 c2 = FILE_RANK_TO_COOR((tolower(p[0]) - 'a'),
468 (tolower(p[1]) - '0'));
469 if (INVALID_SCORE == i1st)
471 i1st = EvalSigmaForPiece(&(ctx.sPosition), c2);
475 i2nd = EvalSigmaForPiece(&(ctx.sPosition), c2);
481 c1 = FILE_RANK_TO_COOR((tolower(p[0]) - 'a'),
482 (tolower(p[1]) - '0'));
483 if (INVALID_SCORE == i1st)
485 i1st = EvalSigmaForPiece(&(ctx.sPosition), c1);
489 i2nd = EvalSigmaForPiece(&(ctx.sPosition), c1);
499 if (INVALID_SCORE == i1st)
509 if (INVALID_SCORE == i1st)
531 switch(cRelationship)
536 Trace("%s NOT TRUE.\n", x[u].szFeature[v]);
538 DumpPosition(&(ctx.sPosition));
545 Trace("%s NOT TRUE.\n", x[u].szFeature[v]);
547 DumpPosition(&(ctx.sPosition));
552 Trace("Unknown cRelationship.\n");