Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/27/20 10:45:57 (4 years ago)
Author:
dpiringe
Message:

#3073

  • added a weight property for constraints (to have a weight multiplier for errors) in IntervalConstraint
  • modified IntervalConstraintsParser to detect weights
Location:
branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalConstraint.cs

    r17723 r17728  
    130130    }
    131131
     132    [Storable]
     133    private double weight = 1.0;
     134    public double Weight
     135    {
     136      get => weight;
     137      set
     138      {
     139        if(weight != value)
     140        {
     141          weight = value;
     142          UpdateExpression();
     143          OnChanged();
     144        }
     145      }
     146    }
     147
    132148    [StorableConstructor]
    133149    private IntervalConstraint(StorableConstructorFlag _) : base(_) { }
    134150
    135151    public IntervalConstraint(string   expression, string variable, string target, int numberOfDerivations,
    136                               Interval interval,   bool  enabled)
     152                              Interval interval, double weight, bool enabled)
    137153      : this(expression, variable, target, numberOfDerivations,
    138              interval, new Dictionary<string, Interval>(), enabled) { }
     154             interval, new Dictionary<string, Interval>(), weight, enabled) { }
    139155
    140156    public IntervalConstraint(string expression, string variable, string target, int numberOfDerivations,
    141                               Interval interval, IDictionary<string, Interval> regions, bool enabled)
     157                              Interval interval, IDictionary<string, Interval> regions, double weight, bool enabled)
    142158    {
    143159      this.expression = expression;
     
    147163      this.interval = interval;
    148164      this.regions = regions;
     165      this.weight = weight;
    149166      this.enabled = enabled;
    150167    }
  • branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalConstraintsParser.cs

    r17723 r17728  
    4646          var targetConstraint = trimmedLine.Substring(start, end - start);
    4747
    48           var match = 
     48          var match =
    4949          Regex.Match(targetConstraint,
    5050                        @"(['](.*)[']|(.*[^\s]))" +
     
    6262                          @"(\S*)\s*" + // 15: region upper bound
    6363                          @"([)])" +
    64                         @")*");
     64                        @")*" +
     65                        @"\s*(<(\S*)>)?"); // 17, 18
     66
    6567         
    6668          if (match.Success) {
    67             if (match.Groups.Count < 9) throw new ArgumentException("The target-constraint is not complete.", line);
     69            if (match.Groups.Count < 19) throw new ArgumentException("The target-constraint is not complete.", line);
    6870
    6971            var targetVariable = match.Groups[1].Value.Trim();
     
    8486            var numberOfDerivation = 0;
    8587            var interval           = new Interval(lowerBound, upperBound);
     88            var weight = 1.0;
     89
     90            if (match.Groups[18].Success && !string.IsNullOrWhiteSpace(match.Groups[18].Value))
     91              weight = ParseWeight(match.Groups[18].Value);
    8692
    8793            if (match.Groups[10].Success)
     
    96102                pairs.Add(inputVar, new Interval(regionLb, regionUb));
    97103              }
    98               yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, pairs, isEnabled);
     104              yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, pairs, weight, isEnabled);
    99105            }
    100106            else
    101             {
    102               yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, isEnabled);
    103             }
     107              yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, weight, isEnabled);
    104108          }
    105           else {
     109          else
    106110            throw new ArgumentException("The inserted target constraint is not valid.", line);
    107           }
    108111
    109112          //Check for derivation
     
    130133                                      @"(\S*)\s*" + // 22: region upper bound
    131134                                      @"([)])" +
    132                                     @")*");
     135                                    @")*" +
     136                                    @"\s*(<(\S*)>)?"); // 24, 25
    133137
    134138          if (match.Success) {
    135             if (match.Groups.Count < 24)
     139            if (match.Groups.Count < 26)
    136140              throw new ArgumentException("The given derivation-constraint is not complete.", line);
    137141
     
    169173            var numberOfDerivation = ParseDerivationCount(match.Groups[2].Value.Trim());
    170174            var interval           = new Interval(lowerBound, upperBound);
     175            var weight             = 1.0;
     176
     177            if(match.Groups[25].Success && !string.IsNullOrWhiteSpace(match.Groups[25].Value))
     178              weight = ParseWeight(match.Groups[25].Value);
    171179
    172180            if(match.Groups[17].Success)
     
    181189                pairs.Add(inputVar, new Interval(regionLb, regionUb));
    182190              }
    183               yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, pairs, isEnabled);
    184             } else {
    185               yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, isEnabled);
    186             }
     191              yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, pairs, weight, isEnabled);
     192            } else
     193              yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, weight, isEnabled);
    187194          }
    188           else {
     195          else
    189196            throw new ArgumentException("The inserted derivation constraint is not valid.", line);
    190           }
    191197
    192198          //Check for comment
     
    219225    }
    220226
     227    private static double ParseWeight(string input)
     228    {
     229      if (double.TryParse(input, NumberStyles.Any, CultureInfo.InvariantCulture, out var value))
     230        return value;
     231      throw new ArgumentException("The given weight is not a double value!");
     232    }
     233
    221234    private static int ParseDerivationCount(string input) {
    222235      switch (input) {
Note: See TracChangeset for help on using the changeset viewer.