Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Parser/IntervalConstraintsParser.cs @ 16587

Last change on this file since 16587 was 16587, checked in by chaider, 5 years ago

#2971

  • Added TextValueView
  • Added IntervalConstraint Parser

This two classes will be moved to another plugin

File size: 3.5 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Linq;
5using System.Text;
6using System.Text.RegularExpressions;
7using System.Threading.Tasks;
8using HeuristicLab.Optimization;
9
10namespace HeuristicLab.Problems.DataAnalysis {
11  public class IntervalConstraintsParser {
12    public IntervalConstraintsParser() {}
13    private List<IntervalConstraint> intervalConstraints = new List<IntervalConstraint>();
14    public List<IntervalConstraint> Parse(string input) {
15      var options = RegexOptions.Multiline | RegexOptions.IgnoreCase;
16      var matches = Regex.Matches(input, @"^(.*)\bin\b\s*([\[\]])(.*[^\s])(\s*\.\.\s*)([^\s].*)([\[\]])\r?$", options);
17
18      for (var i = 0; i < matches.Count; ++i) {
19        if (matches[i].Groups.Count == 7) {
20          var intervalConstraint = new IntervalConstraint();
21          //pattern 1 = defintion
22          var definition = Regex.Replace(matches[i].Groups[1].Value, @"\s *", "");
23          if (Regex.IsMatch(definition, @"\/")) {
24            var splitted = Regex.Split(definition.ToLower().Replace(" ", string.Empty), @"\/");
25            var match = Regex.Match(splitted[0], @"([d∂])([0-9]|[²³])?(.*[^\s*])");
26            if (match.Success) {
27              intervalConstraint.NumberOfDerivation = match.Groups[2].Success ? ParseDerivationCount(match.Groups[2].Value) : 1;
28              intervalConstraint.Definition = match.Groups[3].Value;
29              intervalConstraint.IsDerivation = true;
30              var formulation = Regex.Match(splitted[1], @"([d∂])(.*[^\s*][^²³])([²³])?");
31              if (formulation.Success) {
32                intervalConstraint.Variable = formulation.Groups[2].Success ? formulation.Groups[2].Value : "";
33              }
34            } else {
35              throw new ArgumentException($"An error occured in the derivation part: {splitted[0]}");
36            }
37          } else {
38            intervalConstraint.Definition = Regex.Match(definition, @".*[^.\s]*").Value;
39            intervalConstraint.IsDerivation = false;
40          }     
41          intervalConstraint.InclusiveLowerBound = (matches[i].Groups[2].Value == "[");
42          intervalConstraint.InclusiveUpperBound = (matches[i].Groups[6].Value == "]");
43          intervalConstraint.Interval = new Interval(ParseIntervalBounds(matches[i].Groups[3].Value.Replace(" ", string.Empty)),
44            ParseIntervalBounds(matches[i].Groups[5].Value.Replace(" ", string.Empty)));
45
46          intervalConstraints.Add(intervalConstraint);
47        } else {
48          throw new ArgumentException($"The given constraint: {matches[i].Value} is not valid.");
49        }
50      }
51
52      return intervalConstraints;
53    }
54
55    private static double ParseIntervalBounds(string input) {
56      input = input.ToLower();
57      switch (input) {
58        case "+inf.":
59        case "inf.":
60          return double.PositiveInfinity;
61        case "-inf.":
62          return double.NegativeInfinity;
63        default: {
64          if (double.TryParse(input, out var value)) {
65            return value;
66          } else {
67            throw new ArgumentException("The given Interval in the constraint is not valid.");
68          }
69        }
70      }
71    }
72
73    private static int ParseDerivationCount(string input) {
74      switch (input) {
75        case "²":
76          return 2;
77        case "³":
78          return 3;
79        default:
80          int.TryParse(input, out var value);
81          return value;
82      }
83    }
84  }
85}
Note: See TracBrowser for help on using the repository browser.