Skip to content

Commit

Permalink
v2.5
Browse files Browse the repository at this point in the history
  • Loading branch information
gekomad committed Jul 6, 2022
1 parent 54fe4ae commit 039fed8
Show file tree
Hide file tree
Showing 36 changed files with 5,906 additions and 3,515 deletions.
12 changes: 3 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,15 @@ Cinnamon is a chess program for Windows, Linux, Mac OS, Android and Raspberry Pi

Version
----------
2.4
2.5

News
----------
- Reverse Futility Pruning
- Stalemate improvement
- Trasposition Table improvement
- Bug fix in castle
- Bug fix in en passant
- Speeded up Perft
- Compilable with MS Visual Studio
- Time management
- Tapered eval

Useful links
----------
- [Cinnamon written in Rust](https://github.com/gekomad/cinnamon_r)
- [Bitboard Calculator](https://gekomad.github.io/Cinnamon/BitboardCalculator/)
- [Auriga Distributed Perft](https://github.com/gekomad/Auriga)
- [Web Eval debugger](https://github.com/gekomad/chess-engine-eval-debugger)
Expand Down
15 changes: 9 additions & 6 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
cmake_minimum_required(VERSION 3.17)
cmake_minimum_required(VERSION 3.16)
project(cinnamon_debug)

# debug
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-braced-scalar-init -fsanitize=address -mbmi2 -DUSE_BMI2 -g -DDEBUG_MODE -pthread -Wall -Wpedantic -W -std=c++11 -DDLOG_LEVEL=_TRACE -funroll-loops -msse4.2 -DHAS_POPCNT -mpopcnt -msse3 -DHAS_BSF -m64 ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftrapv -fwrapv -fsanitize=address -mbmi2 -DUSE_BMI2 -g -pthread -Wall -Wpedantic -W -std=c++11 -DDLOG_LEVEL=_TRACE -funroll-loops -msse4.2 -DHAS_POPCNT -mpopcnt -msse3 -DHAS_BSF -m64 ")

# bench
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-braced-scalar-init -mbmi2 -DUSE_BMI2 -pthread -Wpedantic -W -DBENCH_MODE -std=c++11 -DDLOG_LEVEL=_FATAL -Wall -O3 -DNDEBUG -funroll-loops -msse4.2 -DHAS_POPCNT -mpopcnt -msse3 -DHAS_BSF -m64 ")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mbmi2 -DUSE_BMI2 -pthread -Wpedantic -W -DBENCH_MODE -std=c++11 -DDLOG_LEVEL=_FATAL -Wall -O3 -DNDEBUG -funroll-loops -msse4.2 -DHAS_POPCNT -mpopcnt -msse3 -DHAS_BSF -m64 ")

# release
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mbmi2 -DUSE_BMI2 -pthread -Wpedantic -W -std=c++11 -DDLOG_LEVEL=_FATAL -Wall -O3 -DNDEBUG -funroll-loops -msse4.2 -DHAS_POPCNT -mpopcnt -msse3 -DHAS_BSF -m64 ")

# unit test
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-braced-scalar-init -fsanitize=address -g -pthread -Wall -Wpedantic -W -std=c++11 -DDLOG_LEVEL=_TRACE -DFULL_TEST -DDEBUG_MODE -funroll-loops -msse4.2 -DHAS_POPCNT -mpopcnt -msse3 -DHAS_BSF -m64 ")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -O3 -pthread -Wall -Wpedantic -W -std=c++11 -DDLOG_LEVEL=_TRACE -DFULL_TEST -funroll-loops -msse4.2 -DHAS_POPCNT -mpopcnt -msse3 -DHAS_BSF -m64 ")

# tuning
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-braced-scalar-init -mbmi2 -DUSE_BMI2 -O3 -pthread -Wall -Wpedantic -W -std=c++11 -DTUNING -DNDEBUG -DDLOG_LEVEL=_FATAL -funroll-loops -msse4.2 -DHAS_POPCNT -mpopcnt -msse3 -DHAS_BSF -m64 ")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mbmi2 -DUSE_BMI2 -O3 -pthread -Wall -Wpedantic -W -std=c++11 -DTUNING -DNDEBUG -DDLOG_LEVEL=_FATAL -funroll-loops -msse4.2 -DHAS_POPCNT -mpopcnt -msse3 -DHAS_BSF -m64 ")

include_directories(db/gtb)
include_directories(db/gtb/compression)
Expand Down Expand Up @@ -99,7 +102,7 @@ set(SOURCE_FILES
Uci.cpp
Uci.h
unistd.h
)
db/TB.h)

