Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.CEDMA.Core/Results.cs @ 1426

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

Implemented mapping from categorical values to double values. Ordering can't be changed and is more or less random. #544 (Values of categorical model attributes are not visualized correctly in the CEDMA bubble chart)

File size: 5.4 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.Collections;
28using HeuristicLab.CEDMA.DB.Interfaces;
29using System.Xml;
30using System.Runtime.Serialization;
31using System.IO;
32using HeuristicLab.PluginInfrastructure;
33using HeuristicLab.Data;
34using HeuristicLab.DataAnalysis;
35using System.Drawing;
36
37namespace HeuristicLab.CEDMA.Core {
38  public class Results : ItemBase {
39    private const int PAGE_SIZE = 1000;
40    private string[] categoricalVariables = null;
41    public string[] CategoricalVariables {
42      get {
43        if (categoricalVariables == null) {
44          LoadModelAttributes();
45        }
46        return categoricalVariables;
47      }
48    }
49
50    private string[] ordinalVariables = null;
51    public string[] OrdinalVariables {
52      get {
53        if (ordinalVariables == null) {
54          LoadModelAttributes();
55        }
56        return ordinalVariables;
57      }
58    }
59
60    private IStore store;
61    public IStore Store {
62      get { return store; }
63      set {
64        store = value;
65      }
66    }
67
68    private Dictionary<string, Dictionary<object, double>> categoricalValueIndices = new Dictionary<string, Dictionary<object, double>>();
69
70    private Entity dataSetEntity;
71
72    public Results(IStore store) {
73      this.store = store;
74    }
75
76    internal void FilterDataSet(Entity entity) {
77      this.dataSetEntity = entity;
78    }
79
80    private List<ResultsEntry> entries = null;
81    private bool cached = false;
82    public IEnumerable<ResultsEntry> GetEntries() {
83      if (!cached)
84        return SelectRows();
85      return entries.AsEnumerable();
86    }
87
88    private IEnumerable<ResultsEntry> SelectRows() {
89      int page = 0;
90      int resultsReturned = 0;
91      bool newEntry = false;
92      if (store == null) yield break;
93      entries = new List<ResultsEntry>();
94      do {
95        var allBindings = store.Query("<" + dataSetEntity + "> <" + Ontology.PredicateHasModel + "> ?Model ." + Environment.NewLine +
96          "?Model ?Attribute ?Value .", page, PAGE_SIZE);
97        var allModelBindings = allBindings.GroupBy(x => (Entity)x.Get("Model"));
98        resultsReturned = allBindings.Count;
99
100        foreach (var modelBindings in allModelBindings) {
101          ResultsEntry entry = entries.FirstOrDefault(x => x.Uri == modelBindings.Key.Uri);
102          newEntry = false;
103          if (entry == null) {
104            entry = new ResultsEntry();
105            entry.Uri = modelBindings.Key.Uri;
106            entries.Add(entry);
107            newEntry = true;
108          }
109          foreach (var binding in modelBindings) {
110            if (binding.Get("Value") is Literal) {
111              string name = ((Entity)binding.Get("Attribute")).Uri.Replace(Ontology.CedmaNameSpace, "");
112              if (entry.Get(name) == null) {
113                object value = ((Literal)binding.Get("Value")).Value;
114                entry.Set(name, value);
115              }
116            }
117          }
118          if (newEntry) yield return entry;
119        }
120        page++;
121      } while (resultsReturned == PAGE_SIZE);
122
123      FireChanged();
124      cached = true;
125    }
126
127    internal IEnumerable<string> SelectModelAttributes() {
128      return CategoricalVariables.Concat(OrdinalVariables);
129    }
130
131    private void LoadModelAttributes() {
132      this.ordinalVariables =
133        store.Query("?ModelAttribute <" + Ontology.PredicateInstanceOf + "> <" + Ontology.TypeOrdinalAttribute + "> .", 0, 100)
134        .Select(s => ((Entity)s.Get("ModelAttribute")).Uri.Replace(Ontology.CedmaNameSpace, ""))
135        .ToArray();
136      this.categoricalVariables =
137        store.Query("?ModelAttribute <" + Ontology.PredicateInstanceOf + "> <" + Ontology.TypeCategoricalAttribute + "> .", 0, 100)
138        .Select(s => ((Entity)s.Get("ModelAttribute")).Uri.Replace(Ontology.CedmaNameSpace, ""))
139        .ToArray();
140    }
141
142    public double IndexOfCategoricalValue(string variable, object value) {
143      if (value == null) return double.NaN;
144      Dictionary<object, double> valueToIndexMap;
145      if (categoricalValueIndices.ContainsKey(variable)) {
146        valueToIndexMap = categoricalValueIndices[variable];
147      } else {
148        valueToIndexMap = new Dictionary<object, double>();
149        categoricalValueIndices[variable] = valueToIndexMap;
150      }
151      if (!valueToIndexMap.ContainsKey(value)) {
152        if (valueToIndexMap.Values.Count == 0) valueToIndexMap[value] = 1.0;
153        else valueToIndexMap[value] = 1.0 + valueToIndexMap.Values.Max();
154      }
155      return valueToIndexMap[value];
156    }
157  }
158}
Note: See TracBrowser for help on using the repository browser.