Changeset 8331 for branches/ScatterSearch (trunk integration)/HeuristicLab.Operators/3.3/DataReducer.cs
- Timestamp:
- 07/26/12 09:51:13 (12 years ago)
- Location:
- branches/ScatterSearch (trunk integration)
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ScatterSearch (trunk integration)
- Property svn:ignore
-
old new 21 21 protoc.exe 22 22 _ReSharper.HeuristicLab 3.3 Tests 23 Google.ProtocolBuffers-2.4.1.473.dll
-
- Property svn:mergeinfo changed
- Property svn:ignore
-
branches/ScatterSearch (trunk integration)/HeuristicLab.Operators/3.3/DataReducer.cs
r7395 r8331 70 70 var values = ParameterToReduce.ActualValue; 71 71 if (values.Count() > 0) { 72 if (values.All(x => x.GetType() == typeof(IntValue))) { 73 List<IntValue> intValues = new List<IntValue>(); 74 values.ForEach(x => intValues.Add((IntValue)x)); 75 CalculateResult(intValues); 76 } else if (values.All(x => x.GetType() == typeof(DoubleValue))) { 77 List<DoubleValue> doubleValues = new List<DoubleValue>(); 78 values.ForEach(x => doubleValues.Add((DoubleValue)x)); 79 CalculateResult(doubleValues); 80 } else if (values.All(x => x.GetType() == typeof(TimeSpanValue))) { 81 List<TimeSpanValue> timeSpanValues = new List<TimeSpanValue>(); 82 values.ForEach(x => timeSpanValues.Add((TimeSpanValue)x)); 83 CalculateResult(timeSpanValues); 72 if (values.All(x => typeof(IntValue).IsAssignableFrom(x.GetType()))) { 73 CalculateResult(values.OfType<IntValue>().Select(x => x.Value), values.First().GetType()); 74 } else if (values.All(x => typeof(DoubleValue).IsAssignableFrom(x.GetType()))) { 75 CalculateResult(values.OfType<DoubleValue>().Select(x => x.Value), values.First().GetType()); 76 } else if (values.All(x => typeof(TimeSpanValue).IsAssignableFrom(x.GetType()))) { 77 CalculateResult(values.OfType<TimeSpanValue>().Select(x => x.Value), values.First().GetType()); 84 78 } else { 85 79 throw new ArgumentException(string.Format("Type {0} is not supported by the DataReducer.", values.First().GetType())); … … 89 83 } 90 84 91 private void CalculateResult(List<IntValue> values) { 92 int result = 1; 93 if (TargetParameter.ActualValue == null) TargetParameter.ActualValue = new IntValue(); 94 IntValue target = (IntValue)TargetParameter.ActualValue; 95 85 #region integer reduction 86 private void CalculateResult(IEnumerable<int> values, Type targetType) { 87 int result; 96 88 switch (ReductionOperation.Value.Value) { 97 89 case ReductionOperations.Sum: 98 result = values.Sum(x => x.Value); 99 break; 100 case ReductionOperations.Prod: 101 values.ForEach(x => result *= x.Value); 102 break; 103 case ReductionOperations.Avg: 104 result = (int)Math.Round(values.Average(x => x.Value)); 105 break; 106 case ReductionOperations.Min: 107 result = values.Min(x => x.Value); 108 break; 109 case ReductionOperations.Max: 110 result = values.Max(x => x.Value); 111 break; 112 default: 113 throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.Value.Value, result.GetType())); 114 } 115 90 result = values.Sum(); 91 break; 92 case ReductionOperations.Product: 93 result = values.Aggregate(1, (x, y) => x * y); 94 break; 95 case ReductionOperations.Count: 96 result = values.Count(); 97 break; 98 case ReductionOperations.Min: 99 result = values.Min(); 100 break; 101 case ReductionOperations.Max: 102 result = values.Max(); 103 break; 104 case ReductionOperations.Avg: 105 result = (int)Math.Round(values.Average()); 106 break; 107 case ReductionOperations.Assign: 108 result = values.Last(); 109 break; 110 default: 111 throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.Value.Value, targetType)); 112 } 113 114 IntValue target; 116 115 switch (TargetOperation.Value.Value) { 117 case ReductionOperations.Assign: 116 case ReductionOperations.Sum: 117 target = InitializeTarget<IntValue, int>(targetType, 0); 118 target.Value += result; 119 break; 120 case ReductionOperations.Product: 121 target = InitializeTarget<IntValue, int>(targetType, 1); 122 target.Value = target.Value * result; 123 break; 124 case ReductionOperations.Min: 125 target = InitializeTarget<IntValue, int>(targetType, int.MaxValue); 126 target.Value = Math.Min(target.Value, result); 127 break; 128 case ReductionOperations.Max: 129 target = InitializeTarget<IntValue, int>(targetType, int.MinValue); 130 target.Value = Math.Max(target.Value, result); 131 break; 132 case ReductionOperations.Avg: 133 target = InitializeTarget<IntValue, int>(targetType, result); 134 target.Value = (int)Math.Round((target.Value + result) / 2.0); 135 break; 136 case ReductionOperations.Assign: 137 target = InitializeTarget<IntValue, int>(targetType, 0); 118 138 target.Value = result; 119 139 break; 120 case ReductionOperations.Sum: 140 default: 141 throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.Value.Value, targetType)); 142 } 143 } 144 #endregion 145 #region double reduction 146 private void CalculateResult(IEnumerable<double> values, Type targetType) { 147 double result; 148 switch (ReductionOperation.Value.Value) { 149 case ReductionOperations.Sum: 150 result = values.Sum(); 151 break; 152 case ReductionOperations.Product: 153 result = values.Aggregate(1.0, (x, y) => x * y); 154 break; 155 case ReductionOperations.Count: 156 result = values.Count(); 157 break; 158 case ReductionOperations.Min: 159 result = values.Min(); 160 break; 161 case ReductionOperations.Max: 162 result = values.Max(); 163 break; 164 case ReductionOperations.Avg: 165 result = values.Average(); 166 break; 167 case ReductionOperations.Assign: 168 result = values.Last(); 169 break; 170 default: 171 throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.Value.Value, targetType)); 172 } 173 174 DoubleValue target; 175 switch (TargetOperation.Value.Value) { 176 case ReductionOperations.Sum: 177 target = InitializeTarget<DoubleValue, double>(targetType, 0.0); 121 178 target.Value += result; 122 179 break; 123 case ReductionOperations.Prod: 124 if (target.Value == 0) target.Value = 1; 125 target.Value *= result; 126 break; 127 default: 128 throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.Value.Value, result.GetType())); 129 } 130 } 131 132 private void CalculateResult(List<DoubleValue> values) { 133 double result = 1.0; 134 if (TargetParameter.ActualValue == null) TargetParameter.ActualValue = new DoubleValue(); 135 DoubleValue target = (DoubleValue)TargetParameter.ActualValue; 136 180 case ReductionOperations.Product: 181 target = InitializeTarget<DoubleValue, double>(targetType, 1.0); 182 target.Value = target.Value * result; 183 break; 184 case ReductionOperations.Min: 185 target = InitializeTarget<DoubleValue, double>(targetType, double.MaxValue); 186 target.Value = Math.Min(target.Value, result); 187 break; 188 case ReductionOperations.Max: 189 target = InitializeTarget<DoubleValue, double>(targetType, double.MinValue); 190 target.Value = Math.Max(target.Value, result); 191 break; 192 case ReductionOperations.Avg: 193 target = InitializeTarget<DoubleValue, double>(targetType, result); 194 target.Value = (target.Value + result) / 2.0; 195 break; 196 case ReductionOperations.Assign: 197 target = InitializeTarget<DoubleValue, double>(targetType, 0.0); 198 target.Value = result; 199 break; 200 default: 201 throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.Value.Value, targetType)); 202 } 203 } 204 #endregion 205 #region TimeSpan reduction 206 private void CalculateResult(IEnumerable<TimeSpan> values, Type targetType) { 207 TimeSpan result; 137 208 switch (ReductionOperation.Value.Value) { 138 209 case ReductionOperations.Sum: 139 result = values.Sum(x => x.Value); 140 break; 141 case ReductionOperations.Prod: 142 values.ForEach(x => result *= x.Value); 143 break; 144 case ReductionOperations.Avg: 145 result = values.Average(x => x.Value); 146 break; 147 case ReductionOperations.Min: 148 result = values.Min(x => x.Value); 149 break; 150 case ReductionOperations.Max: 151 result = values.Max(x => x.Value); 152 break; 153 default: 154 throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.Value.Value, result.GetType())); 155 } 156 210 result = values.Aggregate(new TimeSpan(), (x, y) => x + y); 211 break; 212 case ReductionOperations.Min: 213 result = values.Min(); 214 break; 215 case ReductionOperations.Max: 216 result = values.Max(); 217 break; 218 case ReductionOperations.Avg: 219 result = TimeSpan.FromMilliseconds(values.Average(x => x.TotalMilliseconds)); 220 break; 221 case ReductionOperations.Assign: 222 result = values.Last(); 223 break; 224 default: 225 throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.Value.Value, targetType)); 226 } 227 228 TimeSpanValue target; 157 229 switch (TargetOperation.Value.Value) { 158 case ReductionOperations.Assign: 230 case ReductionOperations.Sum: 231 target = InitializeTarget<TimeSpanValue, TimeSpan>(targetType, new TimeSpan()); 232 target.Value += result; 233 break; 234 case ReductionOperations.Min: 235 target = InitializeTarget<TimeSpanValue, TimeSpan>(targetType, TimeSpan.MaxValue); 236 target.Value = target.Value < result ? target.Value : result; 237 break; 238 case ReductionOperations.Max: 239 target = InitializeTarget<TimeSpanValue, TimeSpan>(targetType, TimeSpan.MinValue); 240 target.Value = target.Value > result ? target.Value : result; 241 break; 242 case ReductionOperations.Avg: 243 target = InitializeTarget<TimeSpanValue, TimeSpan>(targetType, result); 244 target.Value = TimeSpan.FromMilliseconds((target.Value.TotalMilliseconds + result.TotalMilliseconds) / 2); 245 break; 246 case ReductionOperations.Assign: 247 target = InitializeTarget<TimeSpanValue, TimeSpan>(targetType, new TimeSpan()); 159 248 target.Value = result; 160 249 break; 161 case ReductionOperations.Sum: 162 target.Value += result; 163 break; 164 case ReductionOperations.Prod: 165 if (target.Value == 0.0) target.Value = 1.0; 166 target.Value *= result; 167 break; 168 default: 169 throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.Value.Value, result.GetType())); 170 } 171 } 172 173 private void CalculateResult(List<TimeSpanValue> values) { 174 TimeSpan result = TimeSpan.Zero; 175 if (TargetParameter.ActualValue == null) TargetParameter.ActualValue = new TimeSpanValue(); 176 TimeSpanValue target = (TimeSpanValue)TargetParameter.ActualValue; 177 178 switch (ReductionOperation.Value.Value) { 179 case ReductionOperations.Sum: 180 values.ForEach(x => result = result.Add(x.Value)); 181 break; 182 case ReductionOperations.Avg: 183 double avg = values.Average(x => x.Value.TotalMilliseconds); 184 result = TimeSpan.FromMilliseconds(avg); 185 break; 186 case ReductionOperations.Min: 187 result = values.Min(x => x.Value); 188 break; 189 case ReductionOperations.Max: 190 result = values.Max(x => x.Value); 191 break; 192 default: 193 throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.Value.Value, result.GetType())); 194 } 195 196 switch (TargetOperation.Value.Value) { 197 case ReductionOperations.Assign: 198 target.Value = result; 199 break; 200 case ReductionOperations.Sum: 201 target.Value += result; 202 break; 203 default: 204 throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.Value.Value, result.GetType())); 205 } 206 } 250 default: 251 throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.Value.Value, targetType)); 252 } 253 } 254 #endregion 255 256 #region helpers 257 private T1 InitializeTarget<T1, T2>(Type targetType, T2 initialValue) 258 where T1 : ValueTypeValue<T2> 259 where T2 : struct { 260 T1 target = (T1)TargetParameter.ActualValue; 261 if (target == null) { 262 target = (T1)Activator.CreateInstance(targetType); 263 TargetParameter.ActualValue = target; 264 target.Value = initialValue; 265 } 266 return target; 267 } 268 #endregion 207 269 } 208 270 }
Note: See TracChangeset
for help on using the changeset viewer.