Compare commits

..

5 Commits

Author SHA1 Message Date
Marco Costalba
e87931bbfc Stockfish 1.3
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
2009-05-02 11:53:08 +01:00
Marco Costalba
aa5c375ca9 Fix a very old UCI option parsing bug
We currently fail on an option with a sapece in the name,
as example

setoption name Clear Hash

returns error message "Option Clear not found". This
patch fixes this off-by-one type bug.

Thanks to Joona for spotting this.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
2009-05-02 11:52:49 +01:00
Marco Costalba
cd1cc39b04 Nicely simplify MovePicker::pick_move_from_list
It is a positive fall back from previous patch.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
2009-05-02 10:08:10 +01:00
Marco Costalba
4e151f7e0d Sort moves just after scoring
Instead of a delayed selection sort so that the highest
score move is picked up from the list when needed, sort all
the moves up front just after score them.

Selection sort is O(n*n) while std::sort is O(n*log n), it
is true that delayed selection allows us to just pick the move
until a cut off occurs or up to a given limit (12), but with
an average of 30 non capture-moves delayed pick become slower
just after 5-6 moves and we now pick up to 12.

Profiling seem to prove this idea and movepick.cpp is now 10%
faster.

Also tests seem to confirm this:

After 700 games at 1+0: Mod vs Orig +178 -160 =362 +9 ELO

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
2009-05-02 10:07:46 +01:00
Marco Costalba
d13e4c16c2 Update polyglot.ini
Upadte to new parameters and parameters values.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
2009-04-30 15:16:35 +01:00
6 changed files with 30 additions and 97 deletions

View File

@@ -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

View File

@@ -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 = "";

View File

@@ -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

View File

@@ -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;
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;

View File

@@ -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;

View File

@@ -251,11 +251,13 @@ namespace {
if (token == "name")
{
uip >> name;
uip >> token;
while (!uip.eof() && token != "value")
while (!uip.eof())
{
name += (" " + token);
uip >> token;
uip >> token;
if (token == "value")
break;
name += (" " + token);
}
if (token == "value")
{