Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyAnalyzer.cs @ 4862

Last change on this file since 4862 was 4849, checked in by gkronber, 14 years ago

Reviewed classes AlleleFrequencyAnalyzer, TSPAlleleFrequencyAnalyzer, Allele, AlleleFrequencyCollection, AlleleFrequencyCollectionHistory, AlleleFrequencyView, AlleleFrequencyCollectionView, AlleleFrequencyCollectionHistoryView and MovieView and made some minor changes. #1234

File size: 12.7 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 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.Collections.Generic;
23using System.Linq;
24using HeuristicLab.Common;
25using HeuristicLab.Core;
26using HeuristicLab.Data;
27using HeuristicLab.Operators;
28using HeuristicLab.Optimization;
29using HeuristicLab.Parameters;
30using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
31
32namespace HeuristicLab.Analysis {
33  /// <summary>
34  /// An operator for analyzing the frequency of alleles.
35  /// </summary>
36  [Item("AlleleFrequencyAnalyzer", "An operator for analyzing the frequency of alleles.")]
37  [StorableClass]
38  public abstract class AlleleFrequencyAnalyzer<T> : SingleSuccessorOperator, IAnalyzer where T : class, IItem {
39    public LookupParameter<BoolValue> MaximizationParameter {
40      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
41    }
42    public ScopeTreeLookupParameter<T> SolutionParameter {
43      get { return (ScopeTreeLookupParameter<T>)Parameters["Solution"]; }
44    }
45    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
46      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
47    }
48    public LookupParameter<T> BestKnownSolutionParameter {
49      get { return (LookupParameter<T>)Parameters["BestKnownSolution"]; }
50    }
51    public ValueLookupParameter<ResultCollection> ResultsParameter {
52      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
53    }
54    public ValueParameter<BoolValue> StoreHistoryParameter {
55      get { return (ValueParameter<BoolValue>)Parameters["StoreHistory"]; }
56    }
57    public ValueParameter<IntValue> UpdateIntervalParameter {
58      get { return (ValueParameter<IntValue>)Parameters["UpdateInterval"]; }
59    }
60    public LookupParameter<IntValue> UpdateCounterParameter {
61      get { return (LookupParameter<IntValue>)Parameters["UpdateCounter"]; }
62    }
63
64    [StorableConstructor]
65    protected AlleleFrequencyAnalyzer(bool deserializing) : base(deserializing) { }
66    protected AlleleFrequencyAnalyzer(AlleleFrequencyAnalyzer<T> original, Cloner cloner) : base(original, cloner) { }
67    public AlleleFrequencyAnalyzer()
68      : base() {
69      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem."));
70      Parameters.Add(new ScopeTreeLookupParameter<T>("Solution", "The solutions whose alleles should be analyzed."));
71      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the solutions which should be analyzed."));
72      Parameters.Add(new LookupParameter<T>("BestKnownSolution", "The best known solution."));
73      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the allele frequency analysis results should be stored."));
74      Parameters.Add(new ValueParameter<BoolValue>("StoreHistory", "True if the history of the allele frequency analysis should be stored.", new BoolValue(false)));
75      Parameters.Add(new ValueParameter<IntValue>("UpdateInterval", "The interval in which the allele frequency analysis should be applied.", new IntValue(1)));
76      Parameters.Add(new LookupParameter<IntValue>("UpdateCounter", "The value which counts how many times the operator was called since the last update.", "AlleleFrequencyAnalyzerUpdateCounter"));
77    }
78
79    #region AlleleFrequencyIdEqualityComparer
80    private class AlleleFrequencyIdEqualityComparer : IEqualityComparer<AlleleFrequency> {
81      public bool Equals(AlleleFrequency x, AlleleFrequency y) {
82        return x.Id == y.Id;
83      }
84      public int GetHashCode(AlleleFrequency obj) {
85        return obj.Id.GetHashCode();
86      }
87    }
88    #endregion
89
90    public override IOperation Apply() {
91      int updateInterval = UpdateIntervalParameter.Value.Value;
92      IntValue updateCounter = UpdateCounterParameter.ActualValue;
93      if (updateCounter == null) {
94        updateCounter = new IntValue(updateInterval);
95        UpdateCounterParameter.ActualValue = updateCounter;
96      } else updateCounter.Value++;
97
98      if (updateCounter.Value == updateInterval) {
99        updateCounter.Value = 0;
100
101        bool max = MaximizationParameter.ActualValue.Value;
102        ItemArray<T> solutions = SolutionParameter.ActualValue;
103        ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
104        T bestKnownSolution = BestKnownSolutionParameter.ActualValue;
105        bool storeHistory = StoreHistoryParameter.Value.Value;
106
107        // calculate index of current best solution
108        int bestIndex = -1;
109        if (!max) {
110          bestIndex = qualities
111            .Select((x, index) => new { index, x.Value })
112            .OrderBy(x => x.Value)
113            .First().index;
114        } else {
115          bestIndex = qualities
116            .Select((x, index) => new { index, x.Value })
117            .OrderByDescending(x => x.Value)
118            .First().index;
119        }
120
121        // calculate allels of current best and (if available) best known solution
122        Allele[] bestAlleles = CalculateAlleles(solutions[bestIndex]);
123        Allele[] bestKnownAlleles = null;
124        if (bestKnownSolution != null)
125          bestKnownAlleles = CalculateAlleles(bestKnownSolution);
126
127        // calculate allele frequencies
128        var frequencies = solutions.SelectMany((s, index) => CalculateAlleles(s).Select(a => new { Allele = a, Quality = qualities[index] })).
129                          GroupBy(x => x.Allele.Id).
130                          Select(x => new AlleleFrequency(x.Key,
131                                                          x.Count() / ((double)solutions.Length),
132                                                          x.Average(a => a.Allele.Impact),
133                                                          x.Average(a => a.Quality.Value),
134                                                          bestKnownAlleles == null ? false : bestKnownAlleles.Any(a => a.Id == x.Key),
135                                                          bestAlleles.Any(a => a.Id == x.Key)));
136
137        // calculate dummy allele frequencies of alleles of best known solution which did not occur
138        if (bestKnownAlleles != null) {
139          var bestKnownFrequencies = bestKnownAlleles.Select(x => new AlleleFrequency(x.Id, 0, x.Impact, 0, true, false)).Except(frequencies, new AlleleFrequencyIdEqualityComparer());
140          frequencies = frequencies.Concat(bestKnownFrequencies);
141        }
142
143        // fetch results collection
144        ResultCollection results;
145        if (!ResultsParameter.ActualValue.ContainsKey("Allele Frequency Analysis Results")) {
146          results = new ResultCollection();
147          ResultsParameter.ActualValue.Add(new Result("Allele Frequency Analysis Results", results));
148        } else {
149          results = (ResultCollection)ResultsParameter.ActualValue["Allele Frequency Analysis Results"].Value;
150        }
151
152        // store allele frequencies
153        AlleleFrequencyCollection frequenciesCollection = new AlleleFrequencyCollection(frequencies);
154        if (!results.ContainsKey("Allele Frequencies"))
155          results.Add(new Result("Allele Frequencies", frequenciesCollection));
156        else
157          results["Allele Frequencies"].Value = frequenciesCollection;
158
159        // store allele frequencies history
160        if (storeHistory) {
161          if (!results.ContainsKey("Allele Frequencies History")) {
162            AlleleFrequencyCollectionHistory history = new AlleleFrequencyCollectionHistory();
163            history.Add(frequenciesCollection);
164            results.Add(new Result("Allele Frequencies History", history));
165          } else {
166            ((AlleleFrequencyCollectionHistory)results["Allele Frequencies History"].Value).Add(frequenciesCollection);
167          }
168        }
169
170        // store alleles data table
171        DataTable allelesTable;
172        if (!results.ContainsKey("Alleles")) {
173          allelesTable = new DataTable("Alleles");
174          results.Add(new Result("Alleles", allelesTable));
175
176          allelesTable.Rows.Add(new DataRow("Unique Alleles"));
177          allelesTable.Rows["Unique Alleles"].VisualProperties.StartIndexZero = true;
178
179          allelesTable.Rows.Add(new DataRow("Unique Alleles of Best Known Solution", null));
180          allelesTable.Rows["Unique Alleles of Best Known Solution"].VisualProperties.SecondYAxis = true;
181          allelesTable.Rows["Unique Alleles of Best Known Solution"].VisualProperties.StartIndexZero = true;
182
183          allelesTable.Rows.Add(new DataRow("Fixed Alleles", null));
184          allelesTable.Rows["Fixed Alleles"].VisualProperties.SecondYAxis = true;
185          allelesTable.Rows["Fixed Alleles"].VisualProperties.StartIndexZero = true;
186
187          allelesTable.Rows.Add(new DataRow("Fixed Alleles of Best Known Solution", null));
188          allelesTable.Rows["Fixed Alleles of Best Known Solution"].VisualProperties.SecondYAxis = true;
189          allelesTable.Rows["Fixed Alleles of Best Known Solution"].VisualProperties.StartIndexZero = true;
190
191          allelesTable.Rows.Add(new DataRow("Lost Alleles of Best Known Solution", null));
192          allelesTable.Rows["Lost Alleles of Best Known Solution"].VisualProperties.SecondYAxis = true;
193          allelesTable.Rows["Lost Alleles of Best Known Solution"].VisualProperties.StartIndexZero = true;
194        } else {
195          allelesTable = (DataTable)results["Alleles"].Value;
196        }
197
198        int fixedAllelesCount = frequenciesCollection.Where(x => x.Frequency == 1).Count();
199        var relevantAlleles = frequenciesCollection.Where(x => x.ContainedInBestKnownSolution);
200        int relevantAllelesCount = relevantAlleles.Count();
201        int fixedRelevantAllelesCount = relevantAlleles.Where(x => x.Frequency == 1).Count();
202        int lostRelevantAllelesCount = relevantAlleles.Where(x => x.Frequency == 0).Count();
203        int uniqueRelevantAllelesCount = relevantAllelesCount - lostRelevantAllelesCount;
204        allelesTable.Rows["Unique Alleles"].Values.Add(frequenciesCollection.Count);
205        allelesTable.Rows["Unique Alleles of Best Known Solution"].Values.Add(uniqueRelevantAllelesCount);
206        allelesTable.Rows["Fixed Alleles"].Values.Add(fixedAllelesCount);
207        allelesTable.Rows["Fixed Alleles of Best Known Solution"].Values.Add(fixedRelevantAllelesCount);
208        allelesTable.Rows["Lost Alleles of Best Known Solution"].Values.Add(lostRelevantAllelesCount);
209
210        // store alleles values
211        if (!results.ContainsKey("Unique Alleles"))
212          results.Add(new Result("Unique Alleles", new DoubleValue(frequenciesCollection.Count)));
213        else
214          ((DoubleValue)results["Unique Alleles"].Value).Value = frequenciesCollection.Count;
215
216        if (!results.ContainsKey("Unique Alleles of Best Known Solution"))
217          results.Add(new Result("Unique Alleles of Best Known Solution", new DoubleValue(uniqueRelevantAllelesCount)));
218        else
219          ((DoubleValue)results["Unique Alleles of Best Known Solution"].Value).Value = uniqueRelevantAllelesCount;
220
221        if (!results.ContainsKey("Fixed Alleles"))
222          results.Add(new Result("Fixed Alleles", new DoubleValue(fixedAllelesCount)));
223        else
224          ((DoubleValue)results["Fixed Alleles"].Value).Value = fixedAllelesCount;
225
226        if (!results.ContainsKey("Fixed Alleles of Best Known Solution"))
227          results.Add(new Result("Fixed Alleles of Best Known Solution", new DoubleValue(fixedRelevantAllelesCount)));
228        else
229          ((DoubleValue)results["Fixed Alleles of Best Known Solution"].Value).Value = fixedRelevantAllelesCount;
230
231        if (!results.ContainsKey("Lost Alleles of Best Known Solution"))
232          results.Add(new Result("Lost Alleles of Best Known Solution", new DoubleValue(lostRelevantAllelesCount)));
233        else
234          ((DoubleValue)results["Lost Alleles of Best Known Solution"].Value).Value = lostRelevantAllelesCount;
235      }
236      return base.Apply();
237    }
238
239    protected abstract Allele[] CalculateAlleles(T solution);
240  }
241}
Note: See TracBrowser for help on using the repository browser.