/*
Protector -- a UCI chess engine
Copyright (C) 2009-2010 Raimund Heid (Raimund_Heid@yahoo.com)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "tools.h"
#include "io.h"
#include "protector.h"
#include "bitboard.h"
#include "position.h"
#include "fen.h"
#include "movegeneration.h"
#include "matesearch.h"
#include "search.h"
#include "hash.h"
#include "test.h"
#include "pgn.h"
#include "evaluation.h"
#include "coordination.h"
#include "xboard.h"
#include "book.h"
#ifdef INCLUDE_TABLEBASE_ACCESS
#include "tablebase.h"
#endif
const char *programVersionNumber = "1.9.0";
int _distance[_64_][_64_];
int _horizontalDistance[_64_][_64_];
int _verticalDistance[_64_][_64_];
int _taxiDistance[_64_][_64_];
int castlingsOfColor[2];
const int colorSign[2] = { 1, -1 };
CommandlineOptions commandlineOptions;
UINT64 statCount1, statCount2;
int debugOutput = FALSE;
static void initializeModuleProctector()
{
int sq1, sq2;
ITERATE(sq1)
{
ITERATE(sq2)
{
_horizontalDistance
[sq1
][sq2
] = abs(file
(sq1
) - file
(sq2
));
_verticalDistance
[sq1
][sq2
] = abs(rank
(sq1
) - rank
(sq2
));
_distance[sq1][sq2] =
max(_horizontalDistance[sq1][sq2], _verticalDistance[sq1][sq2]);
_taxiDistance[sq1][sq2] =
_horizontalDistance[sq1][sq2] + _verticalDistance[sq1][sq2];
}
}
castlingsOfColor[WHITE] = WHITE_00 | WHITE_000;
castlingsOfColor[BLACK] = BLACK_00 | BLACK_000;
initializeModuleIo();
initializeModuleTools();
initializeModuleCoordination();
initializeModuleBitboard();
initializeModulePosition();
initializeModuleFen();
initializeModuleMovegeneration();
initializeModuleMatesearch();
initializeModuleSearch();
initializeModuleHash();
initializeModuleTest();
initializeModulePgn();
#ifdef INCLUDE_TABLEBASE_ACCESS
initializeModuleTablebase();
#endif
initializeModuleEvaluation();
initializeModuleXboard();
#ifdef USE_BOOK
initializeModuleBook();
#endif
}
static void reportSuccess(const char *moduleName)
{
logDebug("Module %s tested successfully.\n", moduleName);
}
static int testModuleProtector()
{
assert(_horizontalDistance
[C2
][E6
] == 2);
assert(_verticalDistance
[C2
][E6
] == 4);
assert(_distance
[C3
][H8
] == 5);
assert(_taxiDistance
[B2
][F7
] == 9);
if (testModuleIo() != 0)
{
return -1;
}
else
{
reportSuccess("Io");
}
if (testModuleTools() != 0)
{
return -1;
}
else
{
reportSuccess("Tools");
}
if (testModuleCoordination() != 0)
{
return -1;
}
else
{
reportSuccess("Coordination");
}
if (testModuleBitboard() != 0)
{
return -1;
}
else
{
reportSuccess("Bitboard");
}
if (testModulePosition() != 0)
{
return -1;
}
else
{
reportSuccess("Position");
}
if (testModuleFen() != 0)
{
return -1;
}
else
{
reportSuccess("Fen");
}
if (testModuleMovegeneration() != 0)
{
return -1;
}
else
{
reportSuccess("Movegeneration");
}
if (testModuleHash() != 0)
{
return -1;
}
else
{
reportSuccess("Hash");
}
if (testModuleMatesearch() != 0)
{
return -1;
}
else
{
reportSuccess("Matesearch");
}
if (testModuleSearch() != 0)
{
return -1;
}
else
{
reportSuccess("Search");
}
if (testModulePgn() != 0)
{
return -1;
}
else
{
reportSuccess("Pgn");
}
if (testModuleEvaluation() != 0)
{
return -1;
}
else
{
reportSuccess("Evaluation");
}
if (testModuleXboard() != 0)
{
return -1;
}
else
{
reportSuccess("Xboard");
}
#ifdef USE_BOOK
if (testModuleBook() != 0)
{
return -1;
}
else
{
reportSuccess("Book");
}
#endif
#ifdef INCLUDE_TABLEBASE_ACCESS
if (testModuleTablebase() != 0)
{
return -1;
}
else
{
reportSuccess("Tablebase");
}
#endif
if (testModuleTest() != 0)
{
return -1;
}
else
{
reportSuccess("Test");
}
logDebug("\nModuletest finished successfully.\n");
return 0;
}
static void parseOptions(int argc, char **argv, CommandlineOptions * options)
{
int i;
options->processModuleTest = FALSE;
options->xboardMode = TRUE;
options->dumpEvaluation = FALSE;
options->testfile = 0;
options->bookfile = 0;
options->tablebasePath = 0;
for (i = 0; i < argc; i++)
{
const char *currentArg = argv[i];
if (strcmp(currentArg
, "-m") == 0)
{
options->processModuleTest = TRUE;
options->xboardMode = FALSE;
}
if (strcmp(currentArg
, "-d") == 0)
{
options->dumpEvaluation = TRUE;
}
if (strcmp(currentArg
, "-t") == 0 && i
< argc
- 1)
{
options->testfile = argv[++i];
options->xboardMode = FALSE;
}
if (strcmp(currentArg
, "-e") == 0 && i
< argc
- 1)
{
options->tablebasePath = argv[++i];
}
if (strcmp(currentArg
, "-b") == 0 && i
< argc
- 1)
{
options->bookfile = argv[++i];
}
if (strcmp(currentArg
, "-v") == 0)
{
printf("Protector %s", programVersionNumber
);
}
}
}
int main(int argc, char **argv)
{
parseOptions(argc, argv, &commandlineOptions);
initializeModuleProctector();
/* logDebug("protector initialized\n"); */
if (commandlineOptions.xboardMode)
{
acceptGuiCommands();
return 0;
}
if (commandlineOptions.processModuleTest)
{
if (testModuleProtector() != 0)
{
logDebug("\n##### Moduletest failed! #####\n");
getKeyStroke();
return -1;
}
}
if (commandlineOptions.testfile != 0)
{
if (processTestsuite(commandlineOptions.testfile) != 0)
{
return -1;
}
}
if (commandlineOptions.bookfile != 0)
{
createEmptyBook(&globalBook);
appendBookDatabase(&globalBook, commandlineOptions.bookfile, 50);
closeBook(&globalBook);
}
logDebug("Main thread terminated.\n");
return 0;
}