📄 quadraticparameteroptimizationoperator.java
字号:
}
else{
currentIndex[i] = bestIndex[i];
};
paramIndex = paramIndex*(values[i]).length+currentIndex[i];
};
int row=0;
int c;
while(row < Designmatrix.getRowDimension()){
y.set(row,0,allParameters[paramIndex].getPerformance().getMainCriterion().getValue()); // Performance Zahl?
Designmatrix.set(row,0,1.0);
c = 1;
// compute A
for(int i=0;i<nrParameters;i++){
if((values[i]).length > 2){
Designmatrix.set(row,c,param2coded(values[i][currentIndex[i]], logBase[i]));
c++;
};
};
// compute C
for(int i=0;i<nrParameters;i++){
if((values[i]).length > 2){
for(int j=i+1;j<nrParameters;j++){
if((values[j]).length > 2){
Designmatrix.set(row,c,
param2coded(values[i][currentIndex[i]], logBase[i])*
param2coded(values[j][currentIndex[j]], logBase[j]));
c++;
};
};
};
};
// compute Q:
for(int i=0;i<nrParameters;i++){
if((values[i]).length > 2){
Designmatrix.set(row,c,
param2coded(values[i][currentIndex[i]], logBase[i])*
param2coded(values[i][currentIndex[i]], logBase[i]));
c++;
};
};
// update currentIndex and paramIndex
int k=0;
c=1;
while(k<parameterList.size()){
if((values[k]).length > 2){
currentIndex[k]++;
paramIndex+=c;
if(currentIndex[k] > bestIndex[k]+1){
currentIndex[k] = bestIndex[k]-1;
paramIndex -= 3*c;
c *= values[k].length;
k++;
}
else{
break;
};
}
else{
c *= values[k].length;
k++;
};
};
row++;
};
// compute Designmatrix
Matrix beta = Designmatrix.solve(y);
// generate Matrix P~
Matrix p = new Matrix(nrParameters , nrParameters);
int betapos = nrParameters + 1;
for (int j = 0; j < (nrParameters - 1); j++) {
for (int i = 1 + j; i < nrParameters; i++) {
p.set(i, j, (beta.get(betapos,0)*0.5));
p.set(j, i, (beta.get(betapos,0)*0.5));
betapos++;
}
}
for (int i = 0; i < nrParameters; i++) {
p.set(i, i, beta.get(betapos,0));
betapos++;
}
// generate Matrix y~
Matrix y2 = new Matrix(nrParameters,1);
for (int i = 0; i < nrParameters; i++) {
y2.set(i,0,beta.get(i+1,0));
}
y2 = y2.times(-0.5);
// get stationary point x
Matrix x = new Matrix(nrParameters,1);
try {
x = p.solve(y2);
} catch (RuntimeException e) {
LogService.logMessage("Quadratic optimization failed! (invalid matrix)", LogService.WARNING);
}
String[] Qvalues = new String[parameterList.size()];
int pc = 0;
boolean ok=true;
for (int j = 0; j < parameterList.size(); j++) {
if((values[j]).length > 2){
if((x.get(pc,0) > Double.parseDouble(values[j][bestIndex[j]+1])) ||
(x.get(pc,0) < Double.parseDouble(values[j][bestIndex[j]-1]))){
LogService.logMessage("Parameter "+parameters[j]+" exceeds region of interest ("+x.get(pc,0)+")", LogService.WARNING);
if(ifExceedsRegion == CLIP){
// clip to bound
if(x.get(pc,0) > Double.parseDouble(values[j][bestIndex[j]+1])){
x.set(pc,0,Double.parseDouble(values[j][bestIndex[j]+1]));
}
else{
x.set(pc,0,Double.parseDouble(values[j][bestIndex[j]-1]));
};
}
else if(ifExceedsRegion == FAIL){
ok = false;
};
};
if((x.get(pc,0) < Double.parseDouble(values[j][0])) ||
(x.get(pc,0) > Double.parseDouble(values[j][values[j].length-1]))){
LogService.logMessage("Parameter "+parameters[j]+" exceeds range ("+x.get(pc,0)+")", LogService.WARNING);
if(ifExceedsRange == IGNORE){
// ignore error
LogService.logMessage(" but no measures taken. Check parameters manually!", LogService.WARNING);
}
else if(ifExceedsRange == CLIP){
// clip to bound
if(x.get(pc,0) > Double.parseDouble(values[j][0])){
x.set(pc,0,Double.parseDouble(values[j][0]));
}
else{
x.set(pc,0,Double.parseDouble(values[j][values[j].length-1]));
};
}
else{
ok = false;
};
};
Qvalues[j] = coded2param(x.get(pc,0), logBase[j]);
pc++;
// Werte im richtigen Bereich?
}
else{
Qvalues[j] = values[j][bestIndex[j]];
};
};
LogService.logMessage("Optimised parameter set:", LogService.TASK);
for (int j = 0; j < operators.length; j++) {
operators[j].getParameters().setParameter(parameters[j], Qvalues[j]);
LogService.logMessage(" "+operators[j]+"."+parameters[j]+
" = " + Qvalues[j], LogService.TASK);
}
if(ok){
setInput(input.copy());
PerformanceVector Qperformance = getPerformance();
LogService.logMessage("Old: "+(best.getPerformance().getMainCriterion().getValue()), LogService.STATUS);
LogService.logMessage("New: "+(Qperformance.getMainCriterion().getValue()), LogService.STATUS);
if (Qperformance.compareTo(best.getPerformance()) > 0) {
best = new ParameterSet(operators, parameters, Qvalues, Qperformance);
// log
LogService.logMessage("Optimised parameter set does increase the performance",LogService.STATUS);
}
else{
// anderes log
LogService.logMessage("Could not increase performance by quadratic optimization",LogService.STATUS);
};
}
else{
// not ok
LogService.logMessage("Parameters outside admissible range, not using optimised parameter set.", LogService.WARNING);
};
}
else{
// Warning: no parameters to optimize
LogService.logMessage("No parameters to optimize",LogService.WARNING);
};
// end quadratic optimization
String parameterFile = getParameterAsString("parameter_file");
if (parameterFile != null) {
try {
LogService.logMessage("Writing parameter file: '"+parameterFile+"'", LogService.TASK);
best.write(new PrintWriter(new FileWriter(getExperiment().resolveFileName(parameterFile))));
} catch (IOException e) {
LogService.logMessage("Cannot write parameter file: '"+parameterFile+"'", LogService.ERROR);
}
}
return new IOObject[] { best, best.getPerformance() };
}
/** Applies the inner operator and employs the PerformanceEvaluator for calculating a list
* of performance criteria which is returned. */
protected PerformanceVector getPerformance() throws OperatorException {
IOObject[] evalout = super.apply();
IOContainer evalCont = new IOContainer(evalout);
return (PerformanceVector)evalCont.getInput(PerformanceVector.class);
}
public Class[] getInputClasses() {
return new Class[0];
}
public Class[] getOutputClasses() {
return OUTPUT_CLASSES;
}
public Class[] checkIO(Class[] input) throws IllegalInputException {
for (int i = 0; i < getNumberOfOperators(); i++) {
Operator o = getOperator(i);
input = o.checkIO(input);
}
return OUTPUT_CLASSES;
}
/** Returns the highest possible value for the maximum number of innner operators. */
public int getMaxNumberOfInnerOperators() { return Integer.MAX_VALUE; }
/** Returns 1 for the minimum number of innner operators. */
public int getMinNumberOfInnerOperators() { return 1; }
public int getNumberOfSteps() {
return 1+numberOfCombinations * (getNumberOfChildrensSteps() + 1);
}
public List getParameterTypes() {
List types = super.getParameterTypes();
// ParameterType type = new ParameterTypeList("parameters", "A list of parameters to optimise",
// new ParameterTypeString("value", "The values of the parameter (comma-separated"));
ParameterType type = new ParameterTypeList("parameters", "List of key value pairs where the key is the parameter name and the value specifies the parameter value to optimize.",
new ParameterTypeParameterValue("parameter", "operator.OPERATORNAME.PARAMETER_NAME.PARAMETER_VALUE"));
type.setExpert(false);
types.add(type);
types.add(new ParameterTypeFile("parameter_file", "A file that the optimal parameter set will be written to.", true));
types.add(new ParameterTypeCategory("if_exceeds_region", "What to do if range is exceeded.", EXCEED_BEHAVIORS, CLIP));
types.add(new ParameterTypeCategory("if_exceeds_range", "What to do if range is exceeded.", EXCEED_BEHAVIORS, FAIL));
return types;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -