GRALE
gridlensinversiongenomebase.h
1 /*
2 
3  This file is a part of GRALE, a library to facilitate the simulation
4  and inversion of gravitational lenses.
5 
6  Copyright (C) 2008-2012 Jori Liesenborgs
7 
8  Contact: jori.liesenborgs@gmail.com
9 
10  This program is free software; you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation; either version 2 of the License, or
13  (at your option) any later version.
14 
15  This program is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with this program; if not, write to the Free Software
22  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 
24 */
25 
26 #ifndef GRALE_GRIDLENSINVERSIONGENOMEBASE_H
27 
28 #define GRALE_GRIDLENSINVERSIONGENOMEBASE_H
29 
30 #include "graleconfig.h"
31 #include "lensinversiongenomebase.h"
32 #include "realtype.h"
33 #include <string.h>
34 #include <string>
35 #include <vector>
36 
37 #define GRIDLENSINVERSIONGENOMEBASE_MAXFITNESSCOMP 16
38 
39 namespace grale
40 {
41 
42 class GridLensInversionGAFactoryBase;
43 class GravitationalLens;
44 
45 class GRALE_IMPORTEXPORT GridLensInversionGenomeBase : public LensInversionGenomeBase
46 {
47 public:
48  GridLensInversionGenomeBase(GridLensInversionGAFactoryBase *f, int nummasses, bool useGenomeSheet);
49 #ifdef AUTODISTFRAC
50  GridLensInversionGenomeBase(GridLensInversionGAFactoryBase *f, const std::vector<float> &masses, const std::vector<float> &fractions, float sheetValue);
51 #else
52  GridLensInversionGenomeBase(GridLensInversionGAFactoryBase *f, const std::vector<float> &masses, float sheetValue);
53 #endif // AUTODISTFRAC
54  ~GridLensInversionGenomeBase();
55 
56  void setActiveFitnessComponent(int i) { m_fitnessComp = i; }
57  bool calculateFitness();
58  bool isFitterThan(const mogal::Genome *g) const { const GridLensInversionGenomeBase *g2 = (const GridLensInversionGenomeBase *)g; if (fitnessvalues[m_fitnessComp] < g2->getFitnessValues()[m_fitnessComp]) return true; return false; }
59  mogal::Genome *reproduce(const mogal::Genome *g) const;
60  Genome *clone() const;
61  void mutate();
62  std::string getFitnessDescription() const;
63 
64  const float *getFitnessValues() const { return fitnessvalues; }
65  float getScaleFactor() const { return scalefactor; }
66  float getSheetFactor() const { return m_sheetFactor; }
67  void setFitnessValues(const float *f) { for (int i = 0 ; i < GRIDLENSINVERSIONGENOMEBASE_MAXFITNESSCOMP ; i++) fitnessvalues[i] = f[i]; }
68  void setScaleFactor(float s) { scalefactor = s; }
69  void setSheetFactor(float s) { m_sheetFactor = s; }
70 
71  const std::vector<float> &getMasses() const { return m_masses; }
72  float getSheetValue() const { return m_sheetValue; }
73 #ifdef AUTODISTFRAC
74  const std::vector<float> &getDistanceFractions() const { return m_distanceFractions; }
75 #endif // AUTODISTFRAC
76 
77  GravitationalLens *createLens(double *totalmass, std::string &errstr) const;
78  void copyFitnessValuesTo(float *pDestination, int amount) const { memcpy(pDestination, fitnessvalues, sizeof(float)*amount); }
79 protected:
80  virtual void getCalculationParameters(float &startfactor, float &stopfactor, int &numiterationsteps, int &numiterations) const
81  {
82  startfactor = 0.2;
83  stopfactor = 5.0;
84  numiterationsteps = 20;
85  numiterations = 5;
86  }
87  virtual void getSheetCalculationParameters(float &startfactor, float &stopfactor) const
88  {
89  startfactor = 0;
90  stopfactor = 2.0;
91  }
92 
93  GridLensInversionGAFactoryBase *getFactory() const { return factory; }
94 private:
95  void initializeNewCalculation();
96  float calculateMassScaleFitness(float scalefactor, float sheetScale);
97  void calculateTotalFitness(float scalefactor, float sheetScale, float *fitnessvalues);
98  void rescale();
99 
100  int m_fitnessComp;
101  float fitnessvalues[GRIDLENSINVERSIONGENOMEBASE_MAXFITNESSCOMP];
102  float scalefactor;
103  std::vector<float> m_masses;
104 #ifdef AUTODISTFRAC
105  std::vector<float> m_distanceFractions;
106 #endif // AUTODISTFRAC
107  float m_sheetValue;
108  float m_sheetFactor;
109 
110  GridLensInversionGAFactoryBase *factory;
111 };
112 
113 } // end namespace
114 
115 #endif // GRALE_GRIDLENSINVERSIONGENOMEBASE_H
116