#include "evaluate.h"
#include "history.h"
#include "misc.h"
+#include "move.h"
#include "movegen.h"
#include "movepick.h"
#include "lock.h"
-#include "san.h"
#include "search.h"
#include "timeman.h"
#include "thread.h"
void extract_pv_from_tt(Position& pos);
void insert_pv_in_tt(Position& pos);
- std::string pv_info_to_uci(const Position& pos, Value alpha, Value beta, int pvLine = 0);
+ std::string pv_info_to_uci(Position& pos, Value alpha, Value beta, int pvLine = 0);
int64_t nodes;
Value pv_score;
// Overload operator << for moves to make it easier to print moves in
// coordinate notation compatible with UCI protocol.
+ std::ostream& operator<<(std::ostream& os, Move m) {
- std::ostream& operator<<(std::ostream& os, Move m);
+ bool chess960 = (os.iword(0) != 0); // See set960()
+ return os << move_to_uci(m, chess960);
+ }
/// Adjustments
// Look for a book move, only during games, not tests
if (UseTimeManagement && Options["OwnBook"].value<bool>())
{
- if (Options["Book File"].value<std::string>() != OpeningBook.file_name())
+ if (Options["Book File"].value<std::string>() != OpeningBook.name())
OpeningBook.open(Options["Book File"].value<std::string>());
Move bookMove = OpeningBook.get_move(pos, Options["Best Book Move"].value<bool>());
// Step 1. Initialize node (polling is omitted at root)
ss->currentMove = ss->bestMove = MOVE_NONE;
+ (ss+2)->killers[0] = (ss+2)->killers[1] = (ss+2)->mateKiller = MOVE_NONE;
// Step 2. Check for aborted search (omitted at root)
// Step 3. Mate distance pruning (omitted at root)
void update_history(const Position& pos, Move move, Depth depth,
Move movesSearched[], int moveCount) {
Move m;
+ Value bonus = Value(int(depth) * int(depth));
- H.success(pos.piece_on(move_from(move)), move_to(move), depth);
+ H.update(pos.piece_on(move_from(move)), move_to(move), bonus);
for (int i = 0; i < moveCount - 1; i++)
{
assert(m != move);
if (!pos.move_is_capture_or_promotion(m))
- H.failure(pos.piece_on(move_from(m)), move_to(m), depth);
+ H.update(pos.piece_on(move_from(m)), move_to(m), -bonus);
}
}
&& after != VALUE_NONE
&& pos.captured_piece_type() == PIECE_TYPE_NONE
&& !move_is_special(m))
- H.set_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after));
+ H.update_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after));
}
// formatted according to UCI specification and eventually writes the info
// to a log file. It is called at each iteration or after a new pv is found.
- std::string RootMove::pv_info_to_uci(const Position& pos, Value alpha, Value beta, int pvLine) {
+ std::string RootMove::pv_info_to_uci(Position& pos, Value alpha, Value beta, int pvLine) {
std::stringstream s, l;
Move* m = pv;
}
}
- // Overload operator << to make it easier to print moves in coordinate notation
- // (g1f3, a7a8q, etc.). The only special case is castling moves, where we
- // print in the e1g1 notation in normal chess mode, and in e1h1 notation in
- // Chess960 mode.
-
- std::ostream& operator<<(std::ostream& os, Move m) {
-
- Square from = move_from(m);
- Square to = move_to(m);
- bool chess960 = (os.iword(0) != 0); // See set960()
-
- if (m == MOVE_NONE)
- return os << "(none)";
-
- if (m == MOVE_NULL)
- return os << "0000";
-
- if (move_is_short_castle(m) && !chess960)
- return os << (from == SQ_E1 ? "e1g1" : "e8g8");
-
- if (move_is_long_castle(m) && !chess960)
- return os << (from == SQ_E1 ? "e1c1" : "e8c8");
-
- os << square_to_string(from) << square_to_string(to);
-
- if (move_is_promotion(m))
- os << char(tolower(piece_type_to_char(move_promotion_piece(m))));
-
- return os;
- }
-
} // namespace