docs: public static void add_row(final int blockLength ,
                                 DSubmatrixD1 A , int rowA , double alpha ,
                                 DSubmatrixD1 B , int rowB , double beta ,
                                 DSubmatrixD1 C , int rowC ,
                                 int offset , int end ) {
          final int heightA = Math.min(blockLength,A.row1-A.row0);
          final int heightB = Math.min(blockLength,B.row1-B.row0);
          final int heightC = Math.min(blockLength,C.row1-C.row0);
  
          // handle the case where offset is more than a block
          int startI = offset - offset % blockLength;
          offset = offset % blockLength;
  
          final double dataA[] = A.original.data;
          final double dataB[] = B.original.data;
          final double dataC[] = C.original.data;
  
          for( int i = startI; i < end; i += blockLength ) {
              int segment = Math.min(blockLength,end-i);
  
              int widthA = Math.min(blockLength,A.col1-A.col0-i);
              int widthB = Math.min(blockLength,B.col1-B.col0-i);
              int widthC = Math.min(blockLength,C.col1-C.col0-i);
  
              int indexA = A.row0*A.original.numCols + (A.col0+i)*heightA + rowA*widthA;
              int indexB = B.row0*B.original.numCols + (B.col0+i)*heightB + rowB*widthB;
              int indexC = C.row0*C.original.numCols + (C.col0+i)*heightC + rowC*widthC;
  
              if( i == startI ) {
                  indexA += offset;
                  indexB += offset;
                  indexC += offset;
  
                  for( int j = offset; j < segment; j++ ) {
                      dataC[indexC++] = alpha*dataA[indexA++] + beta*dataB[indexB++];
                  }
              } else {
                  for( int j = 0; j < segment; j++ ) {
                      dataC[indexC++] = alpha*dataA[indexA++] + beta*dataB[indexB++];
                  }
              }
          }
      }