Changeset 4938 for branches/DataAnalysis.PopulationDiversityAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers
- Timestamp:
- 11/25/10 21:41:07 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DataAnalysis.PopulationDiversityAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/FineGrainedStructuralPopulationDiversityAnalyzer.cs
r4934 r4938 44 44 public sealed class FineGrainedStructuralPopulationDiversityAnalyzer : SymbolicRegressionPopulationDiversityAnalyzer { 45 45 46 // properties: min level delts, max level delta, etc. 47 48 private const string FunctionTreeGrammarParameterName = "FunctionTreeGrammar"; 49 50 public IValueLookupParameter<GlobalSymbolicExpressionGrammar> FunctionTreeGrammarParameter { 51 get { return (IValueLookupParameter<GlobalSymbolicExpressionGrammar>)Parameters[FunctionTreeGrammarParameterName]; } 52 } 53 public GlobalSymbolicExpressionGrammar FunctionTreeGrammar { 54 get { return FunctionTreeGrammarParameter.ActualValue; } 55 } 56 57 46 58 [StorableConstructor] 47 59 private FineGrainedStructuralPopulationDiversityAnalyzer(bool deserializing) : base(deserializing) { } 48 60 private FineGrainedStructuralPopulationDiversityAnalyzer(FineGrainedStructuralPopulationDiversityAnalyzer original, Cloner cloner) : base(original, cloner) { } 49 public FineGrainedStructuralPopulationDiversityAnalyzer() : base() { } 61 public FineGrainedStructuralPopulationDiversityAnalyzer() : base() { 62 Parameters.Add(new ValueLookupParameter<GlobalSymbolicExpressionGrammar>(FunctionTreeGrammarParameterName, "The grammar that is used for symbolic regression models.")); 63 } 50 64 51 65 public override IDeepCloneable Clone(Cloner cloner) { … … 54 68 55 69 protected override double[,] CalculateSimilarities(SymbolicExpressionTree[] solutions) { 70 Constant c = null; 71 foreach (Symbol symbol in FunctionTreeGrammar.Symbols) { 72 if (symbol is Constant) { 73 if (c != null) throw new InvalidProgramException("There are more and one constnat definitions in the given function tree grammar."); 74 c = (Constant)symbol; 75 } 76 } 56 77 int n = solutions.Length; 57 78 List<string> variableNames = new List<string>(); … … 62 83 IList<GeneticInformationItem>[] geneticInformationItemsList = new List<GeneticInformationItem>[n]; 63 84 for (int i = 0; i < n; i++) { 64 geneticInformationItemsList[i] = GeneticInformationItem.getGeneticInformationItems(solutions[i].Root, variableNames, 1, 5);85 geneticInformationItemsList[i] = GeneticInformationItem.getGeneticInformationItems(solutions[i].Root, variableNames, 0, int.MaxValue); 65 86 } 66 87 double[,] result = new double[n, n]; … … 101 122 } 102 123 103 // not used in HL 3.3104 // private double myAncestorCoefficient;105 // public double AncestorCoefficient {106 // get { return myAncestorCoefficient; }107 // }108 109 // not used in HL 3.3110 // private double myAncestorVariableIndex;111 // public double AncestorVariableIndex {112 // get { return myAncestorVariableIndex; }113 // }114 115 // not used in HL 3.3116 // private int myAncestorTimeOffset;117 // public int AncestorTimeOffset {118 // get { return myAncestorTimeOffset; }119 // }120 121 // not used in HL 3.3122 // private int myAncestorVariant;123 // public int AncestorVariant {124 // get { return myAncestorVariant; }125 // }126 127 124 private double myDescendantCoefficient; 128 125 public double DescendantCoefficient { … … 153 150 get { return (myDescendantLevel - myAncestorLevel); } 154 151 } 155 156 // not used in HL 3.3157 //private int myDescendantVariant;158 //public int DescendantVariant {159 // get { return myDescendantVariant; }160 //}161 152 162 153 /* … … 181 172 }*/ 182 173 183 /*184 174 public static double Similarity(GeneticInformationItem Item1, GeneticInformationItem Item2, 185 StructuralSimilarityAnalysisParameters Parameters, 186 int MaxTreeHeight, int MaxTimeOffset) { 187 188 if (Item1.AncestorDefinition != Item2.AncestorDefinition || 189 Item1.DescendantDefinition != Item2.DescendantDefinition) 175 GlobalSymbolicExpressionGrammar ExpressionGrammar, double ConstantMinimum, double ConstantMaximum, double VariableWeightSigma, 176 int MaximumTreeHeight, int MaximumTimeOffset, 177 // StructuralSimilarityAnalysisParameters Parameters, 178 double LevelDifferenceCoefficient, 179 double AncestorIndexCoefficient, 180 double ConstantValueCoefficient, 181 double VariableWeightCoefficient, 182 double TimeOffsetCoefficient, 183 double VariableIndexCoefficient, 184 bool AdditiveSimilarityCalculation 185 ) { 186 187 if (Item1.AncestorDefinition != Item2.AncestorDefinition || Item1.DescendantDefinition != Item2.DescendantDefinition) 190 188 return double.NaN; 191 189 192 190 // the two items for sure have the same behavior definitions 193 #region init 191 192 #region initialize punishments 193 194 194 double punishmentContributionSum = 0; 195 195 double punishmentCoefficientsProduct = 1; 196 double ancestorCoefficientDifferencePunishment = 0; 197 double ancestorTimeOffsetDifferencePunishment = 0; 198 double ancestorVariantDifferencePunishment = 0; 199 double ancestorVariableIndexDifferencePunishment = 0; 200 double descendantCoefficientDifferencePunishment = 0; 201 double descendantTimeOffsetDifferencePunishment = 0; 202 double descendantVariantDifferencePunishment = 0; 203 double descendantVariableIndexDifferencePunishment = 0; 196 204 197 double ancestorIndexDifferencePunishment = 0; 205 198 double levelDifferencePunishment = 0; 199 200 double descendantConstantValueDifferencePunishment = 0; 201 double descendantVariableWeightDifferencePunishment = 0; 202 double descendantTimeOffsetDifferencePunishment = 0; 203 double descendantVariableIndexDifferencePunishment = 0; 204 206 205 #endregion 207 206 208 ITerminalDefinition ancestorTerminal = Item1.AncestorDefinition as ITerminalDefinition; 209 ITerminalDefinition descendantTerminal = Item1.DescendantDefinition as ITerminalDefinition; 210 IFunctionDefinition ancestorFunction = Item1.AncestorDefinition as IFunctionDefinition; 211 IFunctionDefinition descendantFunction = Item1.DescendantDefinition as IFunctionDefinition; 212 213 if (Parameters.ConsiderLevelDifference) { 207 if (LevelDifferenceCoefficient > 0) { 214 208 levelDifferencePunishment = Item1.LevelDelta - Item2.LevelDelta; 215 209 if (levelDifferencePunishment < 0) 216 210 levelDifferencePunishment = -levelDifferencePunishment; 217 levelDifferencePunishment /= Max TreeHeight;211 levelDifferencePunishment /= MaximumTreeHeight; 218 212 if (levelDifferencePunishment > 1) 219 213 levelDifferencePunishment = 1; 220 levelDifferencePunishment *= Parameters.LevelDifferenceCoefficient;221 punishmentContributionSum += Parameters.LevelDifferenceCoefficient;222 punishmentCoefficientsProduct *= (1 - Parameters.LevelDifferenceCoefficient);223 } 224 if ( Parameters.ConsiderAncestorIndex) {214 levelDifferencePunishment *= LevelDifferenceCoefficient; 215 punishmentContributionSum += LevelDifferenceCoefficient; 216 punishmentCoefficientsProduct *= (1 - LevelDifferenceCoefficient); 217 } 218 if (AncestorIndexCoefficient > 0) { 225 219 if (Item1.AncestorIndex != Item2.AncestorIndex) 226 220 ancestorIndexDifferencePunishment = 1; 227 221 else 228 222 ancestorIndexDifferencePunishment = 0; 229 ancestorIndexDifferencePunishment *= Parameters.AncestorIndexCoefficient; 230 punishmentContributionSum += Parameters.AncestorIndexCoefficient; 231 punishmentCoefficientsProduct *= (1 - Parameters.AncestorIndexCoefficient); 232 } 233 234 if (Item1.AncestorDefinition is ITerminalDefinition) { 235 if (Parameters.ConsiderCoefficient) { 236 double coefficientDifference = Math.Abs(Item1.myAncestorCoefficient - Item2.myAncestorCoefficient); 237 if (ancestorTerminal.Parametrization.CoefficientIsGaussian) 238 ancestorCoefficientDifferencePunishment = (coefficientDifference / (ancestorTerminal.Parametrization.CoefficientSigma * 4)); 239 else 240 ancestorCoefficientDifferencePunishment = (coefficientDifference / (ancestorTerminal.Parametrization.CoefficientMaxValue - ancestorTerminal.Parametrization.CoefficientMinValue)); 241 if (ancestorCoefficientDifferencePunishment > 1) 242 ancestorCoefficientDifferencePunishment = 1; 243 ancestorCoefficientDifferencePunishment *= Parameters.CoefficientCoefficient; 244 punishmentContributionSum += Parameters.CoefficientCoefficient; 245 punishmentCoefficientsProduct *= (1 - Parameters.CoefficientCoefficient); 246 } 247 if (Parameters.ConsiderTimeOffset) { 248 double timeOffsetDifference = Math.Abs(Item1.AncestorTimeOffset - Item2.AncestorTimeOffset); 249 if (MaxTimeOffset > 0) 250 ancestorTimeOffsetDifferencePunishment = timeOffsetDifference / MaxTimeOffset; 251 ancestorTimeOffsetDifferencePunishment *= Parameters.TimeOffsetCoefficient; 252 punishmentContributionSum += Parameters.TimeOffsetCoefficient; 253 punishmentCoefficientsProduct *= (1 - Parameters.TimeOffsetCoefficient); 254 } 255 if (Parameters.ConsiderVariableIndex) { 256 if (Item1.AncestorVariableIndex != Item2.AncestorVariableIndex) 257 ancestorVariableIndexDifferencePunishment = 1; 258 else 259 ancestorVariableIndexDifferencePunishment = 0; 260 ancestorVariableIndexDifferencePunishment *= Parameters.VariableIndexCoefficient; 261 punishmentContributionSum += Parameters.VariableIndexCoefficient; 262 punishmentCoefficientsProduct *= (1 - Parameters.VariableIndexCoefficient); 263 } 264 } else { 265 if (Parameters.ConsiderVariant) { 266 if (Item1.AncestorVariant != Item2.AncestorVariant) 267 ancestorVariantDifferencePunishment = 1; 268 else 269 ancestorVariantDifferencePunishment = 0; 270 ancestorVariantDifferencePunishment *= Parameters.VariantCoefficient; 271 punishmentContributionSum += Parameters.VariantCoefficient; 272 punishmentCoefficientsProduct *= (1 - Parameters.VariantCoefficient); 273 } 274 } 275 276 if (Item1.DescendantDefinition is ITerminalDefinition) { 277 if (Parameters.ConsiderCoefficient) { 278 double coefficientDifference = Math.Abs(Item1.myDescendantCoefficient - Item2.myDescendantCoefficient); 279 if (descendantTerminal.Parametrization.CoefficientIsGaussian) 280 descendantCoefficientDifferencePunishment = (coefficientDifference / (descendantTerminal.Parametrization.CoefficientSigma * 4)); 281 else 282 descendantCoefficientDifferencePunishment = (coefficientDifference / (descendantTerminal.Parametrization.CoefficientMaxValue - descendantTerminal.Parametrization.CoefficientMinValue)); 283 if (descendantCoefficientDifferencePunishment > 1) 284 descendantCoefficientDifferencePunishment = 1; 285 descendantCoefficientDifferencePunishment *= Parameters.CoefficientCoefficient; 286 punishmentContributionSum += Parameters.CoefficientCoefficient; 287 punishmentCoefficientsProduct *= (1 - Parameters.CoefficientCoefficient); 288 } 289 if (Parameters.ConsiderTimeOffset) { 223 ancestorIndexDifferencePunishment *= AncestorIndexCoefficient; 224 punishmentContributionSum += AncestorIndexCoefficient; 225 punishmentCoefficientsProduct *= (1 - AncestorIndexCoefficient); 226 } 227 228 if (Item1.DescendantTreeNode is ConstantTreeNode) { 229 if (ConstantValueCoefficient > 0) { 230 double constantValueCoefficientDifference = Math.Abs(Item1.DescendantCoefficient - Item2.DescendantCoefficient); 231 // assume uniform distribution within given minimum and maximum 232 descendantConstantValueDifferencePunishment = (constantValueCoefficientDifference / (ConstantMaximum - ConstantMinimum)); 233 if (descendantConstantValueDifferencePunishment > 1) 234 descendantConstantValueDifferencePunishment = 1; 235 descendantConstantValueDifferencePunishment *= ConstantValueCoefficient; 236 punishmentContributionSum += ConstantValueCoefficient; 237 punishmentCoefficientsProduct *= (1 - ConstantValueCoefficient); 238 } 239 } 240 if(Item1.DescendantTreeNode is VariableTreeNode) { 241 if (VariableWeightCoefficient > 0) { 242 double variableWeightDifference = Math.Abs(Item1.DescendantCoefficient - Item2.DescendantCoefficient); 243 // assume normal distribution within given sigma 244 descendantVariableWeightDifferencePunishment = variableWeightDifference / (VariableWeightSigma * 4); 245 if (descendantVariableWeightDifferencePunishment > 1) 246 descendantVariableWeightDifferencePunishment = 1; 247 descendantVariableWeightDifferencePunishment *= VariableWeightCoefficient; 248 punishmentContributionSum += VariableWeightCoefficient; 249 punishmentCoefficientsProduct *= (1 - VariableWeightCoefficient); 250 } 251 if (TimeOffsetCoefficient > 0) { 290 252 double timeOffsetDifference = Math.Abs(Item1.DescendantTimeOffset - Item2.DescendantTimeOffset); 291 if (Max TimeOffset > 0)292 descendantTimeOffsetDifferencePunishment = timeOffsetDifference / Max TimeOffset;293 descendantTimeOffsetDifferencePunishment *= Parameters.TimeOffsetCoefficient;294 punishmentContributionSum += Parameters.TimeOffsetCoefficient;295 punishmentCoefficientsProduct *= (1 - Parameters.TimeOffsetCoefficient);296 } 297 if ( Parameters.ConsiderVariableIndex) {253 if (MaximumTimeOffset > 0) 254 descendantTimeOffsetDifferencePunishment = timeOffsetDifference / MaximumTimeOffset; 255 descendantTimeOffsetDifferencePunishment *= TimeOffsetCoefficient; 256 punishmentContributionSum += TimeOffsetCoefficient; 257 punishmentCoefficientsProduct *= (1 - TimeOffsetCoefficient); 258 } 259 if (VariableIndexCoefficient > 0) { 298 260 if (Item1.DescendantVariableIndex != Item2.DescendantVariableIndex) 299 261 descendantVariableIndexDifferencePunishment = 1; 300 262 else 301 263 descendantVariableIndexDifferencePunishment = 0; 302 descendantVariableIndexDifferencePunishment *= Parameters.VariableIndexCoefficient; 303 punishmentContributionSum += Parameters.VariableIndexCoefficient; 304 punishmentCoefficientsProduct *= (1 - Parameters.VariableIndexCoefficient); 305 } 306 } else { 307 if (Parameters.ConsiderVariant) { 308 if (Item1.DescendantVariant != Item2.DescendantVariant) 309 descendantVariantDifferencePunishment = 1; 310 else 311 descendantVariantDifferencePunishment = 0; 312 descendantVariantDifferencePunishment *= Parameters.VariantCoefficient; 313 punishmentContributionSum += Parameters.VariantCoefficient; 314 punishmentCoefficientsProduct *= (1 - Parameters.VariantCoefficient); 264 descendantVariableIndexDifferencePunishment *= VariableIndexCoefficient; 265 punishmentContributionSum += VariableIndexCoefficient; 266 punishmentCoefficientsProduct *= (1 - VariableIndexCoefficient); 315 267 } 316 268 } … … 318 270 double result; 319 271 320 if (Parameters.AdditiveSimilarityCalculation) { 321 double punishmentsSum = 322 ancestorCoefficientDifferencePunishment + ancestorTimeOffsetDifferencePunishment + 323 ancestorVariantDifferencePunishment + ancestorVariableIndexDifferencePunishment + 324 descendantCoefficientDifferencePunishment + descendantTimeOffsetDifferencePunishment + 325 descendantVariantDifferencePunishment + descendantVariableIndexDifferencePunishment + 326 ancestorIndexDifferencePunishment + levelDifferencePunishment; 272 if (AdditiveSimilarityCalculation) { 273 double punishmentsSum = ancestorIndexDifferencePunishment + levelDifferencePunishment + 274 descendantConstantValueDifferencePunishment + descendantVariableWeightDifferencePunishment + 275 descendantTimeOffsetDifferencePunishment + descendantVariableIndexDifferencePunishment; 327 276 result = (1 - punishmentsSum / punishmentContributionSum); 328 277 } else { 329 278 result = 330 (1 - ancestorCoefficientDifferencePunishment) * 331 (1 - ancestorTimeOffsetDifferencePunishment) * 332 (1 - ancestorVariantDifferencePunishment) * 333 (1 - ancestorVariableIndexDifferencePunishment) * 334 (1 - descendantCoefficientDifferencePunishment) * 279 (1 - ancestorIndexDifferencePunishment) * 280 (1 - levelDifferencePunishment) * 281 (1 - descendantConstantValueDifferencePunishment) * 282 (1 - descendantVariableWeightDifferencePunishment) * 335 283 (1 - descendantTimeOffsetDifferencePunishment) * 336 (1 - descendantVariantDifferencePunishment) * 337 (1 - descendantVariableIndexDifferencePunishment) * 338 (1 - ancestorIndexDifferencePunishment) * 339 (1 - levelDifferencePunishment); 284 (1 - descendantVariableIndexDifferencePunishment); 340 285 // worst possible result is (1-punishmentCoefficientsProduct), so scale linearly to [0;1]: 341 286 result = (result - punishmentCoefficientsProduct) / (1 - punishmentCoefficientsProduct); … … 347 292 return result; 348 293 349 }*/ 350 351 /* 352 public static List<GeneticInformationItem> GetGeneticInformationItems(SymbolicExpressionTreeNode Formula, int MinLevelDifference, int MaxLevelDifference) { 353 List<GeneticInformationItem> result = new List<GeneticInformationItem>(); 354 List<SymbolicExpressionTreeNode> allNodes = new List<SymbolicExpressionTreeNode>(); 355 allNodes.Add(Formula); 356 allNodes.AddRange(getDescendants(Formula)); 357 foreach (SymbolicExpressionTreeNode node in allNodes) { 358 List<SymbolicExpressionTreeNode> allDescendants = new List<SymbolicExpressionTreeNode>(); 359 allDescendants.Add(node); 360 allDescendants.AddRange(getDescendants(node)); 361 foreach (SymbolicExpressionTreeNode descendant in allDescendants) { 362 GeneticInformationItem item = new GeneticInformationItem(node, descendant); 363 if (item.LevelDelta >= MinLevelDifference && item.LevelDelta <= MaxLevelDifference) 364 result.Add(item); 365 } 366 } 367 return result; 368 }*/ 369 370 /* 371 public static List<SymbolicExpressionTreeNode> GetDescendants(SymbolicExpressionTreeNode node) { 372 List<SymbolicExpressionTreeNode> descendants = new List<SymbolicExpressionTreeNode>(); 373 foreach (SymbolicExpressionTreeNode subTreeNode in node.SubTrees) { 374 AddDescendants(descendants, subTreeNode); 375 } 376 return descendants; 377 } 378 private static void AddDescendants(List<SymbolicExpressionTreeNode> list, SymbolicExpressionTreeNode node) { 379 list.Add(node); 380 foreach (SymbolicExpressionTreeNode subTreeNode in node.SubTrees) { 381 AddDescendants(list, subTreeNode); 382 } 383 }*/ 294 } 384 295 385 296 public static IList<GeneticInformationItem> getGeneticInformationItems(SymbolicExpressionTreeNode node, List<string> variableNames, … … 415 326 if (!(node.Symbol is StartSymbol)) 416 327 foreach (GeneticInformationItem item in descendantItems) { 417 if (!descendantNodes.Contains(item.DescendantTreeNode)) 328 if (!descendantNodes.Contains(item.DescendantTreeNode)) { 418 329 list.Add(new GeneticInformationItem(node, item, i, level)); 419 descendantNodes.Add(item.DescendantTreeNode); 330 descendantNodes.Add(item.DescendantTreeNode); 331 } 420 332 } 421 333 }
Note: See TracChangeset
for help on using the changeset viewer.