2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 search_root(int alpha
, int beta
, int depth
, int check
)
37 assert(alpha
>= -MATE_VALUE
&& alpha
< +MATE_VALUE
);
38 assert(beta
> alpha
&& beta
<= +MATE_VALUE
);
39 assert(depth
>= 0 && depth
<= MAX_PLY
);
40 assert(board_is_legal(&brd
));
43 best_score
= -MATE_VALUE
;
50 hash_moves
[0] = pv
[0][0];
54 for (i
= 0; i
< moves
.count
; i
++) {
55 /* get move with largest score */
56 sort_moves(&moves
, i
, 0);
58 if (!make_move(moves
.move
[i
], FALSE
))
61 counters
.searched_nodes
++;
64 is_check
= IS_CHECKED(brd
.wtm
);
67 score
= -search_pv(-beta
, -alpha
, depth
+ check
- 1, 1, is_check
);
71 /* examine if we can reduce or extend move */
72 extend
= moves_count
> NOLMR_MOVES
? \
73 get_extensions(moves
.move
[i
], check
, is_check
, depth
, 0) : \
76 score
= -zwsearch(-alpha
, depth
+ extend
- 1, 1, is_check
);
80 if (score
> alpha
&& extend
< 0) {
81 score
= -zwsearch(-alpha
, depth
- 1, 1, is_check
);
86 if (score
> alpha
&& score
< beta
) {
87 score
= -search_pv(-beta
, -alpha
, depth
+ check
- 1, 1, is_check
);
95 if (score
> best_score
) {
101 #ifdef STATISTIC_COUNTERS
102 counters
.failed_high_total
++;
103 if (moves_count
== 1)
104 counters
.failed_high_first
++;
106 if (!MOVE_IS_TACTICAL(moves
.move
[i
]))
107 history_store(moves
.move
[i
], depth
, 0, best_score
);
112 pv
[0][0] = moves
.move
[i
];
114 for (j
= 1; j
< pv_length
[1]; j
++)
116 pv_length
[0] = pv_length
[1];
121 if (!moves_count
&& !check
)