Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 4631 was 4631, checked in by swagner, 14 years ago

Worked on allele frequency analysis (#1234)

File size: 7.9 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.Linq;
23using HeuristicLab.Core;
24using HeuristicLab.Data;
25using HeuristicLab.Operators;
26using HeuristicLab.Optimization;
27using HeuristicLab.Parameters;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29
30namespace HeuristicLab.Analysis {
31  /// <summary>
32  /// An operator for analyzing the frequency of alleles.
33  /// </summary>
34  [Item("AlleleFrequencyAnalyzer", "An operator for analyzing the frequency of alleles.")]
35  [StorableClass]
36  public abstract class AlleleFrequencyAnalyzer<T> : SingleSuccessorOperator, IAnalyzer where T : class, IItem {
37    public LookupParameter<BoolValue> MaximizationParameter {
38      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
39    }
40    public ScopeTreeLookupParameter<T> SolutionParameter {
41      get { return (ScopeTreeLookupParameter<T>)Parameters["Solution"]; }
42    }
43    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
44      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
45    }
46    public LookupParameter<T> BestKnownSolutionParameter {
47      get { return (LookupParameter<T>)Parameters["BestKnownSolution"]; }
48    }
49    public ValueLookupParameter<ResultCollection> ResultsParameter {
50      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
51    }
52    public ValueParameter<BoolValue> StoreAlleleFrequenciesHistoryParameter {
53      get { return (ValueParameter<BoolValue>)Parameters["StoreAlleleFrequenciesHistory"]; }
54    }
55    public ValueParameter<IntValue> UpdateIntervalParameter {
56      get { return (ValueParameter<IntValue>)Parameters["UpdateInterval"]; }
57    }
58    public LookupParameter<IntValue> UpdateCounterParameter {
59      get { return (LookupParameter<IntValue>)Parameters["UpdateCounter"]; }
60    }
61
62    public AlleleFrequencyAnalyzer()
63      : base() {
64      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem."));
65      Parameters.Add(new ScopeTreeLookupParameter<T>("Solution", "The solutions whose alleles should be analyzed."));
66      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the solutions which should be analyzed."));
67      Parameters.Add(new LookupParameter<T>("BestKnownSolution", "The best known solution."));
68      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the allele frequency analysis results should be stored."));
69      Parameters.Add(new ValueParameter<BoolValue>("StoreAlleleFrequenciesHistory", "True if the history of all allele frequencies should be stored.", new BoolValue(false)));
70      Parameters.Add(new ValueParameter<IntValue>("UpdateInterval", "The interval in which the allele frequency analysis should be applied.", new IntValue(1)));
71      Parameters.Add(new LookupParameter<IntValue>("UpdateCounter", "The value which counts how many times the operator was called since the last update."));
72    }
73
74    public override IOperation Apply() {
75      int updateInterval = UpdateIntervalParameter.Value.Value;
76      IntValue updateCounter = UpdateCounterParameter.ActualValue;
77      if (updateCounter == null) {
78        updateCounter = new IntValue(updateInterval);
79        UpdateCounterParameter.ActualValue = updateCounter;
80      } else updateCounter.Value++;
81
82      if (updateCounter.Value == updateInterval) {
83        updateCounter.Value = 0;
84
85        bool max = MaximizationParameter.ActualValue.Value;
86        ItemArray<T> solutions = SolutionParameter.ActualValue;
87        ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
88        T bestKnownSolution = BestKnownSolutionParameter.ActualValue;
89        bool storeHistory = StoreAlleleFrequenciesHistoryParameter.Value.Value;
90
91        // calculate index of current best solution
92        int bestIndex = -1;
93        if (!max) bestIndex = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
94        else bestIndex = qualities.Select((x, index) => new { index, x.Value }).OrderByDescending(x => x.Value).First().index;
95
96        // calculate allels of current best and (if available) best known solution
97        Allele[] bestAlleles = CalculateAlleles(solutions[bestIndex]);
98        Allele[] bestKnownAlleles = null;
99        if (bestKnownSolution != null)
100          bestKnownAlleles = CalculateAlleles(bestKnownSolution);
101
102        // calculate allele frequencies
103        var frequencies = solutions.SelectMany((s, index) => CalculateAlleles(s).Select(a => new { Allele = a, Quality = qualities[index] })).
104                          GroupBy(x => x.Allele.Id).
105                          Select(x => new AlleleFrequency(x.Key,
106                                                          x.Count() / ((double)solutions.Length),
107                                                          x.Average(a => a.Allele.Impact),
108                                                          x.Average(a => a.Quality.Value),
109                                                          bestKnownAlleles == null ? false : bestKnownAlleles.Any(a => a.Id == x.Key),
110                                                          bestAlleles.Any(a => a.Id == x.Key)));
111
112        // fetch results collection
113        ResultCollection results;
114        if (!ResultsParameter.ActualValue.ContainsKey("Allele Frequency Analysis Results")) {
115          results = new ResultCollection();
116          ResultsParameter.ActualValue.Add(new Result("Allele Frequency Analysis Results", results));
117        } else {
118          results = (ResultCollection)ResultsParameter.ActualValue["Allele Frequency Analysis Results"].Value;
119        }
120
121        // store allele frequencies
122        AlleleFrequencyArray frequenciesArray = new AlleleFrequencyArray(frequencies);
123        if (!results.ContainsKey("Allele Frequencies"))
124          results.Add(new Result("Allele Frequencies", frequenciesArray));
125        else
126          results["Allele Frequencies"].Value = frequenciesArray;
127
128        // store allele frequencies history
129        if (storeHistory) {
130          if (!results.ContainsKey("Allele Frequencies History")) {
131            ItemCollection<AlleleFrequencyArray> history = new ItemCollection<AlleleFrequencyArray>();
132            history.Add(frequenciesArray);
133            results.Add(new Result("Allele Frequencies History", history));
134          } else {
135            ((ItemCollection<AlleleFrequencyArray>)results["Allele Frequencies History"].Value).Add(frequenciesArray);
136          }
137        }
138
139        // store alleles data table
140        DataTable allelesTable;
141        if (!results.ContainsKey("Alleles")) {
142          allelesTable = new DataTable("Alleles");
143          results.Add(new Result("Alleles", allelesTable));
144          allelesTable.Rows.Add(new DataRow("Unique Alleles"));
145        } else {
146          allelesTable = (DataTable)results["Alleles"].Value;
147        }
148        allelesTable.Rows["Unique Alleles"].Values.Add(frequenciesArray.Length);
149      }
150      return base.Apply();
151    }
152
153    protected abstract Allele[] CalculateAlleles(T solution);
154  }
155}
Note: See TracBrowser for help on using the repository browser.