Skip to content

Commit

Permalink
技巧2とApery形式の評価値を混ぜ合わせて評価値を算出
Browse files Browse the repository at this point in the history
  • Loading branch information
tttak committed May 16, 2017
1 parent 4d33d94 commit 765717b
Show file tree
Hide file tree
Showing 9 changed files with 1,029 additions and 5 deletions.
619 changes: 616 additions & 3 deletions src/evaluation.cc

Large diffs are not rendered by default.

173 changes: 173 additions & 0 deletions src/evaluation.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,84 @@ constexpr int32_t kFvScale = 1 << 16;
*/
typedef Pack<int32_t, 4> PackedScore;

/**
* Aperyの評価値の詳細を保存するためのクラスです.
*/
struct AperyEvalDetail {

AperyEvalDetail() {
Clear();
}

void Clear() {
std::memset(this, 0, sizeof(*this));
}

AperyEvalDetail operator+(const AperyEvalDetail& rhs) const {
return AperyEvalDetail(*this) += rhs;
}

AperyEvalDetail operator-(const AperyEvalDetail& rhs) const {
return AperyEvalDetail(*this) -= rhs;
}

AperyEvalDetail& operator+=(const AperyEvalDetail& rhs) {
material += rhs.material;
kk_board += rhs.kk_board;
kk_turn += rhs.kk_turn;
kkp_board += rhs.kkp_board;
kkp_turn += rhs.kkp_turn;
kpp_board[kBlack] += rhs.kpp_board[kBlack];
kpp_turn [kBlack] += rhs.kpp_turn [kBlack];
kpp_board[kWhite] += rhs.kpp_board[kWhite];
kpp_turn [kWhite] += rhs.kpp_turn [kWhite];

return *this;
}

AperyEvalDetail& operator-=(const AperyEvalDetail& rhs) {
material -= rhs.material;
kk_board -= rhs.kk_board;
kk_turn -= rhs.kk_turn;
kkp_board -= rhs.kkp_board;
kkp_turn -= rhs.kkp_turn;
kpp_board[kBlack] -= rhs.kpp_board[kBlack];
kpp_turn [kBlack] -= rhs.kpp_turn [kBlack];
kpp_board[kWhite] -= rhs.kpp_board[kWhite];
kpp_turn [kWhite] -= rhs.kpp_turn [kWhite];

return *this;
}

/**
* Aperyの評価値を計算します.
* @param side_to_move 手番
* @return Aperyの評価値(手番側から見た評価値)
*/
int32_t Sum(const Color side_to_move) const;

/**
* Aperyの評価値の情報を標準出力へ出力します.
* @param side_to_move 手番
*/
void Print(const Color side_to_move) const;

/** 駒割りに関する評価値. */
int32_t material;

/** KK(King-King)に関する評価値(駒の位置、手番). */
int32_t kk_board;
int32_t kk_turn;

/** KKP(King-King-Piece)に関する評価値(駒の位置、手番). */
int32_t kkp_board;
int32_t kkp_turn;

/** KPP(King-Piece-Piece)に関する評価値(駒の位置、手番). */
int32_t kpp_board[2];
int32_t kpp_turn [2];
};

/**
* 評価値の詳細を保存するためのクラスです.
* このように評価値の項目を細かく分類しておくと、必要な項目だけ差分計算することができるという利点があります。
Expand All @@ -86,6 +164,7 @@ struct EvalDetail {
two_pieces += rhs.two_pieces;
king_safety += rhs.king_safety;
sliders += rhs.sliders;
apery_eval_detail += rhs.apery_eval_detail;
return *this;
}

Expand All @@ -96,6 +175,7 @@ struct EvalDetail {
two_pieces -= rhs.two_pieces;
king_safety -= rhs.king_safety;
sliders -= rhs.sliders;
apery_eval_detail -= rhs.apery_eval_detail;
return *this;
}

Expand All @@ -107,6 +187,12 @@ struct EvalDetail {
*/
Score ComputeFinalScore(Color side_to_move, double* progress_output = nullptr) const;

/**
* 評価値の詳細情報を標準出力へ出力します.
* @param side_to_move 手番
*/
void Print(Color side_to_move) const;

/** KP(King-Piece)に関する評価値. */
ArrayMap<PackedScore, Color> kp{PackedScore(0), PackedScore(0)};

