Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Algorithms.IteratedSentenceConstruction/HeuristicLab.Algorithms.IteratedSymbolicExpressionConstruction/3.3/QualityFunctions/TabularMaxQualityFunction.cs @ 12909

Last change on this file since 12909 was 12909, checked in by gkronber, 9 years ago

#2471: initial import of basic algorithm and framework (state value approximation not yet supported)

File size: 3.4 KB
Line 
1using System;
2using System.Collections.Generic;
3using HeuristicLab.Common;
4using HeuristicLab.Core;
5using HeuristicLab.Parameters;
6using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
7
8namespace HeuristicLab.Algorithms.IteratedSymbolicExpressionConstruction {
9  [StorableClass]
10  [Item("TabularMaxQualityFunction", "")]
11  internal class TabularMaxQualityFunction : ParameterizedNamedItem, ITabularQualityFunction {
12    [Storable]
13    private readonly Dictionary<object, Dictionary<int, double>> q = new Dictionary<object, Dictionary<int, double>>();
14    [Storable]
15    private readonly Dictionary<object, Dictionary<int, int>> tries = new Dictionary<object, Dictionary<int, int>>();
16
17    public IStateFunction StateFunction {
18      get {
19        return ((IValueParameter<IStateFunction>)Parameters["State function"]).Value;
20      }
21      set { ((IValueParameter<IStateFunction>)Parameters["State function"]).Value = value; }
22    }
23
24    public TabularMaxQualityFunction() {
25      Parameters.Add(new ValueParameter<IStateFunction>("State function", "The function that is used to map partial trees to states", new DefaultStateFunction()));
26    }
27
28    public double Q(object state, int action) {
29      // an action that has never been tried has q == infinity
30      Dictionary<int, double> stateActionQualities;
31      if (!q.TryGetValue(state, out stateActionQualities)) return double.PositiveInfinity;
32      double quality;
33      if (!stateActionQualities.TryGetValue(action, out quality)) return double.PositiveInfinity;
34      return quality;
35    }
36
37    public void Update(object state, int action, double observedQuality) {
38      Dictionary<int, int> stateActionTries;
39      if (!tries.TryGetValue(state, out stateActionTries)) {
40        stateActionTries = new Dictionary<int, int>();
41        tries.Add(state, stateActionTries);
42      }
43      Dictionary<int, double> stateActionQualities = null;
44      if (!q.TryGetValue(state, out stateActionQualities)) {
45        stateActionQualities = new Dictionary<int, double>();
46        q.Add(state, stateActionQualities);
47      }
48      int t;
49      if (!stateActionTries.TryGetValue(action, out t)) {
50        t = 0;
51        stateActionTries.Add(action, t + 1);
52        stateActionQualities.Add(action, observedQuality);
53      } else {
54        stateActionTries[action] = t + 1;
55        stateActionQualities[action] = Math.Max(stateActionQualities[action], observedQuality);
56      }
57    }
58
59    public int Tries(object state, int action) {
60      Dictionary<int, int> stateTries;
61      if (!tries.TryGetValue(state, out stateTries)) return 0;
62      int stateActionTries;
63      if (!stateTries.TryGetValue(action, out stateActionTries)) return 0;
64      return stateActionTries;
65    }
66
67    #region item
68    [StorableConstructor]
69    protected TabularMaxQualityFunction(bool deserializing) : base(deserializing) { }
70    protected TabularMaxQualityFunction(TabularMaxQualityFunction original, Cloner cloner)
71      : base(original, cloner) {
72      this.q = new Dictionary<object, Dictionary<int, double>>(original.q);
73      this.tries = new Dictionary<object, Dictionary<int, int>>(original.tries);
74    }
75    public override IDeepCloneable Clone(Cloner cloner) {
76      return new TabularMaxQualityFunction(this, cloner);
77    }
78    #endregion
79
80    public void InitializeState() {
81      ClearState();
82    }
83
84    public void ClearState() {
85      q.Clear();
86      tries.Clear();
87    }
88  }
89}
Note: See TracBrowser for help on using the repository browser.