commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From er...@apache.org
Subject svn commit: r1159792 - /commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizer.java
Date Fri, 19 Aug 2011 21:35:19 GMT
Author: erans
Date: Fri Aug 19 21:35:19 2011
New Revision: 1159792

URL: http://svn.apache.org/viewvc?rev=1159792&view=rev
Log:
MATH-621
Function "prelim": Local variables defined at initialization.

Modified:
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizer.java

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizer.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizer.java?rev=1159792&r1=1159791&r2=1159792&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizer.java
(original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/direct/BOBYQAOptimizer.java
Fri Aug 19 21:35:19 2011
@@ -565,12 +565,15 @@ public class BOBYQAOptimizer
             if (dsq <= xoptsq * ONE_OVER_A_THOUSAND) {
                 fracsq = xoptsq * ONE_OVER_FOUR;
                 sumpq = ZERO;
+                // final RealVector sumVector
+                //     = new ArrayRealVector(npt, -HALF * xoptsq).add(xpt.operate(xopt));
                 for (int k = 0; k < npt; k++) {
                     sumpq += pq.getEntry(k);
                     sum = -HALF * xoptsq;
                     for (int i = 0; i < n; i++) {
                         sum += xpt.getEntry(k, i) * xopt.getEntry(i);
                     }
+                    // sum = sumVector.getEntry(k); // XXX "testAckley" and "testDiffPow"
fail.
                     work2.setEntry(k, sum);
                     temp = fracsq - HALF * sum;
                     for (int i = 0; i < n; i++) {
@@ -1648,23 +1651,9 @@ public class BOBYQAOptimizer
         final int ndim = bmat.getRowDimension();
 
         final double rhosq = initialTrustRegionRadius * initialTrustRegionRadius;
-        final double recip = ONE / rhosq;
+        final double recip = 1d / rhosq;
         final int np = n + 1;
 
-        // System generated locals
-        double d__1, d__2, d__3, d__4;
-
-        // Local variables
-        double f;
-        int ih, nfm;
-        int nfx = 0, ipt = 0, jpt = 0;
-        double fbeg = 0, diff = 0, temp = 0, stepa = 0, stepb = 0;
-        int itemp;
-
-        // Set some constants.
-
-        // Function Body
-
         // Set XBASE to the initial vector of variables, and set the initial
         // elements of XPT, BMAT, HQ, PQ and ZMAT to zero.
 
@@ -1691,41 +1680,47 @@ public class BOBYQAOptimizer
         // of function values so far. The coordinates of the displacement of the
         // next initial interpolation point from XBASE are set in XPT(NF+1,.).
 
+        int ipt = 0;
+        int jpt = 0;
+        double fbeg = Double.NaN;
         do {
-            nfm = getEvaluations();
-            nfx = getEvaluations() - n;
+            final int nfm = getEvaluations();
+            final int nfx = nfm - n;
             final int nfmm = nfm - 1;
             final int nfxm = nfx - 1;
-            if (nfm <= n << 1) {
-                if (nfm >= 1 && nfm <= n) {
+            double stepa = 0;
+            double stepb = 0;
+            if (nfm <= 2 * n) {
+                if (nfm >= 1 &&
+                    nfm <= n) {
                     stepa = initialTrustRegionRadius;
                     if (su.getEntry(nfmm) == ZERO) {
                         stepa = -stepa;
+                        throw new PathIsExploredException(); // XXX
                     }
                     xpt.setEntry(nfm, nfmm, stepa);
                 } else if (nfm > n) {
                     stepa = xpt.getEntry(nfx, nfxm);
                     stepb = -initialTrustRegionRadius;
                     if (sl.getEntry(nfxm) == ZERO) {
-                        // Computing MIN
-                        final double d1 = TWO * initialTrustRegionRadius;
-                        stepb = Math.min(d1, su.getEntry(nfxm));
+                        stepb = Math.min(TWO * initialTrustRegionRadius, su.getEntry(nfxm));
+                        throw new PathIsExploredException(); // XXX
                     }
                     if (su.getEntry(nfxm) == ZERO) {
-                        // Computing MAX
-                        final double d1 = -TWO * initialTrustRegionRadius;
-                        stepb = Math.max(d1, sl.getEntry(nfxm));
+                        stepb = Math.max(-TWO * initialTrustRegionRadius, sl.getEntry(nfxm));
+                        throw new PathIsExploredException(); // XXX
                     }
                     xpt.setEntry(nfm, nfxm, stepb);
                 }
             } else {
-                itemp = (nfm - np) / n;
-                jpt = nfm - itemp * n - n;
-                ipt = jpt + itemp;
+                final int tmp1 = (nfm - np) / n;
+                jpt = nfm - tmp1 * n - n;
+                ipt = jpt + tmp1;
                 if (ipt > n) {
-                    itemp = jpt;
+                    final int tmp2 = jpt;
                     jpt = ipt - n;
-                    ipt = itemp;
+                    ipt = tmp2;
+                    throw new PathIsExploredException(); // XXX
                 }
                 xpt.setEntry(nfm, ipt, xpt.getEntry(ipt, ipt));
                 xpt.setEntry(nfm, jpt, xpt.getEntry(jpt, jpt));
@@ -1735,13 +1730,9 @@ public class BOBYQAOptimizer
             // its index are required.
 
             for (int j = 0; j < n; j++) {
-                // Computing MIN
-                // Computing MAX
-                d__3 = lowerBound[j];
-                d__4 = xbase.getEntry(j) + xpt.getEntry(nfm, j);
-                d__1 = Math.max(d__3, d__4);
-                d__2 = upperBound[j];
-                currentBest.setEntry(j, Math.min(d__1, d__2));
+                currentBest.setEntry(j, Math.min(Math.max(lowerBound[j],
+                                                          xbase.getEntry(j) + xpt.getEntry(nfm,
j)),
+                                                 upperBound[j]));
                 if (xpt.getEntry(nfm, j) == sl.getEntry(j)) {
                     currentBest.setEntry(j, lowerBound[j]);
                 }
@@ -1749,13 +1740,13 @@ public class BOBYQAOptimizer
                     currentBest.setEntry(j, upperBound[j]);
                 }
             }
-
-            f = computeObjectiveValue(currentBest.getData());
-
-            if (!isMinimize)
-                f = -f;
+            
+            final double objectiveValue = computeObjectiveValue(currentBest.getData());
+            final double f = isMinimize ? objectiveValue : -objectiveValue;
+            final int numEval = getEvaluations(); // nfm + 1
             fval.setEntry(nfm, f);
-            if (getEvaluations() == 1) {
+
+            if (numEval == 1) {
                 fbeg = f;
                 trustRegionCenterInterpolationPointIndex = 0;
             } else if (f < fval.getEntry(trustRegionCenterInterpolationPointIndex)) {
@@ -1768,20 +1759,23 @@ public class BOBYQAOptimizer
             // order that the function value at the first of them contributes to the
             // off-diagonal second derivative terms of the initial quadratic model.
 
-            if (getEvaluations() <= (n << 1) + 1) {
-                if (getEvaluations() >= 2 && getEvaluations() <= n + 1) {
+            if (numEval <= 2 * n + 1) {
+                if (numEval >= 2 &&
+                    numEval <= n + 1) {
                     gopt.setEntry(nfmm, (f - fbeg) / stepa);
-                    if (npt < getEvaluations() + n) {
-                        bmat.setEntry(0, nfmm, -ONE / stepa);
-                        bmat.setEntry(nfm, nfmm, ONE / stepa);
+                    if (npt < numEval + n) {
+                        final double oneOverStepA = ONE / stepa;
+                        bmat.setEntry(0, nfmm, -oneOverStepA);
+                        bmat.setEntry(nfm, nfmm, oneOverStepA);
                         bmat.setEntry(npt + nfmm, nfmm, -HALF * rhosq);
+                        throw new PathIsExploredException(); // XXX
                     }
-                } else if (getEvaluations() >= n + 2) {
-                    ih = nfx * (nfx + 1) / 2 - 1;
-                    temp = (f - fbeg) / stepb;
-                    diff = stepb - stepa;
-                    hq.setEntry(ih, TWO * (temp - gopt.getEntry(nfxm)) / diff);
-                    gopt.setEntry(nfxm, (gopt.getEntry(nfxm) * stepb - temp * stepa) / diff);
+                } else if (numEval >= n + 2) {
+                    final int ih = nfx * (nfx + 1) / 2 - 1;
+                    final double tmp = (f - fbeg) / stepb;
+                    final double diff = stepb - stepa;
+                    hq.setEntry(ih, TWO * (tmp - gopt.getEntry(nfxm)) / diff);
+                    gopt.setEntry(nfxm, (gopt.getEntry(nfxm) * stepb - tmp * stepa) / diff);
                     if (stepa * stepb < ZERO) {
                         if (f < fval.getEntry(nfm - n)) {
                             fval.setEntry(nfm, fval.getEntry(nfm - n));
@@ -1794,27 +1788,29 @@ public class BOBYQAOptimizer
                         }
                     }
                     bmat.setEntry(0, nfxm, -(stepa + stepb) / (stepa * stepb));
-                    bmat.setEntry(nfm, nfxm, -HALF /
-                                   xpt.getEntry(nfm - n, nfxm));
-                    bmat.setEntry(nfm - n, nfxm, -bmat.getEntry(0, nfxm) -
-                                   bmat.getEntry(nfm, nfxm));
+                    bmat.setEntry(nfm, nfxm, -HALF / xpt.getEntry(nfm - n, nfxm));
+                    bmat.setEntry(nfm - n, nfxm,
+                                  -bmat.getEntry(0, nfxm) - bmat.getEntry(nfm, nfxm));
                     zmat.setEntry(0, nfxm, Math.sqrt(TWO) / (stepa * stepb));
                     zmat.setEntry(nfm, nfxm, Math.sqrt(HALF) / rhosq);
-                    zmat.setEntry(nfm - n, nfxm, -zmat.getEntry(0, nfxm) -
-                                   zmat.getEntry(nfm, nfxm));
+                    // zmat.setEntry(nfm, nfxm, Math.sqrt(HALF) * recip); // XXX "testAckley"
and "testDiffPow" fail.
+                    zmat.setEntry(nfm - n, nfxm,
+                                  -zmat.getEntry(0, nfxm) - zmat.getEntry(nfm, nfxm));
                 }
 
                 // Set the off-diagonal second derivatives of the Lagrange functions and
                 // the initial quadratic model.
 
             } else {
-                ih = ipt * (ipt - 1) / 2 + jpt - 1;
                 zmat.setEntry(0, nfxm, recip);
                 zmat.setEntry(nfm, nfxm, recip);
                 zmat.setEntry(ipt, nfxm, -recip);
                 zmat.setEntry(jpt, nfxm, -recip);
-                temp = xpt.getEntry(nfm, ipt - 1) * xpt.getEntry(nfm, jpt - 1);
-                hq.setEntry(ih, (fbeg - fval.getEntry(ipt) - fval.getEntry(jpt) + f) / temp);
+
+                final int ih = ipt * (ipt - 1) / 2 + jpt - 1;
+                final double tmp = xpt.getEntry(nfm, ipt - 1) * xpt.getEntry(nfm, jpt - 1);
+                hq.setEntry(ih, (fbeg - fval.getEntry(ipt) - fval.getEntry(jpt) + f) / tmp);
+                throw new PathIsExploredException(); // XXX
             }
         } while (getEvaluations() < npt);
     } // prelim



Mime
View raw message