/** Normalizes the (from, to, incr) predicate to a predicate w/ positive increment. */
  private void normalizePredicate() {
    // check for positive increment
    if (_incrVal.getLongValue() >= 0) return;

    long lfrom = _fromVal.getLongValue();
    long lto = _toVal.getLongValue();
    long lincr = _incrVal.getLongValue();

    _fromVal = new IntObject(lfrom - ((lfrom - lto) / lincr * lincr));
    _toVal = new IntObject(lfrom);
    _incrVal = new IntObject(-1 * lincr);
  }
  protected TaskPartitioner(
      long taskSize, String iterVarName, IntObject fromVal, IntObject toVal, IntObject incrVal) {
    _taskSize = taskSize;

    _iterVarName = iterVarName;
    _fromVal = fromVal;
    _toVal = toVal;
    _incrVal = incrVal;

    _numIter =
        (long)
            Math.ceil(
                ((double) (_toVal.getLongValue() - _fromVal.getLongValue() + 1))
                    / _incrVal.getLongValue());
  }
  protected TaskPartitioner(
      long taskSize, String iterVarName, IntObject fromVal, IntObject toVal, IntObject incrVal) {
    _taskSize = taskSize;
    _iterVarName = iterVarName;
    _fromVal = fromVal;
    _toVal = toVal;
    _incrVal = incrVal;

    // normalize predicate if necessary
    normalizePredicate();

    // compute number of iterations
    _numIter =
        (long)
            Math.ceil(
                ((double) (_toVal.getLongValue() - _fromVal.getLongValue() + 1))
                    / _incrVal.getLongValue());
  }