Rev 108 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 108 | Rev 154 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | #include "chess.h" |
1 | #include "chess.h" |
2 | #include "data.h" |
2 | #include "data.h" |
3 | /* last modified |
3 | /* last modified 08/03/16 */ |
4 | /* |
4 | /* |
5 | ******************************************************************************* |
5 | ******************************************************************************* |
6 | * * |
6 | * * |
7 | * Quiece() is the recursive routine used to implement the quiescence * |
7 | * Quiece() is the recursive routine used to implement the quiescence * |
8 | * search part of the alpha/beta negamax search. It performs the following * |
8 | * search part of the alpha/beta negamax search. It performs the following * |
Line 40... | Line 40... | ||
40 | ******************************************************************************* |
40 | ******************************************************************************* |
41 | */ |
41 | */ |
42 | int Quiesce(TREE * RESTRICT tree, int ply, int wtm, int alpha, int beta, |
42 | int Quiesce(TREE * RESTRICT tree, int ply, int wtm, int alpha, int beta, |
43 | int checks) { |
43 | int checks) { |
44 | unsigned *next, *movep; |
44 | unsigned *next, *movep; |
45 | int original_alpha = alpha, value; |
45 | int original_alpha = alpha, value, repeat; |
46 | 46 | ||
47 | /* |
47 | /* |
48 | ************************************************************ |
48 | ************************************************************ |
49 | * * |
49 | * * |
50 | * Initialize. * |
50 | * Initialize. * |
Line 73... | Line 73... | ||
73 | * zero so that additional plies of checks are not tried. * |
73 | * zero so that additional plies of checks are not tried. * |
74 | * * |
74 | * * |
75 | ************************************************************ |
75 | ************************************************************ |
76 | */ |
76 | */ |
77 | if (checks) { |
77 | if (checks) { |
78 |
|
78 | repeat = Repeat(tree, ply); |
- | 79 | if (repeat) { |
|
79 | value = DrawScore(wtm); |
80 | value = DrawScore(wtm); |
80 | if (value < beta) |
81 | if (value < beta) |
81 | SavePV(tree, ply, |
82 | SavePV(tree, ply, repeat); |
82 | #if defined(TRACE) |
83 | #if defined(TRACE) |
83 | if (ply <= trace_level) |
84 | if (ply <= trace_level) |
84 | printf("draw by repetition detected, ply=%d.\n", ply); |
85 | printf("draw by repetition detected, ply=%d.\n", ply); |
85 | #endif |
86 | #endif |
86 | return value; |
87 | return value; |
Line 98... | Line 99... | ||
98 | ************************************************************ |
99 | ************************************************************ |
99 | */ |
100 | */ |
100 | value = Evaluate(tree, ply, wtm, alpha, beta); |
101 | value = Evaluate(tree, ply, wtm, alpha, beta); |
101 | #if defined(TRACE) |
102 | #if defined(TRACE) |
102 | if (ply <= trace_level) |
103 | if (ply <= trace_level) |
103 | Trace(tree, ply, value, wtm, alpha, beta, "Quiesce", serial, EVALUATION, |
104 | Trace(tree, ply, value, wtm, alpha, beta, "Quiesce", serial, EVALUATION, |
- | 105 | 0); |
|
104 | #endif |
106 | #endif |
105 | if (value > alpha) { |
107 | if (value > alpha) { |
106 | if (value >= beta) |
108 | if (value >= beta) |
107 | return value; |
109 | return value; |
108 | alpha = value; |
110 | alpha = value; |
Line 264... | Line 266... | ||
264 | tree->pv[ply - 1].path[ply - 1] = tree->curmv[ply - 1]; |
266 | tree->pv[ply - 1].path[ply - 1] = tree->curmv[ply - 1]; |
265 | } |
267 | } |
266 | return alpha; |
268 | return alpha; |
267 | } |
269 | } |
268 | 270 | ||
269 | /* last modified |
271 | /* last modified 08/03/16 */ |
270 | /* |
272 | /* |
271 | ******************************************************************************* |
273 | ******************************************************************************* |
272 | * * |
274 | * * |
273 | * QuiesceEvasions() is the recursive routine used to implement the alpha/ * |
275 | * QuiesceEvasions() is the recursive routine used to implement the alpha/ * |
274 | * beta negamax quiescence search. The primary function here is to escape a * |
276 | * beta negamax quiescence search. The primary function here is to escape a * |
275 | * check that was delivered by |
277 | * check that was delivered by Quiesce() at the previous ply. We do not * |
276 | * |
278 | * have the usual "stand pat" option because we have to find a legal move to * |
277 | * |
279 | * prove we have not been checkmated. * |
278 | * * |
280 | * * |
279 | * QuiesceEvasions() uses the legal move generator (GenerateCheckEvasions()) * |
281 | * QuiesceEvasions() uses the legal move generator (GenerateCheckEvasions()) * |
280 | * to produce only the set of legal moves that escape check. We try those * |
282 | * to produce only the set of legal moves that escape check. We try those * |
281 | * in the the order they are generated since we are going to try them all * |
283 | * in the the order they are generated since we are going to try them all * |
282 | * unless we get a fail-high. * |
284 | * unless we get a fail-high. * |
283 | * * |
285 | * * |
284 | ******************************************************************************* |
286 | ******************************************************************************* |
285 | */ |
287 | */ |
286 | int QuiesceEvasions(TREE * RESTRICT tree, int ply, int wtm, int alpha, |
288 | int QuiesceEvasions(TREE * RESTRICT tree, int ply, int wtm, int alpha, |
287 | int beta) { |
289 | int beta) { |
288 | int original_alpha, value, moves_searched = 0, order; |
290 | int original_alpha, value, moves_searched = 0, order, repeat; |
289 | 291 | ||
290 | /* |
292 | /* |
291 | ************************************************************ |
293 | ************************************************************ |
292 | * * |
294 | * * |
293 | * Initialize. * |
295 | * Initialize. * |
Line 310... | Line 312... | ||
310 | * Check for draw by repetition, which includes 50 move * |
312 | * Check for draw by repetition, which includes 50 move * |
311 | * draws also. * |
313 | * draws also. * |
312 | * * |
314 | * * |
313 | ************************************************************ |
315 | ************************************************************ |
314 | */ |
316 | */ |
315 |
|
317 | repeat = Repeat(tree, ply); |
- | 318 | if (repeat) { |
|
316 | value = DrawScore(wtm); |
319 | value = DrawScore(wtm); |
317 | if (value < beta) |
320 | if (value < beta) |
318 | SavePV(tree, ply, |
321 | SavePV(tree, ply, repeat); |
319 | #if defined(TRACE) |
322 | #if defined(TRACE) |
320 | if (ply <= trace_level) |
323 | if (ply <= trace_level) |
321 | printf("draw by repetition detected, ply=%d.\n", ply); |
324 | printf("draw by repetition detected, ply=%d.\n", ply); |
322 | #endif |
325 | #endif |
323 | return value; |
326 | return value; |