-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathEngineThread.cpp
112 lines (91 loc) · 2.82 KB
/
EngineThread.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "stdafx.h"
#include <thread>
#include "EngineThread.h"
#include "UCTSearch.h"
#include "MainFrame.h"
#include "Utils.h"
TEngineThread::TEngineThread(const GameState& state, MainFrame * frame) {
m_state = std::make_unique<GameState>(state);
m_frame = frame;
m_maxvisits = 0;
m_runflag = true;
m_nopass = false;
m_quiet = false;
m_nets = true;
m_update_score = true;
}
void TEngineThread::Run() {
auto Func = [this] {
auto search = std::make_unique<UCTSearch>(*m_state);
int who = m_state->get_to_move();
if (m_analyseflag && !m_pondering) {
search->set_playout_limit(0);
} else {
search->set_playout_limit(m_maxvisits);
}
search->set_runflag(&m_runflag);
search->set_analyzing(m_analyseflag);
search->set_quiet(m_quiet);
search->set_use_nets(m_nets);
int mode = UCTSearch::NORMAL;
if (m_nopass) {
mode = UCTSearch::NOPASS;
}
int move;
if (m_resigning) {
move = search->think(who, mode);
} else {
move = search->think(who, mode | UCTSearch::NORESIGN);
}
if (!m_analyseflag) {
m_state->play_move(who, move);
}
if (m_update_score) {
// Broadcast result from search
auto event = new wxCommandEvent(wxEVT_EVALUATION_UPDATE);
auto scores = search->get_scores();
auto movenum = m_state->get_movenum();
auto scoretuple = std::make_tuple(movenum,
std::get<0>(scores),
std::get<1>(scores),
std::get<2>(scores));
event->SetClientData((void*)new auto(scoretuple));
wxQueueEvent(m_frame->GetEventHandler(), event);
}
if (!m_analyseflag) {
wxQueueEvent(m_frame->GetEventHandler(),
new wxCommandEvent(wxEVT_NEW_MOVE));
}
};
m_tg.add_task(Func);
}
void TEngineThread::Wait() {
m_tg.wait_all();
}
void TEngineThread::limit_visits(int visits) {
m_maxvisits = visits;
}
void TEngineThread::stop_engine() {
m_runflag = false;
}
void TEngineThread::set_resigning(bool res) {
m_resigning = res;
}
void TEngineThread::set_analyzing(bool flag) {
m_analyseflag = flag;
}
void TEngineThread::set_pondering(bool flag) {
m_pondering = flag;
}
void TEngineThread::set_nopass(bool flag) {
m_nopass = flag;
}
void TEngineThread::set_quiet(bool flag) {
m_quiet = flag;
}
void TEngineThread::set_nets(bool flag) {
m_nets = flag;
}
void TEngineThread::kill_score_update(void) {
m_update_score = false;
}