#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;
// operator<<() that will use it to properly format castling moves.
enum set960 {};
- std::ostream& operator<< (std::ostream& os, const set960& m) {
+ std::ostream& operator<< (std::ostream& os, const set960& f) {
- os.iword(0) = int(m);
+ os.iword(0) = int(f);
return os;
}
+ // 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) {
+
+ bool chess960 = (os.iword(0) != 0); // See set960()
+ return os << move_to_uci(m, chess960);
+ }
+
+
/// Adjustments
// Step 6. Razoring
bool connected_threat(const Position& pos, Move m, Move threat);
Value refine_eval(const TTEntry* tte, Value defaultEval, int ply);
void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount);
- void update_killers(Move m, SearchStack* ss);
+ void update_killers(Move m, Move killers[]);
void update_gains(const Position& pos, Move move, Value before, Value after);
int current_search_time();
int64_t sum = 0;
// Generate all legal moves
- MoveStack* last = generate_moves(pos, mlist);
+ MoveStack* last = generate<MV_LEGAL>(pos, mlist);
// If we are at the last ply we don't need to do and undo
// the moves, just to count them.
if (!pos.move_is_capture_or_promotion(move))
{
update_history(pos, move, depth, movesSearched, moveCount);
- update_killers(move, ss);
+ update_killers(move, ss->killers);
}
// Inform GUI that PV has changed
&& !pos.move_is_capture_or_promotion(move))
{
update_history(pos, move, depth, movesSearched, moveCount);
- update_killers(move, ss);
+ update_killers(move, ss->killers);
}
}
// update_killers() add a good move that produced a beta-cutoff
// among the killer moves of that ply.
- void update_killers(Move m, SearchStack* ss) {
+ void update_killers(Move m, Move killers[]) {
- if (m == ss->killers[0])
+ if (m == killers[0])
return;
- ss->killers[1] = ss->killers[0];
- ss->killers[0] = m;
+ killers[1] = killers[0];
+ killers[0] = m;
}
int t = current_search_time();
// Poll for input
- if (data_available())
+ if (input_available())
{
// We are line oriented, don't read single chars
std::string command;
// 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;
ss[0].eval = ss[0].evalMargin = VALUE_NONE;
// Generate all legal moves
- MoveStack* last = generate_moves(pos, mlist);
+ MoveStack* last = generate<MV_LEGAL>(pos, mlist);
// Add each move to the RootMoveList's vector
for (MoveStack* cur = mlist; cur != last; cur++)