Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3.2/sources/HeuristicLab.GP.Boolean/3.3/BooleanTreeInterpreter.cs

Last change on this file was 2629, checked in by gkronber, 15 years ago

Fixed display of unknown functions and removed UnknownFunctionException. #845 (In the FunctionTreeView only the string N/A is displayed for unknown functions)

File size: 2.8 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using System.Text;
26using HeuristicLab.Core;
27using System.Xml;
28using System.Diagnostics;
29using HeuristicLab.Common;
30using HeuristicLab.Data;
31using HeuristicLab.GP.Interfaces;
32using HeuristicLab.DataAnalysis;
33
34namespace HeuristicLab.GP.Boolean {
35  internal class BooleanTreeInterpreter {
36    private const double EPSILON = 0.00001;
37    private Dataset dataset;
38    private IFunctionTree tree;
39    private int targetVariable;
40    private int currentRow;
41
42    public void Reset(Dataset dataset, IFunctionTree tree, int targetVariable) {
43      this.dataset = dataset;
44      this.tree = tree;
45      this.targetVariable = targetVariable;
46    }
47
48    internal int GetNumberOfErrors(int start, int end) {
49      int errors = 0;
50      for (int i = start; i < end; i++) {
51        currentRow = i;
52        int result = Step(tree) ? 1 : 0;
53        if (Math.Abs(result - dataset.GetValue(i, targetVariable)) > EPSILON) errors++;
54      }
55      return errors;
56    }
57
58    internal bool Step(IFunctionTree t) {
59      int symbol = SymbolTable.MapFunction(t.Function);
60      switch (symbol) {
61        case SymbolTable.AND: return Step(t.SubTrees[0]) && Step(t.SubTrees[1]);
62        case SymbolTable.OR: return Step(t.SubTrees[0]) || Step(t.SubTrees[1]);
63        case SymbolTable.NOT: return !Step(t.SubTrees[0]);
64        case SymbolTable.XOR: return Step(t.SubTrees[0]) ^ Step(t.SubTrees[1]);
65        case SymbolTable.NAND: return !(Step(t.SubTrees[0]) && Step(t.SubTrees[1]));
66        case SymbolTable.NOR: return !(Step(t.SubTrees[0]) || Step(t.SubTrees[1]));
67        case SymbolTable.VARIABLE: {
68            var varNode = (VariableFunctionTree)t;
69            int index = dataset.GetVariableIndex(varNode.VariableName);
70            return !dataset.GetValue(currentRow, index).IsAlmost(0.0);
71          }
72        case SymbolTable.UNKNOWN:
73        default:
74          throw new NotImplementedException(t.Function.Name);
75      }
76    }
77  }
78}
Note: See TracBrowser for help on using the repository browser.