#include "sortaction.h"
#include "reverseaction.h"
+#include "genealgorithms.h"
+
using namespace std;
-GeneSorter::ActionList GeneSorter::sort(const GeneOrder& go1){
+GeneSorter::ActionList GeneSorter::sort(const GeneOrder& go){
return ActionList();
}
-GeneSorter::ActionList GeneSorter::safeActions(const GeneOrder& go1){
- return ActionList();
+GeneSorter::ActionList GeneSorter::safeActions(const GeneOrder& go){
+ if (countCycles(go) == go.size() - 1)
+ return ActionList();
+ ActionList al;
+ al.push_back(ActionPointer(new ReverseAction(2,3)));
+ return al;
}
#define __GENESORTER_H__
#include <vector>
+#include <tr1/memory>
class SortAction;
class GeneOrder;
*/
class GeneSorter{
public:
- typedef std::vector<SortAction> ActionList;
+ typedef std::tr1::shared_ptr<SortAction> ActionPointer;
+ typedef std::vector<ActionPointer> ActionList;
/**
* Takes a GeneOrder, finds the actions to transform it into a sorted
ReverseAction(size_t i, size_t j):_i(i),_j(j){}
/**
- * Sort SortActions by score
+ * Applies the sort action on the gene order
*/
virtual GeneOrder& operator()(GeneOrder& go) const{
go.reverse(_i,_j);
GeneOrder go2(_validPerm2.begin(),_validPerm2.end());
al = so.sort(go2);
CPPUNIT_ASSERT_EQUAL(1ul,al.size());
- CPPUNIT_ASSERT(al[0] == ReverseAction(2,3));
+ CPPUNIT_ASSERT((*al[0]) == ReverseAction(2,3));
+
+ (*al[0])(go2);
+ CPPUNIT_ASSERT(equal(go.begin(),go.end(),go2.begin()));
GeneOrder go3(_validPerm3.begin(),_validPerm3.end());
al = so.sort(go3);
CPPUNIT_ASSERT_EQUAL(5ul,al.size());
+ for (size_t i = 0; i < al.size(); ++i)
+ (*al[i])(go3);
+ int perm[] = {0,1,2,3,4,5,6,7,8,9};
+ CPPUNIT_ASSERT(equal(go3.begin(),go3.end(),perm));
}
void testSafeActions (){
GeneSorter so;
GeneOrder go2(_validPerm2.begin(),_validPerm2.end());
al = so.safeActions(go2);
CPPUNIT_ASSERT_EQUAL(1ul,al.size());
- CPPUNIT_ASSERT(al[0] == ReverseAction(2,3));
+ CPPUNIT_ASSERT((*al[0]) == ReverseAction(2,3));
+ CPPUNIT_ASSERT(!((*al[0]) == ReverseAction(2,5)));
}
};