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