diff --git a/src/main/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizer.java b/src/main/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizer.java index c144ceee0..b0c6b8b23 100644 --- a/src/main/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizer.java +++ b/src/main/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizer.java @@ -664,37 +664,6 @@ public class BOBYQAOptimizer // useful safeguard, but is not invoked in most applications of BOBYQA. } - case 190: { - nfsav = getEvaluations(); - kbase = trustRegionCenterInterpolationPointIndex; - - rescue(xbase, xpt, - fval, xopt, gopt, hq, pq, bmat, - zmat, sl, su, delta, - vlag); - - // XOPT is updated now in case the branch below to label 720 is taken. - // Any updating of GOPT occurs after the branch below to label 20, which - // leads to a trust region iteration as does the branch to label 60. - - xoptsq = ZERO; - if (trustRegionCenterInterpolationPointIndex != kbase) { - for (int i = 0; i < n; i++) { - xopt.setEntry(i, xpt.getEntry(trustRegionCenterInterpolationPointIndex, i)); - // Computing 2nd power - final double d1 = xopt.getEntry(i); - xoptsq += d1 * d1; - } - } - nresc = getEvaluations(); - if (nfsav < getEvaluations()) { - nfsav = getEvaluations(); - state = 20; break; - } - if (ntrits > 0) { - state = 60; break; - } - } case 210: { // Pick two alternative vectors of variables, relative to XBASE, that // are suitable as new positions of the KNEW-th interpolation point. @@ -776,8 +745,8 @@ public class BOBYQAOptimizer if (ntrits == 0) { // Computing 2nd power - d__1 = vlag.getEntry(knew); // XXX Same statement as a few lines below? - denom = d__1 * d__1 + alpha * beta; + final double d1 = vlag.getEntry(knew); + denom = d1 * d1 + alpha * beta; if (denom < cauchy && cauchy > ZERO) { for (int i = 0; i < n; i++) { xnew.setEntry(i, xalt.getEntry(i)); @@ -786,18 +755,9 @@ public class BOBYQAOptimizer cauchy = ZERO; // XXX Useful statement? state = 230; break; } - // Computing 2nd power - d__1 = vlag.getEntry(knew); // XXX Same statement as a few lines above? - if (denom <= HALF * (d__1 * d__1)) { - if (getEvaluations() > nresc) { - state = 190; break; - } - throw new MathIllegalStateException(LocalizedFormats.TOO_MUCH_CANCELLATION, vquad); - } - // Alternatively, if NTRITS is positive, then set KNEW to the index of // the next interpolation point to be deleted to make room for a trust - // region step. Again RESCUE may be called if rounding errors have damaged + // region step. Again RESCUE may be called if rounding errors have damaged_ // the chosen denominator, which is the reason for attempting to select // KNEW before calculating the next value of the objective function. @@ -843,12 +803,6 @@ public class BOBYQAOptimizer d__2 = temp * (d__3 * d__3); biglsq = Math.max(d__1, d__2); } - if (scaden <= HALF * biglsq) { - if (getEvaluations() > nresc) { - state = 190; break; - } - throw new MathIllegalStateException(LocalizedFormats.TOO_MUCH_CANCELLATION, vquad); - } } // Put the variables for the next calculation of the objective function @@ -1277,6 +1231,9 @@ public class BOBYQAOptimizer f = fval.getEntry(trustRegionCenterInterpolationPointIndex); } return f; + } + default: { + throw new MathIllegalStateException(LocalizedFormats.SIMPLE_MESSAGE, "bobyqb"); }} } // bobyqb @@ -1896,543 +1853,6 @@ public class BOBYQAOptimizer } while (getEvaluations() < npt); } // prelim - // ---------------------------------------------------------------------------------------- - - /** - * The first NDIM+NPT elements of the array W are used for working space. - * The final elements of BMAT and ZMAT are set in a well-conditioned way - * to the values that are appropriate for the new interpolation points. - * The elements of GOPT, HQ and PQ are also revised to the values that are - * appropriate to the final quadratic model. - * - * The arguments N, NPT, XL, XU, IPRINT, MAXFUN, XBASE, XPT, FVAL, XOPT, - * GOPT, HQ, PQ, BMAT, ZMAT, NDIM, SL and SU have the same meanings as - * the corresponding arguments of BOBYQB on the entry to RESCUE. - * NF is maintained as the number of calls of CALFUN so far, except that - * NF is set to -1 if the value of MAXFUN prevents further progress. - * KOPT is maintained so that FVAL(KOPT) is the least calculated function - * value. Its correct value must be given on entry. It is updated if a - * new least function value is found, but the corresponding changes to - * XOPT and GOPT have to be made later by the calling program. - * DELTA is the current trust region radius. - * VLAG is a working space vector that will be used for the values of the - * provisional Lagrange functions at each of the interpolation points. - * They are part of a product that requires VLAG to be of length NDIM. - * PTSAUX is also a working space array. For J=1,2,...,N, PTSAUX(1,J) and - * PTSAUX(2,J) specify the two positions of provisional interpolation - * points when a nonzero step is taken along e_J (the J-th coordinate - * direction) through XBASE+XOPT, as specified below. Usually these - * steps have length DELTA, but other lengths are chosen if necessary - * in order to satisfy the given bounds on the variables. - * PTSID is also a working space array. It has NPT components that denote - * provisional new positions of the original interpolation points, in - * case changes are needed to restore the linear independence of the - * interpolation conditions. The K-th point is a candidate for change - * if and only if PTSID(K) is nonzero. In this case let p and q be the - * int parts of PTSID(K) and (PTSID(K)-p) multiplied by N+1. If p - * and q are both positive, the step from XBASE+XOPT to the new K-th - * interpolation point is PTSAUX(1,p)*e_p + PTSAUX(1,q)*e_q. Otherwise - * the step is PTSAUX(1,p)*e_p or PTSAUX(2,q)*e_q in the cases q=0 or - * p=0, respectively. - * @param xbase - * @param xpt - * @param fval - * @param xopt - * @param gopt - * @param hq - * @param pq - * @param bmat - * @param zmat - * @param sl - * @param su - * @param delta - * @param vlag - */ - private void rescue( - ArrayRealVector xbase, - Array2DRowRealMatrix xpt, - ArrayRealVector fval, - ArrayRealVector xopt, - ArrayRealVector gopt, - ArrayRealVector hq, - ArrayRealVector pq, - Array2DRowRealMatrix bmat, - Array2DRowRealMatrix zmat, - ArrayRealVector sl, - ArrayRealVector su, - double delta, - ArrayRealVector vlag - ) { - // System.out.println("rescue"); // XXX - - final int n = currentBest.getDimension(); - final int npt = numberOfInterpolationPoints; - final int ndim = bmat.getRowDimension(); - - final Array2DRowRealMatrix ptsaux = new Array2DRowRealMatrix(n, 2); - final ArrayRealVector ptsid = new ArrayRealVector(npt); - - final ArrayRealVector work1 = new ArrayRealVector(npt); // Originally: w(1 .. npt). - final ArrayRealVector work2 = new ArrayRealVector(n); // Originally: w(npt+1 .. npt+n). - final ArrayRealVector work3 = new ArrayRealVector(npt); // Originally: w(npt+n+1 .. npt+n+npt). - - final int np = n + 1; - final double sfrac = HALF / (double) np; - final int nptm = npt - np; - - // System generated locals - double d__1, d__2, d__3, d__4; - - - // Local variables - double f; - int ih, jp, ip, iq; - double xp = 0, xq = 0, den = 0; - int ihp = 0; - int jpn, kpt; - double sum = 0, diff = 0, beta = 0; - int kold; - double winc; - int nrem, knew; - double temp, bsum; - double hdiag = 0, fbase = 0, denom = 0, vquad = 0, sumpq = 0; - double dsqmin, distsq, vlmxsq; - - // Set some constants. - - // Function Body - - // Shift the interpolation points so that XOPT becomes the origin, and set - // the elements of ZMAT to zero. The value of SUMPQ is required in the - // updating of HQ below. The squares of the distances from XOPT to the - // other interpolation points are set at the end of W. Increments of WINC - // may be added later to these squares to balance the consideration of - // the choice of point that is going to become current. - - sumpq = ZERO; - winc = ZERO; - for (int k = 0; k < npt; k++) { - distsq = ZERO; - for (int j = 0; j < n; j++) { - xpt.setEntry(k, j, xpt.getEntry(k, j) - xopt.getEntry(j)); - // Computing 2nd power - final double d1 = xpt.getEntry(k, j); - distsq += d1 * d1; - } - sumpq += pq.getEntry(k); - work3.setEntry(k, distsq); - winc = Math.max(winc, distsq); - for (int j = 0; j < nptm; j++) { - zmat.setEntry(k, j, ZERO); - } - } - - // Update HQ so that HQ and PQ define the second derivatives of the model - // after XBASE has been shifted to the trust region centre. - - ih = 0; - for (int j = 0; j < n; j++) { - work2.setEntry(j, HALF * sumpq * xopt.getEntry(j)); - for (int k = 0; k < npt; k++) { - work2.setEntry(j, work2.getEntry(j) + pq.getEntry(k) * xpt.getEntry(k, j)); - } - for (int i = 0; i <= j; i++) { - hq.setEntry(ih, hq.getEntry(ih) + work2.getEntry(i) * xopt.getEntry(j) + work2.getEntry(j) * xopt.getEntry(i)); - ih++; - } - } - - // Shift XBASE, SL, SU and XOPT. Set the elements of BMAT to zero, and - // also set the elements of PTSAUX. - - for (int j = 0; j < n; j++) { - xbase.setEntry(j, xbase.getEntry(j) + xopt.getEntry(j)); - sl.setEntry(j, sl.getEntry(j) - xopt.getEntry(j)); - su.setEntry(j, su.getEntry(j) - xopt.getEntry(j)); - xopt.setEntry(j, ZERO); - // Computing MIN - d__1 = delta; - d__2 = su.getEntry(j); - ptsaux.setEntry(j, 0, Math.min(d__1, d__2)); - // Computing MAX - d__1 = -delta; - d__2 = sl.getEntry(j); - ptsaux.setEntry(j, 1, Math.max(d__1, d__2)); - if (ptsaux.getEntry(j, 0) + ptsaux.getEntry(j, 1) < ZERO) { - temp = ptsaux.getEntry(j, 0); - ptsaux.setEntry(j, 0, ptsaux.getEntry(j, 1)); - ptsaux.setEntry(j, 1, temp); - } - d__2 = ptsaux.getEntry(j, 1); - d__1 = ptsaux.getEntry(j, 0); - if (Math.abs(d__2) < HALF * Math.abs(d__1)) { - ptsaux.setEntry(j, 1, HALF * ptsaux.getEntry(j, 0)); - } - for (int i = 0; i < ndim; i++) { - bmat.setEntry(i, j, ZERO); - } - } - fbase = fval.getEntry(trustRegionCenterInterpolationPointIndex); - - // Set the identifiers of the artificial interpolation points that are - // along a coordinate direction from XOPT, and set the corresponding - // nonzero elements of BMAT and ZMAT. - - ptsid.setEntry(0, sfrac); - for (int j = 0; j < n; j++) { - jp = j + 1; - jpn = jp + n; - ptsid.setEntry(jp, 1.0 + j + sfrac); - if (jpn <= npt) { - ptsid.setEntry(jpn, (1.0+j) / (double) np + sfrac); - temp = ONE / (ptsaux.getEntry(j, 0) - ptsaux.getEntry(j, 1)); - bmat.setEntry(jp, j, -temp + ONE / ptsaux.getEntry(j, 0)); - bmat.setEntry(jpn, j, temp + ONE / ptsaux.getEntry(j, 1)); - bmat.setEntry(0, j, -bmat.getEntry(jp, j) - bmat.getEntry(jpn, j)); - final double d1 = ptsaux.getEntry(j, 0) * ptsaux.getEntry(j, 1); - zmat.setEntry(0, j, Math.sqrt(TWO) / Math.abs(d1)); - zmat.setEntry(jp, j, zmat.getEntry(0, j) * - ptsaux.getEntry(j, 1) * temp); - zmat.setEntry(jpn, j, -zmat.getEntry(0, j) * - ptsaux.getEntry(j, 0) * temp); - } else { - bmat.setEntry(0, j, -ONE / ptsaux.getEntry(j, 0)); - bmat.setEntry(jp, j, ONE / ptsaux.getEntry(j, 0)); - // Computing 2nd power - final double d1 = ptsaux.getEntry(j, 0); - bmat.setEntry(j + npt, j, -HALF * (d1 * d1)); - } - } - - // Set any remaining identifiers with their nonzero elements of ZMAT. - - if (npt >= n + np) { - for (int k = np << 1; k <= npt; k++) { - int iw = (int) (((double) (k - np) - HALF) / (double) n); - ip = k - np - iw * n; - iq = ip + iw; - if (iq > n) { - iq -= n; - } - ptsid.setEntry(k, (double) ip + (double) iq / (double) np + - sfrac); - temp = ONE / (ptsaux.getEntry(ip, 0) * ptsaux.getEntry(iq, 0)); - zmat.setEntry(0, (k - np), temp); - zmat.setEntry(ip + 1, k - np, -temp); - zmat.setEntry(iq + 1, k - np, -temp); - zmat.setEntry(k, k - np, temp); - } - } - nrem = npt; - kold = 1; - knew = trustRegionCenterInterpolationPointIndex; - - // Reorder the provisional points in the way that exchanges PTSID(KOLD) - // with PTSID(KNEW). - - int state = 80; - for(;;) switch (state) { - case 80: { - for (int j = 0; j < n; j++) { - temp = bmat.getEntry(kold, j); - bmat.setEntry(kold, j, bmat.getEntry(knew, j)); - bmat.setEntry(knew, j, temp); - } - for (int j = 0; j < nptm; j++) { - temp = zmat.getEntry(kold, j); - zmat.setEntry(kold, j, zmat.getEntry(knew, j)); - zmat.setEntry(knew, j, temp); - } - ptsid.setEntry(kold, ptsid.getEntry(knew)); - ptsid.setEntry(knew, ZERO); - work3.setEntry(knew, ZERO); - --nrem; - if (knew != trustRegionCenterInterpolationPointIndex) { - temp = vlag.getEntry(kold); - vlag.setEntry(kold, vlag.getEntry(knew)); - vlag.setEntry(knew, temp); - - // Update the BMAT and ZMAT matrices so that the status of the KNEW-th - // interpolation point can be changed from provisional to original. The - // branch to label 350 occurs if all the original points are reinstated. - // The nonnegative values of W(NDIM+K) are required in the search below. - - update(bmat, zmat, vlag, - beta, denom, knew); - - if (nrem == 0) { - return; - } - for (int k = 0; k < npt; k++) { - work3.setEntry(k, Math.abs(work3.getEntry(k))); - } - } - - // Pick the index KNEW of an original interpolation point that has not - // yet replaced one of the provisional interpolation points, giving - // attention to the closeness to XOPT and to previous tries with KNEW. - } - case 120: { - dsqmin = ZERO; - for (int k = 0; k < npt; k++) { - final double v1 = work3.getEntry(k); - if (v1 > ZERO) { - if (dsqmin == ZERO || - v1 < dsqmin) { - knew = k; - dsqmin = v1; - } - } - } - if (dsqmin == ZERO) { - state = 260; break; - } - - // Form the W-vector of the chosen original interpolation point. - - for (int j = 0; j < n; j++) { - work2.setEntry(j, xpt.getEntry(knew, j)); - } - for (int k = 0; k < npt; k++) { - sum = ZERO; - if (k == trustRegionCenterInterpolationPointIndex) { - } else if (ptsid.getEntry(k) == ZERO) { - for (int j = 0; j < n; j++) { - sum += work2.getEntry(j) * xpt.getEntry(k, j); - } - } else { - ip = (int) ptsid.getEntry(k); - if (ip > 0) { - sum = work2.getEntry(ip - 1) * ptsaux.getEntry(ip - 1, 0); - } - iq = (int) ((double) np * ptsid.getEntry(k) - (double) (ip * np)); - if (iq > 0) { - int iw = 0; - if (ip == 0) { - iw = 1; - } - sum += work2.getEntry(iq - 1) * ptsaux.getEntry(iq - 1, iw); - } - } - work1.setEntry(k, HALF * sum * sum); - } - - // Calculate VLAG and BETA for the required updating of the H matrix if - // XPT(KNEW,.) is reinstated in the set of interpolation points. - - for (int k = 0; k < npt; k++) { - sum = ZERO; - for (int j = 0; j < n; j++) { - sum += bmat.getEntry(k, j) * work2.getEntry(j); - } - vlag.setEntry(k, sum); - } - beta = ZERO; - for (int j = 0; j < nptm; j++) { - sum = ZERO; - for (int k = 0; k < npt; k++) { - sum += zmat.getEntry(k, j) * work1.getEntry(k); - } - beta -= sum * sum; - for (int k = 0; k < npt; k++) { - vlag.setEntry(k, vlag.getEntry(k) + sum * zmat.getEntry(k, j)); - } - } - bsum = ZERO; - distsq = ZERO; - for (int j = 0; j < n; j++) { - sum = ZERO; - for (int k = 0; k < npt; k++) { - sum += bmat.getEntry(k, j) * work1.getEntry(k); - } - jp = j + npt; - bsum += sum * work2.getEntry(j); - for (int k = 0; k < n; k++) { - sum += bmat.getEntry(npt + k, j) * work2.getEntry(k); - } - bsum += sum * work2.getEntry(j); - vlag.setEntry(jp, sum); - // Computing 2nd power - final double d1 = xpt.getEntry(knew, j); - distsq += d1 * d1; - } - beta = HALF * distsq * distsq + beta - bsum; - vlag.setEntry(trustRegionCenterInterpolationPointIndex, vlag.getEntry(trustRegionCenterInterpolationPointIndex) + ONE); - - // KOLD is set to the index of the provisional interpolation point that is - // going to be deleted to make way for the KNEW-th original interpolation - // point. The choice of KOLD is governed by the avoidance of a small value - // of the denominator in the updating calculation of UPDATE. - - denom = ZERO; - vlmxsq = ZERO; - for (int k = 0; k < npt; k++) { - if (ptsid.getEntry(k) != ZERO) { - hdiag = ZERO; - for (int j = 0; j < nptm; j++) { - // Computing 2nd power - final double d1 = zmat.getEntry(k, j); - hdiag += d1 * d1; - } - // Computing 2nd power - final double d1 = vlag.getEntry(k); - den = beta * hdiag + d1 * d1; - if (den > denom) { - kold = k; - denom = den; - } - } - // Computing MAX - // Computing 2nd power - final double d3 = vlag.getEntry(k); - vlmxsq = Math.max(vlmxsq , d3 * d3); - } - if (denom <= vlmxsq * .01) { - work3.setEntry(knew, -work3.getEntry(knew) - winc); - state = 120; break; - } - state = 80; break; - - // When label 260 is reached, all the final positions of the interpolation - // points have been chosen although any changes have not been included yet - // in XPT. Also the final BMAT and ZMAT matrices are complete, but, apart - // from the shift of XBASE, the updating of the quadratic model remains to - // be done. The following cycle through the new interpolation points begins - // by putting the new point in XPT(KPT,.) and by setting PQ(KPT) to zero, - // except that a RETURN occurs if MAXFUN prohibits another value of F. - - } - case 260: { - for (kpt = 0; kpt < npt; kpt++) { - if (ptsid.getEntry(kpt) == ZERO) { - continue; - } - ih = 0; - for (int j = 0; j < n; j++) { - work2.setEntry(j, xpt.getEntry(kpt, j)); - xpt.setEntry(kpt, j, ZERO); - temp = pq.getEntry(kpt) * work2.getEntry(j); - for (int i = 0; i <= j; i++) { - hq.setEntry(ih, hq.getEntry(ih) + temp * work2.getEntry(i)); - ih++; - } - } - pq.setEntry(kpt, ZERO); - ip = (int) ptsid.getEntry(kpt); - iq = (int) ((double) np * ptsid.getEntry(kpt) - (double) (ip * np)); - if (ip > 0) { - xp = ptsaux.getEntry(ip - 1, 0); - xpt.setEntry(kpt, ip - 1, xp); - } - if (iq > 0) { - xq = ptsaux.getEntry(iq - 1, 0); - if (ip == 0) { - xq = ptsaux.getEntry(iq - 1, 1); - } - xpt.setEntry(kpt, iq - 1, xq); - } - - // Set VQUAD to the value of the current model at the new point. - - vquad = fbase; - if (ip > 0) { - ihp = (ip + ip * ip) / 2; - vquad += xp * (gopt.getEntry(ip - 1) + HALF * xp * hq.getEntry(ihp - 1)); - } - if (iq > 0) { - int ihq = (iq + iq * iq) / 2; - vquad += xq * (gopt.getEntry(iq - 1) + HALF * xq * hq.getEntry(ihq - 1)); - if (ip > 0) { - int iiw = Math.max(ihp, ihq) - Math.abs(ip - iq); - vquad += xp * xq * hq.getEntry(iiw - 1); - } - } - for (int k = 0; k < npt; k++) { - temp = ZERO; - if (ip > 0) { - temp += xp * xpt.getEntry(k, ip - 1); - } - if (iq > 0) { - temp += xq * xpt.getEntry(k, iq - 1); - } - vquad += HALF * pq.getEntry(k) * temp * temp; - } - - // Calculate F at the new interpolation point, and set DIFF to the factor - // that is going to multiply the KPT-th Lagrange function when the model - // is updated to provide interpolation to the new function value. - - for (int i = 0; i < n; i++) { - // Computing MIN - // Computing MAX - d__3 = lowerBound[i]; - d__4 = xbase.getEntry(i) + xpt.getEntry(kpt, i); - d__1 = Math.max(d__3, d__4); - d__2 = upperBound[i]; - work2.setEntry(i, Math.min(d__1, d__2)); - if (xpt.getEntry(kpt, i) == sl.getEntry(i)) { - work2.setEntry(i, lowerBound[i]); - } - if (xpt.getEntry(kpt, i) == su.getEntry(i)) { - work2.setEntry(i, upperBound[i]); - } - } - - f = computeObjectiveValue(work2.getData()); - - if (!isMinimize) - f = -f; - fval.setEntry(kpt, f); - if (f < fval.getEntry(trustRegionCenterInterpolationPointIndex)) { - trustRegionCenterInterpolationPointIndex = kpt; - } - diff = f - vquad; - - // Update the quadratic model. The RETURN from the subroutine occurs when - // all the new interpolation points are included in the model. - - for (int i = 0; i < n; i++) { - gopt.setEntry(i, gopt.getEntry(i) + diff * bmat.getEntry(kpt, i)); - } - for (int k = 0; k < npt; k++) { - sum = ZERO; - for (int j = 0; j < nptm; j++) { - sum += zmat.getEntry(k, j) * zmat.getEntry(kpt, j); - } - temp = diff * sum; - if (ptsid.getEntry(k) == ZERO) { - pq.setEntry(k, pq.getEntry(k) + temp); - } else { - ip = (int) ptsid.getEntry(k); - iq = (int) ((double) np * ptsid.getEntry(k) - (double) (ip * np)); - int ihq = (iq * iq + iq) / 2; - if (ip == 0) { - // Computing 2nd power - final double d1 = ptsaux.getEntry(iq - 1, 1); - hq.setEntry(ihq - 1, hq.getEntry(ihq - 1) + temp * (d1 * d1)); - } else { - ihp = (ip * ip + ip) / 2; - // Computing 2nd power - final double d1 = ptsaux.getEntry(ip - 1, 0); - hq.setEntry(ihp - 1, hq.getEntry(ihp - 1) + temp * (d1 * d1)); - if (iq > 0) { - // Computing 2nd power - final double d2 = ptsaux.getEntry(iq - 1, 0); - hq.setEntry(ihq - 1, hq.getEntry(ihq - 1) + temp * (d2 * d2)); - int iw = Math.max(ihp,ihq) - Math.abs(iq - ip); - hq.setEntry(iw - 1, hq.getEntry(iw - 1) - + temp * ptsaux.getEntry(ip - 1, 0) * ptsaux.getEntry(iq - 1, 0)); - } - } - } - } - ptsid.setEntry(kpt, ZERO); - } - return; - }} - } // rescue - - // ---------------------------------------------------------------------------------------- @@ -2966,6 +2386,9 @@ public class BOBYQAOptimizer hred.setEntry(i, hs.getEntry(i)); } state = 120; break; + } + default: { + throw new MathIllegalStateException(LocalizedFormats.SIMPLE_MESSAGE, "trsbox"); }} } // trsbox diff --git a/src/test/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizerTest.java b/src/test/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizerTest.java index e9276a1fe..aa2ec3955 100644 --- a/src/test/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizerTest.java +++ b/src/test/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizerTest.java @@ -75,16 +75,6 @@ public class BOBYQAOptimizerTest { 1e-13, 1e-6, lowMaxEval, null); } - @Test(expected=TooManyEvaluationsException.class) - public void testRescue() { - double[] startPoint = point(DIM, 1); - double[][] boundaries = null; - RealPointValuePair expected = new RealPointValuePair(point(DIM, 0), 0); - doTest(new MinusElli(), startPoint, boundaries, - GoalType.MINIMIZE, - 1e-13, 1e-6, 1000, expected); - } - @Test public void testRosen() { double[] startPoint = point(DIM,0.1);