Changeset 12988 for branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SchemaDiversification/SchemaEvaluator.cs
- Timestamp:
- 10/09/15 00:16:03 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SchemaDiversification/SchemaEvaluator.cs
r12979 r12988 50 50 private const string MutatorParameterName = "Mutator"; 51 51 private const string RandomReplacementParameterName = "RandomReplacement"; 52 private const string ChangedTreesParameterName = "ChangedTrees";52 private const string NumberOfChangedTreesParameterName = "NumberOfChangedTrees"; 53 53 private const string ExecuteInParallelParameterName = "ExecuteInParallel"; 54 54 private const string MaxDegreeOfParalellismParameterName = "MaxDegreeOfParallelism"; 55 private const string ExclusiveMatchingParameterName = "ExclusiveMatching"; 55 56 #endregion 56 57 57 58 #region parameters 59 public ILookupParameter<BoolValue> ExclusiveMatchingParameter { 60 get { return (ILookupParameter<BoolValue>)Parameters[ExclusiveMatchingParameterName]; } 61 } 58 62 public ILookupParameter<BoolValue> ExecuteInParallelParameter { 59 63 get { return (ILookupParameter<BoolValue>)Parameters[ExecuteInParallelParameterName]; } … … 101 105 get { return (ILookupParameter<PercentValue>)Parameters[MinimumPhenotypicSimilarityParameterName]; } 102 106 } 103 public LookupParameter<IntValue> ChangedTreesParameter {104 get { return (LookupParameter<IntValue>)Parameters[ ChangedTreesParameterName]; }107 public LookupParameter<IntValue> NumberOfChangedTreesParameter { 108 get { return (LookupParameter<IntValue>)Parameters[NumberOfChangedTreesParameterName]; } 105 109 } 106 110 #endregion … … 111 115 public PercentValue MinimumPhenotypicSimilarity { get { return MinimumPhenotypicSimilarityParameter.ActualValue; } } 112 116 public BoolValue RandomReplacement { get { return RandomReplacementParameter.ActualValue; } } 117 public IntValue NumberOfChangedTrees { get { return NumberOfChangedTreesParameter.ActualValue; } } 113 118 #endregion 114 119 … … 122 127 }; 123 128 129 public ISymbolicExpressionTree Schema { get; set; } 130 124 131 [Storable] 125 132 private readonly UpdateEstimatedValuesOperator updateEstimatedValuesOperator; … … 128 135 qm = new QueryMatch(comp) { MatchParents = true }; 129 136 this.updateEstimatedValuesOperator = new UpdateEstimatedValuesOperator(); 130 137 #region add parameters 131 138 Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(SchemaParameterName, "The current schema to be evaluated")); 132 139 Parameters.Add(new LookupParameter<PercentValue>(MinimumSchemaFrequencyParameterName)); … … 142 149 Parameters.Add(new LookupParameter<ISymbolicExpressionTreeManipulator>(MutatorParameterName)); 143 150 Parameters.Add(new LookupParameter<BoolValue>(RandomReplacementParameterName)); 144 Parameters.Add(new LookupParameter<IntValue>( ChangedTreesParameterName));151 Parameters.Add(new LookupParameter<IntValue>(NumberOfChangedTreesParameterName)); 145 152 Parameters.Add(new LookupParameter<BoolValue>(ExecuteInParallelParameterName)); 146 153 Parameters.Add(new LookupParameter<IntValue>(MaxDegreeOfParalellismParameterName)); 154 Parameters.Add(new LookupParameter<BoolValue>(ExclusiveMatchingParameterName)); 155 #endregion 147 156 } 148 157 … … 170 179 var mutator = MutatorParameter.ActualValue; 171 180 172 var s = Schema Parameter.ActualValue;181 var s = Schema; 173 182 var sRoot = s.Root.GetSubtree(0).GetSubtree(0); 174 183 int countThreshold = (int)Math.Max(2, Math.Round(MinimumSchemaFrequency.Value * individuals.Count)); 175 184 176 185 // first apply the length and root equality checks in order to filter the individuals 177 var filtered = (from ind in individuals 178 let t = (ISymbolicExpressionTree)ind.Variables["SymbolicExpressionTree"].Value 179 where t.Length >= s.Length && qm.Comparer.Equals(t.Root.GetSubtree(0).GetSubtree(0), sRoot) 180 select ind).ToList(); 186 var exclusiveMatching = ExclusiveMatchingParameter.ActualValue.Value; 187 var filtered = exclusiveMatching ? (from ind in individuals 188 where !ind.Variables.ContainsKey("AlreadyMatched") 189 let t = (ISymbolicExpressionTree)ind.Variables["SymbolicExpressionTree"].Value 190 where t.Length >= s.Length && qm.Comparer.Equals(t.Root.GetSubtree(0).GetSubtree(0), sRoot) 191 select ind).ToList() 192 : (from ind in individuals 193 let t = (ISymbolicExpressionTree)ind.Variables["SymbolicExpressionTree"].Value 194 where t.Length >= s.Length && qm.Comparer.Equals(t.Root.GetSubtree(0).GetSubtree(0), sRoot) 195 select ind).ToList(); 181 196 182 197 // if we don't have enough filtered individuals, then we are done 183 198 if (filtered.Count < countThreshold) { 184 ChangedTreesParameter.ActualValue = new IntValue(0);185 199 return base.Apply(); 186 200 } … … 210 224 } else { 211 225 for (int i = 0; i < filtered.Count; ++i) { 212 213 226 // break early if it becomes impossible to reach the minimum threshold 214 227 if (matchingIndividuals.Count + filtered.Count - i < countThreshold) … … 223 236 } 224 237 238 // additional condition: the average schema quality should be equal or greater than the population average quality 225 239 if (matchingIndividuals.Count < countThreshold) { 226 ChangedTreesParameter.ActualValue = new IntValue(0);227 240 return base.Apply(); 228 241 } … … 230 243 var similarity = CalculatePhenotypicSimilarity(matchingIndividuals, calculator, executeInParallel, maxDegreeOfParallelism); 231 244 if (similarity < MinimumPhenotypicSimilarity.Value) { 232 ChangedTreesParameter.ActualValue = new IntValue(0);233 245 return base.Apply(); 234 246 } … … 244 256 mutationOc.Add(mutatorOp); 245 257 updateEstimatedValues.Add(updateOp); 246 } 247 ChangedTreesParameter.ActualValue = new IntValue(individualsToReplace.Count); 258 if (exclusiveMatching) 259 ind.Variables.Add(new Core.Variable("AlreadyMatched")); 260 } 261 262 NumberOfChangedTrees.Value += individualsToReplace.Count; // a lock is not necessary here because the SchemaEvaluators cannot be executed in parallel 263 248 264 return new OperationCollection(mutationOc, updateEstimatedValues, base.Apply()); 249 265 }
Note: See TracChangeset
for help on using the changeset viewer.