示例#1
0
std::vector<bool> Line::getProblematic(){
	std::vector<bool> prblm(m_Points.size());
	for (std::vector<Point>::size_type i = 0; i < m_Points.size(); i++)
		prblm[i] = m_Points[i].problematic;

	return(prblm);
}
	double CalibrationHelperCmsCorrelations::calibrate() {
		
		CmsCorrelationCostFunction costfct(this,&(*corrTS_),lambda_,MINPRICE_,ONLYPOSITIVECORR_,MAXCORR_);
		CmsCorrelationConstraint constraint;

		int n = corrTS_->numberOfPillars();
		Array guess(n);
		for(int i=0;i<n;i++) {
			double corr=corrTS_->pillarCorrelation(i);
			if(corr>MAXCORR_) corr=MAXCORR_;
			if(corr<-MAXCORR_) corr=-MAXCORR_;
			if(ONLYPOSITIVECORR_) {
				if(corr<0.0) corr=0.0; // only allow positive correlations
				guess[i]=tan(M_PI/2.0*sqrt(corr)); // only allow positive correlations
			}
			else {
				guess[i]=tan(M_PI/2.0*corr);
			}
		}
		
		Problem prblm(costfct,constraint,guess);
		EndCriteria ec(MAXIT_, MAXST_, OPTACCURACY_, OPTACCURACY_, OPTACCURACY_);
		EndCriteria::Type ret;
		if(optimizer_==0) {
			Simplex method(0.05);
			ret=method.minimize(prblm,ec);	
		}
		if(optimizer_==1) {
			LevenbergMarquardt method;
			ret=method.minimize(prblm,ec);	
		}
		if(optimizer_==2) {
			SimulatedAnnealing method(0.1,0,50,500,2.5,0.2);
			ret=method.minimize(prblm,ec);	
		}
		//FILE* out=fopen("cost.log","a");
		//fprintf(out,"Start Optimization with maxit=%d, maxst=%d, acc=%f, maxCorr=%f, minPrice=%f, allowPosOnly=%d",
		//	MAXIT,MAXST,OPTACCURACY,MAXCORR,MINPRICE,ONLYPOSITIVECORR);
		//fclose(out);
		
		Array x=prblm.currentValue();
		double y=costfct.value(x);//prblm.functionValue(); to make sure, the model is set to optimal value

		if(ret==EndCriteria::None) QL_FAIL("Optimizer returns status none");
		if(ret==EndCriteria::MaxIterations) QL_FAIL("Optimizer returns status max iterations");
		if(ret==EndCriteria::Unknown) QL_FAIL("Optimizer returns status unknown");

		return y;

	}
	double CalibrationHelperCms::calibrate() {

		double sumRmse=0.0;

		//for(int i=0;i<optPillarIndex_.size();i++) {
		
			CmsCostFunction* costfct;
			
			if(!useStdCube_) costfct = new CmsCostFunction(this,&(*volCube_),noOptPillars_,optPillarTimes_,undPillarIndex_,maxMu_,maxNu_,minBeta_,maxBeta_,mode_);
			else costfct = new CmsCostFunction(this,&(*volCube2_),noOptPillars_,optPillarTimes_,skipOptPillars_,underlying_,maxMu_,maxNu_,minBeta_,maxBeta_,mode_,weights_);
			NoConstraint constraint;
			
			int nop;
			if(mode_==0 || mode_==4) nop=2;
			if(mode_==1 || mode_==5) nop=3;
			if(mode_==2 || mode_==6) nop=noOptPillars_;
			if(mode_==3 || mode_==7) nop=4;
			Array guess(nop);

			if(!useStdCube_) {
				if(mode_==0 || mode_==1) {
					guess[0]=tan(M_PI*(volCube_->pillarBeta(0,undPillarIndex_)) - M_PI/2.0);
					guess[1]=tan(M_PI*(volCube_->pillarBeta(noOptPillars_-1,undPillarIndex_)) - M_PI/2.0);
				}
				if(mode_==4 || mode_==5) {
					guess[0]=sqrt(volCube_->pillarNu(0,undPillarIndex_));
					guess[1]=sqrt(volCube_->pillarNu(noOptPillars_-1,undPillarIndex_));
				}
				if(mode_==1 || mode_==5) {
					guess[2]=1.0; // decay factor
				}
				if(mode_==2) {
					for(int i=0;i<noOptPillars_;i++) 
						guess[i]=tan(M_PI*(volCube_->pillarBeta(i,undPillarIndex_)) - M_PI/2.0);
				}
				if(mode_==6) {
					for(int i=0;i<noOptPillars_;i++) 
						guess[i]=sqrt(volCube_->pillarNu(i,undPillarIndex_));
				}
				if(mode_==3) {
					guess[3]=volCube_->pillarBeta(noOptPillars_-1,undPillarIndex_);
					guess[0]=volCube_->pillarBeta(0,undPillarIndex_)-guess[3];
					guess[1]=0.0;
					guess[2]=1.0;
				}
				if(mode_==7) {
					guess[3]=volCube_->pillarNu(noOptPillars_-1,undPillarIndex_);
					guess[0]=volCube_->pillarNu(0,undPillarIndex_)-guess[3];
					guess[1]=0.0;
					guess[2]=1.0;
				}
			}
			else {
				if(mode_==0) {
					{guess[0]=0.5; guess[1]=0.5;} // default guess for beta calibration
				}
				if(mode_==4) {
					{guess[0]=1.0; guess[1]=1.0;} // default guess for nu calibration
				}
				if(mode_==2) {
					for(int i=skipOptPillars_;i<noOptPillars_;i++) 
						guess[i]=0.5;  // default guess for beta calibration
				}
				if(mode_==6) {
					for(int i=skipOptPillars_;i<noOptPillars_;i++) 
						guess[i]=1.0;  // default guess for nu calibration
				}
			}
		
			Problem prblm(*costfct,constraint,guess);
			EndCriteria ec(MAXIT_, MAXST_, OPTACCURACY_, OPTACCURACY_, OPTACCURACY_);
			EndCriteria::Type ret;
			if(optimizer_==0) {
				Simplex method(0.5);
				ret=method.minimize(prblm,ec);	
			}
			if(optimizer_==1) {
				LevenbergMarquardt method;
				ret=method.minimize(prblm,ec);	
			}
			if(optimizer_==2) {
				SimulatedAnnealing method(0.1,0,50,500,2.5,0.2);
				ret=method.minimize(prblm,ec);	
			}
			//SteepestDescent method;
			//LevenbergMarquardt method;
			//SimulatedAnnealing method(0.1,0,50,500,2.5,0.2);
			//FILE *out=fopen("costCms.log","a");
			//fprintf(out,"Opt Settings: MAXIT=%d, MAXST=%d, OPTACCURACY=%1.5e\n",MAXIT,MAXST,OPTACCURACY);
			//fclose(out);
			Array x=prblm.currentValue();
			double y=costfct->value(x);//prblm.functionValue(); to make sure, the model is set to optimal value

			if(ret==EndCriteria::None) QL_FAIL("Optimizer returns status none");
			if(ret==EndCriteria::MaxIterations) QL_FAIL("Optimizer returns status max iterations");
			if(ret==EndCriteria::Unknown) QL_FAIL("Optimizer returns status unknown");

			//sumRmse+=y;

		//}

		if(useStdCube_) volCube2_->updateAfterRecalibration(); // recalibrate 

		return y; //sumRmse;

	}