set(CMAKE_CXX_COMPILER "clang++")
add_executable(cinnamon_debug ${SOURCE_FILES})
Expand Down
52 changes: 28 additions & 24 deletions src/ChessBoard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,14 @@ void ChessBoard::makeZobristKey() {

for (u64 x2 = rightCastle; x2; RESET_LSB(x2)) {
const int position = BITScanForward(x2);
updateZobristKey(RIGHT_CASTLE_IDX, position);//12
updateZobristKey(RIGHT_CASTLE_RAND, position);//12
}

if (enPassant != NO_ENPASSANT) {
updateZobristKey(ENPASSANT_IDX, enPassant);//13
updateZobristKey(ENPASSANT_RAND, enPassant);//13
}

updateZobristKey(SIDETOMOVE_IDX, sideToMove); //14
static constexpr uchar SIDETOMOVE_RAND = 14;
updateZobristKey(SIDETOMOVE_RAND, sideToMove);

}

Expand Down Expand Up @@ -159,19 +159,16 @@ void ChessBoard::display() const {
cout << endl;
}

string ChessBoard::moveToString(const _Tmove *move) {
string a = decodeBoardinv(move->type, move->from, move->side);
if (move->type & 0xc) return a;
string b = decodeBoardinv(move->type, move->to, move->side);
if (move->promotionPiece != NO_PROMOTION) (a + b) += (char) tolower(FEN_PIECE[move->promotionPiece]);
return a + b;
}

void ChessBoard::print(const _Tmove *move) {
cout << moveToString(move) << " " << flush;
cout << decodeBoardinv(move, move->side) << " " << flush;
}

