Free cookie consent management tool by TermsFeed Policy Generator

Changeset 6668


Ignore:
Timestamp:
08/17/11 17:52:09 (13 years ago)
Author:
epitzer
Message:

Enable grouping before fuzzification (#1622)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Optimization/3.3/RunCollectionFuzzifier.cs

    r6665 r6668  
    3030      get { return (ValueParameter<DoubleValue>)Parameters["Spread"]; }
    3131    }
     32    public ValueParameter<StringValue> GroupByParameter {
     33      get { return (ValueParameter<StringValue>)Parameters["GroupBy"]; }
     34    }   
    3235    public ValueParameter<ItemList<StringValue>> LevelsParameter {
    3336      get { return (ValueParameter<ItemList<StringValue>>)Parameters["Levels"]; }
    34     }
     37    }   
    3538    #endregion
    3639
     
    3942    private string Suffix { get { return SuffixParameter.Value.Value; } }
    4043    private double Spread { get { return SpreadParameter.Value.Value; } }
     44    private string GroupBy { get { return GroupByParameter.Value.Value; } }
    4145    private List<string> Levels { get { return LevelsParameter.Value.Select(v => v.Value).ToList(); } }
    4246
     
    5256      Parameters.Add(new ValueParameter<StringValue>("Suffix", "The suffix of all fuzzified values.", new StringValue()));
    5357      Parameters.Add(new ValueParameter<DoubleValue>("Spread", "The number of standard deviations considered one additional level.", new DoubleValue(1)));
     58      Parameters.Add(new ValueParameter<StringValue>("GroupBy", "Create separate analyzes for different values of this variable.", new StringValue("")));
    5459      Parameters.Add(new ValueParameter<ItemList<StringValue>>("Levels", "The list of levels to be assigned.",
    5560        new ItemList<StringValue> {
     
    5964          new StringValue("High"),
    6065          new StringValue("Very High"),
    61         }));
     66        }));     
    6267      RegisterEvents();
    6368      UpdateName();
     
    7681      TargetParameter.ToStringChanged += Parameter_NameChanged;
    7782      SuffixParameter.ToStringChanged += Parameter_NameChanged;
     83      GroupByParameter.ToStringChanged += Parameter_NameChanged;
    7884    }
    7985
     
    8389
    8490    private void UpdateName() {
    85       name = string.Format("{0} := Fuzzy({1}) {2}", Target,Source, Suffix);
     91      name = string.Format("{0} := Fuzzy({1}) {3}",
     92        Target,
     93        Source,
     94        string.IsNullOrWhiteSpace(GroupBy) ? "" : string.Format("/{0}", GroupBy),
     95        Suffix);
    8696      OnNameChanged();
    8797    }
     
    90100
    91101    public void Modify(List<IRun> runs) {
    92       var values =
    93         (from run in runs
    94          select GetSourceValue(run) into value
    95          where value.HasValue
    96          select value.Value).ToList();
    97       if (values.Count == 0)
    98         return;
    99       var avg = values.Average();
    100       var stdDev = values.StandardDeviation();
    101       foreach (var run in runs) {
    102         double? value = GetSourceValue(run);
    103         if (value.HasValue) {
    104           run.Results[Target] = new StringValue(Fuzzify(value.Value, avg, stdDev));
     102      foreach (var group in runs
     103        .Select(r => new {Run=r, Value=GetSourceValue(r)})
     104        .Where(r => r.Value.HasValue && !double.IsNaN(r.Value.Value) && !double.IsInfinity(r.Value.Value))
     105        .Select(r => new {r.Run, r.Value.Value, Bin=GetGroupByValue(r.Run)})
     106        .GroupBy(r => r.Bin).ToList()) {
     107        var values = group.Select(r => r.Value).ToList();
     108        if (values.Count > 0) {
     109          var avg = values.Average();
     110          var stdDev = values.StandardDeviation();
     111          foreach (var r in group) {
     112            r.Run.Results[Target] = new StringValue(Fuzzify(r.Value, avg, stdDev));
     113          }
    105114        }
    106115      }     
     
    109118    private double? GetSourceValue(IRun run) {
    110119      return CastSourceValue(run.Results) ?? CastSourceValue(run.Parameters);
     120    }
     121
     122    private string GetGroupByValue(IRun run) {
     123      if (string.IsNullOrWhiteSpace(GroupBy))
     124        return String.Empty;
     125      IItem value;
     126      run.Results.TryGetValue(GroupBy, out value);
     127      if (value == null)
     128        run.Parameters.TryGetValue(GroupBy, out value);
     129      if (value != null)
     130        return value.ToString();
     131      else
     132        return String.Empty;
    111133    }
    112134
     
    129151      int index;
    130152      if (Levels.Count % 2 == 1) {
    131         index = (int) Math.Floor(Math.Abs(dev));       
    132         index = (Levels.Count - 1)/2 + Math.Sign(dev) * index;       
     153        index = (int) Math.Floor(Math.Abs(dev));
     154        index = (Levels.Count - 1)/2 + Math.Sign(dev) * index;
    133155      } else {
    134156        index = (int) Math.Ceiling(Math.Abs(dev));
     
    136158          index = Levels.Count/2 + index;
    137159        else
    138           index = Levels.Count/2 + 1 - index;       
    139       }           
     160          index = Levels.Count/2 + 1 - index;
     161      }
    140162      return Levels[Math.Min(Levels.Count - 1, Math.Max(0, index))];
    141163    }
Note: See TracChangeset for help on using the changeset viewer.