📄 search.cpp
字号:
{
search_root[thread_id]->flag = true;
}
if(search_input->time_is_limited
&& search_current[thread_id]->time >= search_input->time_limit_1 * 0.6
&& !search_root[thread_id]->bad_2
&& !search_root[thread_id]->change)
{
search_root[thread_id]->flag = true;
}
if(search_info[thread_id]->can_stop
&& (search_info[thread_id]->stop || (search_root[thread_id]->flag && !search_input->infinite)))
{
search_ready = true;
break;
}
}
if(search_ready)
break;
}
}
else
{
for ( depth = 1; depth < 64; depth++ )
{
search_current[thread_id]->act_iteration = depth;
search_info[thread_id]->can_stop = true;
board_copy(search_current[thread_id]->board, search_input->board);
if(depth <= 1)
{
search_full_root(search_root[thread_id]->list, search_current[thread_id]->board, depth, 1, thread_id);
}
else
{
search_full_root(search_root[thread_id]->list, search_current[thread_id]->board, depth, 0, thread_id);
}
search_update_current(thread_id);
}
}
}
// search_update_best()
void search_update_best(int thread_id)
{
int move, value, flags, depth, max_depth;
const mv_t *pv;
double time;
sint64 node_nb;
int mate, i, z;
bool found;
char move_string[256], pv_string[512];
search_update_current(thread_id);
if(thread_id == 0)
{
move = search_best[thread_id][search_current[thread_id]->multipv].move;
value = search_best[thread_id][search_current[thread_id]->multipv].value;
flags = search_best[thread_id][search_current[thread_id]->multipv].flags;
depth = search_best[thread_id][search_current[thread_id]->multipv].depth;
pv = search_best[thread_id][search_current[thread_id]->multipv].pv;
max_depth = search_current[thread_id]->max_depth;
time = search_current[thread_id]->time;
node_nb = search_current[thread_id]->node_nb;
move_to_string(move, move_string, 256);
pv_to_string(pv, pv_string, 512);
mate = value_to_mate(value);
if(search_current[thread_id]->multipv == 0)
{
save_multipv[search_current[thread_id]->multipv].mate = mate;
save_multipv[search_current[thread_id]->multipv].depth = depth;
save_multipv[search_current[thread_id]->multipv].max_depth = max_depth;
save_multipv[search_current[thread_id]->multipv].value = value;
save_multipv[search_current[thread_id]->multipv].time = time * 1000.0;
save_multipv[search_current[thread_id]->multipv].node_nb = node_nb;
strcpy(save_multipv[search_current[thread_id]->multipv].pv_string, pv_string);
}
else
{
found = false;
for ( i = 0; i < search_current[thread_id]->multipv; i++ )
{
if(save_multipv[i].value < value)
{
found = true;
break;
}
}
if(found)
{
for ( z = search_current[thread_id]->multipv; z > i; z-- )
{
save_multipv[z].mate = save_multipv[z - 1].mate;
save_multipv[z].depth = save_multipv[z - 1].depth;
save_multipv[z].max_depth = save_multipv[z - 1].max_depth;
save_multipv[z].value = save_multipv[z - 1].value;
save_multipv[z].time = save_multipv[z - 1].time;
save_multipv[z].node_nb = save_multipv[z - 1].node_nb;
strcpy(save_multipv[z].pv_string, save_multipv[z - 1].pv_string);
}
save_multipv[i].mate = mate;
save_multipv[i].depth = depth;
save_multipv[i].max_depth = max_depth;
save_multipv[i].value = value;
save_multipv[i].time = time * 1000.0;
save_multipv[i].node_nb = node_nb;
strcpy(save_multipv[i].pv_string, pv_string);
}
else
{
save_multipv[search_current[thread_id]->multipv].mate = mate;
save_multipv[search_current[thread_id]->multipv].depth = depth;
save_multipv[search_current[thread_id]->multipv].max_depth = max_depth;
save_multipv[search_current[thread_id]->multipv].value = value;
save_multipv[search_current[thread_id]->multipv].time = time * 1000.0;
save_multipv[search_current[thread_id]->multipv].node_nb = node_nb;
strcpy(save_multipv[search_current[thread_id]->multipv].pv_string, pv_string);
}
}
if(depth > 1 || (depth == 1 && search_current[thread_id]->multipv == search_input->multipv))
{
for ( i = 0; i <= search_input->multipv; i++ )
{
if(save_multipv[i].mate == 0)
{
// normal evaluation
if(false) { }
else if(flags == 3)
{
send("info multipv %d depth %d seldepth %d score cp %d time %.0f nodes " S64_FORMAT " pv %s",i
+1,save_multipv[i].depth,save_multipv[i].max_depth,save_multipv[i].value,save_multipv[
i].time,save_multipv[i].node_nb,save_multipv[i].pv_string);
}
else if(flags == 2)
{
send("info multipv %d depth %d seldepth %d score cp %d lowerbound time %.0f nodes "
S64_FORMAT " pv %s",i
+1,save_multipv[
i].depth,save_multipv[i].max_depth,save_multipv[i].value,save_multipv[
i].time,save_multipv[i].node_nb,save_multipv[i].pv_string);
}
else if(flags == 1)
{
send("info multipv %d depth %d seldepth %d score cp %d upperbound time %.0f nodes "
S64_FORMAT " pv %s",i
+1,save_multipv[
i].depth,save_multipv[i].max_depth,save_multipv[i].value,save_multipv[
i].time,save_multipv[i].node_nb,save_multipv[i].pv_string);
}
}
else
{
// mate announcement
if(false) { }
else if(flags == 3)
{
send("info multipv %d depth %d seldepth %d score mate %d time %.0f nodes " S64_FORMAT " pv %s",i
+1,save_multipv[i].depth,save_multipv[i].max_depth,save_multipv[i].mate,save_multipv[
i].time,save_multipv[i].node_nb,save_multipv[i].pv_string);
}
else if(flags == 2)
{
send("info multipv %d depth %d seldepth %d score mate %d lowerbound time %.0f nodes "
S64_FORMAT " pv %s",i
+1,save_multipv[i].depth,save_multipv[i].max_depth,save_multipv[i].mate,save_multipv[
i].time,save_multipv[i].node_nb,save_multipv[i].pv_string);
}
else if(flags == 1)
{
send("info multipv %d depth %d seldepth %d score mate %d upperbound time %.0f nodes "
S64_FORMAT " pv %s",i
+1,save_multipv[i].depth,save_multipv[i].max_depth,save_multipv[i].mate,save_multipv[
i].time,save_multipv[i].node_nb,save_multipv[i].pv_string);
}
}
}
}
}
if(thread_id == 0 && search_best[thread_id][search_current[thread_id]->multipv].depth > 1)
{
if(search_best[thread_id][search_current[thread_id]->multipv].value <= search_root[thread_id]->last_value - 50)
{
search_root[thread_id]->bad_1 = true;
search_root[thread_id]->easy = false;
search_root[thread_id]->flag = false;
}
else
{
search_root[thread_id]->bad_1 = false;
}
}
}
// search_update_root()
void search_update_root(int thread_id)
{
int move, move_pos, move_nb;
double time;
sint64 node_nb;
char move_string[256];
if(thread_id == 0)
{
search_update_current(thread_id);
if(search_current[thread_id]->time >= 1.0)
{
move = search_root[thread_id]->move;
move_pos = search_root[thread_id]->move_pos;
move_nb = search_root[thread_id]->move_nb;
time = search_current[thread_id]->time;
node_nb = search_current[thread_id]->node_nb;
move_to_string(move, move_string, 256);
send("info currmove %s currmovenumber %d", move_string, move_pos + 1);
}
}
}
// search_update_current()
void search_update_current(int thread_id)
{
my_timer_t *timer;
sint64 node_nb;
double time, speed;
timer = search_current[thread_id]->timer;
node_nb = search_current[thread_id]->node_nb;
time = (FALSE) ? timer_elapsed_cpu(timer) : timer_elapsed_real(timer);
speed = (time >= 1.0) ? double(node_nb) / time : 0.0;
search_current[thread_id]->time = time;
search_current[thread_id]->speed = speed;
}
// search_check()
void search_check(int thread_id)
{
if(thread_id == 0)
{
search_send_stat(thread_id);
event();
if(search_input->depth_is_limited && search_root[thread_id]->depth > search_input->depth_limit)
{
search_root[thread_id]->flag = true;
}
if(search_input->time_is_limited && search_current[thread_id]->time >= search_input->time_limit_2)
{
search_root[thread_id]->flag = true;
}
if(search_input->time_is_limited && search_current[thread_id]->time >= search_input->time_limit_1
&& !search_root[thread_id]->bad_1 && !search_root[thread_id]->bad_2
&& (!TRUE || search_root[thread_id]->move_pos == 0))
{
search_root[thread_id]->flag = true;
}
if(search_info[thread_id]->can_stop
&& (search_info[thread_id]->stop || (search_root[thread_id]->flag && !search_input->infinite)))
{
longjmp(search_info[thread_id]->buf, 1);
}
}
else
{
if(search_info[thread_id]->stop)
{
longjmp(search_info[thread_id]->buf, 1);
}
}
}
// search_send_stat()
static void search_send_stat(int thread_id)
{
double time, speed;
sint64 node_nb;
int i;
search_update_current(thread_id);
if(thread_id == 0 && search_current[thread_id]->time >= search_info[thread_id]->last_time + 1.0)
{ // at least one-second gap
search_info[thread_id]->last_time = search_current[thread_id]->time;
time = search_current[thread_id]->time;
speed = search_current[thread_id]->speed;
node_nb = 0;
speed = 0;
for ( i = 0; i < number_threads; i++ )
{
node_nb += search_current[thread_id]->node_nb;
speed += search_current[thread_id]->speed;
}
send("info time %.0f nodes " S64_FORMAT " nps %.0f",time*1000.0,node_nb,speed);
trans_stats(Trans);
}
}
// end of search.cpp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -