Value evaluate(const Position &pos, SearchStack *ss) { Value score; Move last_move = (ss - 1)->current_move; if ((ss - 1)->evaluated && !(move_piece_type(last_move) == kKing && move_is_capture(last_move)) && is_ok(last_move)) { calc_difference(pos, last_move, ss); score = ss->black_kpp + ss->white_kpp + ss->kkp + ss->material; assert(calc_full(pos, ss) == score); ss->evaluated = true; score = pos.side_to_move() == kWhite ? -score : score; score /= kFvScale; assert(score > -kValueInfinite && score < kValueInfinite); } else { score = calc_full(pos, ss); ss->evaluated = true; score = pos.side_to_move() == kWhite ? -score : score; score /= kFvScale; assert(score > -kValueInfinite && score < kValueInfinite); } return score + kTempo; }
Value Position::evaluate(const Color us, SearchStack* ss) { int score = 0; #if defined(EVAL_DIFF) // null move if (ss->staticEvalRaw != INT_MAX) { score = int(ss->staticEvalRaw); } else if (calc_difference(ss)) { score = int(ss->staticEvalRaw); //ehash_store(st->key, HAND_B, score); } else #endif { // 普通に評価値を計算 score = evaluate_raw_body(); #if defined(EVAL_DIFF) ss->staticEvalRaw = Value(score); #endif } #if defined(_DEBUG) if (score != evaluate_raw_correct()) { std::cout << "Evaluate Value Error !!!" << std::endl; std::cout << to_fen() << std::endl; exit(-1); } #endif score /= FV_SCALE; score += MATERIAL; score = (us == BLACK) ? score : -score; return Value(score); }