package joptima;
import joptima.fortran.*;
/**
* An object-oriented wrapper for UNCMIN Fortran-oid multi-variable
* function minimization routines.
* All the 1980's-paradigm ugliness is encapsulated within this class.
* If it ain't broken, don't fix it... :)
*
* @author Dejan Vucinic
*/
public class Minimizer implements Uncmin_methods {
private int dimension;
private Parameter[] parameters;
private Minimizable function;
public Minimizer(Minimizable function) {
this.function = function;
parameters = function.getParameters();
dimension = parameters.length;
}
public void minimize() throws OptimizationException {
double[] x0 = new double[dimension + 1]; // initial values
int info[] = new int[2]; // return code
double x[] = new double[dimension + 1]; // current parameter values
double f[] = new double[2]; // current function value
double g[] = new double[dimension + 1]; // gradient
double a[][] = new double[dimension + 1][dimension + 1]; // hessian
double udiag[] = new double[dimension + 1]; // who knows
double typsiz[] = new double[dimension + 1];
double fscale[] = new double[2];
int method[] = new int[2];
int iexp[] = new int[2];
int msg[] = new int[2];
int ndigit[] = new int[2];
int itnlim[] = new int[2];
int iagflg[] = new int[2];
int iahflg[] = new int[2];
double dlt[] = new double[2];
double gradtl[] = new double[2];
double stepmx[] = new double[2];
double steptl[] = new double[2];
Uncmin_f77.dfault_f77(dimension,x0,typsiz,fscale,method,iexp,
msg,ndigit,itnlim,iagflg,iahflg,
dlt,gradtl,stepmx,steptl);
// iagflg[1] = 0;
// iahflg[1] = 0;
// iexp[1] = 0;
// itnlim[1] = 50;
// fscale[1] = 1;
try {
// Copy the initial parameters.
for (int i = 0; i < dimension; i++) x0[i + 1] = parameters[i].get();
// Run the minimization.
Uncmin_f77.optif9_f77(dimension,x0,this,typsiz,fscale,method,iexp,
msg,ndigit,itnlim,iagflg,iahflg,
dlt,gradtl,stepmx,steptl,
x,f,g,info,a,udiag);
} catch (IllegalAccessException iae) {
throw new OptimizationException(iae);
}
}
public double f_to_minimize(double[] x) {
try {
for (int i = 0; i < dimension; i++) parameters[i].set(x[i + 1]);
} catch (IllegalAccessException iae) {
iae.printStackTrace();
}
return function.calculate();
}
public void gradient(double x[], double g[]) { }
public void hessian(double x[], double h[][]) { }
}
Ads help maintain this website.