Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 2031 was 2000, checked in by gkronber, 16 years ago

Refactoring: changed CEDMA backend to use a single data set per RDF results database. #656 (CEDMA server should handle only one data set (problem) at a time)

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