Author: erans
Date: Sat Aug 13 09:08:39 2011
New Revision: 1157355
URL: http://svn.apache.org/viewvc?rev=1157355&view=rev
Log:
MATH-621
Added temporary constant "INDEX_OFFSET" to keep track of where changes are
needed for converting from 1-based to 0-based indexing.
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=1157355&r1=1157354&r2=1157355&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
Sat Aug 13 09:08:39 2011
@@ -55,6 +55,7 @@ import org.apache.commons.math.linear.Ar
public class BOBYQAOptimizer
extends BaseAbstractScalarOptimizer<MultivariateRealFunction>
implements MultivariateRealOptimizer {
+ private static final int INDEX_OFFSET = 1; // XXX to become "0" when all
loops are 0-based.
private static final double ZERO = 0d;
private static final double ONE = 1d;
private static final double TWO = 2d;
@@ -437,7 +438,7 @@ public class BOBYQAOptimizer
final double deltaOne = xopt.getEntry(i);
xoptsq += deltaOne * deltaOne;
}
- fsave = fval.getEntry(1);
+ fsave = fval.getEntry(INDEX_OFFSET);
kbase = 1;
// Complete the settings that are required for the iterative procedure.
@@ -1848,7 +1849,7 @@ public class BOBYQAOptimizer
if (getEvaluations() >= 2 && getEvaluations() <= n + 1) {
gopt.setEntry( nfm, (f - fbeg) / stepa);
if (npt < getEvaluations() + n) {
- bmat.setEntry(1, nfm, -ONE / stepa);
+ bmat.setEntry(INDEX_OFFSET, nfm, -ONE / stepa);
bmat.setEntry( getEvaluations(), nfm, ONE / stepa);
bmat.setEntry( npt + nfm, nfm, -HALF * rhosq);
}
@@ -1869,14 +1870,14 @@ public class BOBYQAOptimizer
xpt.setEntry(getEvaluations(), nfx, stepa);
}
}
- bmat.setEntry(1, nfx, -(stepa + stepb) / (stepa * stepb));
+ bmat.setEntry(INDEX_OFFSET, nfx, -(stepa + stepb) / (stepa
* stepb));
bmat.setEntry( getEvaluations(), nfx, -HALF /
xpt.getEntry(getEvaluations() - n, nfx));
- bmat.setEntry( getEvaluations() - n, nfx,
-bmat.getEntry(1, nfx) -
+ bmat.setEntry( getEvaluations() - n, nfx,
-bmat.getEntry(INDEX_OFFSET, nfx) -
bmat.getEntry( getEvaluations(), nfx));
- zmat.setEntry(1, nfx, Math.sqrt(TWO) / (stepa * stepb));
+ zmat.setEntry(INDEX_OFFSET, nfx, Math.sqrt(TWO) / (stepa *
stepb));
zmat.setEntry( getEvaluations(), nfx, Math.sqrt(HALF) /
rhosq);
- zmat.setEntry( getEvaluations() - n, nfx,
-zmat.getEntry(1, nfx) -
+ zmat.setEntry( getEvaluations() - n, nfx,
-zmat.getEntry(INDEX_OFFSET, nfx) -
zmat.getEntry( getEvaluations(), nfx));
}
@@ -1885,7 +1886,7 @@ public class BOBYQAOptimizer
} else {
ih = ipt * (ipt - 1) / 2 + jpt;
- zmat.setEntry(1, nfx, recip);
+ zmat.setEntry(INDEX_OFFSET, nfx, recip);
zmat.setEntry( getEvaluations(), nfx, recip);
zmat.setEntry(ipt + 1, nfx, -recip);
zmat.setEntry( jpt + 1, nfx, -recip);
@@ -2052,20 +2053,20 @@ public class BOBYQAOptimizer
// Computing MIN
d__1 = delta;
d__2 = su.getEntry(j);
- ptsaux.setEntry(j, 1, Math.min(d__1, d__2));
+ ptsaux.setEntry(j, INDEX_OFFSET, Math.min(d__1, d__2));
// Computing MAX
d__1 = -delta;
d__2 = sl.getEntry(j);
- ptsaux.setEntry(j, 2, Math.max(d__1, d__2));
- if (ptsaux.getEntry(j, 1) + ptsaux.getEntry(j, 2) < ZERO) {
- temp = ptsaux.getEntry(j, 1);
- ptsaux.setEntry(j, 1, ptsaux.getEntry(j, 2));
- ptsaux.setEntry(j, 2, temp);
+ ptsaux.setEntry(j, INDEX_OFFSET + 1, Math.max(d__1, d__2));
+ if (ptsaux.getEntry(j, INDEX_OFFSET) + ptsaux.getEntry(j,
INDEX_OFFSET + 1) < ZERO) {
+ temp = ptsaux.getEntry(j, INDEX_OFFSET);
+ ptsaux.setEntry(j, INDEX_OFFSET, ptsaux.getEntry(j,
INDEX_OFFSET + 1));
+ ptsaux.setEntry(j, INDEX_OFFSET + 1, temp);
}
- d__2 = ptsaux.getEntry(j, 2);
- d__1 = ptsaux.getEntry(j, 1);
+ d__2 = ptsaux.getEntry(j, INDEX_OFFSET + 1);
+ d__1 = ptsaux.getEntry(j, INDEX_OFFSET);
if (Math.abs(d__2) < HALF * Math.abs(d__1)) {
- ptsaux.setEntry(j, 2, HALF * ptsaux.getEntry(j, 1));
+ ptsaux.setEntry(j, INDEX_OFFSET + 1, HALF * ptsaux.getEntry(j,
INDEX_OFFSET));
}
for (int i = 1; i <= ndim; i++) {
bmat.setEntry(i, j, ZERO);
@@ -2077,28 +2078,28 @@ public class BOBYQAOptimizer
// along a coordinate direction from XOPT, and set the corresponding
// nonzero elements of BMAT and ZMAT.
- ptsid.setEntry(1, sfrac);
+ ptsid.setEntry(INDEX_OFFSET, sfrac);
for (int j = 1; j <= n; j++) {
jp = j + 1;
jpn = jp + n;
ptsid.setEntry(jp, (double) j + sfrac);
if (jpn <= npt) {
ptsid.setEntry(jpn, (double) j / (double) np + sfrac);
- temp = ONE / (ptsaux.getEntry(j, 1) - ptsaux.getEntry(j, 2));
- bmat.setEntry(jp, j, -temp + ONE / ptsaux.getEntry(j, 1));
- bmat.setEntry(jpn, j, temp + ONE / ptsaux.getEntry(j, 2));
- bmat.setEntry(1, j, -bmat.getEntry(jp, j) - bmat.getEntry(jpn,
j));
- final double d1 = ptsaux.getEntry(j, 1) * ptsaux.getEntry(j,
2);
- zmat.setEntry(1, j, Math.sqrt(TWO) / Math.abs(d1));
- zmat.setEntry(jp, j, zmat.getEntry(1, j) *
- ptsaux.getEntry(j, 2) * temp);
- zmat.setEntry(jpn, j, -zmat.getEntry(1, j) *
- ptsaux.getEntry(j, 1) * temp);
+ temp = ONE / (ptsaux.getEntry(j, INDEX_OFFSET) -
ptsaux.getEntry(j, INDEX_OFFSET + 1));
+ bmat.setEntry(jp, j, -temp + ONE / ptsaux.getEntry(j,
INDEX_OFFSET));
+ bmat.setEntry(jpn, j, temp + ONE / ptsaux.getEntry(j,
INDEX_OFFSET + 1));
+ bmat.setEntry(INDEX_OFFSET, j, -bmat.getEntry(jp, j) -
bmat.getEntry(jpn, j));
+ final double d1 = ptsaux.getEntry(j, INDEX_OFFSET) *
ptsaux.getEntry(j, INDEX_OFFSET + 1);
+ zmat.setEntry(INDEX_OFFSET, j, Math.sqrt(TWO) / Math.abs(d1));
+ zmat.setEntry(jp, j, zmat.getEntry(INDEX_OFFSET, j) *
+ ptsaux.getEntry(j, INDEX_OFFSET + 1) * temp);
+ zmat.setEntry(jpn, j, -zmat.getEntry(INDEX_OFFSET, j) *
+ ptsaux.getEntry(j, INDEX_OFFSET) * temp);
} else {
- bmat.setEntry(1, j, -ONE / ptsaux.getEntry(j, 1));
- bmat.setEntry(jp, j, ONE / ptsaux.getEntry(j, 1));
+ bmat.setEntry(INDEX_OFFSET, j, -ONE / ptsaux.getEntry(j,
INDEX_OFFSET));
+ bmat.setEntry(jp, j, ONE / ptsaux.getEntry(j, INDEX_OFFSET));
// Computing 2nd power
- final double d1 = ptsaux.getEntry(j, 1);
+ final double d1 = ptsaux.getEntry(j, INDEX_OFFSET);
bmat.setEntry(j + npt, j, -HALF * (d1 * d1));
}
}
@@ -2115,8 +2116,8 @@ public class BOBYQAOptimizer
}
ptsid.setEntry(k, (double) ip + (double) iq / (double) np +
sfrac);
- temp = ONE / (ptsaux.getEntry(ip, 1) * ptsaux.getEntry(iq, 1));
- zmat.setEntry(1, (k - np), temp);
+ temp = ONE / (ptsaux.getEntry(ip, INDEX_OFFSET) *
ptsaux.getEntry(iq, INDEX_OFFSET));
+ zmat.setEntry(INDEX_OFFSET, (k - np), temp);
zmat.setEntry(ip + 1, k - np, -temp);
zmat.setEntry(iq + 1, k - np, -temp);
zmat.setEntry(k, k - np, temp);
@@ -2202,13 +2203,13 @@ public class BOBYQAOptimizer
} else {
ip = (int) ptsid.getEntry(k);
if (ip > 0) {
- sum = work2.getEntry(ip) * ptsaux.getEntry(ip, 1);
+ sum = work2.getEntry(ip) * ptsaux.getEntry(ip,
INDEX_OFFSET);
}
iq = (int) ((double) np * ptsid.getEntry(k) - (double) (ip
* np));
if (iq > 0) {
- int iw = 1;
+ int iw = INDEX_OFFSET;
if (ip == 0) {
- iw = 2;
+ iw = INDEX_OFFSET + 1;
}
sum += work2.getEntry(iq) * ptsaux.getEntry(iq, iw);
}
@@ -2320,13 +2321,13 @@ public class BOBYQAOptimizer
ip = (int) ptsid.getEntry(kpt);
iq = (int) ((double) np * ptsid.getEntry(kpt) - (double) (ip *
np));
if (ip > 0) {
- xp = ptsaux.getEntry(ip, 1);
+ xp = ptsaux.getEntry(ip, INDEX_OFFSET);
xpt.setEntry(kpt, ip, xp);
}
if (iq > 0) {
- xq = ptsaux.getEntry(iq, 1);
+ xq = ptsaux.getEntry(iq, INDEX_OFFSET);
if (ip == 0) {
- xq = ptsaux.getEntry(iq, 2);
+ xq = ptsaux.getEntry(iq, INDEX_OFFSET + 1);
}
xpt.setEntry(kpt, iq, xq);
}
@@ -2407,20 +2408,20 @@ public class BOBYQAOptimizer
int ihq = (iq * iq + iq) / 2;
if (ip == 0) {
// Computing 2nd power
- final double d1 = ptsaux.getEntry(iq, 2);
+ final double d1 = ptsaux.getEntry(iq, INDEX_OFFSET
+ 1);
hq.setEntry(ihq, hq.getEntry(ihq) + temp * (d1 *
d1));
} else {
ihp = (ip * ip + ip) / 2;
// Computing 2nd power
- final double d1 = ptsaux.getEntry(ip, 1);
+ final double d1 = ptsaux.getEntry(ip,
INDEX_OFFSET);
hq.setEntry(ihp, hq.getEntry(ihp) + temp * (d1 *
d1));
if (iq > 0) {
// Computing 2nd power
- final double d2 = ptsaux.getEntry(iq, 1);
+ final double d2 = ptsaux.getEntry(iq,
INDEX_OFFSET);
hq.setEntry(ihq, hq.getEntry(ihq) + temp * (d2
* d2));
int iw = Math.max(ihp,ihq) - Math.abs(iq - ip);
hq.setEntry(iw, hq.getEntry(iw)
- + temp * ptsaux.getEntry(ip, 1) *
ptsaux.getEntry(iq, 1));
+ + temp * ptsaux.getEntry(ip,
INDEX_OFFSET) * ptsaux.getEntry(iq, INDEX_OFFSET));
}
}
}
@@ -3028,17 +3029,17 @@ public class BOBYQAOptimizer
d__1 = zmat.getEntry(knew, j);
if (Math.abs(d__1) > ztest) {
// Computing 2nd power
- d__1 = zmat.getEntry(knew, 1);
+ d__1 = zmat.getEntry(knew, INDEX_OFFSET);
// Computing 2nd power
d__2 = zmat.getEntry(knew, j);
temp = Math.sqrt(d__1 * d__1 + d__2 * d__2);
- tempa = zmat.getEntry(knew, 1) / temp;
+ tempa = zmat.getEntry(knew, INDEX_OFFSET) / temp;
tempb = zmat.getEntry(knew, j) / temp;
for (int i = 1; i <= npt; i++) {
- temp = tempa * zmat.getEntry(i, 1) + tempb *
zmat.getEntry(i, j);
+ temp = tempa * zmat.getEntry(i, INDEX_OFFSET) + tempb *
zmat.getEntry(i, j);
zmat.setEntry(i, j, tempa * zmat.getEntry(i, j) -
- tempb * zmat.getEntry(i, 1));
- zmat.setEntry(i, 1, temp);
+ tempb * zmat.getEntry(i, INDEX_OFFSET));
+ zmat.setEntry(i, INDEX_OFFSET, temp);
}
}
zmat.setEntry(knew, j, ZERO);
@@ -3048,7 +3049,7 @@ public class BOBYQAOptimizer
// and calculate the parameters of the updating formula.
for (int i = 1; i <= npt; i++) {
- work.setEntry(i, zmat.getEntry(knew, 1) * zmat.getEntry(i, 1));
+ work.setEntry(i, zmat.getEntry(knew, INDEX_OFFSET) *
zmat.getEntry(i, INDEX_OFFSET));
}
alpha = work.getEntry(knew);
tau = vlag.getEntry(knew);
@@ -3057,10 +3058,10 @@ public class BOBYQAOptimizer
// Complete the updating of ZMAT.
temp = Math.sqrt(denom);
- tempb = zmat.getEntry(knew, 1) / temp;
+ tempb = zmat.getEntry(knew, INDEX_OFFSET) / temp;
tempa = tau / temp;
for (int i= 1; i <= npt; i++) {
- zmat.setEntry(i, 1, tempa * zmat.getEntry(i, 1) -
+ zmat.setEntry(i, INDEX_OFFSET, tempa * zmat.getEntry(i,
INDEX_OFFSET) -
tempb * vlag.getEntry(i));
}
@@ -3157,12 +3158,12 @@ public class BOBYQAOptimizer
/** {@inheritDoc} */
public double getEntry(int index) {
- return super.getEntry(index - 1);
+ return super.getEntry(index - INDEX_OFFSET);
}
/** {@inheritDoc} */
public void setEntry(int index, double value) {
- super.setEntry(index - 1, value);
+ super.setEntry(index - INDEX_OFFSET, value);
}
}
@@ -3175,12 +3176,12 @@ public class BOBYQAOptimizer
}
/** {@inheritDoc} */
public double getEntry(int row, int col) {
- return super.getEntry(row - 1, col - 1);
+ return super.getEntry(row - INDEX_OFFSET, col - INDEX_OFFSET);
}
/** {@inheritDoc} */
public void setEntry(int row, int col, double value) {
- super.setEntry(row - 1, col - 1, value);
+ super.setEntry(row - INDEX_OFFSET, col - INDEX_OFFSET, value);
}
}
@@ -3203,6 +3204,6 @@ public class BOBYQAOptimizer
// For use in Fortran-like 1-based loops. Calls to this offset
// function will be removed when all loops are converted to 0-base.
private static int f2jai(int j) {
- return j - 1;
+ return j - INDEX_OFFSET;
}
}