//update random Vectors
void updateMatrix(Eigen::SparseMatrix<double,Eigen::RowMajor>& randomMatrix,
                  const Eigen::SparseMatrix<int,Eigen::RowMajor>& adjacencyMatrix,
                  int itr)
{

  int numberOfRVector = randomMatrix.rows();
  int numberOfVertice = randomMatrix.cols();

  std::vector<double> rowSum = getRowSum(adjacencyMatrix);

  for(int i=0; i<numberOfRVector;++i){
    for(int h=0;h<itr;++h){
      Eigen::SparseMatrix<double,Eigen::RowMajor> middleValueMatrix(numberOfVertice,1);
      middleValueMatrix.reserve(1);
      for(int j = 0; j<numberOfVertice; ++j){
         Eigen::SparseMatrix<double,Eigen::RowMajor> v1(1,numberOfVertice), v2(numberOfVertice,1);
         v1.reserve(numberOfVertice);
         v2.reserve(1);
         v1 = adjacencyMatrix.cast<double>().innerVector(j);
         v2 = randomMatrix.innerVector(h).transpose();
         Eigen::SparseMatrix<double,Eigen::RowMajor> middleValue1 = v1*v2;
         double middleValue = 0;
         if(rowSum[j] != 0){
            middleValue = (*middleValue1.valuePtr())/rowSum[j];
          } else
            {
              middleValue = 1;
              }

         middleValueMatrix.insert(j,0) = middleValue;

      }

        Eigen::SparseMatrix<double,Eigen::RowMajor> right = middleValueMatrix.transpose();
        Eigen::SparseMatrix<double,Eigen::RowMajor> left = randomMatrix.innerVector(i);

        randomMatrix.innerVector(i) = 0.5*(left + right);
    }
  }
}
std::vector<double> getRowSum(const Eigen::SparseMatrix<int,Eigen::RowMajor>& adjacencyMatrix)
{
  int rowSize = adjacencyMatrix.rows();
  std::vector<double> rowSum;
  rowSum.reserve(rowSize);
  for(int i=0; i<rowSize;++i){
     double value = adjacencyMatrix.innerVector(i).sum();
     rowSum.push_back(value);
  }

  return rowSum;

}