Skip to content

Instantly share code, notes, and snippets.

@ohga
Created July 29, 2017 09:41
Show Gist options
  • Save ohga/63aeeefd449a7a2b0eb034b55883681c to your computer and use it in GitHub Desktop.
Save ohga/63aeeefd449a7a2b0eb034b55883681c to your computer and use it in GitHub Desktop.
diff --git a/source/extra/test_cmd.cpp b/source/extra/test_cmd.cpp
index 452493c..d3991aa 100644
--- a/source/extra/test_cmd.cpp
+++ b/source/extra/test_cmd.cpp
@@ -1572,6 +1572,159 @@ void eval_merge(istringstream& is)
cout << "..done" << endl;
}
+void eval_merge2(istringstream& is)
+{
+ string dir1, dir2, opt;
+ double value;
+ vector<Square> positions;
+
+ is >> dir1 >> dir2 >> opt >> value;
+ if (opt == "b")
+ opt = "black";
+ else if (opt == "w")
+ opt = "while";
+ else
+ opt = "all";
+ cout << "eval merge2 KKPT" << endl; // とりあえずKKPT型評価関数のmerge専用。
+ cout << "dir1 : " << dir1 << endl;
+ cout << "OutDir : " << dir2 << endl;
+ cout << "mode : " << opt << endl;
+ cout << "value : " << value << endl;
+ cout << "target positions : ";
+
+ while (1) {
+ string token = "";
+ is >> token;
+ if (token == "") {
+ break;
+ }
+ const char* cc = token.c_str();
+ if(strlen(cc) != 2
+ || (cc[0] < '0' || cc[0] > '9')
+ || (cc[1] < '0' || cc[1] > '9') ){
+ cout << token << "(skip),";
+ continue;
+ }
+ positions.push_back(
+ (Square)(
+ (((int32_t)cc[0] - (int32_t)'1') * 9) +
+ ((int32_t)cc[1] - (int32_t)'1'))
+ );
+ cout << token << ",";
+ }
+ cout << endl;
+
+ // KK(1) + KKP(38) の裏表^H^H^Hで割って、FV_SCALE適用
+ const int FV_SCALE = 32;
+ value = value / (1 + 38) * FV_SCALE;
+
+ KKPT_reader eval1;
+ eval1.read(dir1);
+
+ for (auto k1 : SQ){
+ for (auto k2 : SQ){
+ for (auto inject_pos : positions){
+ if ((opt == "all" && (k1 == inject_pos || k2 == inject_pos))
+ || (opt == "black" && k1 == inject_pos)
+ || (opt == "while" && k2 == inject_pos)) {
+ (*eval1.kk_)[k1][k2][0] = (s32)(*eval1.kk_)[k1][k2][0] + value;
+ (*eval1.kk_)[k1][k2][1] = (s32)(*eval1.kk_)[k1][k2][1] + value;
+ for (int p1 = 0; p1 < eval1.fe_end; ++p1){
+ (*eval1.kkp_)[k1][k2][p1][0] =
+ (s32)(*eval1.kkp_)[k1][k2][p1][0] + value;
+ (*eval1.kkp_)[k1][k2][p1][1] =
+ (s32)(*eval1.kkp_)[k1][k2][p1][1] + value;
+ }
+ }
+ }
+ }
+ }
+
+ MKDIR(dir2);
+ eval1.write(dir2);
+ cout << "..done" << endl;
+}
+
+void eval_merge3(istringstream& is)
+{
+ string dir1, dir2, dir3;
+ double percent;
+ vector<Square> positions;
+
+ is >> dir1 >> dir2 >> dir3 >> percent;
+ cout << "eval merge3 KKPT" << endl; // とりあえずKKPT型評価関数のmerge専用。
+ cout << "dir1 : " << dir1 << endl;
+ cout << "dir2 : " << dir2 << endl;
+ cout << "OutDir : " << dir3 << endl;
+ cout << "percent : " << percent << endl;
+ cout << "target positions : ";
+
+ while (1) {
+ string token = "";
+ is >> token;
+ if (token == "") {
+ break;
+ }
+ const char* cc = token.c_str();
+ if(strlen(cc) != 2
+ || (cc[0] < '0' || cc[0] > '9')
+ || (cc[1] < '0' || cc[1] > '9') ){
+ cout << token << "(skip),";
+ continue;
+ }
+ positions.push_back(
+ (Square)(
+ (((int32_t)cc[0] - (int32_t)'1') * 9) +
+ ((int32_t)cc[1] - (int32_t)'1'))
+ );
+ cout << token << ",";
+ }
+ cout << endl;
+
+ auto r1 = percent / 100.0;
+ auto r2 = 1 - r1;
+ function<s32(s32, s32)> f = [r1, r2](s32 a, s32 b) { return (s32)(a*r1 + b*r2); };
+
+ KKPT_reader eval1, eval2;
+ eval1.read(dir1);
+ eval2.read(dir2);
+
+ for (auto k1 : SQ) {
+ for (auto inject_pos : positions){
+ if (k1 == inject_pos){
+ for (auto k2 : SQ){
+ (*eval1.kk_)[k1][k2][0] =
+ (s32)(f((*eval1.kk_)[k1][k2][0], (*eval2.kk_)[k1][k2][0]));
+ (*eval1.kk_)[k1][k2][1] =
+ (s32)(f((*eval1.kk_)[k1][k2][1], (*eval2.kk_)[k1][k2][1]));
+ for (int p1 = 0; p1 < eval1.fe_end; ++p1){
+ (*eval1.kkp_)[k1][k2][p1][0] =
+ (s32)(f((*eval1.kkp_)[k1][k2][p1][0],
+ (*eval2.kkp_)[k1][k2][p1][0]));
+ (*eval1.kkp_)[k1][k2][p1][1] =
+ (s32)(f((*eval1.kkp_)[k1][k2][p1][1],
+ (*eval2.kkp_)[k1][k2][p1][1]));
+ }
+ }
+ for (int p1 = 0; p1 < eval1.fe_end; ++p1){
+ for (int p2 = 0; p2 < eval1.fe_end; ++p2){
+ (*eval1.kpp_)[k1][p1][p2][0] =
+ (s16)(f((*eval1.kpp_)[k1][p1][p2][0],
+ (*eval2.kpp_)[k1][p1][p2][0]));
+ (*eval1.kpp_)[k1][p1][p2][1] =
+ (s16)(f((*eval1.kpp_)[k1][p1][p2][1],
+ (*eval2.kpp_)[k1][p1][p2][1]));
+ }
+ }
+ }
+ }
+ }
+
+ MKDIR(dir3);
+ eval1.write(dir3);
+ cout << "..done" << endl;
+}
+
/*
逆行列計算。ライブラリを使うほうが早くて正確なのだが、クッソ小さい行列の計算如きで
ライブラリ依存を増やすのが許せないので自前実装
@@ -1986,6 +2139,8 @@ void test_cmd(Position& pos, istringstream& is)
else if (param == "evalconvert") eval_convert(is); // 評価関数の変換コマンド
else if (param == "evalexam") eval_exam(is); // 評価関数ファイルの調査用
else if (param == "evalresolve") eval_resolve(is); // 評価関数ファイルの調査用
+ else if (param == "evalmerge2") eval_merge2(is); // 評価関数の合成コマンド
+ else if (param == "evalmerge3") eval_merge3(is); // 評価関数の合成コマンド
#endif
#ifdef USE_KIF_CONVERT_TOOLS
else if (param == "kifconvert") test_kif_convert_tools(pos, is); // 現局面からの全合法手を各種形式で出力チェック
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment