Created
July 29, 2017 09:41
-
-
Save ohga/63aeeefd449a7a2b0eb034b55883681c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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