20#include <unordered_map>
29namespace minimaxutils {
33 alpha = max(alpha, cur_eval);
43 bool is_prunable = (beta <= alpha);
55 bool is_prunable = (beta <= alpha);
67template <
typename ConcreteSpaceInfoProv
ider,
typename ConcretePieceValueProv
ider>
71 ConcreteSpaceInfoProvider &game_board,
72 ConcretePieceValueProvider &game_position_points
81 .GetValueOfPieceAtPosition(cur_player, piece_type, move.
end);
87 auto position_value_delta = end_points - start_points;
102 return ScoredMove{move, (position_value_delta + capture_val)};
109 vector<ScoredMove> rated_moves;
110 for (
auto cur_move : cur_player_moves.
moves) {
111 auto cur_rated_move =
RateMove(cur_move, cur_player);
112 rated_moves.emplace_back(cur_rated_move);
118 return move_a.score > move_b.score;
133 typename ConcreteSpaceInfoProvider,
134 typename ConcreteBoardStateCoordinator,
135 typename ConcretePieceValueProvider>
137 ConcreteSpaceInfoProvider,
138 ConcreteBoardStateCoordinator,
139 ConcretePieceValueProvider>> {
156 ConcreteSpaceInfoProvider &game_board,
157 uint32_t zkey_seed = std::random_device{}(),
158 const ConcretePieceValueProvider &game_position_points =
159 ConcretePieceValueProvider()
176 ConcreteSpaceInfoProvider &game_board,
177 const ConcretePieceValueProvider &game_position_points,
198 return final_selected_move;
208 return 8 *
sizeof(
typename ConcreteBoardStateCoordinator::ZobristKey_t);
224 &ConcreteBoardStateCoordinator::UpdateBoardState,
226 std::placeholders::_1
234 return first_search_summary.selected_move();
241 for (
auto space :
game_board_.GetAllSpacesOccupiedBy(color)) {
246 return pre_attack_total;
256 return first_search_summary;
267 return second_search_summary;
299 return EqualScoreMoves{numeric_limits<Points_t>::min(), empty_best_moves};
302 return EqualScoreMoves{numeric_limits<Points_t>::max(), empty_best_moves};
332 (cur_player_points - opponent_points),
333 empty_move_collection
337 (opponent_points - cur_player_points),
338 empty_move_collection
363 return cur_eval > previous_best_eval;
365 return cur_eval < previous_best_eval;
376 if (cur_eval == previous_best_eval) {
378 }
else if (
IsImprovement(cur_eval, previous_best_eval, cur_player)) {
379 previous_best_eval = cur_eval;
380 best_moves.
moves.clear();
427 bool use_transposition_table
429 auto executed_move =
game_board_.ExecuteMove(move);
438 use_transposition_table
447 return numeric_limits<Points_t>::min();
449 return numeric_limits<Points_t>::max();
474 bool use_transposition_table
478 auto ranked_moves =
move_sorter_.GenerateRankedMoveList(cur_player, allowed_moves);
480 for (
auto rated_move : ranked_moves) {
489 use_transposition_table
492 UpdateBestMoves(cur_player, rated_move.move, best_moves, cur_eval, max_eval);
496 if (
IsPrunable(alpha, beta, result_type, cur_player)) {
517 bool use_transposition_table
523 if (use_transposition_table) {
524 auto tr_table_search_result =
526 if (tr_table_search_result.found() &&
527 tr_table_search_result.IsConsistentWith(allowed_moves)) {
531 tr_table_search_result,
538 if (allowed_moves.
moves.size() == 0) {
557 use_transposition_table
564 bool use_transposition_table =
true
566 auto search_start = std::chrono::high_resolution_clock::now();
570 numeric_limits<Points_t>::min(),
571 numeric_limits<Points_t>::max(),
574 use_transposition_table
576 auto search_end = std::chrono::high_resolution_clock::now();
577 std::chrono::duration<double, std::nano> search_time = search_end - search_start;
578 search_summary.
set_time(search_time);
580 return minimax_result;
586 bool use_transposition_table =
true
588 auto minimax_result =
589 RunTimedMinimax(allowed_moves, search_summary, use_transposition_table);
590 auto selected_move = minimax_result.move_collection().SelectRandom();
598template <
typename ConcreteSpaceInfoProv
ider>
600 :
public MoveEvaluator<RandomMoveEvaluator<ConcreteSpaceInfoProvider>> {
604 ConcreteSpaceInfoProvider &game_board
610 auto selected_move_index =
612 return allowed_moves.
moves[selected_move_index];
Constants, typedefs, and simple structs used by gameboard::GameBoard.
Definition of BoardStateCoordinator.
CRTP interface with a method for selecting a gameboard::Move (concrete examples = moveselection::Mini...
Holds a gameboard::MoveCollection in which all gameboard::Move have the same value (as perceived by a...
Implements MoveEvaluator interface, and selects move::Move using Minimax algorithm; uses SpaceInfoPro...
void initialize_hash_calculator()
EqualScoreMoves MinimaxRecursive(const MoveCollection &allowed_moves, DepthType search_depth, Points_t alpha, Points_t beta, PieceColor cur_player, SearchSummary &search_summary, bool use_transposition_table)
ConcreteSpaceInfoProvider & game_board_
ConcretePieceValueProvider game_position_points_
const uint32_t zkeys_seed()
std::atomic< bool > game_over_
Points_t InitializedBestEval(PieceColor cur_player)
SearchSummary & RunFirstSearch(const MoveCollection &allowed_moves)
ConcreteBoardStateCoordinator hash_calculator_
void UpdateBestMoves(PieceColor cur_player, Move move, MoveCollection &best_moves, Points_t cur_eval, Points_t &previous_best_eval)
Points_t GetPlayerTotal(PieceColor color)
const moveselection::SearchSummaries & search_summaries()
moveselection::SearchSummaries search_summaries_
EqualScoreMoves HandleLeaf(PieceColor cur_player, SearchSummary &search_summary, MinimaxResultType &result_type, DepthType search_depth)
void UpdatePruningParam(Points_t &alpha, Points_t &beta, Points_t cur_eval, PieceColor cur_player)
EqualScoreMoves HandleInternalNode(PieceColor cur_player, const MoveCollection &allowed_moves, DepthType &search_depth, Points_t &alpha, Points_t &beta, MinimaxResultType result_type, SearchSummary &search_summary, bool use_transposition_table)
const std::string board_state_hex_str()
void IncrementNumMoveSelections()
EqualScoreMoves FinalizeNodeResult(MinimaxResultType &result_type, Points_t best_eval, MoveCollection best_moves, DepthType search_depth, SearchSummary &search_summary)
SearchSummary & RunSecondSearch(const MoveCollection &allowed_moves)
void GetMinimaxMoveAndStats(const MoveCollection &allowed_moves, SearchSummary &search_summary, bool use_transposition_table=true)
EqualScoreMoves HandleEndOfGame(PieceColor cur_player, SearchSummary &search_summary, MinimaxResultType &result_type, DepthType search_depth)
bool IsImprovement(Points_t cur_eval, Points_t previous_best_eval, PieceColor cur_player)
EqualScoreMoves EvaluateNonWinLeaf(PieceColor cur_player, MinimaxResultType &result_type)
Move ImplementSelectMove(MoveCollection &allowed_moves)
MinimaxMoveEvaluator(PieceColor evaluating_player, DepthType search_depth, ConcreteSpaceInfoProvider &game_board, const ConcretePieceValueProvider &game_position_points, ConcreteBoardStateCoordinator &hash_calculator, PreSearchMoveSorter< ConcreteSpaceInfoProvider, ConcretePieceValueProvider > &move_sorter)
const ConcreteBoardStateCoordinator & hash_calculator() const
PieceColor evaluating_player_
MinimaxMoveEvaluator(PieceColor evaluating_player, DepthType search_depth, ConcreteSpaceInfoProvider &game_board, uint32_t zkey_seed=std::random_device{}(), const ConcretePieceValueProvider &game_position_points=ConcretePieceValueProvider())
EqualScoreMoves HandleTrTableHit(SearchSummary &search_summary, MinimaxResultType &result_type, TranspositionTableSearchResult &tr_table_search_result, DepthType search_depth)
EqualScoreMoves RunTimedMinimax(const MoveCollection &allowed_moves, SearchSummary &search_summary, bool use_transposition_table=true)
Points_t RecursivelyVisitNodes(Move move, PieceColor cur_player, const MoveCollection &allowed_moves, DepthType search_depth, Points_t alpha, Points_t beta, SearchSummary &search_summary, bool use_transposition_table)
PreSearchMoveSorter< ConcreteSpaceInfoProvider, ConcretePieceValueProvider > move_sorter_
EqualScoreMoves EvaluateEndOfGameLeaf(PieceColor cur_player, MinimaxResultType &result_type)
Move SelectValidMove(const MoveCollection &allowed_moves)
MoveCountType num_move_selections_
bool IsPrunable(Points_t &alpha, Points_t &beta, MinimaxResultType &result_type, PieceColor cur_player)
Sorts moves based on points changed induce by single move; used by MinimaxMoveEvaluator for pre-sorti...
PreSearchMoveSorter(ConcreteSpaceInfoProvider &game_board, ConcretePieceValueProvider &game_position_points)
ConcreteSpaceInfoProvider & game_board_
ConcretePieceValueProvider & game_position_points_
std::vector< ScoredMove > GenerateRankedMoveList(PieceColor cur_player, const MoveCollection &cur_player_moves)
ScoredMove RateMove(Move move, PieceColor cur_player)
Implements gameboard::MoveEvaluator interface.
Move ImplementSelectMove(MoveCollection &allowed_moves)
RandomMoveEvaluator(PieceColor evaluating_player, ConcreteSpaceInfoProvider &game_board)
PieceColor evaluating_player_
ConcreteSpaceInfoProvider & game_board_
Stores data collected during a single call to moveselection::MinimaxMoveEvaluator....
void set_time(std::chrono::duration< double, std::nano > search_time)
void RecordNodeInfo(MinimaxResultType result_type, DepthType search_depth, const EqualScoreMoves &equal_score_moves)
void RecordTrTableHit(TranspositionTableSearchResult &tr_table_search_result, DepthType remaining_search_depth)
void set_tr_table_size_final(size_t tr_table_size_final)
void SetSelectedMove(Move selected_move)
Container for storing a moveselection::MinimaxCalcResult retrieved by a call to boardstate::SingleZob...
EqualScoreMoves score_and_moves()
Data structs used by moveselection::MinimaxEvaluator.
Definition of MoveEvaluator interface.
Tracking piece positions and determining legal moves.
PieceColor opponent_of(PieceColor color)
bool IsPrunableForEvaluator(Points_t &alpha, Points_t &beta, MinimaxResultType &result_type)
void UpdateAlpha(Points_t &alpha, Points_t cur_eval)
bool IsPrunableForEvaluatorOpponent(Points_t &alpha, Points_t &beta, MinimaxResultType &result_type)
void UpdateBeta(Points_t &beta, Points_t cur_eval)
bool ValidateMove(SearchSummary &search_summary, const MoveCollection &allowed_moves)
Selecting a move to execute.
T random(T range_from, T range_to)
Definition of PieceValueProvider CRTP interface.
Definition of SpaceInfoProvider CRTP interface.
A container for multiple gameboard::Move objects.
A gameboard::BoardSpace pair (start and end).
gameboard::BoardSpace end
gameboard::BoardSpace start
A gameboard::Move, and an associated score calculated by a MoveEvaluator.
Stores a moveselection::SearchSummary for each moveselection::MinimaxMoveEvaluator....
SearchSummary & NewFirstSearch(DepthType search_depth, size_t tr_table_size_initial)
SearchSummary & NewExtraSearch(DepthType search_depth, MoveCountType search_number, size_t tr_table_size_current)
Defiition of miscellaneous free functions (and implementation of those that are templates).