Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/JCGenerator.cs @ 17266

Last change on this file since 17266 was 17266, checked in by dpiringe, 5 years ago

#3026:

  • changed the namespace from ParameterTest to HeuristicLab.Manufacture
  • added an extension method for Type to get the distance of an interface based on the target type
  • renamed methods ToData, SetValue to Extract, Inject
  • new implementation of the template generation with transformers (not the final name)
  • started to use the new transformers for the instantiation of IOptimizer-objects (out of a template)
  • new transformers: LookupParameterTransformer and DummyTransformer
File size: 5.5 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Linq;
5using HeuristicLab.Algorithms.GeneticAlgorithm;
6using HeuristicLab.Core;
7using HeuristicLab.Data;
8using HeuristicLab.Encodings.PermutationEncoding;
9using HeuristicLab.Optimization;
10using HeuristicLab.Problems.TravelingSalesman;
11using Newtonsoft.Json;
12using Newtonsoft.Json.Linq;
13using Newtonsoft.Json.Serialization;
14
15namespace HeuristicLab.Manufacture {
16
17  public class CustomWriter : JsonTextWriter {
18    private Stack<Formatting> formattings = new Stack<Formatting>();
19    private int lvl = 0;
20    public override void WriteStartArray() {
21      base.WriteStartArray();
22      if(lvl > 1) {
23        formattings.Push(base.Formatting);
24        base.Formatting = Formatting.None;
25      }
26      lvl++;
27    }
28
29    public override void WriteEndArray() {
30      base.WriteEndArray();
31      lvl--;
32      if (lvl > 1)
33        base.Formatting = formattings.Pop();
34    }
35
36    public CustomWriter(TextWriter writer) : base(writer) { }
37
38    public static string Serialize(JToken token) {
39      JsonSerializer serializer = new JsonSerializer();
40      StringWriter sw = new StringWriter();
41      CustomWriter writer = new CustomWriter(sw);
42      writer.Formatting = Formatting.Indented;
43      serializer.Serialize(writer, token);
44      return sw.ToString();
45    }
46  }
47
48  public class JCGenerator {
49
50    private JObject template = JObject.Parse(@"{
51      'Metadata': {},
52      'FreeParameters': {},
53      'StaticParameters': {
54        'Algorithm':{},
55        'Problem':{},
56        'TypeList':{}
57      }
58    }");
59
60   
61    private Dictionary<string, string> TypeList = new Dictionary<string, string>();
62
63    public string GenerateTemplate(IAlgorithm algorithm, IProblem problem, params string[] freeParameters) {
64      algorithm.Problem = problem;
65      IList<JCObject> items = BJCO(algorithm);
66      JArray jsonItems = new JArray();
67     
68      foreach(var item in items) {
69        JToken token = JObject.FromObject(item, Settings());
70
71        RefactorFreeParameters(token, freeParameters);
72        RefactorStaticParameters(token);
73        if(token["StaticParameters"].HasValues || token["FreeParameters"].HasValues)
74          jsonItems.Add(token);
75      }
76      return CustomWriter.Serialize(jsonItems);
77    }
78
79    private void RefactorFreeParameters(JToken token, string[] freeParameters) {
80
81      token["FreeParameters"] = token["StaticParameters"];
82
83      IList<JObject> objToRemove = new List<JObject>();
84      TransformNodes(x => {
85        var p = x.ToObject<ParameterData>();
86
87        /*bool isSelected = false;
88        string name = x["Name"].ToObject<string>();
89        foreach (var selected in freeParameters)
90          isSelected = (name == selected || isSelected);
91        */
92        if (/*!isSelected ||*/ p.Default == null || (p.Default != null && p.Default.GetType() == typeof(string) && p.Range == null)) {
93          objToRemove.Add(x);
94        } else {
95          x.Property("Path")?.Remove();
96          x.Property("Type")?.Remove();
97        }
98      }, token["FreeParameters"]);
99      foreach (var x in objToRemove) x.Remove();
100     
101    }
102
103    private void RefactorStaticParameters(JToken token) {
104      IList<JObject> objToRemove = new List<JObject>();
105      TransformNodes(x => {
106        var p = x.ToObject<ParameterData>();
107        x.Property("Range")?.Remove();
108        if (p.Default == null) objToRemove.Add(x);
109      }, token["StaticParameters"]);
110      foreach (var x in objToRemove) x.Remove();
111    }
112     
113   
114
115    #region Helper
116    private IList<JCObject> BJCO(IParameterizedItem item) {
117      List<JCObject> list = new List<JCObject>();
118      JCObject obj = new JCObject();
119      obj.Name = item.ItemName;
120      obj.Type = item.GetType().AssemblyQualifiedName;
121      obj.StaticParameters = new List<ParameterData>();
122      list.Add(obj);
123
124      foreach (var param in item.Parameters) {
125        if(!param.Hidden) {
126          obj.StaticParameters.Add(Transformer.Extract(param));
127
128          if (param is IParameterizedItem)
129            list.AddRange(BJCO(param.Cast<IParameterizedItem>()));
130         
131          if (param.GetType().IsEqualTo(typeof(IConstrainedValueParameter<>)))
132            foreach (var validValue in param.Cast<dynamic>().ValidValues)
133              if (validValue is IParameterizedItem &&
134                ((IParameterizedItem)validValue).Parameters.Any(p => !p.Hidden))
135                list.AddRange(BJCO((IParameterizedItem)validValue));
136        }
137      }
138      return list;
139    }
140
141
142    private JsonSerializer Settings() => new JsonSerializer() {
143      TypeNameHandling = TypeNameHandling.None,
144      NullValueHandling = NullValueHandling.Ignore
145    };
146
147
148    private void TransformNodes(Action<JObject> action, params JToken[] tokens) {
149      foreach(JObject obj in tokens.SelectMany(x => x.Children<JObject>())) {
150        action(obj);
151      }
152    }
153    #endregion
154
155    /*
156    private void ExtractOperatorInfo(IItem item, ParameterData obj) {
157      if (item is IMultiOperator) {
158        foreach (var op in ((IMultiOperator)item).Operators) {
159          ParameterData newOperator = BuildJCParameter(op);
160          if (obj.Operators == null)
161            obj.Operators = new List<ParameterData>();
162          obj.Operators.Add(newOperator);
163          newOperator.Name = op.GetType().Name;
164
165          newOperator.Path = obj.Path + ".Operators." + op.Name;
166          MultiPermutationManipulator manipulator = new MultiPermutationManipulator();
167        }
168      }
169    }*/
170  }
171}
Note: See TracBrowser for help on using the repository browser.