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;
73 /// Version number. If this is left empty, the current date (in the format
74 /// YYMMDD) is used as a version number.
76 static const string EngineVersion = "";
77 static const string AppName = "Stockfish";
78 static const string AppTag = "";
87 uint64_t dbg_cnt0 = 0;
88 uint64_t dbg_cnt1 = 0;
90 bool dbg_show_mean = false;
91 bool dbg_show_hit_rate = false;
98 void dbg_hit_on(bool b) {
100 assert(!dbg_show_mean);
101 dbg_show_hit_rate = true;
107 void dbg_hit_on_c(bool c, bool b) {
115 assert(!dbg_show_mean);
116 dbg_show_hit_rate = true;
122 assert(!dbg_show_mean);
123 dbg_show_hit_rate = true;
127 void dbg_mean_of(int v) {
129 assert(!dbg_show_hit_rate);
130 dbg_show_mean = true;
135 void dbg_print_hit_rate() {
137 cout << "Total " << dbg_cnt0 << " Hit " << dbg_cnt1
138 << " hit rate (%) " << (dbg_cnt1*100)/(dbg_cnt0 ? dbg_cnt0 : 1) << endl;
141 void dbg_print_mean() {
143 cout << "Total " << dbg_cnt0 << " Mean "
144 << (float)dbg_cnt1 / (dbg_cnt0 ? dbg_cnt0 : 1) << endl;
147 void dbg_print_hit_rate(ofstream& logFile) {
149 logFile << "Total " << dbg_cnt0 << " Hit " << dbg_cnt1
150 << " hit rate (%) " << (dbg_cnt1*100)/(dbg_cnt0 ? dbg_cnt0 : 1) << endl;
153 void dbg_print_mean(ofstream& logFile) {
155 logFile << "Total " << dbg_cnt0 << " Mean "
156 << (float)dbg_cnt1 / (dbg_cnt0 ? dbg_cnt0 : 1) << endl;
159 /// engine_name() returns the full name of the current Stockfish version.
160 /// This will be either "Stockfish YYMMDD" (where YYMMDD is the date when the
161 /// program was compiled) or "Stockfish <version number>", depending on whether
162 /// the constant EngineVersion (defined in misc.h) is empty.
164 const string engine_name() {
166 const string cpu64(CpuHas64BitPath ? " 64bit" : "");
168 if (!EngineVersion.empty())
169 return AppName+ " " + EngineVersion + cpu64;
171 string date(__DATE__); // From compiler, format is "Sep 21 2008"
172 string months("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec");
174 size_t mon = 1 + months.find(date.substr(0, 3)) / 4;
177 string day = (date[4] == ' ' ? date.substr(5, 1) : date.substr(4, 2));
179 string name = AppName + " " + AppTag + " ";
181 s << name << date.substr(date.length() - 2) << setfill('0')
182 << setw(2) << mon << setw(2) << day << cpu64;
188 /// get_system_time() returns the current system time, measured in
191 int get_system_time() {
193 gettimeofday(&t, NULL);
194 return t.tv_sec*1000 + t.tv_usec/1000;
198 /// cpu_count() tries to detect the number of CPU cores.
200 #if !defined(_MSC_VER)
202 # if defined(_SC_NPROCESSORS_ONLN)
204 return Min(sysconf(_SC_NPROCESSORS_ONLN), 8);
217 return Min(s.dwNumberOfProcessors, 8);
224 From Beowulf, from Olithink
227 /* Non-windows version */
231 struct timeval timeout;
234 FD_SET(fileno(stdin), &readfds);
235 /* Set to timeout immediately */
238 select(16, &readfds, 0, 0, &timeout);
240 return (FD_ISSET(fileno(stdin), &readfds));
244 /* Windows-version */
253 /* If we're running under XBoard then we can't use _kbhit() as the input
254 * commands are sent to us directly over the internal pipe */
256 #if defined(FILE_CNT)
262 inh = GetStdHandle(STD_INPUT_HANDLE);
263 pipe = !GetConsoleMode(inh, &dw);
265 SetConsoleMode(inh, dw & ~(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT));
266 FlushConsoleInputBuffer(inh);
270 if (!PeekNamedPipe(inh, NULL, 0, NULL, &dw, NULL))
274 // Count the number of unread input records, including keyboard,
275 // mouse, and window-resizing input records.
276 GetNumberOfConsoleInputEvents(inh, &dw);
280 // Read data from console without removing it from the buffer
281 INPUT_RECORD rec[256];
283 if (!PeekConsoleInput(inh, rec, Min(dw, 256), &recCnt))
286 // Search for at least one keyboard event
287 for (DWORD i = 0; i < recCnt; i++)
288 if (rec[i].EventType == KEY_EVENT)