Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.93 KB | None | 0 0
  1. #include "Clusterizator.h"
  2. #include "Utils.h"
  3.  
  4. bio::HiCMatrix & bio::Clusterizator::prepareHiCMatrix(HiCMatrix & matrix)
  5. {
  6.     for (auto it = matrix.getData().begin(); it != matrix.getData().end();)
  7.     {
  8.         bool val = false;
  9.         for (size_t j = 0; j < it->size(); ++j)
  10.         {
  11.             if ((*it)[j] > 0.0)
  12.             {
  13.                 val = true;
  14.                 break;
  15.             }
  16.         }
  17.  
  18.         if (!val)
  19.             it = matrix.getData().erase(it);
  20.         else
  21.             ++it;
  22.     }
  23.  
  24.     for (size_t j = 0; j < matrix[0].size();)
  25.     {
  26.         bool val = false;
  27.         for (int i = 0; i < matrix.getSize(); ++i)
  28.         {
  29.             if (matrix[i][j] > 0.0)
  30.             {
  31.                 val = true;
  32.                 break;
  33.             }
  34.         }
  35.  
  36.  
  37.         if (!val)
  38.         {
  39.             for (int i = 0; i < matrix.getSize(); ++i)
  40.                 matrix[i].erase(matrix[i].begin() + j);
  41.         }
  42.         else
  43.             ++j;
  44.     }
  45.  
  46.     return matrix;
  47. }
  48.  
  49. std::vector<double> bio::Clusterizator::getAvgFlow(const HiCMatrix & matrix)
  50. {
  51.     double *buf[2];
  52.     buf[0] = new double[matrix.getSize()];
  53.     buf[1] = new double[matrix.getSize()];
  54.     int cur = 0;
  55.  
  56.     for (size_t line = 0; line < matrix.getSize() - 1; ++line)
  57.     {
  58.         for (size_t pos = 0; pos <= line; ++pos)
  59.         {
  60.             // (p + q + 2 * a) / 2 = (p + q) / 2 + a
  61.             const double& a = matrix[pos][matrix[pos].size() - 1 - line + pos];
  62.             if (pos == 0 && pos == line)
  63.                 buf[cur][pos] = a;
  64.             else if (pos == 0)
  65.                 buf[cur][pos] = (buf[1 - cur][pos] * (line)+a) / (line + 1.0);
  66.             else if (pos == line)
  67.                 buf[cur][pos] = (buf[1 - cur][pos - 1] * (line)+a) / (line + 1.0);
  68.             else
  69.             {
  70.                 double leftAvg = (buf[1 - cur][pos - 1] * (line)+a) / (line + 1.0);
  71.                 double rightAvg = (buf[1 - cur][pos] * (line)+a) / (line + 1.0);
  72.                 buf[cur][pos] = (leftAvg + combinationRatio(line - 1, pos) * rightAvg) / (1.0 + combinationRatio(line - 1, pos));
  73.             }
  74.         }
  75.  
  76.         cur = 1 - cur;
  77.     }
  78.  
  79.     std::vector<double> res(matrix.getSize() - 1);
  80.     for (int i = 0; i < res.size(); ++i)
  81.         res[i] = buf[1 - cur][i];
  82.  
  83.     delete[] buf[0];
  84.     delete[] buf[1];
  85.  
  86.     return res;
  87. }
  88.  
  89. size_t bio::Clusterizator::findMinValuePos(const double * func, size_t leftBin, size_t rightBin)
  90. {
  91.     size_t left = leftBin + 1;
  92.     size_t right = rightBin - 1;
  93.     // Ñäâèãàåì ëåâóþ ãðàíèöó, ïîêà íå ïåðåâàëèì çà ëîêàëüíûé ìàêñèìóì ñëåâà
  94.     while (func[left] < func[left - 1] && left != right)
  95.         ++left;
  96.  
  97.     if (left == right)
  98.         return (leftBin + rightBin) / 2;
  99.  
  100.     // Ñäâèãàåì ïðàâóþ ãðàíèöó, ïîêà íå ïåðåâàëèì çà ëîêàëüíûé ìàêñèìóì ñïðàâà
  101.     while (func[right] < func[right + 1] && right != left)
  102.         --right;
  103.  
  104.     if (left == right)
  105.         return (leftBin + rightBin) / 2;
  106.  
  107.     double min = func[left];
  108.     size_t minPos = left;
  109.  
  110.     for (int i = left + 1; i <= right; ++i)
  111.         if (func[i] < min)
  112.         {
  113.             min = func[i];
  114.             minPos = i;
  115.         }
  116.  
  117.     return minPos;
  118. }
  119.  
  120. void bio::Clusterizator::addChilds(const double * func, ClusterNode * parent)
  121. {
  122.     if (parent->getCluster().leftBin == parent->getCluster().rightBin) return;
  123.  
  124.     size_t minPos;
  125.     if (parent->getCluster().rightBin - parent->getCluster().leftBin == 1)
  126.         minPos = (parent->getCluster().leftBin + parent->getCluster().rightBin) / 2;
  127.     else
  128.         minPos = findMinValuePos(func, parent->getCluster().leftBin, parent->getCluster().rightBin);
  129.     parent->setLeft(new ClusterNode(
  130.         Cluster(parent->getCluster().leftBin, minPos, 0.0),
  131.         &parent->getRoot(),
  132.         parent,
  133.         nullptr, nullptr));
  134.  
  135.     parent->setRight(new ClusterNode(Cluster(minPos + 1, parent->getCluster().rightBin, 0.0), &parent->getRoot(), parent, nullptr, nullptr));
  136.  
  137.     addChilds(func, &parent->getLeft());
  138.     addChilds(func, &parent->getRight());
  139. }
  140.  
  141. bio::ClusterNode * bio::Clusterizator::buildHierarchy(const std::vector<double>& func)
  142. {
  143.     ClusterNode *root = new ClusterNode(Cluster(0, func.size() - 1, 0.0), nullptr, nullptr, nullptr, nullptr);
  144.     root->setRoot(root);
  145.  
  146.     addChilds(func.data(), root);
  147.  
  148.  
  149.     /*std::vector<ClusterNode*> nodes(func.size());
  150.    
  151.     size_t curCluster = 1;
  152.     for (;;)
  153.     {
  154.         for(int i = 0; )
  155.     }*/
  156.     return root;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement