| 1 | 1 /* | 
|  | 2     Copyright 2009-2010 Stéphane De Mita, Mathieu Siol | 
|  | 3 | 
|  | 4     This file is part of the EggLib library. | 
|  | 5 | 
|  | 6     EggLib is free software: you can redistribute it and/or modify | 
|  | 7     it under the terms of the GNU General Public License as published by | 
|  | 8     the Free Software Foundation, either version 3 of the License, or | 
|  | 9     (at your option) any later version. | 
|  | 10 | 
|  | 11     EggLib is distributed in the hope that it will be useful, | 
|  | 12     but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 14     GNU General Public License for more details. | 
|  | 15 | 
|  | 16     You should have received a copy of the GNU General Public License | 
|  | 17     along with EggLib.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 18 */ | 
|  | 19 | 
|  | 20 #ifndef EGGLIB_PARAMSET_HPP | 
|  | 21 #define EGGLIB_PARAMSET_HPP | 
|  | 22 | 
|  | 23 | 
|  | 24 #include "DataMatrix.hpp" | 
|  | 25 | 
|  | 26 | 
|  | 27 namespace egglib { | 
|  | 28 | 
|  | 29     class Change; | 
|  | 30     class Controller; | 
|  | 31 | 
|  | 32 | 
|  | 33    /** \brief Set of parameters | 
|  | 34     * | 
|  | 35     * \ingroup coalesce | 
|  | 36     * | 
|  | 37     */ | 
|  | 38     class ParamSet { | 
|  | 39 | 
|  | 40         public: | 
|  | 41 | 
|  | 42            /** \brief Default constructor | 
|  | 43             * | 
|  | 44             * Initializes all parameters to reasonnable values (except | 
|  | 45             * that the sample size is null: 1 population, 0 samples, | 
|  | 46             * selfing rate of 0, recombination rate of 0, growth rate of | 
|  | 47             * 0, population size of 1 and no changes. | 
|  | 48             * | 
|  | 49             */ | 
|  | 50             ParamSet(); | 
|  | 51 | 
|  | 52            /** \brief Destructor | 
|  | 53             * | 
|  | 54             */ | 
|  | 55             ~ParamSet(); | 
|  | 56 | 
|  | 57            /** \brief Copy constructor | 
|  | 58             * | 
|  | 59             */ | 
|  | 60             ParamSet(const ParamSet&); | 
|  | 61 | 
|  | 62            /** \brief Assignment operator | 
|  | 63             * | 
|  | 64             */ | 
|  | 65             ParamSet& operator=(const ParamSet&); | 
|  | 66 | 
|  | 67            /** \brief Restores default value of all parameters | 
|  | 68             * | 
|  | 69             */ | 
|  | 70             void reset(); | 
|  | 71 | 
|  | 72            /** \brief Gets the number of populations | 
|  | 73             * | 
|  | 74             */ | 
|  | 75             unsigned int numberOfPopulations() const; | 
|  | 76 | 
|  | 77            /** \brief Gets a pairwise migration rate | 
|  | 78             * | 
|  | 79             * It is allowed to access a diagonal value. Diagonal | 
|  | 80             * values contain the sum of values of the corresponding | 
|  | 81             * line (diagonal cell excepted, of course). | 
|  | 82             * | 
|  | 83             */ | 
|  | 84             double pairwiseMigrationRate(unsigned int source, unsigned int dest) const; | 
|  | 85 | 
|  | 86            /** \brief Sets a pairwise migration rate | 
|  | 87             * | 
|  | 88             * It is not allowed to set a value on the diagonal (this | 
|  | 89             * would raise an exception). The method takes care of | 
|  | 90             * modifying the diagonal accordingly (still this is not | 
|  | 91             * relevant for the client); | 
|  | 92             * | 
|  | 93             */ | 
|  | 94             void pairwiseMigrationRate(unsigned int source, unsigned int dest, double value); | 
|  | 95 | 
|  | 96            /** \brief Sets the migration rate for all matrix | 
|  | 97             * | 
|  | 98             */ | 
|  | 99             void migrationRate(double value); | 
|  | 100 | 
|  | 101            /** \brief Gets a population size | 
|  | 102             * | 
|  | 103             */ | 
|  | 104             double populationSize(unsigned int populationIndex) const; | 
|  | 105 | 
|  | 106            /** \brief Sets a population size | 
|  | 107             * | 
|  | 108             * The size must be strictly positive. | 
|  | 109             * | 
|  | 110             */ | 
|  | 111             void populationSize(unsigned int populationIndex, double value); | 
|  | 112 | 
|  | 113            /** \brief Gets a growth rate | 
|  | 114             * | 
|  | 115             */ | 
|  | 116             double growthRate(unsigned int populationIndex) const; | 
|  | 117 | 
|  | 118            /** \brief Sets a growth rate | 
|  | 119             * | 
|  | 120             */ | 
|  | 121             void growthRate(unsigned int populationIndex, double value); | 
|  | 122 | 
|  | 123            /** \brief Gets the recombination rate | 
|  | 124             * | 
|  | 125             */ | 
|  | 126             double recombinationRate() const; | 
|  | 127 | 
|  | 128            /** \brief Sets the recombination rate | 
|  | 129             * | 
|  | 130             */ | 
|  | 131             void recombinationRate(double value); | 
|  | 132 | 
|  | 133            /** \brief Gets the number of recombining segments | 
|  | 134             * | 
|  | 135             */ | 
|  | 136             unsigned int numberOfSegments() const; | 
|  | 137 | 
|  | 138            /** \brief Sets the number of recombining segments | 
|  | 139             * | 
|  | 140             */ | 
|  | 141             void numberOfSegments(unsigned int value); | 
|  | 142 | 
|  | 143            /** \brief Gets the selfing rate | 
|  | 144             * | 
|  | 145             */ | 
|  | 146             double selfingRate() const; | 
|  | 147 | 
|  | 148            /** \brief Sets the selfing rate | 
|  | 149             * | 
|  | 150             */ | 
|  | 151             void selfingRate(double value); | 
|  | 152 | 
|  | 153            /** \brief Adds a population to the model | 
|  | 154             * | 
|  | 155             * \param migr pairwise migration rate between other | 
|  | 156             * population and the new one. | 
|  | 157             * | 
|  | 158             * The parameters for the new population are equivalent to | 
|  | 159             * the default parameters. | 
|  | 160             * | 
|  | 161             */ | 
|  | 162             void addPopulation(double migr); | 
|  | 163 | 
|  | 164            /** \brief Adds a change | 
|  | 165             * | 
|  | 166             * The change can be of any type derived from Change. A | 
|  | 167             * const Change* must be passed, so ParamSet will neither | 
|  | 168             * modify or delete the object itself. All passed Change | 
|  | 169             * object must be kept available for use by ParamSet. | 
|  | 170             * | 
|  | 171             */ | 
|  | 172             void addChange(const Change* change); | 
|  | 173 | 
|  | 174            /** \brief Gets the date of the next change | 
|  | 175             * | 
|  | 176             * Returns -1 if no change is planned. | 
|  | 177             * | 
|  | 178             */ | 
|  | 179             double nextChangeDate() const; | 
|  | 180 | 
|  | 181            /** \brief Applies the next change event | 
|  | 182             * | 
|  | 183             * \param controller the Change event might need to have | 
|  | 184             * access to simulation controller (to trigger coalescent | 
|  | 185             * events, for example). | 
|  | 186             * | 
|  | 187             */ | 
|  | 188             void nextChangeDo(Controller* controller); | 
|  | 189 | 
|  | 190            /** \brief Gets the number of single sample from a population | 
|  | 191             * | 
|  | 192             */ | 
|  | 193             unsigned int singles(unsigned int populationIndex) const; | 
|  | 194 | 
|  | 195            /** \brief Sets the number of single sample from a population | 
|  | 196             * | 
|  | 197             */ | 
|  | 198             void singles(unsigned int populationIndex, unsigned int value); | 
|  | 199 | 
|  | 200            /** \brief Gets the number of double sample from a population | 
|  | 201             * | 
|  | 202             */ | 
|  | 203             unsigned int doubles(unsigned int populationIndex) const; | 
|  | 204 | 
|  | 205            /** \brief Sets the number of double sample from a population | 
|  | 206             * | 
|  | 207             */ | 
|  | 208             void doubles(unsigned int populationIndex, unsigned int value); | 
|  | 209 | 
|  | 210            /** \brief Computes the total number of samples | 
|  | 211             * | 
|  | 212             */ | 
|  | 213             unsigned int numberOfSamples() const; | 
|  | 214 | 
|  | 215            /** \brief Gives the date of the last size change | 
|  | 216             * | 
|  | 217             * \param populationIndex the index of the population. | 
|  | 218             * \return The date where the last change occurred, or 0. if | 
|  | 219             * no change occurred during the simulation. | 
|  | 220             * | 
|  | 221             */ | 
|  | 222             double dateOfLastChange(unsigned int populationIndex) const; | 
|  | 223 | 
|  | 224 | 
|  | 225            /** \brief Sets the date of the last size change | 
|  | 226             * | 
|  | 227             * \param populationIndex the index of the population. | 
|  | 228             * \param date the date where the last change occurred, or 0. | 
|  | 229             * if no change occurred during the simulation. | 
|  | 230             * | 
|  | 231             */ | 
|  | 232             void dateOfLastChange(unsigned int populationIndex, double date) const; | 
|  | 233 | 
|  | 234 | 
|  | 235            /** \brief Set groups labels | 
|  | 236             * | 
|  | 237             * Sets the group labels of the DataMatrix, according to the | 
|  | 238             * current state of population structure, and assuming that | 
|  | 239             * the DataMatrix was generated by the class Arg. | 
|  | 240             * | 
|  | 241             * \param dataMatrix the DataMatrix object to modify. The | 
|  | 242             * number of sequences must match the total number of samples | 
|  | 243             * defined by the ParamSet object this method is called on. | 
|  | 244             * | 
|  | 245             * \param labelIndividuals by default, labels the different | 
|  | 246             * samples depending on the population they come from (0 | 
|  | 247             * being the label of the first population). If this flag is | 
|  | 248             * set to true, then the samples are labelled depending on | 
|  | 249             * the individual they come from, regardless of populations. | 
|  | 250             * In that case there can be only one or two genes for a | 
|  | 251             * given group label. | 
|  | 252             * | 
|  | 253             */ | 
|  | 254             void setGroups(DataMatrix& dataMatrix, bool labelIndividuals=false); | 
|  | 255 | 
|  | 256         private: | 
|  | 257 | 
|  | 258             void clear(); | 
|  | 259             void init(); | 
|  | 260             void copy(const ParamSet&); | 
|  | 261 | 
|  | 262             double _selfingRate; | 
|  | 263             double _recombinationRate; | 
|  | 264             unsigned int _numberOfSegments; | 
|  | 265             unsigned int _numberOfPopulations; | 
|  | 266             unsigned int* _singles; | 
|  | 267             unsigned int* _doubles; | 
|  | 268             double* _growthRates; | 
|  | 269             double* _populationSize; | 
|  | 270             double* _dateOfLastChange; | 
|  | 271             double** migrationMatrix; | 
|  | 272             unsigned int _numberOfChanges; | 
|  | 273             unsigned int nextChangeIndex; | 
|  | 274             Change const** changes; | 
|  | 275     }; | 
|  | 276 | 
|  | 277 } | 
|  | 278 | 
|  | 279 #endif |