diff options
Diffstat (limited to 'mgizapp/src/mkcls/IterOptimization.cpp')
-rw-r--r-- | mgizapp/src/mkcls/IterOptimization.cpp | 199 |
1 files changed, 0 insertions, 199 deletions
diff --git a/mgizapp/src/mkcls/IterOptimization.cpp b/mgizapp/src/mkcls/IterOptimization.cpp deleted file mode 100644 index 258cb1f..0000000 --- a/mgizapp/src/mkcls/IterOptimization.cpp +++ /dev/null @@ -1,199 +0,0 @@ -/* - -Copyright (C) 1997,1998,1999,2000,2001 Franz Josef Och - -mkcls - a program for making word classes . - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -USA. - -*/ - - - -#include "IterOptimization.h" -#include "ProblemTest.h" - -ostream *GraphOutput; - - - -IterOptimization::IterOptimization(Problem& p,int m) - : maxNonBetterIterations(0),problem(p),maxStep(m),initialisiert(0) -{ -} - - - -IterOptimization::IterOptimization(IterOptimization& o) : Optimization(),problem(o.problem) -{ - maxNonBetterIterations=o.maxNonBetterIterations; - curValue = o.curValue; - bestStep = o.bestStep; - bestValue = o.bestValue; - maxStep = o.maxStep; - initialisiert = o.initialisiert; - endFlag = o.endFlag; - endFlag2 = o.endFlag2; -} - - - -double IterOptimization::minimize(int steps) -{ - if( !initialisiert ) - zInitialize(); - - if( steps==0 ) - return curValue; - - int t=0; - int every=(steps<0)?10000:(steps/1000+1); - - do - { - curStep++; - t++; - if(verboseMode&&(curStep%1000==0)) - { - if(steps>0) - cout << "Processed: " << 100.0*(curStep/(double)max(maxStep,1)) << " percent. (IterOptimization run) " - << curValue << " max:" << maxStep << " " << steps << " \r"; - else - cout << "In step:" << curStep << " currentValue: " << curValue - << " bestValue: " << bestValue-curValue << " " << curStep-bestStep << ". \r"; - cout.flush(); - } - - - ProblemChange *change= &(problem.change()); - - - double delta=problem.valueChange(*change); - - - abkuehlen(); - - - if( accept(delta) ) - { - - problem.doChange(*change); - - - curValue+=delta; - - - if( curValue<bestValue-1e-10 ) - { - bestValue=curValue; - bestStep=curStep; - endFlag2=endFlag=0; - } - - if( verboseMode>1 ) - cout<<"in step: "<<curStep<<" accepted with : "<<delta<<endl; - } - - if(curStep - bestStep>maxNonBetterIterations && maxNonBetterIterations>0) - endFlag=1; - if(curStep - bestStep>2*maxNonBetterIterations && maxNonBetterIterations>0) - endFlag2=1; - - - - if( GraphOutput&&((curStep%every)==0) ) - { - makeGraphOutput(); - *GraphOutput<<" "<<delta<<endl; - } - - delete change; - } while( t!=steps && (!end()) && (!problem.endCriterion()) ); - - if( GraphOutput) - { - makeGraphOutput(); - *GraphOutput<<endl; - } - return curValue; -} - - -void IterOptimization::zInitialize() -{ - initialisiert=1; - bestValue=curValue=problem.value(); - maxNonBetterIterations=problem.maxNonBetterIterations(); - bestStep=curStep=0; - endFlag2=endFlag=0; -} - - -void IterOptimization::makeGraphOutput() -{ - - *GraphOutput << curStep << " " <<curValue << " "; -} - - -double IterOptimizationOptimizeParameter(Problem &p, - double ¶meter,double min,double max, - int nRun,int nPar,int verfahren, - double &bv) -{ - if( nPar<=0 ) - return (max+min)/2; - - StatVar end1,time1,init1; - StatVar end2,time2,init2; - double mean1,mean2; - double par1,par2; - - parameter = par1 = min + (max-min)/3; - solveProblem(0,p,nRun,-1,verfahren,mean1,end1,time1,init1); - cout << parameter << " " << mean1 << " " << end1.quantil(0.0) << " " << end1.quantil(1.0) << endl; - - parameter = par2 = min + 2*(max-min)/3; - solveProblem(0,p,nRun,-1,verfahren,mean2,end2,time2,init2); - cout << parameter << " " << mean2 << " " << end2.quantil(0.0) << " " << end2.quantil(1.0) << endl; - - double bestPar,bestVal; - if(mean1<mean2) - { - bestVal = mean1; - bestPar=IterOptimizationOptimizeParameter(p,parameter,min,min+2*(max-min)/3,nRun,nPar-2,verfahren,bestVal); - } - else - { - bestVal = mean2; - bestPar=IterOptimizationOptimizeParameter(p,parameter,min+(max-min)/3,max,nRun,nPar-2,verfahren,bestVal); - } - if( mean1<bestVal&&mean1<=mean2 ) - { - bv = mean1; - return par1; - } - else if(mean2<bestVal && mean2<=mean1) - { - bv = mean2; - return par2; - } - else - { - bv = bestVal; - return bestPar; - } -} |