string ChessBoard::decodeBoardinv(const uchar type, const int a, const uchar side) {
string
ChessBoard::decodeBoardinv(const _Tmove *move, const uchar side, const bool verbose) {
const uchar type = move->type;
const int from = move->from;
const int to = move->to;
const int promotionPiece = move->promotionPiece;
if (type & QUEEN_SIDE_CASTLE_MOVE_MASK && side == WHITE) {
return isChess960() ? BOARD[startPosWhiteKing] + BOARD[startPosWhiteRookQueenSide] : "e1c1";
}
Expand All @@ -185,17 +182,24 @@ string ChessBoard::decodeBoardinv(const uchar type, const int a, const uchar sid
return isChess960() ? BOARD[startPosBlackKing] + BOARD[startPosBlackRookKingSide] : "e8g8";
}
assert(!(type & 0xC));
if (a >= 0 && a < 64) {
return BOARD[a];
assert (to >= 0 && to < 64);
string cap = "";
string res = "";
if (verbose) {
if (move->capturedPiece != SQUARE_EMPTY) cap = "*"; else cap = "-";
}
res = BOARD[from] + cap + BOARD[to];
if (promotionPiece != NO_PROMOTION) {
res += tolower(FEN_PIECE[promotionPiece]);
}
_assert(0)
return res;
}

void ChessBoard::clearChessboard() {
memset(chessboard, 0, sizeof(_Tchessboard));
enPassant = NO_ENPASSANT;
rightCastle = 0;
sideToMove=0;
sideToMove = 0;
}

int ChessBoard::loadFen(const string &fen) {
Expand Down Expand Up @@ -226,7 +230,7 @@ int ChessBoard::loadFen(const string &fen) {
iss >> a2;
a2 += " 1";
if (String::isNumber(a2))
movesCount = stoi(a2);
movesCount = stoi(a2);

int ix = 0;
array<int, 64> s;
Expand Down Expand Up @@ -268,28 +272,28 @@ int ChessBoard::loadFen(const string &fen) {
startPosBlackKing = BITScanForward(chessboard[KING_BLACK]);
auto whiteRookKingSide = [&](const char c) {
startPosWhiteRookKingSide = BITScanForward(chessboard[ROOK_WHITE] & 0xffULL);
updateZobristKey(RIGHT_CASTLE_IDX, 4);
updateZobristKey(RIGHT_CASTLE_RAND, 4);
assert(4 == BITScanForward(RIGHT_KING_CASTLE_WHITE_MASK));
rightCastle |= RIGHT_KING_CASTLE_WHITE_MASK;
whiteRookKingSideCastle = c;
};
auto blackRookKingSide = [&](const char c) {
startPosBlackRookKingSide = BITScanForward(chessboard[ROOK_BLACK] & 0xff00000000000000ULL);
updateZobristKey(RIGHT_CASTLE_IDX, 6);
updateZobristKey(RIGHT_CASTLE_RAND, 6);
assert(6 == BITScanForward(RIGHT_KING_CASTLE_BLACK_MASK));
rightCastle |= RIGHT_KING_CASTLE_BLACK_MASK;
blackRookKingSideCastle = c;
};
auto whiteRookQueenSide = [&](const char c) {
startPosWhiteRookQueenSide = BITScanReverse(chessboard[ROOK_WHITE] & 0xffULL);
updateZobristKey(RIGHT_CASTLE_IDX, 5);
updateZobristKey(RIGHT_CASTLE_RAND, 5);
assert(5 == BITScanForward(RIGHT_QUEEN_CASTLE_WHITE_MASK));
rightCastle |= RIGHT_QUEEN_CASTLE_WHITE_MASK;
whiteRookQueenSideCastle = c;
};
auto blackRookQueenSide = [&](const char c) {
startPosBlackRookQueenSide = BITScanReverse(chessboard[ROOK_BLACK] & 0xff00000000000000ULL);
updateZobristKey(RIGHT_CASTLE_IDX, 7);
updateZobristKey(RIGHT_CASTLE_RAND, 7);
assert(7 == BITScanForward(RIGHT_QUEEN_CASTLE_BLACK_MASK));
rightCastle |= RIGHT_QUEEN_CASTLE_BLACK_MASK;
blackRookQueenSideCastle = c;
Expand Down Expand Up @@ -347,7 +351,7 @@ int ChessBoard::loadFen(const string &fen) {
} else {
enPassant += 8;
}
updateZobristKey(ENPASSANT_IDX, enPassant);
updateZobristKey(ENPASSANT_RAND, enPassant);
break;
}
}
Expand Down
22 changes: 10 additions & 12 deletions src/ChessBoard.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class ChessBoard {
public:
ChessBoard();

string decodeBoardinv(const uchar type, const int a, const uchar side);
string decodeBoardinv(const _Tmove *move, const uchar side, const bool verbose = false);

virtual ~ChessBoard();

Expand All @@ -54,10 +54,6 @@ class ChessBoard {

void clearChessboard();

const _Tchessboard &getChessboard() const {
return chessboard;
}

void setSide(const bool b) {
sideToMove = b;
}
Expand All @@ -72,10 +68,17 @@ class ChessBoard {

string boardToFen() const;

uchar rightCastle;

uchar enPassant;
uchar sideToMove;
protected:

void print(const _Tmove *move);

_Tchessboard chessboard;
protected:


uchar startPosWhiteKing;
uchar startPosWhiteRookKingSide;
uchar startPosWhiteRookQueenSide;
Expand All @@ -84,9 +87,7 @@ class ChessBoard {
uchar startPosBlackRookKingSide;
uchar startPosBlackRookQueenSide;

uchar rightCastle;

uchar enPassant;
string MATCH_QUEENSIDE;
string MATCH_QUEENSIDE_WHITE;
string MATCH_KINGSIDE_WHITE;
Expand All @@ -98,9 +99,8 @@ class ChessBoard {

void makeZobristKey();

void print(const _Tmove *move);

#ifdef DEBUG_MODE
#ifndef NDEBUG

void updateZobristKey(int piece, int position) {
ASSERT_RANGE(position, 0, 63)
Expand All @@ -119,7 +119,5 @@ class ChessBoard {
char blackRookKingSideCastle;
char blackRookQueenSideCastle;

string moveToString(const _Tmove *move);

int loadFen();
};
Loading

0 comments on commit 039fed8

Please sign in to comment.