Subversion Repositories Games.Chess Giants

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
112 pmbaty 1
/*
2
    Protector -- a UCI chess engine
3
 
4
    Copyright (C) 2009-2010 Raimund Heid (Raimund_Heid@yahoo.com)
5
 
6
    This program 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.
10
 
11
    This program 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.
15
 
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/>.
18
 
19
*/
20
 
21
#include <stdio.h>
22
#include <stdlib.h>
23
#include <string.h>
24
#include <assert.h>
25
#include "tools.h"
26
#include "io.h"
27
#include "protector.h"
28
#include "bitboard.h"
29
#include "position.h"
30
#include "fen.h"
31
#include "movegeneration.h"
32
#include "matesearch.h"
33
#include "search.h"
34
#include "hash.h"
35
#include "test.h"
36
#include "pgn.h"
37
#include "evaluation.h"
38
#include "coordination.h"
39
#include "xboard.h"
40
#include "book.h"
41
#ifdef INCLUDE_TABLEBASE_ACCESS
42
#include "tablebase.h"
43
#endif
44
 
45
const char *programVersionNumber = "1.9.0";
46
 
47
int _distance[_64_][_64_];
48
int _horizontalDistance[_64_][_64_];
49
int _verticalDistance[_64_][_64_];
50
int _taxiDistance[_64_][_64_];
51
int castlingsOfColor[2];
52
const int colorSign[2] = { 1, -1 };
53
 
54
CommandlineOptions commandlineOptions;
55
UINT64 statCount1, statCount2;
56
int debugOutput = FALSE;
57
 
58
static void initializeModuleProctector()
59
{
60
   int sq1, sq2;
61
 
62
   ITERATE(sq1)
63
   {
64
      ITERATE(sq2)
65
      {
66
         _horizontalDistance[sq1][sq2] = abs(file(sq1) - file(sq2));
67
         _verticalDistance[sq1][sq2] = abs(rank(sq1) - rank(sq2));
68
         _distance[sq1][sq2] =
69
            max(_horizontalDistance[sq1][sq2], _verticalDistance[sq1][sq2]);
70
         _taxiDistance[sq1][sq2] =
71
            _horizontalDistance[sq1][sq2] + _verticalDistance[sq1][sq2];
72
      }
73
   }
74
 
75
   castlingsOfColor[WHITE] = WHITE_00 | WHITE_000;
76
   castlingsOfColor[BLACK] = BLACK_00 | BLACK_000;
77
 
78
   initializeModuleIo();
79
   initializeModuleTools();
80
   initializeModuleCoordination();
81
   initializeModuleBitboard();
82
   initializeModulePosition();
83
   initializeModuleFen();
84
   initializeModuleMovegeneration();
85
   initializeModuleMatesearch();
86
   initializeModuleSearch();
87
   initializeModuleHash();
88
   initializeModuleTest();
89
   initializeModulePgn();
90
#ifdef INCLUDE_TABLEBASE_ACCESS
91
   initializeModuleTablebase();
92
#endif
93
   initializeModuleEvaluation();
94
   initializeModuleXboard();
95
#ifdef USE_BOOK
96
   initializeModuleBook();
97
#endif
98
}
99
 
100
static void reportSuccess(const char *moduleName)
101
{
102
   logDebug("Module %s tested successfully.\n", moduleName);
103
}
104
 
