code: @Override
      protected boolean decomposeLower() {
  
          if( n < blockWidth)
              B.reshape(0,0, false);
          else
              B.reshape(blockWidth,n-blockWidth, false);
  
          int numBlocks = n / blockWidth;
          int remainder = n % blockWidth;
  
          if( remainder > 0 ) {
              numBlocks++;
          }
  
          B.numCols = n;
  
          for( int i = 0; i < numBlocks; i++ ) {
              B.numCols -= blockWidth;
  
              if( B.numCols > 0 ) {
                  // apply cholesky to the current block
                  if( !chol.decompose(T,(i*blockWidth)* T.numCols + i*blockWidth,blockWidth) )  return false;
  
                  int indexSrc = i*blockWidth* T.numCols + (i+1)*blockWidth;
                  int indexDst = (i+1)*blockWidth* T.numCols + i*blockWidth;
  
                  // B = L^(-1) * B
                  solveL_special(chol.getL().data, T,indexSrc,indexDst,B);
  
                  int indexL = (i+1)*blockWidth*n + (i+1)*blockWidth;
  
                  // c = c - a^T*a
                  symmRankTranA_sub(B, T,indexL);
              } else {
                  int width = remainder > 0 ? remainder : blockWidth;
                  if( !chol.decompose(T,(i*blockWidth)* T.numCols + i*blockWidth,width) )  return false;
              }
          }
  
  
          // zero the top right corner.
          for( int i = 0; i < n; i++ ) {
              for( int j = i+1; j < n; j++ ) {
                  t[i*n+j] = 0.0;
              }
          }
  
          return true;
      }
docs: <p>
  Performs Choleksy decomposition on the provided matrix.
  </p>
  
  <p>
  If the matrix is not positive definite then this function will return
  false since it can't complete its computations.  Not all errors will be
  found.
  </p>
  @return True if it was able to finish the decomposition.