Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs @ 17446

Last change on this file since 17446 was 17446, checked in by dpiringe, 4 years ago

#3026:

  • made interfaces for array/matrix JsonItems and for their VMs aswell (IArrayJsonItem, IArrayJsonItemVM, IMatrixJsonItem, IMatrixJsonItemVM), incl. base classes (ArrayJsonItemBase, ArrayValueVM, MatrixJsonItemBase, MatrixValueVM)
  • changed inheritance structure for already existing array/matrix JsonItems -> they inherit now from new base array/matrix base classes
  • added input elements to configure the size of an matrix or array in JsonItemMultiValueControl (incl. VM binding and validation)
  • splitted file JsonItems.cs into separate files for their corresponding types (IntJsonItems.cs, DoubleJsonItems.cs, BoolJsonItems.cs, StringJsonItem.cs, DateTimeJsonItem.cs)
  • changed location of deserialization of json values from JsonTemplateInstantiator into IJsonItem (implemented in JsonItem and set to virtual, overridden in MatrixJsonItemBase and ArrayJsonItemBase)
  • added new CLI argument StringArgument
  • some little UI improvements (location fixes, anchor fixes, ...)
File size: 4.6 KB
Line 
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.IO;
5using System.Linq;
6using System.Reflection;
7using System.Text;
8using System.Threading.Tasks;
9using HEAL.Attic;
10using HeuristicLab.Core;
11using HeuristicLab.Data;
12using HeuristicLab.Optimization;
13using Newtonsoft.Json.Linq;
14
15namespace HeuristicLab.JsonInterface {
16  /// <summary>
17  /// Static class to instantiate an IAlgorithm object with a json interface template and config.
18  /// </summary>
19  public static class JsonTemplateInstantiator {
20    private struct InstData {
21      public JToken Template { get; set; }
22      public JArray Config { get; set; }
23      public IDictionary<string, IJsonItem> Objects { get; set; }
24      public IOptimizer Optimizer { get; set; }
25    }
26
27    public static IOptimizer Instantiate(string templateFile) =>
28      Instantiate(templateFile, null, out IEnumerable<string> allowedResultNames);
29
30
31    public static IOptimizer Instantiate(string templateFile, out IEnumerable<string> allowedResultNames) =>
32      Instantiate(templateFile, null, out allowedResultNames);
33
34   
35
36    /// <summary>
37    /// Instantiate an IAlgorithm object with a template and config.
38    /// </summary>
39    /// <param name="templateFile">Template file (json), generated with JCGenerator.</param>
40    /// <param name="configFile">Config file (json) for the template.</param>
41    /// <returns>confugrated IOptimizer object</returns>
42    public static IOptimizer Instantiate(string templateFile, string configFile, out IEnumerable<string> allowedResultNames) {
43      InstData instData = new InstData() {
44        Objects = new Dictionary<string, IJsonItem>()
45      };
46
47      // parse template and config files
48      instData.Template = JToken.Parse(File.ReadAllText(templateFile));
49      if(!string.IsNullOrEmpty(configFile))
50        instData.Config = JArray.Parse(File.ReadAllText(configFile));
51
52      // extract metadata information
53      string hLFileLocation = Path.GetFullPath(instData.Template[Constants.Metadata][Constants.HLFileLocation].ToString());
54
55      // deserialize hl file
56      ProtoBufSerializer serializer = new ProtoBufSerializer();
57      IOptimizer optimizer = (IOptimizer)serializer.Deserialize(hLFileLocation);
58      instData.Optimizer = optimizer;
59
60      // collect all parameterizedItems from template
61      CollectParameterizedItems(instData);
62     
63      // if config != null -> merge Template and Config
64      if (instData.Config != null)
65        MergeTemplateWithConfig(instData);
66
67      // get algorthm data and object
68      IJsonItem optimizerData = instData.Objects.First().Value;
69     
70      // inject configuration
71      JsonItemConverter.Inject(optimizer, optimizerData);
72
73      allowedResultNames = CollectResults(instData);
74
75      return optimizer;
76    }
77
78    #region Helper
79    private static IEnumerable<string> CollectResults(InstData instData) {
80      IList<string> res = new List<string>();
81      foreach(JObject obj in instData.Template[Constants.Results]) {
82        res.Add(obj.Property("Name").Value.ToString());
83      }
84      return res;
85    }
86
87    private static void CollectParameterizedItems(InstData instData) {
88      IJsonItem root = JsonItemConverter.Extract(instData.Optimizer);
89      instData.Objects.Add(root.Path, root);
90
91      foreach (JObject obj in instData.Template[Constants.Parameters]) {
92        string[] pathParts = obj.Property("Path").Value.ToString().Split('.');
93        IJsonItem tmp = root;
94        IJsonItem old = null;
95        for(int i = 1; i < pathParts.Length; ++i) {
96          foreach(var c in tmp.Children) {
97            if (c.Name == pathParts[i])
98              tmp = c;
99          }
100          if (old == tmp)
101            throw new Exception($"Invalid path '{string.Join(".", pathParts)}'");
102          else old = tmp;
103        }
104        tmp.SetFromJObject(obj);
105        instData.Objects.Add(tmp.Path, tmp);
106      }
107    }
108   
109    private static void MergeTemplateWithConfig(InstData instData) {
110      foreach (JObject obj in instData.Config) {
111        // build item from config object
112        string path = obj.Property("Path").Value.ToString();
113        // override default value
114        if (instData.Objects.TryGetValue(path, out IJsonItem param)) {
115          // save range from template
116          IEnumerable<object> tmpRange = param.Range;
117          param.SetFromJObject(obj);
118          // set range from template
119          param.Range = tmpRange;
120        } else throw new InvalidDataException($"No parameter with path='{path}' defined!");
121      }
122    }
123    #endregion
124  }
125}
Note: See TracBrowser for help on using the repository browser.