105
static int testModuleProtector()
106
{
107
   assert(_horizontalDistance[C2][E6] == 2);
108
   assert(_verticalDistance[C2][E6] == 4);
109
   assert(_distance[C3][H8] == 5);
110
   assert(_taxiDistance[B2][F7] == 9);
111
 
112
   if (testModuleIo() != 0)
113
   {
114
      return -1;
115
   }
116
   else
117
   {
118
      reportSuccess("Io");
119
   }
120
 
121
   if (testModuleTools() != 0)
122
   {
123
      return -1;
124
   }
125
   else
126
   {
127
      reportSuccess("Tools");
128
   }
129
 
130
   if (testModuleCoordination() != 0)
131
   {
132
      return -1;
133
   }
134
   else
135
   {
136
      reportSuccess("Coordination");
137
   }
138
 
139
   if (testModuleBitboard() != 0)
140
   {
141
      return -1;
142
   }
143
   else
144
   {
145
      reportSuccess("Bitboard");
146
   }
147
 
148
   if (testModulePosition() != 0)
149
   {
150
      return -1;
151
   }
152
   else
153
   {
154
      reportSuccess("Position");
155
   }
156
 
157
   if (testModuleFen() != 0)
158
   {
159
      return -1;
160
   }
161
   else
162
   {
163
      reportSuccess("Fen");
164
   }
165
 
166
   if (testModuleMovegeneration() != 0)
167
   {
168
      return -1;
169
   }
170
   else
171
   {
172
      reportSuccess("Movegeneration");
173
   }
174
 
175
   if (testModuleHash() != 0)
176
   {
177
      return -1;
178
   }
179
   else
180
   {
181
      reportSuccess("Hash");
182
   }
183
 
184
   if (testModuleMatesearch() != 0)
185
   {
186
      return -1;
187
   }
188
   else
189
   {
190
      reportSuccess("Matesearch");
191
   }
192
 
193
   if (testModuleSearch() != 0)
194
   {
195
      return -1;
196
   }
197
   else
198
   {
199
      reportSuccess("Search");
200
   }
201
 
202
   if (testModulePgn() != 0)
203
   {
204
      return -1;
205
   }
206
   else
207
   {
208
      reportSuccess("Pgn");
209
   }
210
 
211
   if (testModuleEvaluation() != 0)
212
   {
213
      return -1;
214
   }
215
   else
216
   {
217
      reportSuccess("Evaluation");
218
   }
219
 
220
   if (testModuleXboard() != 0)
221
   {
222
      return -1;
223
   }
224
   else
225
   {
226
      reportSuccess("Xboard");
227
   }
228
 
229
#ifdef USE_BOOK
230
   if (testModuleBook() != 0)
231
   {
232
      return -1;
233
   }
234
   else
235
   {
236
      reportSuccess("Book");
237
   }
238
#endif
239
 
240
#ifdef INCLUDE_TABLEBASE_ACCESS
241
   if (testModuleTablebase() != 0)
242
   {
243
      return -1;
244
   }
245
   else
246
   {
247
      reportSuccess("Tablebase");
248
   }
249
#endif
250
 
251
   if (testModuleTest() != 0)
252
   {
253
      return -1;
254
   }
255
   else
256
   {
257
      reportSuccess("Test");
258
   }
259
 
260
   logDebug("\nModuletest finished successfully.\n");
261
 
262
   return 0;
263
}
264
 
265
static void parseOptions(int argc, char **argv, CommandlineOptions * options)
266
{
267
   int i;
268
 
269
   options->processModuleTest = FALSE;
270
   options->xboardMode = TRUE;
271
   options->dumpEvaluation = FALSE;
272
   options->testfile = 0;
273
   options->bookfile = 0;
274
   options->tablebasePath = 0;
275
 
276
   for (i = 0; i < argc; i++)
277
   {
278
      const char *currentArg = argv[i];
279
 
280
      if (strcmp(currentArg, "-m") == 0)
281
      {
282
         options->processModuleTest = TRUE;
283
         options->xboardMode = FALSE;
284
      }
285
 
286
      if (strcmp(currentArg, "-d") == 0)
287
      {
288
         options->dumpEvaluation = TRUE;
289
      }
290
 
291
      if (strcmp(currentArg, "-t") == 0 && i < argc - 1)
292
      {
293
         options->testfile = argv[++i];
294
         options->xboardMode = FALSE;
295
      }
296
 
297
      if (strcmp(currentArg, "-e") == 0 && i < argc - 1)
298
      {
299
         options->tablebasePath = argv[++i];
300
      }
301
 
302
      if (strcmp(currentArg, "-b") == 0 && i < argc - 1)
303
      {
304
         options->bookfile = argv[++i];
305
      }
306
 
307
      if (strcmp(currentArg, "-v") == 0)
308
      {
309
         printf("Protector %s", programVersionNumber);
310
      }
311
   }
312
}
313
 
314
int main(int argc, char **argv)
315
{
316
 
317
   parseOptions(argc, argv, &commandlineOptions);
318
   initializeModuleProctector();
319
   /* logDebug("protector initialized\n"); */
320
 
321
   if (commandlineOptions.xboardMode)
322
   {
323
      acceptGuiCommands();
324
 
325
      return 0;
326
   }
327
 
328
   if (commandlineOptions.processModuleTest)
329
   {
330
      if (testModuleProtector() != 0)
331
      {
332
         logDebug("\n##### Moduletest failed! #####\n");
333
         getKeyStroke();
334
 
335
         return -1;
336
      }
337
   }
338
 
339
   if (commandlineOptions.testfile != 0)
340
   {
341
      if (processTestsuite(commandlineOptions.testfile) != 0)
342
      {
343
         return -1;
344
      }
345
   }
346
 
347
   if (commandlineOptions.bookfile != 0)
348
   {
349
      createEmptyBook(&globalBook);
350
      appendBookDatabase(&globalBook, commandlineOptions.bookfile, 50);
351
      closeBook(&globalBook);
352
   }
353
 
354
   logDebug("Main thread terminated.\n");
355
 
356
   return 0;
357
}