I've runned test match between new version with the code above, and previous one (no pruning at the root). Currently it shows 1409.5:1398.5 — so, probably, no significant changes when I've expected some dropdown.
What is your expirience of forward pruning in PV-nodes? I think at least some moves can be reduced.
Code: Select all
int reduction_bound[16] = {200, 200, 200, 200, 200, 200, 200, 150, 100, 75, 65, 50, 40, 35, 30, 25};
int reduction_num_bound[8] = {25, 25, 25, 20, 15, 10, 5, 0};
int RootSearch(int a, int b, int d)
{
int min_value;
int max_value;
if (mate_moves > 0)
{
min_value = -(INFINITY - (mate_moves << 1));
max_value = min_value + 1;
}
else
{
min_value = -INFINITY - 1;
max_value = INFINITY + 1;
}
if (a < min_value) a = min_value;
if (b > max_value) b = max_value;
if (a >= b) return (a);
if (d >= 5 * INCPLY && b == a + 1)
{
int bound = reduction_bound[MIN(d / INCPLY, 15)] + reduction_num_bound[MIN(7, RootMoveNum)];
int res_reducted = Search(a + bound, b + bound, d - 4 * INCPLY - ((int)((d / 6) / INCPLY)) * INCPLY, TRUE, (b == a + 1) ? NODE_TYPE_CUT : NODE_TYPE_EXACT);
if (threads[CURRENT_THREAD].board->stopped) return 0;
if (res_reducted >= b + bound) return res_reducted;
}
{
int res = Search(a, b, d, TRUE, (b == a + 1) ? NODE_TYPE_CUT : NODE_TYPE_EXACT);
// printf("[%d;%d: %d]\n", min_value, max_value, res);
return res;
}
}