]> ruin.nu Git - germs.git/commitdiff
constructor for GeneOrder done
authorMichael Andreen <harv@ruin.nu>
Thu, 14 Jun 2007 19:53:56 +0000 (19:53 +0000)
committerMichael Andreen <harv@ruin.nu>
Thu, 14 Jun 2007 19:53:56 +0000 (19:53 +0000)
src/geneorder.cpp
src/geneorder.h
src/test/geneordertest.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(){
 }
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
index bf476d3a794010a6cbd0f9ca5cbaa695d13079f7..d8cf105f68b3dce230beba2f23aa5bf0dddb246f 100644 (file)
@@ -2,6 +2,7 @@
 #include <cppunit/extensions/HelperMacros.h>
 
 #include <geneorder.h>
+using namespace std;
 
 /* 
  * A test case that is designed to produce
@@ -19,17 +20,36 @@ class TESTNAME : public CPPUNIT_NS::TestFixture
   CPPUNIT_TEST_SUITE_END();
 
 protected:
+               vector<int> _validPerm;
+               vector<int> _validPerm2;
+               vector<int> _validPerm3;
+               vector<int> _bigvalidPerm;
+               vector<int> _invalidPerm;
 
 public:
 
        void setUp (){
+               int validPerm[] = {1,2,3,4};
+               _validPerm.assign(validPerm,validPerm+4);
+               int validPerm2[] = {0,-2,-1,4,3,5,-8,6,7,9};
+               _validPerm2.assign(validPerm2,validPerm2+10);
+               int validPerm3[] = {-3,1,2,4,6,5,7,-15,-13,-14,-12,-10,-11,-9,8};
+               _validPerm3.assign(validPerm3,validPerm3+15);
+               int invalidPerm[] = {1,3,4,5};
+               _invalidPerm.assign(invalidPerm,validPerm+4);
+               int test[] = {0,493,494,495,299,336,-490,-489,-488,-487,-486,-484,481,-482,503,-140,504,292,-507,97,-506,-505,154,157,509,510,511,512,513,514,515,-235,516,517,132,518,-308,519,520,521,523,525,526,383,384,-116,-119,529,530,531,532,533,433,-432,-431,-430,-429,-428,-426,-425,-424,-423,-422,-421,185,-420,-419,-418,-417,-416,-415,-414,-413,-412,-411,-410,-409,-408,-407,-406,-405,-404,-403,-402,-401,-400,-399,-398,-397,-396,-395,-394,-393,-63,-392,-391,-390,-238,-389,-388,-387,-386,385,-382,162,-381,-380,-379,-378,-377,-376,-375,-374,-58,-373,-372,-371,-370,-369,-368,-366,-365,-364,-363,-362,-359,-358,-357,-356,-355,-354,-353,-352,-351,-350,-349,-348,-347,-346,-84,-345,-344,-343,-329,-328,-67,146,-321,596,-316,-315,-314,-313,-311,-310,175,51,-309,-134,-342,-340,-339,-338,-337,-334,-333,-331,-194,-330,-306,-305,-302,-301,-300,-298,297,-296,-295,293,-291,294,-290,632,-40,-273,633,634,322,-323,-324,-327,-325,5,6,-7,-106,-216,-75,-215,-214,-213,-212,-211,188,-209,-208,-207,-206,-203,-202,-201,-200,141,-199,-198,-197,-92,93,94,95,98,-192,-191,-190,-196,-195,-193,36,37,39,-41,42,43,44,46,47,50,52,53,56,54,59,61,62,65,66,68,69,70,71,72,73,74,76,77,78,-60,79,80,81,82,85,86,88,-90,91,-189,-187,-186,-48,-184,-16,-182,-181,-180,-179,-178,64,-177,-176,-174,-159,-158,-170,-169,-156,-153,-152,-121,122,172,-617,128,130,127,129,137,138,139,113,114,-151,-150,-149,-148,-147,118,-145,-144,173,183,-163,-117,-161,124,123,126,125,-160,115,120,485,108,110,111,142,143,164,-19,-136,-135,-133,-131,-107,-168,-167,165,100,-105,-104,-102,-101,-35,-34,-33,-32,-20,-31,-30,-29,-28,-26,-25,-24,-23,-22,-21,-17,-55,13,14,15,-12,-11,-10,-252,-18,231,232,233,234,237,239,240,241,242,243,244,245,246,247,83,248,-219,220,221,222,223,224,225,227,228,229,230,38,254,255,256,257,258,-49,259,260,261,263,265,266,57,-361,-4,-3,-2,-1,-280,-281,96,-9,-8,267,-249,250,251,268,269,-360,270,271,272,528,166,274,275,276,277,278,279,282,283,171,284,285,286,287,264,253,452,-631,-630,-629,-628,-627,-626,-625,-451,-624,-623,-622,-621,-620,-619,-618,-87,-218,-616,-615,-614,-613,-612,-611,-610,-609,-608,-607,-606,-605,-604,-603,591,-602,27,-601,-600,-598,-599,-597,226,318,320,-326,-595,-594,-593,-592,-155,590,-589,-588,-587,-586,-585,-584,-583,-582,-581,-580,-579,-578,427,-577,-540,-560,-576,-575,-574,-573,-572,-571,-570,-569,-568,335,-567,-332,508,-112,-566,545,-565,204,-564,205,-103,563,-109,-562,-559,-558,-45,-557,-556,-312,-555,-554,-553,262,-552,-551,-317,-550,-549,-548,-547,-546,304,544,543,-542,-541,527,-236,-539,-538,-537,-522,483,-536,-436,-341,217,319,-289,-535,-534,-524,-288,99,434,435,-437,89,438,439,440,441,442,443,444,445,446,447,448,449,450,210,453,454,455,303,456,457,458,-561,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,367,496,497,498,499,500,501,502,476,477,478,-307,479,480,-491,492,635};
+
+               _bigvalidPerm.assign(test,test+636);
        }
 
 protected:
 
        void testCreate (){
-               int test[] = {1,2,3,4};
-               GeneOrder go(test,test+4);
+               CPPUNIT_ASSERT_NO_THROW(GeneOrder go(_validPerm.begin(),_validPerm.end()));
+               CPPUNIT_ASSERT_NO_THROW(GeneOrder go(_validPerm2.begin(),_validPerm2.end()));
+               CPPUNIT_ASSERT_NO_THROW(GeneOrder go(_validPerm3.begin(),_validPerm3.end()));
+               CPPUNIT_ASSERT_NO_THROW(GeneOrder go(_bigvalidPerm.begin(),_bigvalidPerm.end()));
+               CPPUNIT_ASSERT_THROW(GeneOrder go(_invalidPerm.begin(),_invalidPerm.end()),invalid_argument);
        }
 };