Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.App/Runner.cs @ 18041

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

#3026

  • added PythonResultFormatter
  • removed code which was used for debugging and was forgotten
  • fixed the release build path of all JsonInterface projects
  • changed the output of Runner -> now: it writes the results after (at least) one run is finished
File size: 3.1 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Linq;
5using System.Threading;
6using System.Threading.Tasks;
7using HeuristicLab.Core;
8using HeuristicLab.Optimization;
9using Newtonsoft.Json.Linq;
10
11namespace HeuristicLab.JsonInterface.App {
12  internal static class Runner {
13    internal static void Run(string template, string config, string outputFile) {
14      try {
15        InstantiatorResult instantiatorResult = JsonTemplateInstantiator.Instantiate(template, config);
16        IOptimizer optimizer = instantiatorResult.Optimizer;
17        IEnumerable<IResultJsonItem> configuredResultItem = instantiatorResult.ConfiguredResultItems;
18
19        optimizer.Runs.Clear();
20        if (optimizer is EngineAlgorithm e)
21          e.Engine = new ParallelEngine.ParallelEngine();
22
23        Task task = optimizer.StartAsync();
24        while (!task.IsCompleted) {
25          WriteResultsToFile(outputFile, optimizer, configuredResultItem);
26          Thread.Sleep(100);
27        }
28
29        WriteResultsToFile(outputFile, optimizer, configuredResultItem);
30      } catch (Exception e) {
31        Console.Error.WriteLine($"{e.Message} \n\n\n\n {e.StackTrace}");
32        File.WriteAllText(outputFile, e.Message + "\n\n\n\n" + e.StackTrace);
33        Environment.Exit(-1);
34      }
35    }
36
37    private static void WriteResultsToFile(string file, IOptimizer optimizer, IEnumerable<IResultJsonItem> configuredResultItem) {
38      if (optimizer.Runs.Count > 0)
39        File.WriteAllText(file, FetchResults(optimizer, configuredResultItem));
40    }
41     
42
43    private static IEnumerable<IResultFormatter> ResultFormatter { get; } =
44      PluginInfrastructure.ApplicationManager.Manager.GetInstances<IResultFormatter>();
45
46    private static IResultFormatter GetResultFormatter(string fullName) =>
47      ResultFormatter?.Where(x => x.GetType().FullName == fullName).Last();
48
49    private static string FetchResults(IOptimizer optimizer, IEnumerable<IResultJsonItem> configuredResultItems) {
50      JArray arr = new JArray();
51      IEnumerable<string> configuredResults = configuredResultItems.Select(x => x.Name);
52
53      foreach (var run in optimizer.Runs) {
54        JObject obj = new JObject();
55        arr.Add(obj);
56        obj.Add("Run", JToken.FromObject(run.ToString()));
57
58        // zip and filter the results with the ResultJsonItems
59        var filteredResults = new List<Tuple<IResultJsonItem, IItem>>();
60        foreach(var resultItem in configuredResultItems) {
61          foreach(var result in run.Results) {
62            if(resultItem.Name == result.Key) {
63              filteredResults.Add(Tuple.Create(resultItem, result.Value));
64            }
65          }
66        }
67
68        // add results to the JObject
69        foreach(var result in filteredResults) {
70          var formatter = GetResultFormatter(result.Item1.ResultFormatterType);
71          if(!obj.ContainsKey(result.Item1.Name)) // to prevent duplicates
72            obj.Add(result.Item1.Name, formatter.Format(result.Item2));
73        }
74      }
75      return SingleLineArrayJsonWriter.Serialize(arr);
76    }
77  }
78}
Note: See TracBrowser for help on using the repository browser.