Ejemplo n.º 1
0
bool lomonosov_root_probe(Position& pos, Search::RootMoves& rootMoves, bool *from_dtm) {
	if (!lomonosov_loaded)
		return false;
	int value;
	*from_dtm = false;

	if (!lomonosov_tbprobe(pos, 0, &value, false, 0)) return false;

	StateInfo st;
	CheckInfo ci(pos);
	bool success = false;
	bool from_dtm_moves = true;

	// Probe each move.
	for (size_t i = 0; i < rootMoves.size(); i++) {
		Move move = rootMoves[i].pv[0];
		pos.do_move(move, st, pos.gives_check(move, ci));
		int v = 0;
		bool from_dtm_cur = false;
		success = lomonosov_tbprobe(pos, 1, &v, false, 0, &from_dtm_cur);
		pos.undo_move(move);
		if (!success) return false;
		from_dtm_moves &= from_dtm_cur;
		rootMoves[i].score = (Value)v;
	}

	size_t j = 0;
	if (value > 0) {
		int best = 0;
		if (from_dtm_moves) {
			for (size_t i = 0; i < rootMoves.size(); i++) {
				int v = rootMoves[i].score;
				if (v < 0 && (v > best || best == 0))
					best = v;
			}
		}
		for (size_t i = 0; i < rootMoves.size(); i++) {
			int v = rootMoves[i].score;
			if (from_dtm_moves) {
				if (v == best) {
					rootMoves[j++] = rootMoves[i];
					rootMoves[0].score = VALUE_MATE - value;
					*from_dtm = true;
					break;
				}
			} else if (v < 0) {
				rootMoves[j++] = rootMoves[i];
			}
		}
	} else if (value < 0) {
		if (from_dtm_moves) {
			int best = 0;
			for (size_t i = 0; i < rootMoves.size(); i++) {
				int v = rootMoves[i].score;
				if (v > best)
					best = v;
			}
			for (size_t i = 0; i < rootMoves.size(); i++) {
				if (rootMoves[i].score == best)
					rootMoves[j++] = rootMoves[i];
			}
		} else
			j = rootMoves.size();
	} else {
		for (size_t i = 0; i < rootMoves.size(); i++) {
			if (rootMoves[i].score == 0)
				rootMoves[j++] = rootMoves[i];
		}
	}
	rootMoves.resize(j, Search::RootMove(MOVE_NONE));

	return true;
}