Expand All @@ -121,6 +207,9 @@ struct EvalDetail {

/** 飛び駒に関する評価値. */
PackedScore sliders{0};

/** Aperyの評価値. */
AperyEvalDetail apery_eval_detail;
};

/**
Expand Down Expand Up @@ -164,6 +253,12 @@ class Evaluation {
const PsqControlList& previous_list,
const PsqControlList& current_list,
PsqList* psq_list);

/**
* 評価値の詳細情報を標準出力へ出力します.
* @param pos 評価値を計算したい局面
*/
static void Print(const Position& pos);
};

/**
Expand Down Expand Up @@ -232,4 +327,82 @@ struct EvalParameters {
*/
extern std::unique_ptr<EvalParameters> g_eval_params;


/**
* Aperyの評価値関連
*/
namespace AperyEval {

/** KP、KPP、KKPのスケール */
const int FV_SCALE = 32;

/** Aperyの駒割り */
enum {
PawnValue = 90,
LanceValue = 315,
KnightValue = 405,
SilverValue = 495,
GoldValue = 540,
BishopValue = 855,
RookValue = 990,
ProPawnValue = 540,
ProLanceValue = 540,
ProKnightValue = 540,
ProSilverValue = 540,
HorseValue = 945,
DragonValue = 1395,
KingValue = 15000,
};

/** 駒の位置、手番 */
enum {
kBoard
, kTurn
};

/**
* 評価関数ファイルを読み込みます.
*/
void LoadEval();

/**
* すべての評価項目について、評価値を計算します(全計算).
* @param pos 評価値を計算したい局面
* @param psq_list 駒の位置のインデックスのリスト
* @return 評価項目ごとの評価値
*/
AperyEvalDetail ComputeEval(const Position& pos, const PsqList& list);

/**
* 駒割りを全計算します.
* @param pos 評価値を計算したい局面
* @return 駒割りの評価値
*/
Score EvaluateMaterial(const Position& pos);

/**
* 駒割りを差分計算します.
* @param pos 評価値を計算したい局面
* @return 駒割りの評価値の差分
*/
Score EvaluateDifferenceOfMaterial(const Position& pos);

/**
* Aperyの生の評価値を1歩=100点(centipawn)の評価値に変換します.
* @param value 生の評価値
* @return 1歩=100点(centipawn)の評価値
*/
double ToCentiPawn(const int32_t value);

/**
* Aperyの生の評価値を1歩=100点(centipawn)の評価値(手番側から見た評価値)に変換します.
* @param value 生の評価値
* @param side_to_move 手番
* @return 1歩=100点(centipawn)の評価値(手番側から見た評価値)
*/
double ToCentiPawn(const int32_t value, const Color side_to_move);


} // namespace

#endif /* EVALUATION_H_ */
3 changes: 3 additions & 0 deletions src/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ int main(int argc, char **argv) {
Material::Init();
MoveProbability::Init();

// Apery評価関数用のPsqIndexへの変換テーブルを初期化する
InitAperyPsqIndexArray();

#ifdef UNIT_TEST
// Google Test によるユニットテストを行う
std::printf("Running main() from main.cc\n");
Expand Down
17 changes: 17 additions & 0 deletions src/node.cc
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,23 @@ Score Node::Evaluate(double* const progress) {
}
#endif

// デバッグ用
#if 0
if (score != Evaluation::Evaluate(*this)) {
printf("score != Evaluation::Evaluate(*this)\n");
printf("score=%d\n", score);
printf("Evaluation::Evaluate(*this)=%d\n", Evaluation::Evaluate(*this));
printf("(*this).last_move()=%s\n", (*this).last_move().ToSfen().c_str());
printf("(*this).last_move().piece()=%s\n", (*this).last_move().piece().ToSfen().c_str());
printf("(*this).last_move().is_drop()=%d\n", (*this).last_move().is_drop());
printf("(*this).last_move().is_capture()=%d\n", (*this).last_move().is_capture());
printf("(*this).last_move().captured_piece()=%s\n", (*this).last_move().captured_piece().ToSfen().c_str());
(*this).Print();

exit(EXIT_FAILURE);
}
#endif

return score;
}

Expand Down
Loading

0 comments on commit 765717b

Please sign in to comment.