Changeset 259 for trunk/sources/HeuristicLab.Functions/BakedFunctionTree.cs
- Timestamp:
- 05/14/08 19:23:46 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Functions/BakedFunctionTree.cs
r239 r259 28 28 using HeuristicLab.Data; 29 29 using System.Xml; 30 using System.Globalization; 30 31 31 32 namespace HeuristicLab.Functions { … … 33 34 private List<int> code; 34 35 private List<double> data; 35 36 private static BakedTreeEvaluator evaluator = new BakedTreeEvaluator(); 36 37 public BakedFunctionTree() { 37 38 code = new List<int>(); … … 42 43 : this() { 43 44 code.Add(0); 44 code.Add( BakedTreeEvaluator.MapFunction(function));45 code.Add(evaluator.MapFunction(function)); 45 46 code.Add(0); 46 47 treesExpanded = true; … … 58 59 : this() { 59 60 code.Add(0); 60 code.Add( BakedTreeEvaluator.MapFunction(tree.Function));61 code.Add(evaluator.MapFunction(tree.Function)); 61 62 code.Add(tree.LocalVariables.Count); 62 63 foreach(IVariable variable in tree.LocalVariables) { … … 158 159 if(!variablesExpanded) { 159 160 variables = new List<IVariable>(); 160 IFunction function = BakedTreeEvaluator.MapSymbol(code[1]);161 IFunction function = evaluator.MapSymbol(code[1]); 161 162 int localVariableIndex = 0; 162 163 foreach(IVariableInfo variableInfo in function.VariableInfos) { … … 186 187 187 188 public IFunction Function { 188 get { return BakedTreeEvaluator.MapSymbol(code[1]); }189 get { return evaluator.MapSymbol(code[1]); } 189 190 } 190 191 … … 220 221 } 221 222 222 private BakedTreeEvaluator evaluator;223 223 public double Evaluate(Dataset dataset, int sampleIndex) { 224 224 FlattenVariables(); 225 225 FlattenTrees(); 226 if(evaluator == null) evaluator = new BakedTreeEvaluator(code, data);226 evaluator.SetCode(code, data); 227 227 return evaluator.Evaluate(dataset, sampleIndex); 228 228 } … … 230 230 231 231 public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) { 232 FlattenVariables(); 233 FlattenTrees(); 232 234 XmlNode node = base.GetXmlNode(name, document, persistedObjects); 233 node.AppendChild(PersistenceManager.Persist("Function", Function, document, persistedObjects)); 234 XmlNode subTreesNode = document.CreateNode(XmlNodeType.Element, "SubTrees", null); 235 for(int i = 0; i < SubTrees.Count; i++) 236 subTreesNode.AppendChild(PersistenceManager.Persist(SubTrees[i], document, persistedObjects)); 237 node.AppendChild(subTreesNode); 238 XmlNode variablesNode = document.CreateNode(XmlNodeType.Element, "Variables", null); 239 foreach(IVariable variable in LocalVariables) 240 variablesNode.AppendChild(PersistenceManager.Persist(variable, document, persistedObjects)); 241 node.AppendChild(variablesNode); 235 if(evaluator != null) { 236 XmlNode evaluatorNode = PersistenceManager.Persist("Evaluator", evaluator, document, persistedObjects); 237 node.AppendChild(evaluatorNode); 238 } 239 XmlAttribute codeAttribute = document.CreateAttribute("Code"); 240 codeAttribute.Value = GetString<int>(code); 241 node.Attributes.Append(codeAttribute); 242 XmlAttribute dataAttribute = document.CreateAttribute("Data"); 243 dataAttribute.Value = GetString<double>(data); 244 node.Attributes.Append(dataAttribute); 242 245 return node; 243 246 } … … 245 248 public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) { 246 249 base.Populate(node, restoredObjects); 247 IFunction function = (IFunction)PersistenceManager.Restore(node.SelectSingleNode("Function"), restoredObjects); 248 code.Add(0); 249 code.Add(BakedTreeEvaluator.MapFunction(function)); 250 code.Add(0); 251 treesExpanded = true; 252 subTrees = new List<IFunctionTree>(); 253 variables = new List<IVariable>(); 254 variablesExpanded = true; 255 XmlNode subTreesNode = node.SelectSingleNode("SubTrees"); 256 for(int i = 0; i < subTreesNode.ChildNodes.Count; i++) 257 subTrees.Add((IFunctionTree)PersistenceManager.Restore(subTreesNode.ChildNodes[i], restoredObjects)); 258 XmlNode variablesNode = node.SelectSingleNode("Variables"); 259 foreach(XmlNode variableNode in variablesNode.ChildNodes) 260 variables.Add((IVariable)PersistenceManager.Restore(variableNode, restoredObjects)); 250 XmlNode evaluatorNode = node.SelectSingleNode("Evaluator"); 251 if(evaluatorNode != null) { 252 BakedTreeEvaluator evaluator = (BakedTreeEvaluator)PersistenceManager.Restore(evaluatorNode, restoredObjects); 253 BakedFunctionTree.evaluator = evaluator; 254 } 255 code = GetList<int>(node.Attributes["Code"].Value, s => int.Parse(s, CultureInfo.InvariantCulture)); 256 data = GetList<double>(node.Attributes["Data"].Value, s => double.Parse(s, CultureInfo.InvariantCulture)); 257 } 258 259 private string GetString<T>(IEnumerable<T> xs) where T : IConvertible { 260 StringBuilder builder = new StringBuilder(); 261 foreach(T x in xs) { 262 builder.Append(x.ToString(CultureInfo.InvariantCulture) + "; "); 263 } 264 if(builder.Length > 0) builder.Remove(builder.Length - 2, 2); 265 return builder.ToString(); 266 } 267 268 private List<T> GetList<T>(string s, Converter<string, T> converter) { 269 List<T> result = new List<T>(); 270 string[] tokens = s.Split(new char[] {';',' '}, StringSplitOptions.RemoveEmptyEntries); 271 foreach(string token in tokens) { 272 T x = converter(token.Trim()); 273 result.Add(x); 274 } 275 return result; 261 276 } 262 277 … … 264 279 BakedFunctionTree clone = new BakedFunctionTree(); 265 280 // in case the user (de)serialized the tree between evaluation and selection we have to flatten the tree again. 266 if(treesExpanded) FlattenTrees(); 281 if(treesExpanded) FlattenTrees(); 267 282 if(variablesExpanded) FlattenVariables(); 268 283 clone.code.AddRange(code);
Note: See TracChangeset
for help on using the changeset viewer.