public KyokumenPngArgsImpl( ISfenPosition1 ro_Kyokumen1, int srcMasu_orMinusOne, int dstMasu_orMinusOne, KyokumenPngArgs_FoodOrDropKoma foodKoma, KyokumenPngArgs_FoodOrDropKoma dropKoma, string outFile, KyokumenPngEnvironment reportEnvironment) { this.ro_Kyokumen1 = ro_Kyokumen1; this.srcMasu_orMinusOne = srcMasu_orMinusOne; this.dstMasu_orMinusOne = dstMasu_orMinusOne; this.foodKoma = foodKoma; this.dropKoma = dropKoma; //// デバッグ //{ // Debug.Assert(this.ro_Kyokumen1.Ban.Length == 10, "サイズ違反"); // Debug.Assert(this.ro_Kyokumen1.Ban[0].Length == 10, "サイズ違反"); // Debug.Assert(this.ro_Kyokumen1.Ban[1].Length == 10, "サイズ違反"); // Debug.Assert(this.ro_Kyokumen1.Ban[2].Length == 10, "サイズ違反"); // Debug.Assert(this.ro_Kyokumen1.Ban[3].Length == 10, "サイズ違反"); // Debug.Assert(this.ro_Kyokumen1.Ban[4].Length == 10, "サイズ違反"); // Debug.Assert(this.ro_Kyokumen1.Ban[5].Length == 10, "サイズ違反"); // Debug.Assert(this.ro_Kyokumen1.Ban[6].Length == 10, "サイズ違反"); // Debug.Assert(this.ro_Kyokumen1.Ban[7].Length == 10, "サイズ違反"); // Debug.Assert(this.ro_Kyokumen1.Ban[8].Length == 10, "サイズ違反"); // Debug.Assert(this.ro_Kyokumen1.Ban[9].Length == 10, "サイズ違反"); //} this.outFile = outFile; this.env = reportEnvironment; }
/// <summary> /// 評価明細の書き出し。 /// </summary> /// <param name="id"></param> /// <param name="node"></param> /// <param name="treeFolder"></param> /// <param name="env"></param> public static void AAAA_Write_HyokaMeisai( IEngineConf engineConf, string id, KifuNode node, string treeFolder, KyokumenPngEnvironment env ) { StringBuilder sb = new StringBuilder(); // 見出し sb.Append(id); sb.Append(" "); sb.Append(((int)node.Score).ToString()); sb.Append(" "); switch (node.Value.KyokumenConst.KaisiPside) { case Playerside.P1: sb.Append("P2が指し終えた局面。手番P1"); break; case Playerside.P2: sb.Append("P1が指し終えた局面。手番P2"); break; case Playerside.Empty: sb.Append("手番Empty"); break; } sb.AppendLine(); foreach (KeyValuePair <string, KyHyokaMeisai_Koumoku> entry in node.KyHyokaSheet_Mutable.Items) { KyHyokaMeisai_Koumoku koumoku = ((KyHyokaMeisai_Koumoku)entry.Value); sb.Append(" "); sb.Append(entry.Key); //項目名 sb.Append(" "); sb.Append(koumoku.UtiwakeValue); //評価値 sb.Append(" "); sb.Append(koumoku.Utiwake);//内訳 sb.AppendLine(); } sb.AppendLine(); ////------------------------------ //// TODO: 局面ハッシュ ////------------------------------ //sb.Append("hash:"); //sb.AppendLine(Conv_Sky.ToKyokumenHash(node.Value.ToKyokumenConst).ToString()); //sb.AppendLine(); File.AppendAllText($"{env.OutFolder}{treeFolder}{engineConf.GetResourceBasename("HyokaMeisaiLogTxtBasename")}", sb.ToString()); }
static LearningDataImpl() { var engineConf = new EngineConf(); LearningDataImpl.REPORT_ENVIRONMENT = new KyokumenPngEnvironmentImpl( engineConf.LogDirectory, Path.Combine(engineConf.DataDirectory, "img/gkLog/"), engineConf.GetResourceBasename("Koma1PngBasename"), //argsDic["kmFile"], engineConf.GetResourceBasename("Suji1PngBasename"), //argsDic["sjFile"], "20", //argsDic["kmW"], "20", //argsDic["kmH"], "8", //argsDic["sjW"], "12" //argsDic["sjH"] ); }
/// <summary> /// 棋譜ツリーの、ノードに格納されている、局面評価明細を、出力していきます。 /// </summary> public static void AA_Write_ForeachLeafs_ForDebug( IEngineConf engineConf, ref int logFileCounter, string nodePath, KifuNode node, KifuTree kifu, string treeFolder, KyokumenPngEnvironment reportEnvironment ) { // 次ノードの有無 if (0 < node.Count_ChildNodes) { // 葉ノードではないなら int logFileCounter_temp = logFileCounter; // 先に奥の枝から。 node.Foreach_ChildNodes((string key, Node <IMove, KyokumenWrapper> nextNode, ref bool toBreak) => { float score = ((KifuNode)nextNode).Score; // 再帰 Util_KifuTreeLogWriter.AA_Write_ForeachLeafs_ForDebug( engineConf, ref logFileCounter_temp, $"{nodePath} {ConvMoveStrSfen.ToMoveStrSfenForFilename(nextNode.Key)}", (KifuNode)nextNode, kifu, $"{treeFolder}{(int)score}点_{ConvMoveStrSfen.ToMoveStrSfen(nextNode.Key)}/", reportEnvironment ); }); logFileCounter = logFileCounter_temp; } // 盤1個分の png 画像ログ出力 Util_KifuTreeLogWriter.AAA_Write_Node( engineConf, ref logFileCounter, nodePath, node, kifu, treeFolder, reportEnvironment ); }
public EvaluationArgsImpl( SennititeConfirmer sennititeConfirmer, FeatureVector featureVector, KyokumenPngEnvironment reportEnvironment #if DEBUG , KaisetuBoards kaisetuBoards_orNull #endif ) { this.sennititeConfirmer = sennititeConfirmer; this.featureVector = featureVector; this.reportEnvironment = reportEnvironment; #if DEBUG this.kaisetuBoards_orNull = kaisetuBoards_orNull; #endif }
/// <summary> /// 盤1個分のログ。 /// </summary> public static void Build_LogBoard( Node <IMove, KyokumenWrapper> node_forLog, string nodePath, KifuNode niniNode, //任意のノード //KifuTree kifu_forAssert, KyokumenPngEnvironment reportEnvironment, KaisetuBoards logF_kiki ) { // // HTMLログ // if (logF_kiki.boards.Count < 30)//出力件数制限 { KaisetuBoard logBrd_move1 = new KaisetuBoard(); List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus; Playerside pside = niniNode.Value.KyokumenConst.KaisiPside; Util_KyokumenMoves.LA_Split_KomaBETUSusumeruMasus( 2, //node_forLog, out komaBETUSusumeruMasus, true, //本将棋 niniNode.Value.KyokumenConst, //現在の局面 pside, false //#if DEBUG , new MmLogGenjoImpl( 0, //読み開始手目済み logBrd_move1, 0, //現在の手済み niniNode.Key ) //#endif ); logBrd_move1.moveOrNull = niniNode.Key; logBrd_move1.YomikaisiTemezumi = niniNode.Value.KyokumenConst.Temezumi;//読み開始手目済み // int.MinValue; logBrd_move1.Temezumi = int.MinValue; logBrd_move1.Score = (int)niniNode.Score; logF_kiki.boards.Add(logBrd_move1); } }
/// <summary> /// SFEN文字列と、出力ファイル名を指定することで、局面の画像ログを出力します。 /// </summary> /// <param name="sfenstring"></param> /// <param name="outFile"></param> /// <param name="reportEnvironment"></param> /// <returns></returns> public static bool Write_ForTest( string sfenstring, string relFolder, string outFile, KyokumenPngEnvironment reportEnvironment ) { bool successful = true; //System.Windows.Forms.MessageBox.Show($@"{sfenstring} //{outFile}", "局面PNG書き出し"); // // SFEN → RO_SfenStartpos // ISfenPosition2 ro_SfenStartpos; string rest; if (!Sfenstring146Conv.ToKyokumen2(sfenstring, out rest, out ro_SfenStartpos)) { //System.Windows.Forms.MessageBox.Show(sfenstring,"sfenstringパース失敗"); successful = false; goto gt_EndMethod; } // テスト・プログラム用 Util_KyokumenPng_Writer.Write1( ro_SfenStartpos.ToKyokumen1(), -1, //移動元升不明 -1, //移動先升不明 KyokumenPngArgs_FoodOrDropKoma.UNKNOWN, //取った駒不明 "", //指し手SFEN relFolder, outFile, reportEnvironment ); gt_EndMethod: return(successful); }
/// <summary> /// 盤1個分のログ。 /// </summary> private static void AAA_Write_Node( IEngineConf engineConf, ref int logFileCounter, string nodePath, KifuNode node, KifuTree kifu, string relFolder, KyokumenPngEnvironment reportEnvironment ) { string fileName = ""; // 出力先 fileName = Conv_Filepath.ToEscape($"_log_{((int)node.Score)}点_{logFileCounter}_{nodePath}.png"); relFolder = Conv_Filepath.ToEscape(relFolder); // // 画像ログ // if (true) { int srcMasu_orMinusOne = -1; int dstMasu_orMinusOne = -1; if (null != node.Key) { srcMasu_orMinusOne = Conv_SyElement.ToMasuNumber(((RO_Star)node.Key.LongTimeAgo).Masu); dstMasu_orMinusOne = Conv_SyElement.ToMasuNumber(((RO_Star)node.Key.Now).Masu); } KyokumenPngArgs_FoodOrDropKoma foodKoma; if (null != node.Key.FoodKomaSyurui) { switch (Util_Komasyurui14.NarazuCaseHandle((PieceType)node.Key.FoodKomaSyurui)) { case PieceType.None: foodKoma = KyokumenPngArgs_FoodOrDropKoma.NONE; break; case PieceType.P: foodKoma = KyokumenPngArgs_FoodOrDropKoma.FU__; break; case PieceType.L: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KYO_; break; case PieceType.N: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KEI_; break; case PieceType.S: foodKoma = KyokumenPngArgs_FoodOrDropKoma.GIN_; break; case PieceType.G: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KIN_; break; case PieceType.R: foodKoma = KyokumenPngArgs_FoodOrDropKoma.HI__; break; case PieceType.B: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KAKU; break; default: foodKoma = KyokumenPngArgs_FoodOrDropKoma.UNKNOWN; break; } } else { foodKoma = KyokumenPngArgs_FoodOrDropKoma.NONE; } // 評価明細に添付 Util_KyokumenPng_Writer.Write1( Conv_KifuNode.ToRO_Kyokumen1(node), srcMasu_orMinusOne, dstMasu_orMinusOne, foodKoma, ConvMoveStrSfen.ToMoveStrSfen(node.Key), relFolder, fileName, reportEnvironment ); logFileCounter++; } // // 評価明細 // { Util_KifuTreeLogWriter.AAAA_Write_HyokaMeisai(engineConf, fileName, node, relFolder, reportEnvironment); } }
/// <summary> /// 局面データと、出力ファイル名を指定することで、局面の画像ログを出力します。 /// </summary> /// <param name="ro_Kyokumen1"></param> /// <param name="dstMasu_orMinusOne">あれば、移動先升番号。なければ -1。</param> /// <param name="appendFilepath"></param> /// <param name="outFile"></param> /// <param name="reportEnvironment"></param> /// <returns></returns> public static bool Write1( ISfenPosition1 ro_Kyokumen1, int srcMasu_orMinusOne, int dstMasu_orMinusOne, KyokumenPngArgs_FoodOrDropKoma foodKoma, string sfenMoveStrOrEmpty, string appendFilepath, string outFile, KyokumenPngEnvironment reportEnvironment ) { bool successful = true; //---------------------------------------- // 打った駒を調べる //---------------------------------------- KyokumenPngArgs_FoodOrDropKoma dropKoma; { dropKoma = KyokumenPngArgs_FoodOrDropKoma.UNKNOWN; if ("" != sfenMoveStrOrEmpty) { string moji1; string moji2; string moji3; string moji4; string moji5; string rest; SfenMovesTextConv.ToTokens( sfenMoveStrOrEmpty, out moji1, out moji2, out moji3, out moji4, out moji5, out rest ); if (moji2 == "*") { switch (moji1) { case SfenWord.P_PAWN__: dropKoma = KyokumenPngArgs_FoodOrDropKoma.FU__; break; case SfenWord.L_LANCE_: dropKoma = KyokumenPngArgs_FoodOrDropKoma.KYO_; break; case SfenWord.N_KNIGHT: dropKoma = KyokumenPngArgs_FoodOrDropKoma.KEI_; break; case SfenWord.S_SILVER: dropKoma = KyokumenPngArgs_FoodOrDropKoma.GIN_; break; case SfenWord.G_GOLD__: dropKoma = KyokumenPngArgs_FoodOrDropKoma.KIN_; break; case SfenWord.B_BISHOP: dropKoma = KyokumenPngArgs_FoodOrDropKoma.KAKU; break; case SfenWord.R_ROOK__: dropKoma = KyokumenPngArgs_FoodOrDropKoma.HI__; break; default: break; } } else { dropKoma = KyokumenPngArgs_FoodOrDropKoma.NONE; } } } //---------------------------------------- // ファイルに使える文字に変換 //---------------------------------------- appendFilepath = appendFilepath.Replace('*', '*'); outFile = outFile.Replace('*', '*'); KyokumenPngArgs args = new KyokumenPngArgsImpl( ro_Kyokumen1, srcMasu_orMinusOne, dstMasu_orMinusOne, foodKoma, dropKoma, outFile, reportEnvironment ); // 局面画像を描きだします。 Bitmap bmp = new Bitmap( 2 * (args.Env.KmW + 2 * args.Env.SjW) + Util_KyokumenPngPainter.BN_SUJIS * args.Env.KmW + Util_KyokumenPngPainter.BN_BRD_R_W, Util_KyokumenPngPainter.BN_DANS * args.Env.KmH + Util_KyokumenPngPainter.BN_BRD_B_W ); Util_KyokumenPngPainter.Paint(Graphics.FromImage(bmp), args); //args.Env.OutFolder + args.OutFile, "bmp.Save" string filepath = args.Env.OutFolder + appendFilepath + args.OutFile; // フォルダーが無ければ、作る必要があります。 { DirectoryInfo dirInfo = Directory.GetParent(filepath); if (!Directory.Exists(dirInfo.FullName)) { Directory.CreateDirectory(dirInfo.FullName); } } bmp.Save(filepath); return(successful); }