]> ruin.nu Git - germs.git/blobdiff - src/geneorder.cpp
constructor for GeneOrder done
[germs.git] / src / geneorder.cpp
index 31461a1d366abb015cb3815e4376b74a8e77a2b1..994137d288a025e788eaf99d2b79b4272bc7d96a 100644 (file)
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA          *
  ***************************************************************************/
 
-#include "geneorder.h"
+#include <geneorder.h>
+
+#include <algorithm>
+#include <cstdlib>
 
 using namespace std;
 
@@ -35,6 +38,31 @@ GeneOrder::GeneOrder(const GeneOrder& go){
        _geneorder = go._geneorder;
 }
 
+void GeneOrder::pad(){
+       if (_geneorder[0] != 0)
+               _geneorder.insert(_geneorder.begin(),0);
+       if(_geneorder.back() != static_cast<Gene>(_geneorder.size() - 1))
+               _geneorder.push_back(_geneorder.size());
+}
+
+struct test{
+       Gene operator()(Gene x) const{
+               return abs(x);
+       }
+};
+
+void GeneOrder::verify(){
+       if(_geneorder[0] != 0)
+               throw std::invalid_argument("Permutation doesn't start with 0");
+       if ( _geneorder.back() != static_cast<Gene>(_geneorder.size() - 1))
+               throw std::invalid_argument("Permutation doesn't end with n+1");
+       GeneList genes(_geneorder);
+       transform(genes.begin(),genes.end(),genes.begin(),test());
+       sort(genes.begin(),genes.end());
+       if (unique(genes.begin(),genes.end()) != genes.end())
+               throw std::invalid_argument("Not all genes are present exactly 1 time");
+}
+
 
 GeneOrder::~GeneOrder(){
 }