The following document contains the results of PMD's CPD 4.1.
| File | Line |
|---|---|
| com/alonsoruibal/chess/evaluation/CompleteEvaluator.java | 76 |
| com/alonsoruibal/chess/evaluation/CompleteEvaluatorNew.java | 88 |
public final static int TEMPO = 10; // Add to moving side score
private final static int knightOutpost[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 7, 9, 9, 7, 0, 0,
0, 5, 10, 20, 20, 10, 5, 0,
0, 5, 10, 20, 20, 10, 5, 0,
0, 0, 7, 9, 9, 7, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
// The pair of values are {opening, endgame}
private final static int PawnFileValue[] = {5,0};
private final static int KnightCenterValue[] = {5,5};
private final static int KnightRankValue[] = {5,0};
private final static int KnightBackRankValue[] = {0,0};
private final static int KnightTrappedValue[] = {-100,0};
private final static int BishopCenterValue[] = {2,3};
private final static int BishopBackRankValue[] = {-10,0};
private final static int BishopDiagonalValue[] = {4,0};
private final static int RookFileValue[] = {3,0};
private final static int QueenCenterValue[] = {0,4};
private final static int QueenBackRankValue[] = {-5,0};
private final static int KingCenterValue[] = {0,12};
private final static int KingFileValue[] = {10,0};
private final static int KingRankValue[] = {10,0};
private final static int PawnFile[] = {-3, -1, +0, +1, +1, +0, -1, -3};
private final static int KnightLine[] = {-4, -2, +0, +1, +1, +0, -2, -4};
private final static int KnightRank[] = {-2, -1, +0, +1, +2, +3, +2, +1};
private final static int BishopLine[] = {-3, -1, +0, +1, +1, +0, -1, -3};
private final static int RookFile[] = {-2, -1, +0, +1, +1, +0, -1, -2};
private final static int QueenLine[] = {-3, -1, +0, +1, +1, +0, -1, -3};
private final static int KingLine[] = {-3, -1, +0, +1, +1, +0, -1, -3};
private final static int KingFile[] = {+3, +4, +2, +0, +0, +2, +4, +3};
private final static int KingRank[] = {+1, +0, -2, -3, -4, -5, -6, -7};
// Values are rotated for whites, so when white is playing is like shown in the code
private final static int pawnIndexValue[][] = new int[64][2];
private final static int knightIndexValue[][] = new int[64][2];
private final static int bishopIndexValue[][] = new int[64][2];
private final static int rookIndexValue[][] = new int[64][2];
private final static int queenIndexValue[][] = new int[64][2];
private final static int kingIndexValue[][] = new int[64][2];
static {
// Initialize Piece square values Fruit/Toga style
int i;
for (int phase = 0; phase<2; phase++) {
for (i = 0; i < 64; i++) {
int rank = i >> 3;
int file = 7 - i & 7;
pawnIndexValue[i][phase] = PawnFile[file] * PawnFileValue[phase];
knightIndexValue[i][phase] = KnightLine[file] * KnightCenterValue[phase] + KnightLine[rank] * KnightCenterValue[phase] + KnightRank[rank] * KnightRankValue[phase];
bishopIndexValue[i][phase] = BishopLine[file] * BishopCenterValue[phase] + BishopLine[rank] * BishopCenterValue[phase];
rookIndexValue[i][phase] = RookFile[file] * RookFileValue[phase];
queenIndexValue[i][phase] = QueenLine[file] * QueenCenterValue[phase] + QueenLine[rank] * QueenCenterValue[phase];
kingIndexValue[i][phase] = KingFile[file] * KingFileValue[phase] + KingRank[rank] * KingRankValue[phase] + KingLine[file] * KingCenterValue[phase] + KingLine[rank] * KingCenterValue[phase];
}
knightIndexValue[56][phase] += KnightTrappedValue[phase]; // H8
knightIndexValue[63][phase] += KnightTrappedValue[phase]; // A8
for (i = 0; i < 8; i++) {
queenIndexValue[i][phase] += QueenBackRankValue[phase];
knightIndexValue[i][phase] += KnightBackRankValue[phase];
bishopIndexValue[i][phase] += BishopBackRankValue[phase];
bishopIndexValue[(i << 3) | i][phase] += BishopDiagonalValue[phase];
bishopIndexValue[((i << 3) | i) ^ 070][phase] += BishopDiagonalValue[phase];
}
}
// Pawn opening corrections
pawnIndexValue[19][OPENING] += 10; // E3
pawnIndexValue[20][OPENING] += 10; // D3
pawnIndexValue[27][OPENING] += 25; // E4
pawnIndexValue[28][OPENING] += 25; // D4
pawnIndexValue[35][OPENING] += 10; // E5
pawnIndexValue[36][OPENING] += 10; // D5
// logger.debug("***PAWN");
// printPcsq(pawnIndexValue);
// logger.debug("***KNIGHT");
// printPcsq(knightIndexValue);
// logger.debug("***BISHOP");
// printPcsq(bishopIndexValue);
// logger.debug("***ROOK");
// printPcsq(rookIndexValue);
// logger.debug("***QUEEN");
// printPcsq(queenIndexValue);
// logger.debug("***KING");
// printPcsq(kingIndexValue);
// logger.debug("PCSQ tables generated");
}
// private static void printPcsq(int pcsq[][]) {
// StringBuffer sb = new StringBuffer();
// for (int k=0; k<2; k++) {
// if (k==0) sb.append("Opening:\n");
// else sb.append("Endgame:\n");
// for (int i = 0; i<64; i++) {
// String aux = " " + pcsq[i][k];
// aux = aux.substring(aux.length()-5);
// sb.append(aux);
// if (i%8 != 7) {
// sb.append(",");
// } else {
// sb.append("\n");
// }
// }
// }
// logger.debug(sb.toString());
// }
public int evaluateBoard(Board board) {
int pieces = 0;
long attacks[] = {0,0}; // Squares attacked by each side
| |
| File | Line |
|---|---|
| com/alonsoruibal/chess/evaluation/CompleteEvaluator.java | 198 |
| com/alonsoruibal/chess/evaluation/CompleteEvaluatorNew.java | 212 |
int auxInt;
int bishopCount[] = {0,0};
int materialValue[] = {0,0};
int pawnMaterialValue[] = {0,0};
int mobilityOpeningValue[] = {0,0};
int mobilityEndgameValue[] = {0,0};
int positionalOpeningValue[] = {0,0};
int positionalEndgameValue[] = {0,0};
int kingSafetyValue[] = {0,0};
int pawnsValue[] = {0,0};
// Squares surrounding King
long squaresNearKing[] = {BitboardAttacks.king[BitboardUtils.square2Index(board.whites & board.kings)],
BitboardAttacks.king[BitboardUtils.square2Index(board.blacks & board.kings)]};
// From material imbalances (Larry Kaufmann):
// A further refinement would be to raise the knight's value by 1/16 and lower the rook's value by 1/8
// for each pawn above five of the side being valued, with the opposite adjustment for each pawn short of five
int whitePawnsCount = BitboardUtils.popCount(board.pawns & board.whites);
int blackPawnsCount = BitboardUtils.popCount(board.pawns & board.blacks);
int knightKaufBonus[] = {KNIGHT_KAUF_BONUS * (whitePawnsCount-5), KNIGHT_KAUF_BONUS * (blackPawnsCount-5)};
int rookKaufBonus[] = {ROOK_KAUF_BONUS * (whitePawnsCount-5), ROOK_KAUF_BONUS * (blackPawnsCount-5)};
long square = 1;
byte index = 0;
while (square != 0) {
boolean isWhite = ((board.whites & square) != 0);
int color = (isWhite ? 0 : 1);
long mines = (isWhite ? board.whites : board.blacks);
long others = (isWhite ? board.blacks : board.whites);
int pcsqIndex = (isWhite ? index : 63 - index);
if ((square & all) != 0) {
pieces++;
int rank = index >> 3;
int file = 7 - index & 7;
if ((square & board.pawns ) != 0) {
pawnMaterialValue[color] += PAWN;
positionalOpeningValue[color] += pawnIndexValue[pcsqIndex][OPENING];
positionalEndgameValue[color] += pawnIndexValue[pcsqIndex][ENDGAME];
| |
| File | Line |
|---|---|
| com/alonsoruibal/chess/tt/MultiprobeTranspositionTable.java | 60 |
| com/alonsoruibal/chess/tt/TwoTierTranspositionTable.java | 62 |
}
return false;
}
public int getBestMove() {
return (int)(info & 0x1fffff);
}
public int getNodeType() {
return (int)((info >>> 21) & 0xf);
}
public byte getGeneration() {
return (byte)((info >>> 32) & 0xff);
}
public byte getDepthAnalyzed() {
return (byte)((info >>> 40) & 0xff);
}
public int getScore() {
return (short)((info >>> 48) & 0xffff);
}
public void set(Board board, int nodeType, int bestMove, int score, byte depthAnalyzed) {
long key2 = board.getKey2();
| |
| File | Line |
|---|---|
| com/alonsoruibal/chess/movegen/MagicMoveGenerator.java | 58 |
| com/alonsoruibal/chess/movesort/MoveIterator.java | 150 |
| ((square & BitboardUtils.b2_u) != 0 && (((square >>> 8) | (square >>> 16)) & all) == 0 ? (square >>> 16) : 0));
}
}
}
square <<= 1;
index++;
}
square = board.kings & mines; // my king
Byte myKingIndex = null;
// Castling: disabled when in check or squares attacked
if ((((all & (board.getTurn() ? 0x06L : 0x0600000000000000L)) == 0 &&
(board.getTurn() ? board.getWhiteKingsideCastling() : board.getBlackKingsideCastling())))) {
myKingIndex = BitboardUtils.square2Index(square);
if (!board.getCheck() &&
!BitboardAttacks.isIndexAttacked(board, (byte) (myKingIndex-1), board.getTurn()) &&
!BitboardAttacks.isIndexAttacked(board, (byte) (myKingIndex-2), board.getTurn()))
| |
| File | Line |
|---|---|
| com/alonsoruibal/chess/evaluation/CompleteEvaluator.java | 277 |
| com/alonsoruibal/chess/evaluation/CompleteEvaluatorNew.java | 303 |
if ((( BitboardUtils.FILE_ADJACENTS[file] &
(isWhite ? BitboardUtils.RANKS_UPWARDS[rank] : BitboardUtils.RANKS_DOWNWARDS[rank])
& board.pawns & others) == 0) &&
(((isWhite ? BitboardAttacks.pawnDownwards[index] : BitboardAttacks.pawnUpwards[index]) & board.pawns & mines) !=0))
positionalOpeningValue[color] += knightOutpost[pcsqIndex];
} else if ((square & board.bishops) != 0) {
materialValue[color] += BISHOP;
positionalOpeningValue[color] += bishopIndexValue[pcsqIndex][OPENING];
positionalEndgameValue[color] += bishopIndexValue[pcsqIndex][ENDGAME];
| |
| File | Line |
|---|---|
| com/alonsoruibal/chess/movegen/MagicMoveGenerator.java | 75 |
| com/alonsoruibal/chess/movesort/MoveIterator.java | 167 |
addNonCapturesAndBadPromos(Move.KING, myKingIndex, myKingIndex-2, 0, false, Move.TYPE_KINGSIDE_CASTLING);
}
if ((((all & (board.getTurn() ? 0x70L : 0x7000000000000000L)) == 0 &&
(board.getTurn() ? board.getWhiteQueensideCastling() : board.getBlackQueensideCastling())))) {
if (myKingIndex == null) myKingIndex = BitboardUtils.square2Index(square);
if (!board.getCheck() &&
!BitboardAttacks.isIndexAttacked(board, (byte) (myKingIndex+1), board.getTurn()) &&
!BitboardAttacks.isIndexAttacked(board, (byte) (myKingIndex+2), board.getTurn()))
| |
| File | Line |
|---|---|
| com/alonsoruibal/chess/search/SearchEngine.java | 260 |
| com/alonsoruibal/chess/search/SearchEngine.java | 420 |
public int zwsearch(byte depth, byte depthRemaining, int beta) throws TimeExceedException {
if (System.currentTimeMillis() > thinkTo && foundOneMove) throw new TimeExceedException();
positionCounter++;
// checks draw by treefold rep. and fifty moves rule
if (board.isDraw()) return 0;
int ttMove = 0;
int bestMove = 0;
int bestScore = -Evaluator.VICTORY;
int score = 0;
ttProbe++;
if (tt.search(board)) {
if (tt.getDepthAnalyzed() >= depthRemaining && tt.isMyGeneration()) {
switch(tt.getNodeType()) {
case TranspositionTable.TYPE_EXACT_SCORE: ttPvHit++; return tt.getScore();
case TranspositionTable.TYPE_FAIL_LOW: ttLBHit++; if (tt.getScore() <= beta-1) return beta-1;
| |
| File | Line |
|---|---|
| com/alonsoruibal/chess/evaluation/CompleteEvaluator.java | 350 |
| com/alonsoruibal/chess/evaluation/CompleteEvaluatorNew.java | 382 |
value += kingSafetyValue[0] - kingSafetyValue[1];
// Ponder opening and Endgame value: opening=> gamephase = 255 / ending => gamephase ~=0
int gamePhase = (256 * ((materialValue[0] + materialValue[1])) / 5000);
if (gamePhase > 256) gamePhase = 256; // Security
value += (gamePhase * (positionalOpeningValue[0] - positionalOpeningValue[1]
+ mobilityOpeningValue[0] - mobilityOpeningValue[1])) >> 8; // divide by 256
value += ((256 - gamePhase) * (positionalEndgameValue[0] - positionalEndgameValue[1]
+ mobilityEndgameValue[0] - mobilityEndgameValue[1])) >> 8;
// Piece attacks
// value += BitboardUtils.popCount(attacks[0]&~attacks[1]) - BitboardUtils.popCount(attacks[1]&~attacks[0]);
// Tempo
value += (board.getTurn() ? TEMPO : -TEMPO);
// logger.debug("materialValue = " + (materialValue[OPENING] - materialValue[ENDGAME]));
// logger.debug("pawnMaterialValue = " + (pawnMaterialValue[OPENING] - pawnMaterialValue[ENDGAME]));
// logger.debug("mobilityOpeningValue = " + (mobilityOpeningValue[OPENING] - mobilityOpeningValue[ENDGAME]));
// logger.debug("mobilityEndgameValue = " + (mobilityEndgameValue[OPENING] - mobilityEndgameValue[ENDGAME]));
// logger.debug("pawnsValue = " + (pawnsValue[OPENING] - pawnsValue[ENDGAME]));
// logger.debug("kingSafetyValue = " + (kingSafetyValue[OPENING] - kingSafetyValue[ENDGAME]));
// logger.debug("positionalOpeningValue = " + (positionalOpeningValue[OPENING] - positionalOpeningValue[ENDGAME]));
// logger.debug("positionalEndgameValue = " + (positionalEndgameValue[OPENING] - positionalEndgameValue[ENDGAME]));
// logger.debug("gamePhase = " + gamePhase);
// logger.debug("tempo = " + (board.getTurn() ? TEMPO : -TEMPO));
// logger.debug("value = " + value);
return value;
}
}
| |
| File | Line |
|---|---|
| com/alonsoruibal/chess/tt/MultiprobeTranspositionTable.java | 128 |
| com/alonsoruibal/chess/tt/TwoTierTranspositionTable.java | 98 |
}
keys[index] = key2;
info = (bestMove & 0x1fffff) |
((nodeType & 0xf) << 21) |
(((long)(generation & 0xff)) << 32) |
(((long)(depthAnalyzed & 0xff)) << 40) |
(((long)(score & 0xffff)) << 48);
infos[index] = info;
}
// called at the start of each search
public void newGeneration() {
generation++;
}
@Override
public boolean isMyGeneration() {
return getGeneration() == generation;
}
}
| |