Difference between revisions of "830 - MarkovModel::Transpose()"

From Genome Analysis Wiki
Jump to navigationJump to search
(Created page with "<source lang="cpp"> void MarkovModel::Transpose(float * from, float * to, double r) { if (r == 0) for (int i = 0; i < states; i++) to[i] = from[i]; els...")
 
 
Line 7: Line 7:
 
   else
 
   else
 
       {
 
       {
      double flipRate = r * empiricalFlipRate;
 
 
       double sum = 0.0;
 
       double sum = 0.0;
  
Line 13: Line 12:
 
         sum += from[i];
 
         sum += from[i];
  
       sum *= r * (1.0 - empiricalFlipRate) / states;
+
       sum *= r / states;
  
 
       double complement = 1. - r;
 
       double complement = 1. - r;
Line 21: Line 20:
 
         {
 
         {
 
         sum *= 1e15;
 
         sum *= 1e15;
        flipRate *= 1e15;
 
 
         complement *= 1e15;
 
         complement *= 1e15;
 
         }
 
         }
 
      // printf("r = %g, SUM = %g, COMPLEMENT = %g\n", r, sum, complement);
 
  
 
       for (int i = 0; i < states; i++)
 
       for (int i = 0; i < states; i++)
         to[i] = from[i] * complement + from[i^1] * flipRate + sum;
+
         to[i] = from[i] * complement + sum;
 
       }
 
       }
 
   }
 
   }
 
</source>
 
</source>

Latest revision as of 14:39, 25 September 2013

void MarkovModel::Transpose(float * from, float * to, double r)
   {
   if (r == 0)
      for (int i = 0; i < states; i++)
         to[i] = from[i];
   else
      {
      double sum = 0.0;

      for (int i = 0; i < states; i++)
         sum += from[i];

      sum *= r / states;

      double complement = 1. - r;

      // avoid underflows
      if (sum < 1e-10)
         {
         sum *= 1e15;
         complement *= 1e15;
         }

      for (int i = 0; i < states; i++)
         to[i] = from[i] * complement + sum;
      }
   }