mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-21 09:37: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]
|
[PolyGlot]
|
||||||
|
|
||||||
EngineDir = .
|
EngineDir = .
|
||||||
EngineCommand = ./glaurung
|
EngineCommand = ./stockfish
|
||||||
|
|
||||||
Book = false
|
Book = false
|
||||||
BookFile = book.bin
|
BookFile = book.bin
|
||||||
|
|
||||||
Log = true
|
Log = true
|
||||||
LogFile = glaurung.log
|
LogFile = stockfish.log
|
||||||
|
|
||||||
Resign = true
|
Resign = true
|
||||||
ResignScore = 600
|
ResignScore = 600
|
||||||
@@ -34,8 +34,7 @@ King Safety Coefficient = 40
|
|||||||
King Safety X Intercept = 0
|
King Safety X Intercept = 0
|
||||||
King Safety Max Slope = 30
|
King Safety Max Slope = 30
|
||||||
King Safety Max Value = 500
|
King Safety Max Value = 500
|
||||||
Queen Contact Check Bonus = 4
|
Queen Contact Check Bonus = 3
|
||||||
Rook Contact Check Bonus = 2
|
|
||||||
Queen Check Bonus = 2
|
Queen Check Bonus = 2
|
||||||
Rook Check Bonus = 1
|
Rook Check Bonus = 1
|
||||||
Bishop 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 (PV nodes) = 14
|
||||||
Full Depth Moves (non-PV nodes) = 3
|
Full Depth Moves (non-PV nodes) = 3
|
||||||
Threat Depth = 5
|
Threat Depth = 5
|
||||||
Selective Plies = 7
|
|
||||||
Futility Pruning (Main Search) = true
|
Futility Pruning (Main Search) = true
|
||||||
Futility Pruning (Quiescence 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
|
Randomness = 0
|
||||||
Minimum Split Depth = 4
|
Minimum Split Depth = 4
|
||||||
Maximum Number of Threads per Split Point = 5
|
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
|
/// Version number. If this is left empty, the current date (in the format
|
||||||
/// YYMMDD) is used as a version number.
|
/// 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 AppName = "Stockfish";
|
||||||
static const string AppTag = "";
|
static const string AppTag = "";
|
||||||
|
|
||||||
|
|||||||
@@ -62,6 +62,9 @@ struct MoveStack {
|
|||||||
int score;
|
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
|
//// Inline functions
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
//// Includes
|
//// Includes
|
||||||
////
|
////
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
#include "history.h"
|
#include "history.h"
|
||||||
@@ -136,16 +137,19 @@ Move MovePicker::get_next_move() {
|
|||||||
case PH_GOOD_CAPTURES:
|
case PH_GOOD_CAPTURES:
|
||||||
numOfMoves = generate_captures(pos, moves);
|
numOfMoves = generate_captures(pos, moves);
|
||||||
score_captures();
|
score_captures();
|
||||||
|
std::sort(moves, moves + numOfMoves);
|
||||||
movesPicked = 0;
|
movesPicked = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PH_BAD_CAPTURES:
|
case PH_BAD_CAPTURES:
|
||||||
|
// It's probably a good idea to use SEE move ordering here. FIXME
|
||||||
movesPicked = 0;
|
movesPicked = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PH_NONCAPTURES:
|
case PH_NONCAPTURES:
|
||||||
numOfMoves = generate_noncaptures(pos, moves);
|
numOfMoves = generate_noncaptures(pos, moves);
|
||||||
score_noncaptures();
|
score_noncaptures();
|
||||||
|
std::sort(moves, moves + numOfMoves);
|
||||||
movesPicked = 0;
|
movesPicked = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -153,16 +157,19 @@ Move MovePicker::get_next_move() {
|
|||||||
assert(pos.is_check());
|
assert(pos.is_check());
|
||||||
numOfMoves = generate_evasions(pos, moves, pinned);
|
numOfMoves = generate_evasions(pos, moves, pinned);
|
||||||
score_evasions();
|
score_evasions();
|
||||||
|
std::sort(moves, moves + numOfMoves);
|
||||||
movesPicked = 0;
|
movesPicked = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PH_QCAPTURES:
|
case PH_QCAPTURES:
|
||||||
numOfMoves = generate_captures(pos, moves);
|
numOfMoves = generate_captures(pos, moves);
|
||||||
score_qcaptures();
|
score_qcaptures();
|
||||||
|
std::sort(moves, moves + numOfMoves);
|
||||||
movesPicked = 0;
|
movesPicked = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PH_QCHECKS:
|
case PH_QCHECKS:
|
||||||
|
// Perhaps we should order moves move here? FIXME
|
||||||
numOfMoves = generate_non_capture_checks(pos, moves, dc);
|
numOfMoves = generate_non_capture_checks(pos, moves, dc);
|
||||||
movesPicked = 0;
|
movesPicked = 0;
|
||||||
break;
|
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
|
/// MovePicker::pick_move_from_list() picks the move with the biggest score
|
||||||
/// from a list of generated moves (moves[] or badCaptures[], depending on
|
/// from a list of generated moves (moves[] or badCaptures[], depending on
|
||||||
/// the current move generation phase). It takes care not to return the
|
/// 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() {
|
Move MovePicker::pick_move_from_list() {
|
||||||
|
|
||||||
int bestIndex;
|
assert(movesPicked >= 0);
|
||||||
Move move;
|
assert(!pos.is_check() || PhaseTable[phaseIndex] == PH_EVASIONS || PhaseTable[phaseIndex] == PH_STOP);
|
||||||
|
assert( pos.is_check() || PhaseTable[phaseIndex] != PH_EVASIONS);
|
||||||
|
|
||||||
switch (PhaseTable[phaseIndex]) {
|
switch (PhaseTable[phaseIndex]) {
|
||||||
|
|
||||||
case PH_GOOD_CAPTURES:
|
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:
|
case PH_NONCAPTURES:
|
||||||
assert(!pos.is_check());
|
|
||||||
assert(movesPicked >= 0);
|
|
||||||
|
|
||||||
while (movesPicked < numOfMoves)
|
while (movesPicked < numOfMoves)
|
||||||
{
|
{
|
||||||
// If this is a PV node or we have only picked a few moves, scan
|
Move move = moves[movesPicked++].move;
|
||||||
// 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++];
|
|
||||||
if ( move != ttMove
|
if ( move != ttMove
|
||||||
&& move != mateKiller
|
&& move != mateKiller
|
||||||
&& pos.pl_move_is_legal(move, pinned))
|
&& pos.pl_move_is_legal(move, pinned))
|
||||||
@@ -368,26 +332,15 @@ Move MovePicker::pick_move_from_list() {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PH_EVASIONS:
|
case PH_EVASIONS:
|
||||||
assert(pos.is_check());
|
if (movesPicked < numOfMoves)
|
||||||
assert(movesPicked >= 0);
|
return moves[movesPicked++].move;
|
||||||
|
|
||||||
while (movesPicked < numOfMoves)
|
break;
|
||||||
{
|
|
||||||
bestIndex = find_best_index();
|
|
||||||
move = moves[bestIndex].move;
|
|
||||||
moves[bestIndex] = moves[movesPicked++];
|
|
||||||
return move;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PH_BAD_CAPTURES:
|
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)
|
while (movesPicked < numOfBadCaptures)
|
||||||
{
|
{
|
||||||
move = badCaptures[movesPicked++].move;
|
Move move = badCaptures[movesPicked++].move;
|
||||||
if ( move != ttMove
|
if ( move != ttMove
|
||||||
&& move != mateKiller
|
&& move != mateKiller
|
||||||
&& pos.pl_move_is_legal(move, pinned))
|
&& pos.pl_move_is_legal(move, pinned))
|
||||||
@@ -396,28 +349,11 @@ Move MovePicker::pick_move_from_list() {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PH_QCAPTURES:
|
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:
|
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)
|
while (movesPicked < numOfMoves)
|
||||||
{
|
{
|
||||||
move = moves[movesPicked++].move;
|
Move move = moves[movesPicked++].move;
|
||||||
|
// Maybe postpone the legality check until after futility pruning?
|
||||||
if ( move != ttMove
|
if ( move != ttMove
|
||||||
&& pos.pl_move_is_legal(move, pinned))
|
&& pos.pl_move_is_legal(move, pinned))
|
||||||
return move;
|
return move;
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ private:
|
|||||||
void score_evasions();
|
void score_evasions();
|
||||||
void score_qcaptures();
|
void score_qcaptures();
|
||||||
Move pick_move_from_list();
|
Move pick_move_from_list();
|
||||||
int find_best_index() const;
|
|
||||||
|
|
||||||
const Position& pos;
|
const Position& pos;
|
||||||
Move ttMove, mateKiller, killer1, killer2;
|
Move ttMove, mateKiller, killer1, killer2;
|
||||||
|
|||||||
10
src/uci.cpp
10
src/uci.cpp
@@ -251,11 +251,13 @@ namespace {
|
|||||||
if (token == "name")
|
if (token == "name")
|
||||||
{
|
{
|
||||||
uip >> name;
|
uip >> name;
|
||||||
uip >> token;
|
while (!uip.eof())
|
||||||
while (!uip.eof() && token != "value")
|
|
||||||
{
|
{
|
||||||
name += (" " + token);
|
uip >> token;
|
||||||
uip >> token;
|
if (token == "value")
|
||||||
|
break;
|
||||||
|
|
||||||
|
name += (" " + token);
|
||||||
}
|
}
|
||||||
if (token == "value")
|
if (token == "value")
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user