Changeset 15427 for trunk/sources/HeuristicLab.Problems.DataAnalysis
- Timestamp:
- 10/20/17 17:39:51 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/DatasetUtil.cs
r15013 r15427 23 23 using System.Collections; 24 24 using System.Collections.Generic; 25 using System.ComponentModel;26 25 using System.Linq; 27 using System.Text; 26 using System.Linq.Expressions; 27 using HeuristicLab.Common; 28 28 using HeuristicLab.Core; 29 29 using HeuristicLab.Random; 30 30 31 31 namespace HeuristicLab.Problems.DataAnalysis { 32 using ValuesType = Dictionary<string, IList>; 33 32 34 public static class DatasetUtil { 33 35 /// <summary> … … 57 59 } 58 60 return shuffled; 61 } 59 62 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; 60 122 } 61 123 }
Note: See TracChangeset
for help on using the changeset viewer.