mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-21 01:27:16 +08:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e87931bbfc | ||
|
|
aa5c375ca9 | ||
|
|
cd1cc39b04 | ||
|
|
4e151f7e0d | ||
|
|
d13e4c16c2 |
13
polyglot.ini
13
polyglot.ini
@@ -2,13 +2,13 @@
|
||||
[PolyGlot]
|
||||
|
||||
EngineDir = .
|
||||
EngineCommand = ./glaurung
|
||||
EngineCommand = ./stockfish
|
||||
|
||||
Book = false
|
||||
BookFile = book.bin
|
||||
|
||||
Log = true
|
||||
LogFile = glaurung.log
|
||||
LogFile = stockfish.log
|
||||
|
||||
Resign = true
|
||||
ResignScore = 600
|
||||
@@ -34,8 +34,7 @@ King Safety Coefficient = 40
|
||||
King Safety X Intercept = 0
|
||||
King Safety Max Slope = 30
|
||||
King Safety Max Value = 500
|
||||
Queen Contact Check Bonus = 4
|
||||
Rook Contact Check Bonus = 2
|
||||
Queen Contact Check Bonus = 3
|
||||
Queen Check Bonus = 2
|
||||
Rook Check Bonus = 1
|
||||
Bishop Check Bonus = 1
|
||||
@@ -57,14 +56,8 @@ Pawn Endgame Extension (non-PV nodes) = 2
|
||||
Full Depth Moves (PV nodes) = 14
|
||||
Full Depth Moves (non-PV nodes) = 3
|
||||
Threat Depth = 5
|
||||
Selective Plies = 7
|
||||
Futility Pruning (Main Search) = true
|
||||
Futility Pruning (Quiescence Search) = true
|
||||
Futility Margin 0 = 50
|
||||
Futility Margin 1 = 100
|
||||
Futility Margin 2 = 300
|
||||
Maximum Razoring Depth = 3
|
||||
Razoring Margin = 300
|
||||
Randomness = 0
|
||||
Minimum Split Depth = 4
|
||||
Maximum Number of Threads per Split Point = 5
|
||||
|
||||
@@ -71,7 +71,7 @@ using namespace std;
|
||||
/// Version number. If this is left empty, the current date (in the format
|
||||
/// YYMMDD) is used as a version number.
|
||||
|
||||
static const string EngineVersion = "1.3rc1";
|
||||
static const string EngineVersion = "1.3";
|
||||
static const string AppName = "Stockfish";
|
||||
static const string AppTag = "";
|
||||
|
||||
|
||||
@@ -62,6 +62,9 @@ struct MoveStack {
|
||||
int score;
|
||||
};
|
||||
|
||||
// Note that operator< is set up such that std::sort() will sort in descending order
|
||||
inline bool operator<(const MoveStack& f, const MoveStack& s) { return s.score < f.score; }
|
||||
|
||||
|
||||
////
|
||||
//// Inline functions
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
//// Includes
|
||||
////
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
|
||||
#include "history.h"
|
||||
@@ -136,16 +137,19 @@ Move MovePicker::get_next_move() {
|
||||
case PH_GOOD_CAPTURES:
|
||||
numOfMoves = generate_captures(pos, moves);
|
||||
score_captures();
|
||||
std::sort(moves, moves + numOfMoves);
|
||||
movesPicked = 0;
|
||||
break;
|
||||
|
||||
case PH_BAD_CAPTURES:
|
||||
// It's probably a good idea to use SEE move ordering here. FIXME
|
||||
movesPicked = 0;
|
||||
break;
|
||||
|
||||
case PH_NONCAPTURES:
|
||||
numOfMoves = generate_noncaptures(pos, moves);
|
||||
score_noncaptures();
|
||||
std::sort(moves, moves + numOfMoves);
|
||||
movesPicked = 0;
|
||||
break;
|
||||
|
||||
@@ -153,16 +157,19 @@ Move MovePicker::get_next_move() {
|
||||
assert(pos.is_check());
|
||||
numOfMoves = generate_evasions(pos, moves, pinned);
|
||||
score_evasions();
|
||||
std::sort(moves, moves + numOfMoves);
|
||||
movesPicked = 0;
|
||||
break;
|
||||
|
||||
case PH_QCAPTURES:
|
||||
numOfMoves = generate_captures(pos, moves);
|
||||
score_qcaptures();
|
||||
std::sort(moves, moves + numOfMoves);
|
||||
movesPicked = 0;
|
||||
break;
|
||||
|
||||
case PH_QCHECKS:
|
||||
// Perhaps we should order moves move here? FIXME
|
||||
numOfMoves = generate_non_capture_checks(pos, moves, dc);
|
||||
movesPicked = 0;
|
||||
break;
|
||||
@@ -299,26 +306,6 @@ void MovePicker::score_qcaptures() {
|
||||
}
|
||||
|
||||
|
||||
/// find_best_index() loops across the moves and returns index of
|
||||
/// the highest scored one.
|
||||
|
||||
int MovePicker::find_best_index() const {
|
||||
|
||||
assert(movesPicked < numOfMoves);
|
||||
|
||||
int bestIndex = movesPicked;
|
||||
int bestScore = moves[movesPicked].score;
|
||||
|
||||
for (int i = movesPicked + 1; i < numOfMoves; i++)
|
||||
if (moves[i].score > bestScore)
|
||||
{
|
||||
bestIndex = i;
|
||||
bestScore = moves[i].score;
|
||||
}
|
||||
return bestIndex;
|
||||
}
|
||||
|
||||
|
||||
/// MovePicker::pick_move_from_list() picks the move with the biggest score
|
||||
/// from a list of generated moves (moves[] or badCaptures[], depending on
|
||||
/// the current move generation phase). It takes care not to return the
|
||||
@@ -326,40 +313,17 @@ int MovePicker::find_best_index() const {
|
||||
|
||||
Move MovePicker::pick_move_from_list() {
|
||||
|
||||
int bestIndex;
|
||||
Move move;
|
||||
assert(movesPicked >= 0);
|
||||
assert(!pos.is_check() || PhaseTable[phaseIndex] == PH_EVASIONS || PhaseTable[phaseIndex] == PH_STOP);
|
||||
assert( pos.is_check() || PhaseTable[phaseIndex] != PH_EVASIONS);
|
||||
|
||||
switch (PhaseTable[phaseIndex]) {
|
||||
|
||||
case PH_GOOD_CAPTURES:
|
||||
assert(!pos.is_check());
|
||||
assert(movesPicked >= 0);
|
||||
|
||||
while (movesPicked < numOfMoves)
|
||||
{
|
||||
bestIndex = find_best_index();
|
||||
move = moves[bestIndex].move;
|
||||
moves[bestIndex] = moves[movesPicked++];
|
||||
if ( move != ttMove
|
||||
&& move != mateKiller
|
||||
&& pos.pl_move_is_legal(move, pinned))
|
||||
return move;
|
||||
}
|
||||
break;
|
||||
|
||||
case PH_NONCAPTURES:
|
||||
assert(!pos.is_check());
|
||||
assert(movesPicked >= 0);
|
||||
|
||||
while (movesPicked < numOfMoves)
|
||||
{
|
||||
// If this is a PV node or we have only picked a few moves, scan
|
||||
// the entire move list for the best move. If many moves have already
|
||||
// been searched and it is not a PV node, we are probably failing low
|
||||
// anyway, so we just pick the first move from the list.
|
||||
bestIndex = (pvNode || movesPicked < 12) ? find_best_index() : movesPicked;
|
||||
move = moves[bestIndex].move;
|
||||
moves[bestIndex] = moves[movesPicked++];
|
||||
Move move = moves[movesPicked++].move;
|
||||
if ( move != ttMove
|
||||
&& move != mateKiller
|
||||
&& pos.pl_move_is_legal(move, pinned))
|
||||
@@ -368,26 +332,15 @@ Move MovePicker::pick_move_from_list() {
|
||||
break;
|
||||
|
||||
case PH_EVASIONS:
|
||||
assert(pos.is_check());
|
||||
assert(movesPicked >= 0);
|
||||
if (movesPicked < numOfMoves)
|
||||
return moves[movesPicked++].move;
|
||||
|
||||
while (movesPicked < numOfMoves)
|
||||
{
|
||||
bestIndex = find_best_index();
|
||||
move = moves[bestIndex].move;
|
||||
moves[bestIndex] = moves[movesPicked++];
|
||||
return move;
|
||||
}
|
||||
break;
|
||||
|
||||
case PH_BAD_CAPTURES:
|
||||
assert(!pos.is_check());
|
||||
assert(movesPicked >= 0);
|
||||
// It's probably a good idea to use SEE move ordering here, instead
|
||||
// of just picking the first move. FIXME
|
||||
while (movesPicked < numOfBadCaptures)
|
||||
{
|
||||
move = badCaptures[movesPicked++].move;
|
||||
Move move = badCaptures[movesPicked++].move;
|
||||
if ( move != ttMove
|
||||
&& move != mateKiller
|
||||
&& pos.pl_move_is_legal(move, pinned))
|
||||
@@ -396,28 +349,11 @@ Move MovePicker::pick_move_from_list() {
|
||||
break;
|
||||
|
||||
case PH_QCAPTURES:
|
||||
assert(!pos.is_check());
|
||||
assert(movesPicked >= 0);
|
||||
while (movesPicked < numOfMoves)
|
||||
{
|
||||
bestIndex = (movesPicked < 4 ? find_best_index() : movesPicked);
|
||||
move = moves[bestIndex].move;
|
||||
moves[bestIndex] = moves[movesPicked++];
|
||||
// Maybe postpone the legality check until after futility pruning?
|
||||
if ( move != ttMove
|
||||
&& pos.pl_move_is_legal(move, pinned))
|
||||
return move;
|
||||
}
|
||||
break;
|
||||
|
||||
case PH_QCHECKS:
|
||||
assert(!pos.is_check());
|
||||
assert(movesPicked >= 0);
|
||||
// Perhaps we should do something better than just picking the first
|
||||
// move here? FIXME
|
||||
while (movesPicked < numOfMoves)
|
||||
{
|
||||
move = moves[movesPicked++].move;
|
||||
Move move = moves[movesPicked++].move;
|
||||
// Maybe postpone the legality check until after futility pruning?
|
||||
if ( move != ttMove
|
||||
&& pos.pl_move_is_legal(move, pinned))
|
||||
return move;
|
||||
|
||||
@@ -80,7 +80,6 @@ private:
|
||||
void score_evasions();
|
||||
void score_qcaptures();
|
||||
Move pick_move_from_list();
|
||||
int find_best_index() const;
|
||||
|
||||
const Position& pos;
|
||||
Move ttMove, mateKiller, killer1, killer2;
|
||||
|
||||
@@ -251,11 +251,13 @@ namespace {
|
||||
if (token == "name")
|
||||
{
|
||||
uip >> name;
|
||||
uip >> token;
|
||||
while (!uip.eof() && token != "value")
|
||||
while (!uip.eof())
|
||||
{
|
||||
name += (" " + token);
|
||||
uip >> token;
|
||||
if (token == "value")
|
||||
break;
|
||||
|
||||
name += (" " + token);
|
||||
}
|
||||
if (token == "value")
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user