Free cookie consent management tool by TermsFeed Policy Generator

source: addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/EvolvabilityAggregator.cs @ 16573

Last change on this file since 16573 was 16573, checked in by gkronber, 5 years ago

#2520: changed HeuristicLab.FLA addon to compile with new HL.Persistence

File size: 5.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Drawing;
4using System.Linq;
5using HeuristicLab.Common;
6using HeuristicLab.Core;
7using HeuristicLab.Optimization;
8using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
9using HeuristicLab.Data;
10using HeuristicLab.Common.Resources;
11using HEAL.Attic;
12
13namespace HeuristicLab.Analysis.FitnessLandscape {
14
15  [Item("Evolvability Aggregator", "Aggregates evolvability values into an evolvability portrait.")]
16  [StorableType("B1471271-C89E-47A9-A0A1-4F0D64468F39")]
17  public class EvolvabilityAggregator : NamedItem, IAggregator {
18
19    #region Fields
20    [Storable]
21    private List<double> E_a;
22    [Storable]
23    private List<double> E_b;
24    [Storable]
25    private List<double> E_c;
26    [Storable]
27    private List<double> E_d;
28    [Storable]
29    private List<double> baseQualities;
30    [Storable]
31    private List<double> expectedAbsoluteQualityDeltas;
32    [Storable]
33    private List<double> expectedRelativeQualityDeltas;
34    #endregion   
35
36    #region Properties
37    public static new Image StaticItemImage { get { return VSImageLibrary.Database; } }
38    public override bool CanChangeName { get { return false; } }
39    #endregion
40
41    #region Construction and Cloning
42    [StorableConstructor]
43    protected EvolvabilityAggregator(StorableConstructorFlag _) : base(_) { }
44    protected EvolvabilityAggregator(EvolvabilityAggregator original, Cloner cloner)
45      : base(original, cloner) {
46      E_a = original.E_a.ToList();
47      E_b = original.E_b.ToList();
48      E_c = original.E_c.ToList();
49      E_d = original.E_d.ToList();
50      baseQualities = original.baseQualities.ToList();
51      expectedAbsoluteQualityDeltas = original.expectedAbsoluteQualityDeltas.ToList();
52      expectedRelativeQualityDeltas = original.expectedRelativeQualityDeltas.ToList();
53    }
54    public EvolvabilityAggregator() {
55      name = ItemName;
56      description = ItemDescription;
57      E_a = new List<double>();
58      E_b = new List<double>();
59      E_c = new List<double>();
60      E_d = new List<double>();
61      baseQualities = new List<double>();
62      expectedAbsoluteQualityDeltas = new List<double>();
63      expectedRelativeQualityDeltas = new List<double>();
64    }
65    public override IDeepCloneable Clone(Cloner cloner) {
66      return new EvolvabilityAggregator(this, cloner);
67    }
68    #endregion
69
70    #region IAggregator Members
71    public void MaybeAddResult(IResult result) {
72      if (result.DataType == typeof(DoubleValue)) {
73        double value = ((DoubleValue)result.Value).Value;
74        switch (result.Name) {
75          case "E_a": E_a.Add(value); break;
76          case "E_b": E_b.Add(value); break;
77          case "E_c": E_c.Add(value); break;
78          case "E_d": E_d.Add(value); break;
79          case "Base Quality": baseQualities.Add(value); break;
80          case "Expected Absolute Quality Delta": expectedAbsoluteQualityDeltas.Add(value); break;
81          case "Expected Relative Quality Delta": expectedRelativeQualityDeltas.Add(value); break;
82        }
83      }
84    }
85
86    public void Reset() {
87      E_a.Clear();
88      E_b.Clear();
89      E_c.Clear();
90      E_d.Clear();
91      baseQualities.Clear();
92      expectedAbsoluteQualityDeltas.Clear();
93      expectedRelativeQualityDeltas.Clear();
94    }
95
96    private class PortraitEntry {
97      public readonly double A, B, C, D, Q, AbsQDelta, RelQDelta;
98      public PortraitEntry(double a, double b, double c, double d, double q, double absQDelta, double relQDelta) {       
99        A = a;
100        B = b;
101        C = c;
102        D = d;
103        Q = q;
104        AbsQDelta = absQDelta;
105        RelQDelta = relQDelta;
106      }           
107    }
108
109    public IResult CreateResult() {
110      var portrait = new DataTable("Evolvability Portrait");
111      var E_a_row = new DataRow("E_a", "probability of non-deleterious mutation")
112                      {VisualProperties = {SecondYAxis = true}};
113      var E_b_row = new DataRow("E_b", "average expected offspring fitness");
114      var E_c_row = new DataRow("E_c", "90th percentile offspring fitness");
115      var E_d_row = new DataRow("E_d", "10th percentile offspring fitness");
116      var baseQualityRow = new DataRow("Q", "Base quality");
117      var absQDelta = new DataRow("abs Q delta", "expected absolute quality delta");
118      var relQDelta = new DataRow("rel Q delta", "expected relatve quality delta")
119                        {VisualProperties = {SecondYAxis = true}};
120      var entries = E_a.Select((t, i) =>
121        new PortraitEntry(t, E_b[i], E_c[i], E_d[i],
122          baseQualities[i], expectedAbsoluteQualityDeltas[i], expectedRelativeQualityDeltas[i]))
123          .ToList();
124      Action<List<PortraitEntry>> addBinAverages = b => {
125        if (b.Count > 0) {
126          E_a_row.Values.Add(b.Average(e => e.A));
127          E_b_row.Values.Add(b.Average(e => e.B));
128          E_c_row.Values.Add(b.Average(e => e.C));
129          E_d_row.Values.Add(b.Average(e => e.D));
130          baseQualityRow.Values.Add(b.Average(e => e.Q));
131          absQDelta.Values.Add(b.Average(e => e.AbsQDelta));
132          relQDelta.Values.Add(b.Average(e => e.RelQDelta));
133        }
134      };
135      var a = new DistributionAnalyzer(baseQualities);
136      addBinAverages(entries.Where(e => e.Q <= a[0.1]).ToList());
137      for (double t = 0.1; t < 1; t += 0.1)
138        addBinAverages(entries.Where(e => a[t] < e.Q && e.Q <= a[t+0.1]).ToList());
139      portrait.Rows.Add(E_a_row);
140      portrait.Rows.Add(E_b_row);
141      portrait.Rows.Add(E_c_row);
142      portrait.Rows.Add(E_d_row);
143      portrait.Rows.Add(baseQualityRow);
144      portrait.Rows.Add(absQDelta);
145      portrait.Rows.Add(relQDelta);
146      return new Result("Evolvability Portrait", portrait);
147    }   
148    #endregion
149  }
150}
Note: See TracBrowser for help on using the repository browser.