Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/14/08 19:23:46 (16 years ago)
Author:
gkronber
Message:

implemented #146

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Functions/BakedFunctionTree.cs

    r239 r259  
    2828using HeuristicLab.Data;
    2929using System.Xml;
     30using System.Globalization;
    3031
    3132namespace HeuristicLab.Functions {
     
    3334    private List<int> code;
    3435    private List<double> data;
    35 
     36    private static BakedTreeEvaluator evaluator = new BakedTreeEvaluator();
    3637    public BakedFunctionTree() {
    3738      code = new List<int>();
     
    4243      : this() {
    4344      code.Add(0);
    44       code.Add(BakedTreeEvaluator.MapFunction(function));
     45      code.Add(evaluator.MapFunction(function));
    4546      code.Add(0);
    4647      treesExpanded = true;
     
    5859      : this() {
    5960      code.Add(0);
    60       code.Add(BakedTreeEvaluator.MapFunction(tree.Function));
     61      code.Add(evaluator.MapFunction(tree.Function));
    6162      code.Add(tree.LocalVariables.Count);
    6263      foreach(IVariable variable in tree.LocalVariables) {
     
    158159        if(!variablesExpanded) {
    159160          variables = new List<IVariable>();
    160           IFunction function = BakedTreeEvaluator.MapSymbol(code[1]);
     161          IFunction function = evaluator.MapSymbol(code[1]);
    161162          int localVariableIndex = 0;
    162163          foreach(IVariableInfo variableInfo in function.VariableInfos) {
     
    186187
    187188    public IFunction Function {
    188       get { return BakedTreeEvaluator.MapSymbol(code[1]); }
     189      get { return evaluator.MapSymbol(code[1]); }
    189190    }
    190191
     
    220221    }
    221222
    222     private BakedTreeEvaluator evaluator;
    223223    public double Evaluate(Dataset dataset, int sampleIndex) {
    224224      FlattenVariables();
    225225      FlattenTrees();
    226       if(evaluator == null) evaluator = new BakedTreeEvaluator(code, data);
     226      evaluator.SetCode(code, data);
    227227      return evaluator.Evaluate(dataset, sampleIndex);
    228228    }
     
    230230
    231231    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
     232      FlattenVariables();
     233      FlattenTrees();
    232234      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);
    242245      return node;
    243246    }
     
    245248    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
    246249      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;
    261276    }
    262277
     
    264279      BakedFunctionTree clone = new BakedFunctionTree();
    265280      // 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();
    267282      if(variablesExpanded) FlattenVariables();
    268283      clone.code.AddRange(code);
Note: See TracChangeset for help on using the changeset viewer.