]> ruin.nu Git - germs.git/blobdiff - src/geneorder.h
qt tester optional
[germs.git] / src / geneorder.h
index e411a37253f932ec9788a3f5533bff19c695f2fe..ebc427a9c4c0f49bb770de0af27a3c8c795c80de 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <vector>
 #include <stdexcept>
-#include <cstdlib>
 
 #include "misc.h"
 
@@ -34,7 +33,7 @@
 class GeneOrder{
        public:
 
-               typedef std::vector<Gene> GeneList;
+               typedef std::vector<long> GeneList;
                typedef GeneList::size_type size_type;
 
                /**
@@ -77,18 +76,19 @@ class GeneOrder{
                 */
                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();
 };
 
 
@@ -98,22 +98,8 @@ class GeneOrder{
  */
 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