using System.Collections.Generic; using HeuristicLab.Optimization; using Newtonsoft.Json.Linq; using HEAL.Attic; using System.IO; using HeuristicLab.Core; namespace HeuristicLab.JsonInterface { /// /// Class to generate json interface templates. /// public class JsonTemplateGenerator { public static void GenerateTemplate(string path, IOptimizer optimizer) => GenerateTemplate(path, optimizer.Name, optimizer); public static void GenerateTemplate(string path, string templateName, IOptimizer optimizer) => GenerateTemplate(path, templateName, optimizer, JsonItemConverter.Extract(optimizer)); public static void GenerateTemplate(string path, string templateName, IOptimizer optimizer, IJsonItem rootItem) { #region Init JObject template = JObject.Parse(Constants.Template); JArray parameterItems = new JArray(); JArray resultItems = new JArray(); IList jsonItems = new List(); string fullPath = Path.GetFullPath(path); #endregion if(optimizer.ExecutionState == ExecutionState.Paused) optimizer.Stop(); // recursively filter items with values/ranges/actualNames PopulateJsonItems(rootItem, jsonItems); #region Serialize HL File ProtoBufSerializer serializer = new ProtoBufSerializer(); string hlFilePath = Path.Combine(fullPath, templateName + ".hl"); serializer.Serialize(optimizer, hlFilePath); #endregion #region Filter Items foreach (var item in jsonItems) { if (item is IResultJsonItem) resultItems.Add(item.GenerateJObject()); else parameterItems.Add(item.GenerateJObject()); } #endregion #region Set Template Data template[Constants.Metadata][Constants.TemplateName] = templateName; template[Constants.Metadata][Constants.HLFileLocation] = hlFilePath; template[Constants.Parameters] = parameterItems; template[Constants.Results] = resultItems; #endregion #region Serialize and write to file File.WriteAllText(fullPath + @"\" + templateName + ".json", SingleLineArrayJsonWriter.Serialize(template)); #endregion } #region Helper private static void PopulateJsonItems(IJsonItem item, IList jsonItems) { foreach(var x in item) { if (x.Active && !(x is EmptyJsonItem)) { jsonItems.Add(x); } } } #endregion } }