2 Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3 Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
4 Copyright (C) 2008-2009 Marco Costalba
6 Stockfish is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 Stockfish is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #if !defined(_MSC_VER)
27 # include <sys/time.h>
28 # include <sys/types.h>
33 (c) Copyright 1992 Eric Backus
35 This software may be used freely so long as this copyright notice is
36 left intact. There is no warrantee on this software.
42 static int gettimeofday(struct timeval* tp, struct timezone*)
49 time_t theTime = time(NULL);
51 tmrec = *localtime(&theTime);
52 tp->tv_sec = mktime(&tmrec);
53 GetLocalTime(&systime); /* system time */
55 tp->tv_usec = systime.wMilliseconds * 1000;
72 /// Version number. If this is left empty, the current date (in the format
73 /// YYMMDD) is used as a version number.
75 static const string EngineVersion = "";
76 static const string AppName = "Stockfish";
77 static const string AppTag = "";
86 uint64_t dbg_cnt0 = 0;
87 uint64_t dbg_cnt1 = 0;
89 bool dbg_show_mean = false;
90 bool dbg_show_hit_rate = false;
97 void dbg_hit_on(bool b) {
99 assert(!dbg_show_mean);
100 dbg_show_hit_rate = true;
106 void dbg_hit_on_c(bool c, bool b) {
114 assert(!dbg_show_mean);
115 dbg_show_hit_rate = true;
121 assert(!dbg_show_mean);
122 dbg_show_hit_rate = true;
126 void dbg_mean_of(int v) {
128 assert(!dbg_show_hit_rate);
129 dbg_show_mean = true;
134 void dbg_print_hit_rate() {
136 cout << "Total " << dbg_cnt0 << " Hit " << dbg_cnt1
137 << " hit rate (%) " << (dbg_cnt1*100)/(dbg_cnt0 ? dbg_cnt0 : 1) << endl;
140 void dbg_print_mean() {
142 cout << "Total " << dbg_cnt0 << " Mean "
143 << (float)dbg_cnt1 / (dbg_cnt0 ? dbg_cnt0 : 1) << endl;
146 void dbg_print_hit_rate(ofstream& logFile) {
148 logFile << "Total " << dbg_cnt0 << " Hit " << dbg_cnt1
149 << " hit rate (%) " << (dbg_cnt1*100)/(dbg_cnt0 ? dbg_cnt0 : 1) << endl;
152 void dbg_print_mean(ofstream& logFile) {
154 logFile << "Total " << dbg_cnt0 << " Mean "
155 << (float)dbg_cnt1 / (dbg_cnt0 ? dbg_cnt0 : 1) << endl;
158 /// engine_name() returns the full name of the current Stockfish version.
159 /// This will be either "Stockfish YYMMDD" (where YYMMDD is the date when the
160 /// program was compiled) or "Stockfish <version number>", depending on whether
161 /// the constant EngineVersion (defined in misc.h) is empty.
163 const string engine_name() {
165 if (!EngineVersion.empty())
166 return "Stockfish " + EngineVersion;
168 string date(__DATE__); // From compiler, format is "Sep 21 2008"
169 string months("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec");
171 size_t mon = 1 + months.find(date.substr(0, 3)) / 4;
174 string day = (date[4] == ' ' ? date.substr(5, 1) : date.substr(4, 2));
176 string name = AppName + " " + AppTag + " ";
178 s << name << date.substr(date.length() - 2) << setfill('0')
179 << setw(2) << mon << setw(2) << day;
185 /// get_system_time() returns the current system time, measured in
188 int get_system_time() {
190 gettimeofday(&t, NULL);
191 return t.tv_sec*1000 + t.tv_usec/1000;
195 /// cpu_count() tries to detect the number of CPU cores.
197 #if !defined(_MSC_VER)
199 # if defined(_SC_NPROCESSORS_ONLN)
201 return Min(sysconf(_SC_NPROCESSORS_ONLN), 8);
214 return Min(s.dwNumberOfProcessors, 8);
221 From Beowulf, from Olithink
224 /* Non-windows version */
228 struct timeval timeout;
231 FD_SET(fileno(stdin), &readfds);
232 /* Set to timeout immediately */
235 select(16, &readfds, 0, 0, &timeout);
237 return (FD_ISSET(fileno(stdin), &readfds));
241 /* Windows-version */
250 /* If we're running under XBoard then we can't use _kbhit() as the input
251 * commands are sent to us directly over the internal pipe */
253 #if defined(FILE_CNT)
259 inh = GetStdHandle(STD_INPUT_HANDLE);
260 pipe = !GetConsoleMode(inh, &dw);
262 SetConsoleMode(inh, dw & ~(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT));
263 FlushConsoleInputBuffer(inh);
267 if (!PeekNamedPipe(inh, NULL, 0, NULL, &dw, NULL))
271 // Count the number of unread input records, including keyboard,
272 // mouse, and window-resizing input records.
273 GetNumberOfConsoleInputEvents(inh, &dw);
277 // Read data from console without removing it from the buffer
278 INPUT_RECORD rec[256];
280 if (!PeekConsoleInput(inh, rec, Min(dw, 256), &recCnt))
283 // Search for at least one keyboard event
284 for (DWORD i = 0; i < recCnt; i++)
285 if (rec[i].EventType == KEY_EVENT)