]> ruin.nu Git - germs.git/blobdiff - src/models.cpp
scoring function for Zipper model
[germs.git] / src / models.cpp
index cd89ef848aa6375af8d1e5d40d866ce1e39f1647..a8289c7b3f9a5056dc2dc8fb9a3caefbf885c8d3 100644 (file)
@@ -19,6 +19,8 @@
  ***************************************************************************/
 
 #include "models.h"
+#include "reverseaction.h"
+#include "geneorder.h"
 
 using namespace std;
 
@@ -26,40 +28,53 @@ namespace Models{
 
 ModelImpl::~ModelImpl(){}
 
-double ModelImpl::score(const SortAction& sa){
+double ModelImpl::score(const SortAction& sa, const GeneOrder& go){
        return 1;
 }
-string ModelImpl::name(){
+const char* ModelImpl::name(){
        return "Standard";
 }
 
 
 
-double X::score(const SortAction& sa){
-       return 1;
+double X::score(const SortAction& sa, const GeneOrder& go){
+       const ReverseAction* ra = dynamic_cast<const ReverseAction*>(&sa.impl());
+
+       if (ra){
+               int l1 = go.size()/2 - ra->i();
+               int l2 = ra->j() - go.size()/2;
+               double C = abs(l1 - l2)/static_cast<double>(go.size());
+               return 1/(C+1);
+       }
+       return -1;
 }
-string X::name(){
+const char* X::name(){
        return "X";
 }
 
-double Zipper::score(const SortAction& sa){
-       return 1;
+double Zipper::score(const SortAction& sa, const GeneOrder& go){
+       const ReverseAction* ra = dynamic_cast<const ReverseAction*>(&sa.impl());
+
+       if (ra){
+               return 1.0/(((ra->j()-ra->i())/static_cast<double>(go.size()))+1.0);
+       }
+       return -1;
 }
-string Zipper::name(){
+const char* Zipper::name(){
        return "Zipper";
 }
 
-double Cloud::score(const SortAction& sa){
+double Cloud::score(const SortAction& sa, const GeneOrder& go){
        return 1;
 }
-string Cloud::name(){
+const char* Cloud::name(){
        return "Cloud";
 }
 
-double FatX::score(const SortAction& sa){
+double FatX::score(const SortAction& sa, const GeneOrder& go){
        return 1;
 }
-string FatX::name(){
+const char* FatX::name(){
        return "FatX";
 }