#include <vector>
#include <stdexcept>
-#include <cstdlib>
#include "misc.h"
class GeneOrder{
public:
- typedef std::vector<Gene> GeneList;
+ typedef std::vector<long> GeneList;
typedef GeneList::size_type size_type;
/**
*/
const GeneList& list() const;
+
+ private:
+ GeneList _geneorder;
/**
- * Reverses an interval and returns the new permutation
+ * pads the permutation with 0 in front and n+1 at the end if needed
*/
- GeneOrder reverse(size_type i, size_type j) const;
+ void pad();
/**
- * Moves the gene on position i to position j, returning a new permutation
+ * Verifies that the permutation starts with 0, ends with n+1 and that all genes i, 0 < i < n+1
+ * are present, without duplication.
*/
- GeneOrder transpos(size_type i, size_type j) const;
-
- private:
- GeneList _geneorder;
+ void verify();
};
*/
template<typename T>
GeneOrder::GeneOrder(T begin, T end): _geneorder(begin,end){
-
- /*TODO: Pad code, just not sure if I need it all the time.
- if (_geneorder[0] != 0)
- _geneorder.insert(_geneorder.begin(),0);
- if(_geneorder[_geneorder.size()-1] != _geneorder.size() - 1)
- _geneorder.push_back(_geneorder.size());
- */
-
- GeneList genes(_geneorder.size());
- for (GeneList::iterator gene = _geneorder.begin(); gene != _geneorder.end(); ++gene){
- ++genes[std::abs(*gene)];
- }
- for (GeneList::iterator gene = genes.begin(); gene != genes.end(); ++gene){
- if (*gene != 1)
- throw std::invalid_argument("Not all genes are present only 1 time");
- }
+ pad();
+ verify();
}
#endif