/*
Texel - A UCI chess engine.
Copyright (C) 2012-2014 Peter Ă–sterlund, peterosterlund2@gmail.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/>.
*/
/*
* parameters.cpp
*
* Created on: Feb 25, 2012
* Author: petero
*/
#include "parameters.hpp"
#include "computerPlayer.hpp"
namespace UciParams {
std::shared_ptr<Parameters::SpinParam> hash(std::make_shared<Parameters::SpinParam>("Hash", 1, 524288, 16));
std::shared_ptr<Parameters::CheckParam> ownBook(std::make_shared<Parameters::CheckParam>("OwnBook", false));
std::shared_ptr<Parameters::CheckParam> ponder(std::make_shared<Parameters::CheckParam>("Ponder", true));
std::shared_ptr<Parameters::CheckParam> analyseMode(std::make_shared<Parameters::CheckParam>("UCI_AnalyseMode", false));
std::shared_ptr<Parameters::SpinParam> strength(std::make_shared<Parameters::SpinParam>("Strength", 0, 1000, 1000));
std::shared_ptr<Parameters::SpinParam> threads(std::make_shared<Parameters::SpinParam>("Threads", 1, 64, 1));
std::shared_ptr<Parameters::SpinParam> multiPV(std::make_shared<Parameters::SpinParam>("MultiPV", 1, 256, 1));
std::shared_ptr<Parameters::StringParam> gtbPath(std::make_shared<Parameters::StringParam>("GaviotaTbPath", ""));
std::shared_ptr<Parameters::SpinParam> gtbCache(std::make_shared<Parameters::SpinParam>("GaviotaTbCache", 1, 2047, 1));
std::shared_ptr<Parameters::StringParam> rtbPath(std::make_shared<Parameters::StringParam>("SyzygyPath", ""));
std::shared_ptr<Parameters::SpinParam> minProbeDepth(std::make_shared<Parameters::SpinParam>("MinProbeDepth", 0, 100, 1));
std::shared_ptr<Parameters::ButtonParam> clearHash(std::make_shared<Parameters::ButtonParam>("Clear Hash"));
}
int pieceValue[Piece::nPieceTypes];
DEFINE_PARAM(pV);
DEFINE_PARAM(nV);
DEFINE_PARAM(bV);
DEFINE_PARAM(rV);
DEFINE_PARAM(qV);
DEFINE_PARAM(kV);
DEFINE_PARAM(pawnIslandPenalty);
DEFINE_PARAM(pawnBackwardPenalty);
DEFINE_PARAM(pawnSemiBackwardPenalty1);
DEFINE_PARAM(pawnSemiBackwardPenalty2);
DEFINE_PARAM(pawnRaceBonus);
DEFINE_PARAM(passedPawnEGFactor);
DEFINE_PARAM(RBehindPP1);
DEFINE_PARAM(RBehindPP2);
DEFINE_PARAM(QvsRMBonus1);
DEFINE_PARAM(QvsRMBonus2);
DEFINE_PARAM(knightVsQueenBonus1);
DEFINE_PARAM(knightVsQueenBonus2);
DEFINE_PARAM(knightVsQueenBonus3);
DEFINE_PARAM(krkpBonus);
DEFINE_PARAM(krpkbBonus);
DEFINE_PARAM(krpkbPenalty);
DEFINE_PARAM(krpknBonus);
DEFINE_PARAM(RvsBPBonus);
DEFINE_PARAM(pawnTradePenalty);
DEFINE_PARAM(pieceTradeBonus);
DEFINE_PARAM(pawnTradeThreshold);
DEFINE_PARAM(pieceTradeThreshold);
DEFINE_PARAM(threatBonus1);
DEFINE_PARAM(threatBonus2);
DEFINE_PARAM(rookHalfOpenBonus);
DEFINE_PARAM(rookOpenBonus);
DEFINE_PARAM(rookDouble7thRowBonus);
DEFINE_PARAM(trappedRookPenalty1);
DEFINE_PARAM(trappedRookPenalty2);
DEFINE_PARAM(bishopPairPawnPenalty);
DEFINE_PARAM(trappedBishopPenalty);
DEFINE_PARAM(oppoBishopPenalty);
DEFINE_PARAM(kingSafetyHalfOpenBCDEFG1);
DEFINE_PARAM(kingSafetyHalfOpenBCDEFG2);
DEFINE_PARAM(kingSafetyHalfOpenAH1);
DEFINE_PARAM(kingSafetyHalfOpenAH2);
DEFINE_PARAM(kingSafetyWeight1);
DEFINE_PARAM(kingSafetyWeight2);
DEFINE_PARAM(kingSafetyWeight3);
DEFINE_PARAM(kingSafetyWeight4);
DEFINE_PARAM(kingSafetyThreshold);
DEFINE_PARAM(knightKingProtectBonus);
DEFINE_PARAM(bishopKingProtectBonus);
DEFINE_PARAM(pawnStormBonus);
DEFINE_PARAM(pawnLoMtrl);
DEFINE_PARAM(pawnHiMtrl);
DEFINE_PARAM(minorLoMtrl);
DEFINE_PARAM(minorHiMtrl);
DEFINE_PARAM(castleLoMtrl);
DEFINE_PARAM(castleHiMtrl);
DEFINE_PARAM(queenLoMtrl);
DEFINE_PARAM(queenHiMtrl);
DEFINE_PARAM(passedPawnLoMtrl);
DEFINE_PARAM(passedPawnHiMtrl);
DEFINE_PARAM(kingSafetyLoMtrl);
DEFINE_PARAM(kingSafetyHiMtrl);
DEFINE_PARAM(oppoBishopLoMtrl);
DEFINE_PARAM(oppoBishopHiMtrl);
DEFINE_PARAM(knightOutpostLoMtrl);
DEFINE_PARAM(knightOutpostHiMtrl);
DEFINE_PARAM(aspirationWindow);
DEFINE_PARAM(rootLMRMoveCount);
DEFINE_PARAM(razorMargin1);
DEFINE_PARAM(razorMargin2);
DEFINE_PARAM(reverseFutilityMargin1);
DEFINE_PARAM(reverseFutilityMargin2);
DEFINE_PARAM(reverseFutilityMargin3);
DEFINE_PARAM(reverseFutilityMargin4);
DEFINE_PARAM(futilityMargin1);
DEFINE_PARAM(futilityMargin2);
DEFINE_PARAM(futilityMargin3);
DEFINE_PARAM(futilityMargin4);
DEFINE_PARAM(lmpMoveCountLimit1);
DEFINE_PARAM(lmpMoveCountLimit2);
DEFINE_PARAM(lmpMoveCountLimit3);
DEFINE_PARAM(lmpMoveCountLimit4);
DEFINE_PARAM(lmrMoveCountLimit1);
DEFINE_PARAM(lmrMoveCountLimit2);
DEFINE_PARAM(quiesceMaxSortMoves);
DEFINE_PARAM(deltaPruningMargin);
DEFINE_PARAM(timeMaxRemainingMoves);
DEFINE_PARAM(bufferTime);
DEFINE_PARAM(minTimeUsage);
DEFINE_PARAM(maxTimeUsage);
DEFINE_PARAM(timePonderHitRate);
/** Piece/square table for king during middle game. */
ParamTable<64> kt1b { -200, 200, useUciParam,
{ 71, 118, 113, 98, 88, 112, 129, 44,
117, 3, 36, 37, 64, 37, 3, 99,
-28, -4, 13, 12, 18, 28, 25, -41,
-11, -11, -15, -20, -12, 4, -9, -19,
-36, -14, -29, -31, -33, -33, -19, -76,
-12, 1, -25, -49, -23, -11, 7, -17,
24, 23, 3, -7, 2, -1, 39, 36,
-2, 34, 24, -27, 14, -15, 31, 10 },
{ 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64 }
};
ParamTableMirrored<64> kt1w(kt1b);
/** Piece/square table for king during end game. */
ParamTable<64> kt2b { -200, 200, useUciParam,
{ -18, 48, 73, 82, 82, 73, 48, -18,
33, 93, 108, 100, 100, 108, 93, 33,
78, 104, 110, 109, 109, 110, 104, 78,
68, 97, 105, 108, 108, 105, 97, 68,
54, 79, 92, 97, 97, 92, 79, 54,
43, 61, 75, 82, 82, 75, 61, 43,
28, 47, 63, 62, 62, 63, 47, 28,
0, 20, 33, 20, 20, 33, 20, 0 },
{ 1, 2, 3, 4, 4, 3, 2, 1,
5, 6, 7, 8, 8, 7, 6, 5,
9, 10, 11, 12, 12, 11, 10, 9,
13, 14, 15, 16, 16, 15, 14, 13,
17, 18, 19, 20, 20, 19, 18, 17,
21, 22, 23, 24, 24, 23, 22, 21,
25, 26, 27, 28, 28, 27, 26, 25,
0, 29, 30, 31, 31, 30, 29, 0 }
};
ParamTableMirrored<64> kt2w(kt2b);
/** Piece/square table for pawns during middle game. */
ParamTable<64> pt1b { -200, 300, useUciParam,
{ 0, 0, 0, 0, 0, 0, 0, 0,
137, 103, 117, 123, 74, 97, -12, 148,
19, 31, 28, 26, 22, 41, 32, 8,
-7, -5, -11, -1, 4, -12, -9, -7,
-9, -2, -7, 0, -1, 2, -2, -17,
-12, -9, -27, -15, -5, -12, -5, -6,
-10, -14, -24, -20, -13, 0, 5, -5,
0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0,
1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48,
0, 0, 0, 0, 0, 0, 0, 0 }
};
ParamTableMirrored<64> pt1w(pt1b);
/** Piece/square table for pawns during end game. */
ParamTable<64> pt2b { -200, 200, useUciParam,
{ 0, 0, 0, 0, 0, 0, 0, 0,
-10, 9, 4, -9, -9, 4, 9, -10,
33, 35, 22, 7, 7, 22, 35, 33,
22, 26, 15, 6, 6, 15, 26, 22,
12, 23, 13, 13, 13, 13, 23, 12,
4, 17, 17, 21, 21, 17, 17, 4,
3, 17, 27, 32, 32, 27, 17, 3,
0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0,
1, 2, 3, 4, 4, 3, 2, 1,
5, 6, 7, 8, 8, 7, 6, 5,
9, 10, 11, 12, 12, 11, 10, 9,
13, 14, 15, 16, 16, 15, 14, 13,
17, 18, 19, 20, 20, 19, 18, 17,
21, 22, 23, 24, 24, 23, 22, 21,
0, 0, 0, 0, 0, 0, 0, 0 }
};
ParamTableMirrored<64> pt2w(pt2b);
/** Piece/square table for knights during middle game. */
ParamTable<64> nt1b { -300, 200, useUciParam,
{-258, -21, -42, -4, 22, -65, -22,-239,
-57, -52, 13, 40, 35, 98, -2, 20,
-41, -5, 22, 39, 95, 102, 47, -13,
-15, 1, 9, 38, 16, 45, 22, 23,
-18, 6, 11, 9, 27, 25, 27, -12,
-49, -10, -1, 11, 19, 0, -5, -35,
-55, -39, -23, 2, -2, -7, -30, -27,
-78, -38, -42, -34, -24, -31, -39, -94 },
{ 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64 }
};
ParamTableMirrored<64> nt1w(nt1b);
/** Piece/square table for knights during end game. */
ParamTable<64> nt2b { -200, 200, useUciParam,
{ -87, 7, 11, -2, -2, 11, 7, -87,
-10, 8, 20, 37, 37, 20, 8, -10,
-6, 20, 36, 41, 41, 36, 20, -6,
-1, 29, 46, 47, 47, 46, 29, -1,
2, 30, 43, 44, 44, 43, 30, 2,
-24, 6, 23, 34, 34, 23, 6, -24,
-35, -3, 4, 9, 9, 4, -3, -35,
-42, -57, -15, -12, -12, -15, -57, -42 },
{ 1, 2, 3, 4, 4, 3, 2, 1,
5, 6, 7, 8, 8, 7, 6, 5,
9, 10, 11, 12, 12, 11, 10, 9,
13, 14, 15, 16, 16, 15, 14, 13,
17, 18, 19, 20, 20, 19, 18, 17,
21, 22, 23, 24, 24, 23, 22, 21,
25, 26, 27, 28, 28, 27, 26, 25,
29, 30, 31, 32, 32, 31, 30, 29 }
};
ParamTableMirrored<64> nt2w(nt2b);
/** Piece/square table for bishops during middle game. */
ParamTable<64> bt1b { -200, 200, useUciParam,
{ -56, -6, 28, -46, 16, -71, 18, -41,
-35, -29, -29, 19, -24, -11, -52, -54,
-19, 11, -10, 2, 41, 56, 42, 3,
-25, -10, -5, 30, -6, 4, -17, -4,
-5, -17, -8, 9, 14, -20, -13, -1,
-17, 0, -2, -4, -5, -5, -5, 0,
10, -5, 5, -7, -1, -5, 11, 9,
-31, 6, -16, -15, -20, -11, -26, -12 },
{ 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64 }
};
ParamTableMirrored<64> bt1w(bt1b);
/** Piece/square table for bishops during end game. */
ParamTable<64> bt2b { -200, 200, useUciParam,
{ 20, 20, 17, 22, 22, 17, 20, 20,
20, 20, 25, 30, 30, 25, 20, 20,
17, 25, 36, 38, 38, 36, 25, 17,
22, 30, 38, 43, 43, 38, 30, 22,
22, 30, 38, 43, 43, 38, 30, 22,
17, 25, 36, 38, 38, 36, 25, 17,
20, 20, 25, 30, 30, 25, 20, 20,
20, 20, 17, 22, 22, 17, 20, 20 },
{ 10, 1, 2, 3, 3, 2, 1, 10,
1, 4, 5, 6, 6, 5, 4, 1,
2, 5, 7, 8, 8, 7, 5, 2,
3, 6, 8, 9, 9, 8, 6, 3,
3, 6, 8, 9, 9, 8, 6, 3,
2, 5, 7, 8, 8, 7, 5, 2,
1, 4, 5, 6, 6, 5, 4, 1,
10, 1, 2, 3, 3, 2, 1, 10 }
};
ParamTableMirrored<64> bt2w(bt2b);
/** Piece/square table for queens during middle game. */
ParamTable<64> qt1b { -200, 200, useUciParam,
{ -32, -23, -22, -26, 29, -11, 87, 32,
-66,-100, -54, -79,-113, -32, -66, 49,
-49, -41, -74, -68, -32, -22, -33, -48,
-37, -38, -44, -66, -60, -54, -40, -45,
-27, -32, -19, -38, -30, -32, -3, -36,
-27, -17, -14, -21, -11, -14, 3, -20,
-30, -22, -13, -4, -5, 3, -8, -30,
-15, -19, -7, -8, -2, -18, -48, -19 },
{ 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64 }
};
ParamTableMirrored<64> qt1w(qt1b);
ParamTable<64> qt2b { -200, 200, useUciParam,
{ -17, -20, -19, -16, -16, -19, -20, -17,
-20, -23, -14, -8, -8, -14, -23, -20,
-19, -14, -3, -5, -5, -3, -14, -19,
-16, -8, -5, 7, 7, -5, -8, -16,
-16, -8, -5, 7, 7, -5, -8, -16,
-19, -14, -3, -5, -5, -3, -14, -19,
-20, -23, -14, -8, -8, -14, -23, -20,
-17, -20, -19, -16, -16, -19, -20, -17 },
{ 10, 1, 2, 3, 3, 2, 1, 10,
1, 4, 5, 6, 6, 5, 4, 1,
2, 5, 7, 8, 8, 7, 5, 2,
3, 6, 8, 9, 9, 8, 6, 3,
3, 6, 8, 9, 9, 8, 6, 3,
2, 5, 7, 8, 8, 7, 5, 2,
1, 4, 5, 6, 6, 5, 4, 1,
10, 1, 2, 3, 3, 2, 1, 10 }
};
ParamTableMirrored<64> qt2w(qt2b);
/** Piece/square table for rooks during end game. */
ParamTable<64> rt1b { -200, 200, useUciParam,
{ 39, 45, 36, 36, 39, 58, 54, 63,
34, 36, 47, 53, 47, 53, 57, 47,
27, 36, 40, 36, 53, 71, 65, 53,
15, 18, 24, 27, 26, 33, 38, 19,
-1, -1, 12, 6, 9, 12, 21, 3,
-17, -10, -4, -3, 0, 3, 15, -5,
-24, -18, -6, 1, 2, -3, 1, -35,
-3, -1, 6, 9, 9, 9, 3, 4 },
{ 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64 }
};
ParamTableMirrored<64> rt1w(rt1b);
ParamTable<64> knightOutpostBonus { 0, 150, useUciParam,
{ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 29, 49, 46, 46, 49, 29, 0,
0, 19, 38, 43, 43, 38, 19, 0,
0, 0, 23, 43, 43, 23, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 3, 2, 1, 0,
0, 4, 5, 6, 6, 5, 4, 0,
0, 0, 7, 8, 8, 7, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 }
};
ParamTable<64> protectedPawnBonus { -50, 150, useUciParam,
{ 0, 0, 0, 0, 0, 0, 0, 0,
104, 109, 69, 136, 136, 69, 109, 104,
28, 53, 51, 63, 63, 51, 53, 28,
4, 11, 16, 17, 17, 16, 11, 4,
4, 6, 5, 8, 8, 5, 6, 4,
8, 11, 17, 11, 11, 17, 11, 8,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0,
1, 2, 3, 4, 4, 3, 2, 1,
5, 6, 7, 8, 8, 7, 6, 5,
9, 10, 11, 12, 12, 11, 10, 9,
13, 14, 15, 16, 16, 15, 14, 13,
17, 18, 19, 20, 20, 19, 18, 17,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 }
};
ParamTable<64> attackedPawnBonus { -150, 100, useUciParam,
{ 0, 0, 0, 0, 0, 0, 0, 0,
-35, -55, 17, -16, -16, 17, -55, -35,
10, 0, 20, 18, 18, 20, 0, 10,
-10, -5, -6, 9, 9, -6, -5, -10,
-35, 11, -12, 13, 13, -12, 11, -35,
-101, -24, -59, -43, -43, -59, -24,-101,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0,
1, 2, 3, 4, 4, 3, 2, 1,
5, 6, 7, 8, 8, 7, 6, 5,
9, 10, 11, 12, 12, 11, 10, 9,
13, 14, 15, 16, 16, 15, 14, 13,
17, 18, 19, 20, 20, 19, 18, 17,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 }
};
ParamTable<4> protectBonus { -50, 50, useUciParam,
{ 1, 11, 7, 2 },
{ 1, 2, 3, 4 }
};
ParamTable<15> rookMobScore { -50, 50, useUciParam,
{-17,-11, -6, -2, 0, 5, 9, 12, 17, 20, 22, 26, 28, 25, 30 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }
};
ParamTable<14> bishMobScore = { -50, 50, useUciParam,
{-14,-10, -1, 5, 12, 18, 24, 28, 31, 35, 34, 38, 39, 31 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }
};
ParamTable<28> knightMobScore { -200, 200, useUciParam,
{-96,-25, 16,-36,-12, 4, 10,-49,-18, -3, 11, 15,-20,-20,-12, -7, 1, 6, 8,-22,-22,-19,-10, -3, 2, 7, 9, 6 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26 }
};
ParamTable<28> queenMobScore { -100, 100, useUciParam,
{ 7, -1, -4, -3, -1, 1, 4, 5, 9, 10, 14, 17, 20, 24, 28, 30, 35, 36, 41, 43, 44, 46, 45, 45, 39, 39, 43, 30 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28 }
};
ParamTable<36> connectedPPBonus { -200, 400, useUciParam,
{ -4, -3, 3, 11, 5, -13,
-3, 1, 0, 7, 6, 8,
3, 0, 16, 12, 22, 17,
11, 7, 12, 40, -2, 38,
5, 6, 22, -2, 102, -27,
-13, 8, 17, 38, -27, 337 },
{ 1, 2, 4, 7, 11, 16,
2, 3, 5, 8, 12, 17,
4, 5, 6, 9, 13, 18,
7, 8, 9, 10, 14, 19,
11, 12, 13, 14, 15, 20,
16, 17, 18, 19, 20, 21 }
};
ParamTable<8> passedPawnBonusX { -200, 200, useUciParam,
{ 0, 2, -2, -5, -5, -2, 2, 0 },
{ 0, 1, 2, 3, 3, 2, 1, 0 }
};
ParamTable<8> passedPawnBonusY { -200, 200, useUciParam,
{ 0, 3, 5, 14, 33, 63,103, 0 },
{ 0, 1, 2, 3, 4, 5, 6, 0 }
};
ParamTable<10> ppBlockerBonus { -50, 50, useUciParam,
{ 23, 26, 11,-11, 47, -1, 3, 1, -2, 8 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
};
ParamTable<8> candidatePassedBonus { -200, 200, useUciParam,
{ -1, -1, 5, 14, 36, 15, -1, -1 },
{ 0, 1, 2, 3, 4, 5, 0, 0 }
};
ParamTable<16> majorPieceRedundancy { -200, 200, useUciParam,
{ 0, -85, 0, 0,
85, 0, 0, 0,
0, 0, 0, 88,
0, 0, -88, 0 },
{ 0, -1, 0, 0,
1, 0, 0, 0,
0, 0, 0, 2,
0, 0, -2, 0 }
};
ParamTable<5> QvsRRBonus { -200, 200, useUciParam,
{-10, 31, 55,113, 68 },
{ 1, 2, 3, 4, 5 }
};
ParamTable<7> RvsMBonus { -200, 200, useUciParam,
{ 13, 37, 45, 35, 26, -2,-60 },
{ 1, 2, 3, 4, 5, 6, 7 }
};
ParamTable<7> RvsMMBonus { -200, 200, useUciParam,
{-92,-92,-12, 7, 12, 19, 54 },
{ 1, 1, 2, 3, 4, 5, 6 }
};
ParamTable<4> bishopPairValue { 0, 200, useUciParam,
{100, 79, 63, 57 },
{ 1, 2, 3, 4 }
};
ParamTable<7> rookEGDrawFactor { 0, 255, useUciParam,
{ 65, 70,109,137,133,156,156 },
{ 1, 2, 3, 4, 5, 6, 7 }
};
ParamTable<7> RvsBPDrawFactor { 0, 255, useUciParam,
{128, 93,108,123,127,249,162 },
{ 0, 1, 2, 3, 4, 5, 6 }
};
ParamTable<4> castleFactor { 0, 128, useUciParam,
{ 64, 42, 30, 23 },
{ 1, 2, 3, 4 }
};
ParamTable<9> pawnShelterTable { -100, 100, useUciParam,
{ 13, 31,-20, 6, 23,-12, 1, 9, 2 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }
};
ParamTable<9> pawnStormTable { -400, 100, useUciParam,
{-166,-93,-273, 37, 32, 4, 14, 4,-12 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }
};
ParamTable<14> kingAttackWeight { 0, 400, useUciParam,
{ 0, 3, 0, 6, 7, 14, 29, 57, 64,103,112,152,211,353 },
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }
};
ParamTable<5> kingPPSupportK { 0, 200, useUciParam,
{ 47, 71, 65, 56, 98 },
{ 1, 2, 3, 4, 5 }
};
ParamTable<8> kingPPSupportP { 1, 64, useUciParam,
{ 0, 4, 4, 10, 16, 22, 32, 0 },
{ 0, 1, 2, 3, 4, 5, 0, 0 }
};
ParamTable<8> pawnDoubledPenalty { 0, 50, useUciParam,
{ 42, 22, 17, 11, 11, 17, 22, 42 },
{ 1, 2, 3, 4, 4, 3, 2, 1 }
};
ParamTable<8> pawnIsolatedPenalty { 0, 50, useUciParam,
{ 2, 12, 10, 14, 14, 10, 12, 2 },
{ 1, 2, 3, 4, 4, 3, 2, 1 }
};
ParamTable<10> halfMoveFactor { 0, 192, useUciParam,
{128,128,128,128, 43, 27, 19, 13, 9, 5 },
{ 0, 0, 0, 0, 1, 2, 3, 4, 5, 6 }
};
ParamTable<9> stalePawnFactor { 0, 192, useUciParam,
{119,127,131,133,137,129,104, 65, 28 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }
};
Parameters::Parameters() {
std::string about = ComputerPlayer::engineName +
" by Peter Osterlund, see http://web.comhem.se/petero2home/javachess/index.html#texel";
addPar(std::make_shared<StringParam>("UCI_EngineAbout", about));
addPar(UciParams::hash);
addPar(UciParams::ownBook);
addPar(UciParams::ponder);
addPar(UciParams::analyseMode);
addPar(UciParams::strength);
addPar(UciParams::threads);
addPar(UciParams::multiPV);
addPar(UciParams::gtbPath);
addPar(UciParams::gtbCache);
addPar(UciParams::rtbPath);
addPar(UciParams::minProbeDepth);
addPar(UciParams::clearHash);
// Evaluation parameters
REGISTER_PARAM(pV, "PawnValue");
REGISTER_PARAM(nV, "KnightValue");
REGISTER_PARAM(bV, "BishopValue");
REGISTER_PARAM(rV, "RookValue");
REGISTER_PARAM(qV, "QueenValue");
REGISTER_PARAM(kV, "KingValue");
REGISTER_PARAM(pawnIslandPenalty, "PawnIslandPenalty");
REGISTER_PARAM(pawnBackwardPenalty, "PawnBackwardPenalty");
REGISTER_PARAM(pawnSemiBackwardPenalty1, "PawnSemiBackwardPenalty1");
REGISTER_PARAM(pawnSemiBackwardPenalty2, "PawnSemiBackwardPenalty2");
REGISTER_PARAM(pawnRaceBonus, "PawnRaceBonus");
REGISTER_PARAM(passedPawnEGFactor, "PassedPawnEGFactor");
REGISTER_PARAM(RBehindPP1, "RookBehindPassedPawn1");
REGISTER_PARAM(RBehindPP2, "RookBehindPassedPawn2");
REGISTER_PARAM(QvsRMBonus1, "QueenVsRookMinorBonus1");
REGISTER_PARAM(QvsRMBonus2, "QueenVsRookMinorBonus2");
REGISTER_PARAM(knightVsQueenBonus1, "KnightVsQueenBonus1");
REGISTER_PARAM(knightVsQueenBonus2, "KnightVsQueenBonus2");
REGISTER_PARAM(knightVsQueenBonus3, "KnightVsQueenBonus3");
REGISTER_PARAM(krkpBonus, "RookVsPawnBonus");
REGISTER_PARAM(krpkbBonus, "RookPawnVsBishopBonus");
REGISTER_PARAM(krpkbPenalty, "RookPawnVsBishopPenalty");
REGISTER_PARAM(krpknBonus, "RookPawnVsKnightBonus");
REGISTER_PARAM(RvsBPBonus, "RookVsBishopPawnBonus");
REGISTER_PARAM(pawnTradePenalty, "PawnTradePenalty");
REGISTER_PARAM(pieceTradeBonus, "PieceTradeBonus");
REGISTER_PARAM(pawnTradeThreshold, "PawnTradeThreshold");
REGISTER_PARAM(pieceTradeThreshold, "PieceTradeThreshold");
REGISTER_PARAM(threatBonus1, "ThreatBonus1");
REGISTER_PARAM(threatBonus2, "ThreatBonus2");
REGISTER_PARAM(rookHalfOpenBonus, "RookHalfOpenBonus");
REGISTER_PARAM(rookOpenBonus, "RookOpenBonus");
REGISTER_PARAM(rookDouble7thRowBonus, "RookDouble7thRowBonus");
REGISTER_PARAM(trappedRookPenalty1, "TrappedRookPenalty1");
REGISTER_PARAM(trappedRookPenalty2, "TrappedRookPenalty2");
REGISTER_PARAM(bishopPairPawnPenalty, "BishopPairPawnPenalty");
REGISTER_PARAM(trappedBishopPenalty, "TrappedBishopPenalty");
REGISTER_PARAM(oppoBishopPenalty, "OppositeBishopPenalty");
REGISTER_PARAM(kingSafetyHalfOpenBCDEFG1, "KingSafetyHalfOpenBCDEFG1");
REGISTER_PARAM(kingSafetyHalfOpenBCDEFG2, "KingSafetyHalfOpenBCDEFG2");
REGISTER_PARAM(kingSafetyHalfOpenAH1, "KingSafetyHalfOpenAH1");
REGISTER_PARAM(kingSafetyHalfOpenAH2, "KingSafetyHalfOpenAH2");
REGISTER_PARAM(kingSafetyWeight1, "KingSafetyWeight1");
REGISTER_PARAM(kingSafetyWeight2, "KingSafetyWeight2");
REGISTER_PARAM(kingSafetyWeight3, "KingSafetyWeight3");
REGISTER_PARAM(kingSafetyWeight4, "KingSafetyWeight4");
REGISTER_PARAM(kingSafetyThreshold, "KingSafetyThreshold");
REGISTER_PARAM(knightKingProtectBonus, "KnightKingProtectBonus");
REGISTER_PARAM(bishopKingProtectBonus, "BishopKingProtectBonus");
REGISTER_PARAM(pawnStormBonus, "PawnStormBonus");
REGISTER_PARAM(pawnLoMtrl, "PawnLoMtrl");
REGISTER_PARAM(pawnHiMtrl, "PawnHiMtrl");
REGISTER_PARAM(minorLoMtrl, "MinorLoMtrl");
REGISTER_PARAM(minorHiMtrl, "MinorHiMtrl");
REGISTER_PARAM(castleLoMtrl, "CastleLoMtrl");
REGISTER_PARAM(castleHiMtrl, "CastleHiMtrl");
REGISTER_PARAM(queenLoMtrl, "QueenLoMtrl");
REGISTER_PARAM(queenHiMtrl, "QueenHiMtrl");
REGISTER_PARAM(passedPawnLoMtrl, "PassedPawnLoMtrl");
REGISTER_PARAM(passedPawnHiMtrl, "PassedPawnHiMtrl");
REGISTER_PARAM(kingSafetyLoMtrl, "KingSafetyLoMtrl");
REGISTER_PARAM(kingSafetyHiMtrl, "KingSafetyHiMtrl");
REGISTER_PARAM(oppoBishopLoMtrl, "OppositeBishopLoMtrl");
REGISTER_PARAM(oppoBishopHiMtrl, "OppositeBishopHiMtrl");
REGISTER_PARAM(knightOutpostLoMtrl, "KnightOutpostLoMtrl");
REGISTER_PARAM(knightOutpostHiMtrl, "KnightOutpostHiMtrl");
// Evaluation tables
kt1b.registerParams("KingTableMG", *this);
kt2b.registerParams("KingTableEG", *this);
pt1b.registerParams("PawnTableMG", *this);
pt2b.registerParams("PawnTableEG", *this);
nt1b.registerParams("KnightTableMG", *this);
nt2b.registerParams("KnightTableEG", *this);
bt1b.registerParams("BishopTableMG", *this);
bt2b.registerParams("BishopTableEG", *this);
qt1b.registerParams("QueenTableMG", *this);
qt2b.registerParams("QueenTableEG", *this);
rt1b.registerParams("RookTable", *this);
knightOutpostBonus.registerParams("KnightOutpostBonus", *this);
protectedPawnBonus.registerParams("ProtectedPawnBonus", *this);
attackedPawnBonus.registerParams("AttackedPawnBonus", *this);
protectBonus.registerParams("ProtectBonus", *this);
rookMobScore.registerParams("RookMobility", *this);
bishMobScore.registerParams("BishopMobility", *this);
knightMobScore.registerParams("KnightMobility", *this);
queenMobScore.registerParams("QueenMobility", *this);
majorPieceRedundancy.registerParams("MajorPieceRedundancy", *this);
connectedPPBonus.registerParams("ConnectedPPBonus", *this);
passedPawnBonusX.registerParams("PassedPawnBonusX", *this);
passedPawnBonusY.registerParams("PassedPawnBonusY", *this);
ppBlockerBonus.registerParams("PassedPawnBlockerBonus", *this);
candidatePassedBonus.registerParams("CandidatePassedPawnBonus", *this);
QvsRRBonus.registerParams("QueenVs2RookBonus", *this);
RvsMBonus.registerParams("RookVsMinorBonus", *this);
RvsMMBonus.registerParams("RookVs2MinorBonus", *this);
bishopPairValue.registerParams("BishopPairValue", *this);
rookEGDrawFactor.registerParams("RookEndGameDrawFactor", *this);
RvsBPDrawFactor.registerParams("RookVsBishopPawnDrawFactor", *this);
castleFactor.registerParams("CastleFactor", *this);
pawnShelterTable.registerParams("PawnShelterTable", *this);
pawnStormTable.registerParams("PawnStormTable", *this);
kingAttackWeight.registerParams("KingAttackWeight", *this);
kingPPSupportK.registerParams("KingPassedPawnSupportK", *this);
kingPPSupportP.registerParams("KingPassedPawnSupportP", *this);
pawnDoubledPenalty.registerParams("PawnDoubledPenalty", *this);
pawnIsolatedPenalty.registerParams("PawnIsolatedPenalty", *this);
halfMoveFactor.registerParams("HalfMoveFactor", *this);
stalePawnFactor.registerParams("StalePawnFactor", *this);
// Search parameters
REGISTER_PARAM(aspirationWindow, "AspirationWindow");
REGISTER_PARAM(rootLMRMoveCount, "RootLMRMoveCount");
REGISTER_PARAM(razorMargin1, "RazorMargin1");
REGISTER_PARAM(razorMargin2, "RazorMargin2");
REGISTER_PARAM(reverseFutilityMargin1, "ReverseFutilityMargin1");
REGISTER_PARAM(reverseFutilityMargin2, "ReverseFutilityMargin2");
REGISTER_PARAM(reverseFutilityMargin3, "ReverseFutilityMargin3");
REGISTER_PARAM(reverseFutilityMargin4, "ReverseFutilityMargin4");
REGISTER_PARAM(futilityMargin1, "FutilityMargin1");
REGISTER_PARAM(futilityMargin2, "FutilityMargin2");
REGISTER_PARAM(futilityMargin3, "FutilityMargin3");
REGISTER_PARAM(futilityMargin4, "FutilityMargin4");
REGISTER_PARAM(lmpMoveCountLimit1, "LMPMoveCountLimit1");
REGISTER_PARAM(lmpMoveCountLimit2, "LMPMoveCountLimit2");
REGISTER_PARAM(lmpMoveCountLimit3, "LMPMoveCountLimit3");
REGISTER_PARAM(lmpMoveCountLimit4, "LMPMoveCountLimit4");
REGISTER_PARAM(lmrMoveCountLimit1, "LMRMoveCountLimit1");
REGISTER_PARAM(lmrMoveCountLimit2, "LMRMoveCountLimit2");
REGISTER_PARAM(quiesceMaxSortMoves, "QuiesceMaxSortMoves");
REGISTER_PARAM(deltaPruningMargin, "DeltaPruningMargin");
// Time management parameters
REGISTER_PARAM(timeMaxRemainingMoves, "TimeMaxRemainingMoves");
REGISTER_PARAM(bufferTime, "BufferTime");
REGISTER_PARAM(minTimeUsage, "MinTimeUsage");
REGISTER_PARAM(maxTimeUsage, "MaxTimeUsage");
REGISTER_PARAM(timePonderHitRate, "TimePonderHitRate");
}
Parameters&
Parameters::instance() {
static Parameters inst;
return inst;
}
void
Parameters::getParamNames(std::vector<std::string>& parNames) {
parNames = paramNames;
}
std::shared_ptr<Parameters::ParamBase>
Parameters::getParam(const std::string& name) const {
auto it = params.find(toLowerCase(name));
if (it == params.end())
return nullptr;
return it->second;
}
void
Parameters::addPar(const std::shared_ptr<ParamBase>& p) {
std::string name = toLowerCase(p->name);
assert(params.find(name) == params.end());
params[name] = p;
paramNames.push_back(name);
}
int
Parameters::Listener::addListener(Func f, bool callNow) {
int id = ++nextId;
listeners[id] = f;
if (callNow)
f();
return id;
}
void
Parameters::Listener::removeListener(int id) {
listeners.erase(id);
}
void
Parameters::Listener::notify() {
for (auto& e : listeners)
(e.second)();
}
void
ParamTableBase::registerParamsN(const std::string& name, Parameters& pars,
int* table, int* parNo, int N) {
// Check that each parameter has a single value
std::map<int,int> parNoToVal;
int maxParIdx = -1;
for (int i = 0; i < N; i++) {
if (parNo[i] == 0)
continue;
const int pn = std::abs(parNo[i]);
const int sign = parNo[i] > 0 ? 1 : -1;
maxParIdx = std::max(maxParIdx, pn);
auto it = parNoToVal.find(pn);
if (it == parNoToVal.end())
parNoToVal.insert(std::make_pair(pn, sign*table[i]));
else
assert(it->second == sign*table[i]);
}
if (!uci)
return;
params.resize(maxParIdx+1);
for (const auto& p : parNoToVal) {
std::string pName = name + num2Str(p.first);
params[p.first] = std::make_shared<Parameters::SpinParam>(pName, minValue, maxValue, p.second);
pars.addPar(params[p.first]);
params[p.first]->addListener([=]() { modifiedN(table, parNo, N); }, false);
}
modifiedN(table, parNo, N);
}
void
ParamTableBase::modifiedN(int* table, int* parNo, int N) {
for (int i = 0; i < N; i++)
if (parNo[i] > 0)
table[i] = params[parNo[i]]->getIntPar();
else if (parNo[i] < 0)
table[i] = -params[-parNo[i]]->getIntPar();
notify();
}