Mercurial > repos > dereeper > sniplay
diff egglib/egglib-2.1.5/include/egglib-cpp/ParamSet.hpp @ 1:420b57c3c185 draft
Uploaded
author | dereeper |
---|---|
date | Fri, 10 Jul 2015 04:39:30 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/egglib/egglib-2.1.5/include/egglib-cpp/ParamSet.hpp Fri Jul 10 04:39:30 2015 -0400 @@ -0,0 +1,279 @@ +/* + Copyright 2009-2010 Stéphane De Mita, Mathieu Siol + + This file is part of the EggLib library. + + EggLib is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + EggLib is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with EggLib. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef EGGLIB_PARAMSET_HPP +#define EGGLIB_PARAMSET_HPP + + +#include "DataMatrix.hpp" + + +namespace egglib { + + class Change; + class Controller; + + + /** \brief Set of parameters + * + * \ingroup coalesce + * + */ + class ParamSet { + + public: + + /** \brief Default constructor + * + * Initializes all parameters to reasonnable values (except + * that the sample size is null: 1 population, 0 samples, + * selfing rate of 0, recombination rate of 0, growth rate of + * 0, population size of 1 and no changes. + * + */ + ParamSet(); + + /** \brief Destructor + * + */ + ~ParamSet(); + + /** \brief Copy constructor + * + */ + ParamSet(const ParamSet&); + + /** \brief Assignment operator + * + */ + ParamSet& operator=(const ParamSet&); + + /** \brief Restores default value of all parameters + * + */ + void reset(); + + /** \brief Gets the number of populations + * + */ + unsigned int numberOfPopulations() const; + + /** \brief Gets a pairwise migration rate + * + * It is allowed to access a diagonal value. Diagonal + * values contain the sum of values of the corresponding + * line (diagonal cell excepted, of course). + * + */ + double pairwiseMigrationRate(unsigned int source, unsigned int dest) const; + + /** \brief Sets a pairwise migration rate + * + * It is not allowed to set a value on the diagonal (this + * would raise an exception). The method takes care of + * modifying the diagonal accordingly (still this is not + * relevant for the client); + * + */ + void pairwiseMigrationRate(unsigned int source, unsigned int dest, double value); + + /** \brief Sets the migration rate for all matrix + * + */ + void migrationRate(double value); + + /** \brief Gets a population size + * + */ + double populationSize(unsigned int populationIndex) const; + + /** \brief Sets a population size + * + * The size must be strictly positive. + * + */ + void populationSize(unsigned int populationIndex, double value); + + /** \brief Gets a growth rate + * + */ + double growthRate(unsigned int populationIndex) const; + + /** \brief Sets a growth rate + * + */ + void growthRate(unsigned int populationIndex, double value); + + /** \brief Gets the recombination rate + * + */ + double recombinationRate() const; + + /** \brief Sets the recombination rate + * + */ + void recombinationRate(double value); + + /** \brief Gets the number of recombining segments + * + */ + unsigned int numberOfSegments() const; + + /** \brief Sets the number of recombining segments + * + */ + void numberOfSegments(unsigned int value); + + /** \brief Gets the selfing rate + * + */ + double selfingRate() const; + + /** \brief Sets the selfing rate + * + */ + void selfingRate(double value); + + /** \brief Adds a population to the model + * + * \param migr pairwise migration rate between other + * population and the new one. + * + * The parameters for the new population are equivalent to + * the default parameters. + * + */ + void addPopulation(double migr); + + /** \brief Adds a change + * + * The change can be of any type derived from Change. A + * const Change* must be passed, so ParamSet will neither + * modify or delete the object itself. All passed Change + * object must be kept available for use by ParamSet. + * + */ + void addChange(const Change* change); + + /** \brief Gets the date of the next change + * + * Returns -1 if no change is planned. + * + */ + double nextChangeDate() const; + + /** \brief Applies the next change event + * + * \param controller the Change event might need to have + * access to simulation controller (to trigger coalescent + * events, for example). + * + */ + void nextChangeDo(Controller* controller); + + /** \brief Gets the number of single sample from a population + * + */ + unsigned int singles(unsigned int populationIndex) const; + + /** \brief Sets the number of single sample from a population + * + */ + void singles(unsigned int populationIndex, unsigned int value); + + /** \brief Gets the number of double sample from a population + * + */ + unsigned int doubles(unsigned int populationIndex) const; + + /** \brief Sets the number of double sample from a population + * + */ + void doubles(unsigned int populationIndex, unsigned int value); + + /** \brief Computes the total number of samples + * + */ + unsigned int numberOfSamples() const; + + /** \brief Gives the date of the last size change + * + * \param populationIndex the index of the population. + * \return The date where the last change occurred, or 0. if + * no change occurred during the simulation. + * + */ + double dateOfLastChange(unsigned int populationIndex) const; + + + /** \brief Sets the date of the last size change + * + * \param populationIndex the index of the population. + * \param date the date where the last change occurred, or 0. + * if no change occurred during the simulation. + * + */ + void dateOfLastChange(unsigned int populationIndex, double date) const; + + + /** \brief Set groups labels + * + * Sets the group labels of the DataMatrix, according to the + * current state of population structure, and assuming that + * the DataMatrix was generated by the class Arg. + * + * \param dataMatrix the DataMatrix object to modify. The + * number of sequences must match the total number of samples + * defined by the ParamSet object this method is called on. + * + * \param labelIndividuals by default, labels the different + * samples depending on the population they come from (0 + * being the label of the first population). If this flag is + * set to true, then the samples are labelled depending on + * the individual they come from, regardless of populations. + * In that case there can be only one or two genes for a + * given group label. + * + */ + void setGroups(DataMatrix& dataMatrix, bool labelIndividuals=false); + + private: + + void clear(); + void init(); + void copy(const ParamSet&); + + double _selfingRate; + double _recombinationRate; + unsigned int _numberOfSegments; + unsigned int _numberOfPopulations; + unsigned int* _singles; + unsigned int* _doubles; + double* _growthRates; + double* _populationSize; + double* _dateOfLastChange; + double** migrationMatrix; + unsigned int _numberOfChanges; + unsigned int nextChangeIndex; + Change const** changes; + }; + +} + +#endif