/**
   * @param valueOut
   * @param correction
   * @param op
   * @param rlen
   * @param clen
   * @param sparseHint
   * @param imbededCorrection
   * @throws DMLRuntimeException
   */
  public static void startAggregation(
      MatrixValue valueOut,
      MatrixValue correction,
      AggregateOperator op,
      int rlen,
      int clen,
      boolean sparseHint,
      boolean imbededCorrection)
      throws DMLRuntimeException {
    int outRow = 0, outCol = 0, corRow = 0, corCol = 0;
    if (op.correctionExists) {
      if (!imbededCorrection) {
        switch (op.correctionLocation) {
          case NONE:
            outRow = rlen;
            outCol = clen;
            corRow = rlen;
            corCol = clen;
            break;
          case LASTROW:
            outRow = rlen - 1;
            outCol = clen;
            corRow = 1;
            corCol = clen;
            break;
          case LASTCOLUMN:
            if (op.increOp.fn instanceof Builtin
                && (((Builtin) (op.increOp.fn)).bFunc == Builtin.BuiltinFunctionCode.MAXINDEX
                    || ((Builtin) (op.increOp.fn)).bFunc == Builtin.BuiltinFunctionCode.MININDEX)) {
              outRow = rlen;
              outCol = 1;
              corRow = rlen;
              corCol = 1;
            } else {
              outRow = rlen;
              outCol = clen - 1;
              corRow = rlen;
              corCol = 1;
            }
            break;
          case LASTTWOROWS:
            outRow = rlen - 2;
            outCol = clen;
            corRow = 2;
            corCol = clen;
            break;
          case LASTTWOCOLUMNS:
            outRow = rlen;
            outCol = clen - 2;
            corRow = rlen;
            corCol = 2;
            break;
          case LASTFOURROWS:
            outRow = rlen - 4;
            outCol = clen;
            corRow = 4;
            corCol = clen;
            break;
          case LASTFOURCOLUMNS:
            outRow = rlen;
            outCol = clen - 4;
            corRow = rlen;
            corCol = 4;
            break;
          default:
            throw new DMLRuntimeException(
                "unrecognized correctionLocation: " + op.correctionLocation);
        }
      } else {
        outRow = rlen;
        outCol = clen;
        corRow = rlen;
        corCol = clen;
      }

      // set initial values according to operator
      if (op.initialValue == 0) {
        valueOut.reset(outRow, outCol, sparseHint);
        correction.reset(corRow, corCol, false);
      } else {
        valueOut.resetDenseWithValue(outRow, outCol, op.initialValue);
        correction.resetDenseWithValue(corRow, corCol, op.initialValue);
      }

    } else {
      if (op.initialValue == 0) valueOut.reset(rlen, clen, sparseHint);
      else valueOut.resetDenseWithValue(rlen, clen, op.initialValue);
    }
  }