/// <summary> /// 実行ファイル配下のengineフォルダを調べて、それぞれの"engine_define.xml"を読み込んで /// EngineDefineのListを返す。 /// </summary> /// <returns></returns> public static List <EngineDefineEx> GetEngineDefines() { // 実行ファイル配下のengine/フォルダ配下にある"engine_define.xml"を列挙する。 var def_files = GetEngineDefineFiles(); // MyShogiの実行フォルダ。これをfilenameから削って、相対pathを得る。 var current_path = Path.GetDirectoryName(Application.ExecutablePath); var list = new List <EngineDefineEx>(); foreach (var filename in def_files) { try { var engine_define = ReadFile(filename); var relative_path = Path.GetDirectoryName(filename).Substring(current_path.Length); var engine_define_ex = new EngineDefineEx() { EngineDefine = engine_define, FolderPath = relative_path, }; list.Add(engine_define_ex); } catch (Exception ex) { TheApp.app.MessageShow($"{filename}の解析に失敗しました。\n例外名" + ex.Message, MessageShowType.Error); } } // EngineDefine.EngineOrderの順で並び替える。 list.Sort((x, y) => y.EngineDefine.DisplayOrder - x.EngineDefine.DisplayOrder); return(list); }
/// <summary> /// UsiEngineに渡すEngineOptionsを生成する。 /// /// ・エンジン共通設定 /// ・エンジン個別設定 /// /// ・エンジン側から送られてきた"option"の列 /// → これは送られて来る前に、OptionListを設定しないといけないので使えない? /// → エンジン共通設定にあるものしか設定できないので、エンジンからオプションリストをもらわないと /// どうにもならないのでは…。 /// /// </summary> /// <param name="optionList">これが改変される</param> /// <param name="engineDefineEx"></param> /// <param name="selectedPresetIndex">プリセットの番号</param> /// <param name="commonSetting">共通設定</param> /// <param name="HashSize">hashサイズ[MB] 0を指定するとoption設定に従う。AutoHashの時に呼び出し元のほうで設定する。</param> /// <param name="threads">スレッド数。エンジンオプションのThreadsの値は、この値で設定される。</param> /// <returns></returns> public static void SetDefaultOption(List <UsiOption> optionList, EngineDefineEx engineDefineEx, int selectedPresetIndex, EngineConfig config, long hashSize, int threads, bool ponder) { var engineDefine = engineDefineEx.EngineDefine; var folderPath = engineDefineEx.FolderPath; // EnginePreset var index = selectedPresetIndex /* - 1 */; // EngineDefineのデシリアライズ時に0番目に「カスタム」を自動挿入している。ゆえに、このまま対応する。 List <EngineOption> preset = null; if (0 <= index && index < engineDefine.Presets.Count) { preset = engineDefine.Presets[index].Options; } // 共通設定 var commonSetting = config.CommonOptions; // 個別設定 var indSetting = config.IndivisualEnginesOptions.Find(x => x.FolderPath == folderPath); foreach (var option in optionList) { var value = config.GetOptionValue(option.Name, commonSetting, indSetting, preset); // 値を変更したい場合は、この変数valueを上書きする。(最後にSetDefault(value)しているので) // Hashサイズの自動マネージメント if (option.Name == "Hash" || option.Name == "USI_Hash") { if (hashSize != 0) { value = hashSize.ToString(); } // option名を適切なoption名にrename // デフォルトでは"USI_Hash" , extentionで指定されていれば"Hash" var option_name = engineDefine.IsSupported(ExtendedProtocol.UseHashCommandExtension) ? "Hash" : "USI_Hash"; option.SetName(option_name); } // Threadsの自動マネージメント else if (option.Name == "Threads") { value = threads.ToString(); } // Ponder設定の反映。 else if (option.Name == "USI_Ponder") { value = ponder ? "true" : "false"; } if (value != null) { option.SetDefault(value); } } // スレッド数の自動マネージメントについて.. // ponderの自動マネージメントについて.. }
/// <summary> /// UsiEngineに渡すEngineOptionsを生成する。 /// /// ・エンジン共通設定 /// ・エンジン個別設定 /// /// ・エンジン側から送られてきた"option"の列 /// → これは送られて来る前に、OptionListを設定しないといけないので使えない? /// → エンジン共通設定にあるものしか設定できないので、エンジンからオプションリストをもらわないと /// どうにもならないのでは…。 /// /// </summary> /// <param name="optionList">これが改変される</param> /// <param name="engineDefineEx">エンジン定義</param> /// <param name="selectedPresetIndex">プリセットの番号</param> /// <param name="config">エンジン共通設定、個別設定</param> /// <param name="hashSize">hashサイズ[MB] 0を指定するとoption設定に従う。AutoHashの時に呼び出し元のほうで設定する。</param> /// <param name="threads">スレッド数。エンジンオプションのThreadsの値は、この値で設定される。</param> /// <returns></returns> public static void SetDefaultOption(List <UsiOption> optionList, EngineDefineEx engineDefineEx, int selectedPresetIndex, EngineConfig config, long hashSize, int threads, bool ponder) { var engineDefine = engineDefineEx.EngineDefine; var folderPath = engineDefineEx.FolderPath; // EnginePreset var index = selectedPresetIndex /* - 1 */; // EngineDefineのデシリアライズ時に0番目に「カスタム」を自動挿入している。ゆえに、このまま対応する。 List <EngineOption> preset = null; if (0 <= index && index < engineDefine.Presets.Count) { preset = engineDefine.Presets[index].Options; } // 共通設定 var commonSetting = config.CommonOptions; // 個別設定 var indSetting = config.IndivisualEnginesOptions.Find(x => x.FolderPath == folderPath); bool set_hash = false; foreach (var option in optionList) { var value = config.GetOptionValue(option.Name, commonSetting, indSetting, preset); // 値を変更したい場合は、この変数valueを上書きする。(最後にSetDefault(value)しているので) // Hashサイズの自動マネージメント if (option.Name == "USI_Hash" || option.Name == "Hash") { // "USI_Hash","Hash"のうち、エンジン側が持っているほうのオプション名に対して設定すれば良い // どちらも持っていない場合は、"USI_Hash"オプションを強制的に生成しなければならない。 if (hashSize != 0) { value = hashSize.ToString(); } set_hash = true; } // Threadsの自動マネージメント else if (option.Name == "Threads") { value = threads.ToString(); } // Ponder設定の反映。 else if (option.Name == "USI_Ponder") { value = ponder ? "true" : "false"; } if (value != null) { option.SetDefault(value); } } if (!set_hash) { // hashの設定がなかったので"USI_Hash"を強制追加。 var option = UsiOption.USI_Hash.Clone(); option.SetDefault(hashSize.ToString()); optionList.Add(option); } // スレッド数の自動マネージメントについて.. // ponderの自動マネージメントについて.. }