Minimax check(mate) detection in my minimax function I have a first few lines looking something like this:

children = board.get_all_possible_moves(board)

if depth = 0 or board.is_check_mate or board.is_draw:
    return None, evaluation(board)


The problem is that it takes time to calculate the children one "extra time" if the depth is 0 and the position is not draw or check mate. However, I want to know if the board state at depth 0 is check mate or draw. 

As of now I detect check mate and draw by the following logic:

if not possible_moves:
    if board.is_check:
        board.is_check_mate = True
    else:
        board.is_draw = True


Is there a better way of finding whether a posisiton is check mate or not? Without having to calculate the opponents possible moves first, to save time in the minimax recursive function. Thank you in advance.
Your approach is correct. Stockfish does it as well.


  https://github.com/official-stockfish/Stockfish/blob/master/src/search.cpp


if (rootMoves.empty())
{
  rootMoves.emplace_back(MOVE_NONE);
  sync_cout &lt;&lt; "info depth 0 score "
            &lt;&lt; UCI::value(rootPos.checkers() ? -VALUE_MATE : VALUE_DRAW)
            &lt;&lt; sync_endl;
 }


There shouldn't be much penalty in performance, because:


You will always need to generate candidate moves anyway
Your code should maintain a bitboard (or other data structure) for the pieces checking the king. You will always need this information in your evaluation.


Consequently, what you're doing is just checking information that you already have.