⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 search.cpp

📁 超强国际象棋引擎
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                    {
                    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 + -