Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateGenerator.cs

Last change on this file was 18059, checked in by dpiringe, 3 years ago

#3026

  • removed/renamed all interfaces, classes and views related to results (are replaced by RunCollectionModifiers)
  • fixed a bug in JsonTemplateInstantiator to prevent errors for opening templates without a defined property for RunCollectionModifiers
File size: 3.8 KB
Line 
1using System.Collections.Generic;
2using HeuristicLab.Optimization;
3using Newtonsoft.Json.Linq;
4using HEAL.Attic;
5using System.IO;
6using HeuristicLab.Core;
7using System.Linq;
8
9namespace HeuristicLab.JsonInterface {
10  /// <summary>
11  /// Class to generate json interface templates.
12  /// </summary>
13  public class JsonTemplateGenerator {
14
15    /// <summary>
16    /// static Function to generate a template.
17    /// </summary>
18    /// <param name="templatePath">the path for the template files</param>
19    /// <param name="optimizer">the optimizer object to serialize</param>
20    /// <param name="rootItem">Root JsonItem for serialization, considers only active JsonItems for serialization</param>
21    public static void GenerateTemplate(string templatePath, IOptimizer optimizer, IJsonItem rootItem, IEnumerable<IRunCollectionModifier> runCollectionModifiers) {
22      // clear all runs
23      if (optimizer.ExecutionState == ExecutionState.Paused)
24        optimizer.Stop();
25      optimizer.Runs.Clear();
26
27      // validation
28      ValidationResult validationResult = rootItem.GetValidator().Validate();
29      if (!validationResult.Success)
30        throw validationResult.GenerateException();
31
32      #region Init
33      JObject template = JObject.Parse(Constants.Template);
34      JArray parameterItems = new JArray();
35      JArray resultItems = new JArray();
36      JArray runCollectionModifierItems = new JArray();
37      string templateName = Path.GetFileName(templatePath);
38      string templateDirectory = Path.GetDirectoryName(templatePath);
39      #endregion
40
41      // filter items with values/ranges/actualNames
42      var jsonItems = rootItem.Where(x => x.Active && !(x is EmptyJsonItem) && !(x is UnsupportedJsonItem));
43
44      #region Serialize HL File
45      ProtoBufSerializer serializer = new ProtoBufSerializer();
46      // get absolute path for serialization
47      string hlFilePath = Path.Combine(templateDirectory, $"{templateName}.hl");
48      serializer.Serialize(optimizer, hlFilePath);
49      // overwrite string for relative path
50      hlFilePath = Path.Combine($".", $"{templateName}.hl");
51      #endregion
52
53      #region Filter Items
54      foreach (var item in jsonItems) {
55        parameterItems.Add(item.GenerateJObject());
56      }
57      #endregion
58
59      #region RunCollectionModifiers Serialization
60      foreach (var rcModifier in runCollectionModifiers) {
61        JArray rcModifierParameterItems = new JArray();
62        var guid = StorableTypeAttribute.GetStorableTypeAttribute(rcModifier.GetType()).Guid.ToString();
63        var item = JsonItemConverter.Extract(rcModifier);
64
65        var rcModifierItems = item
66          .Where(x => !(x is EmptyJsonItem) && !(x is UnsupportedJsonItem))
67          .Select(x => x.GenerateJObject());
68
69        foreach (var i in rcModifierItems)
70          rcModifierParameterItems.Add(i);
71
72        JObject rcModifierObj = new JObject();
73        rcModifierObj.Add(nameof(IJsonItem.Name), item.Name);
74        rcModifierObj.Add("GUID", guid);
75        rcModifierObj.Add(Constants.Parameters, rcModifierParameterItems);
76        runCollectionModifierItems.Add(rcModifierObj);
77      }
78      #endregion
79
80      #region Set Template Data
81      template[Constants.Metadata][Constants.TemplateName] = templateName;
82      template[Constants.Metadata][Constants.HLFileLocation] = hlFilePath;
83      template[Constants.Metadata][Constants.OptimizerDescription] = optimizer.Description;
84      template[Constants.Parameters] = parameterItems;
85      template[Constants.RunCollectionModifiers] = runCollectionModifierItems;
86      #endregion
87
88      #region Serialize and write to file
89      File.WriteAllText(Path.Combine(templateDirectory, $"{templateName}.json"), SingleLineArrayJsonWriter.Serialize(template));
90      #endregion
91    }
92  }
93}
Note: See TracBrowser for help on using the repository browser.