| 
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
 |