| 
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_POPULATION_HPP
 | 
| 
 | 
    21 #define EGGLIB_POPULATION_HPP
 | 
| 
 | 
    22 
 | 
| 
 | 
    23 
 | 
| 
 | 
    24 #include "Edge.hpp"
 | 
| 
 | 
    25 
 | 
| 
 | 
    26 namespace egglib {
 | 
| 
 | 
    27 
 | 
| 
 | 
    28     class Random;
 | 
| 
 | 
    29 
 | 
| 
 | 
    30    /** \brief Handles a single population
 | 
| 
 | 
    31     *
 | 
| 
 | 
    32     * \ingroup coalesce
 | 
| 
 | 
    33     *
 | 
| 
 | 
    34     */
 | 
| 
 | 
    35     class Population {
 | 
| 
 | 
    36 
 | 
| 
 | 
    37         public:
 | 
| 
 | 
    38     
 | 
| 
 | 
    39            /** \brief Default constructor
 | 
| 
 | 
    40             *
 | 
| 
 | 
    41             * Generates an empty population.
 | 
| 
 | 
    42             * 
 | 
| 
 | 
    43             */
 | 
| 
 | 
    44             Population();
 | 
| 
 | 
    45             
 | 
| 
 | 
    46            /** \brief Copy constructor
 | 
| 
 | 
    47             * 
 | 
| 
 | 
    48             */
 | 
| 
 | 
    49             Population(const Population& source);
 | 
| 
 | 
    50             
 | 
| 
 | 
    51            /** \brief Assignment operator
 | 
| 
 | 
    52             * 
 | 
| 
 | 
    53             */
 | 
| 
 | 
    54             Population& operator=(const Population& source);
 | 
| 
 | 
    55             
 | 
| 
 | 
    56            /** \brief Destructor
 | 
| 
 | 
    57             * 
 | 
| 
 | 
    58             * The object only cleans Edge objects currently stored in it.
 | 
| 
 | 
    59             *
 | 
| 
 | 
    60             */
 | 
| 
 | 
    61             ~Population();
 | 
| 
 | 
    62 
 | 
| 
 | 
    63            /** \brief Standard constructor
 | 
| 
 | 
    64             * 
 | 
| 
 | 
    65             * The Edge instances will be handled by address and they
 | 
| 
 | 
    66             * MUST be passed using the method set().
 | 
| 
 | 
    67             * 
 | 
| 
 | 
    68             * \param numberOfSegments number of recombining segments.
 | 
| 
 | 
    69             * 
 | 
| 
 | 
    70             * \param numberOfLineages the number of lineages contained
 | 
| 
 | 
    71             * in this population.
 | 
| 
 | 
    72             * 
 | 
| 
 | 
    73             * \param firstIndex the absolute index (or ID) of the first
 | 
| 
 | 
    74             * lineage (the other will have consecutive incremented
 | 
| 
 | 
    75             * ID's).
 | 
| 
 | 
    76             *
 | 
| 
 | 
    77             */
 | 
| 
 | 
    78             Population(unsigned int numberOfSegments,
 | 
| 
 | 
    79                     unsigned int numberOfLineages, unsigned firstIndex);
 | 
| 
 | 
    80 
 | 
| 
 | 
    81            /** \brief Gets the number of lineages
 | 
| 
 | 
    82             * 
 | 
| 
 | 
    83             */
 | 
| 
 | 
    84             unsigned int numberOfLineages() const;
 | 
| 
 | 
    85             
 | 
| 
 | 
    86            /** \brief Gets the efficient number of lineages
 | 
| 
 | 
    87             * 
 | 
| 
 | 
    88             * The number of lineages is multiplied by the number of
 | 
| 
 | 
    89             * covered segments of each lineages.
 | 
| 
 | 
    90             * 
 | 
| 
 | 
    91             */
 | 
| 
 | 
    92             unsigned int efficientNumberOfLineages() const;            
 | 
| 
 | 
    93             
 | 
| 
 | 
    94            /** \brief Sets the Edge of a lineage
 | 
| 
 | 
    95             * 
 | 
| 
 | 
    96             * \param index the index of the lineage within the
 | 
| 
 | 
    97             * population.
 | 
| 
 | 
    98             * \param edge the address of the Edge instance representing
 | 
| 
 | 
    99             * the lineage.
 | 
| 
 | 
   100             *
 | 
| 
 | 
   101             */
 | 
| 
 | 
   102             void set(unsigned int index, Edge* edge);
 | 
| 
 | 
   103 
 | 
| 
 | 
   104            /** \brief Removes and returns a random lineage.
 | 
| 
 | 
   105             * 
 | 
| 
 | 
   106             * \param random pointer to simulator's random generator
 | 
| 
 | 
   107             * instance.
 | 
| 
 | 
   108             * 
 | 
| 
 | 
   109             */
 | 
| 
 | 
   110             Edge* extractRandomly(Random* random);
 | 
| 
 | 
   111 
 | 
| 
 | 
   112            /** \brief Removes and returns a given lineage.
 | 
| 
 | 
   113             * 
 | 
| 
 | 
   114             * \param index the relative index of the lineage.
 | 
| 
 | 
   115             * 
 | 
| 
 | 
   116             */
 | 
| 
 | 
   117             Edge* extractByIndex(unsigned int index);
 | 
| 
 | 
   118 
 | 
| 
 | 
   119            /** \brief Appends a lineage to the object
 | 
| 
 | 
   120             * 
 | 
| 
 | 
   121             */
 | 
| 
 | 
   122             void push(Edge* edge);
 | 
| 
 | 
   123 
 | 
| 
 | 
   124            /** \brief Gets coverage
 | 
| 
 | 
   125             * 
 | 
| 
 | 
   126             */
 | 
| 
 | 
   127             unsigned int coverage(unsigned int edgeIndex) const;
 | 
| 
 | 
   128 
 | 
| 
 | 
   129 
 | 
| 
 | 
   130         private:
 | 
| 
 | 
   131 
 | 
| 
 | 
   132             void copy(const Population& source);
 | 
| 
 | 
   133             void clear();
 | 
| 
 | 
   134             Edge* pick(unsigned int index);
 | 
| 
 | 
   135             void init();
 | 
| 
 | 
   136             unsigned int _numberOfLineages;
 | 
| 
 | 
   137             unsigned int _efficientNumberOfLineages;
 | 
| 
 | 
   138             Edge** lineages;
 | 
| 
 | 
   139     };
 | 
| 
 | 
   140 
 | 
| 
 | 
   141 }
 | 
| 
 | 
   142 
 | 
| 
 | 
   143 #endif
 |