Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/20/17 17:39:51 (7 years ago)
Author:
bburlacu
Message:

#2848: Factor out functionality into static methods inside DatasetUtil.cs and adjust menu item code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/DatasetUtil.cs

    r15013 r15427  
    2323using System.Collections;
    2424using System.Collections.Generic;
    25 using System.ComponentModel;
    2625using System.Linq;
    27 using System.Text;
     26using System.Linq.Expressions;
     27using HeuristicLab.Common;
    2828using HeuristicLab.Core;
    2929using HeuristicLab.Random;
    3030
    3131namespace HeuristicLab.Problems.DataAnalysis {
     32  using ValuesType = Dictionary<string, IList>;
     33
    3234  public static class DatasetUtil {
    3335    /// <summary>
     
    5759      }
    5860      return shuffled;
     61    }
    5962
     63    private static readonly Action<Dataset, ValuesType> setValues;
     64    private static readonly Func<Dataset, ValuesType> getValues;
     65    static DatasetUtil() {
     66      var dataset = Expression.Parameter(typeof(Dataset));
     67      var variableValues = Expression.Parameter(typeof(ValuesType));
     68      var valuesExpression = Expression.Field(dataset, "variableValues");
     69      var assignExpression = Expression.Assign(valuesExpression, variableValues);
     70
     71      var variableValuesSetExpression = Expression.Lambda<Action<Dataset, ValuesType>>(assignExpression, dataset, variableValues);
     72      setValues = variableValuesSetExpression.Compile();
     73
     74      var variableValuesGetExpression = Expression.Lambda<Func<Dataset, ValuesType>>(valuesExpression, dataset);
     75      getValues = variableValuesGetExpression.Compile();
     76    }
     77
     78    public static void RemoveDuplicateDatasets(IContent content) {
     79      var variableValuesMapping = new Dictionary<ValuesType, ValuesType>();
     80
     81      foreach (var problemData in content.GetObjectGraphObjects(excludeStaticMembers: true).OfType<IDataAnalysisProblemData>()) {
     82        var dataset = problemData.Dataset as Dataset;
     83        if (dataset == null) continue;
     84
     85        var originalValues = getValues(dataset);
     86
     87        ValuesType matchingValues;
     88
     89        variableValuesMapping.GetEqualValues(originalValues, out matchingValues);
     90
     91        setValues(dataset, matchingValues);
     92      }
     93    }
     94
     95    private static bool GetEqualValues(this Dictionary<ValuesType, ValuesType> variableValuesMapping, ValuesType originalValues, out ValuesType matchingValues) {
     96      if (variableValuesMapping.ContainsKey(originalValues)) {
     97        matchingValues = variableValuesMapping[originalValues];
     98        return true;
     99      }
     100      matchingValues = variableValuesMapping.FirstOrDefault(kv => kv.Key == kv.Value && EqualVariableValues(originalValues, kv.Key)).Key;
     101      bool result = true;
     102      if (matchingValues == null) {
     103        matchingValues = originalValues;
     104        result = false;
     105      }
     106      variableValuesMapping[originalValues] = matchingValues;
     107      return result;
     108    }
     109
     110    private static bool EqualVariableValues(ValuesType values1, ValuesType values2) {
     111      //compare variable names for equality
     112      if (!values1.Keys.SequenceEqual(values2.Keys)) return false;
     113      foreach (var key in values1.Keys) {
     114        var v1 = values1[key];
     115        var v2 = values2[key];
     116        if (v1.Count != v2.Count) return false;
     117        for (int i = 0; i < v1.Count; i++) {
     118          if (!v1[i].Equals(v2[i])) return false;
     119        }
     120      }
     121      return true;
    60122    }
    61123  }
Note: See TracChangeset for help on using the changeset viewer.