示例#1
0
double Optimize_Torsion_Parameters(int Idx_Soft_Tor)
{
	double lb[N_TOR_PARA] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -100.0 }; /* lower bounds */
	double ub[N_TOR_PARA] = { 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0,  100.0 }; /* lower bounds */
	double Phase[32][5]={{0, 0, 0, 0, 0}, {0, 0, 0, 0, PI}, {0, 0, 0, PI, 0}, {0, 0, 0, PI, PI}, {0, 0, PI, 0, 0}, {0, 0, PI, 0, PI}, {0, 0, PI, PI, 0}, {0, 0, PI, PI, PI}, {0, PI, 0, 0, 0}, {0, PI, 0, 0, PI}, 
						{0, PI, 0, PI, 0}, {0, PI, 0, PI, PI}, {0, PI, PI, 0, 0}, {0, PI, PI, 0, PI}, {0, PI, PI, PI, 0}, {0, PI, PI, PI, PI}, {PI, 0, 0, 0, 0}, {PI, 0, 0, 0, PI}, {PI, 0, 0, PI, 0}, {PI, 0, 0, PI, PI},
						{PI, 0, PI, 0, 0}, {PI, 0, PI, 0, PI}, {PI, 0, PI, PI, 0}, {PI, 0, PI, PI, PI}, {PI, PI, 0, 0, 0}, {PI, PI, 0, 0, PI}, {PI, PI, 0, PI, 0}, {PI, PI, 0, PI, PI}, {PI, PI, PI, 0, 0}, {PI, PI, PI, 0, PI}, 
						{PI, PI, PI, PI, 0}, {PI, PI, PI, PI, PI}};
	nlopt_opt opt;
	double Chi_SQ;
	int i, j, Idx_Phi;

	Chi_SQ_Min = 1.0E100;
	opt = nlopt_create(NLOPT_LD_LBFGS, N_TOR_PARA);

	nlopt_set_lower_bounds(opt, lb);
	nlopt_set_upper_bounds(opt, ub);
	nlopt_set_min_objective(opt, Callback_Eval_Gradient, NULL);
	nlopt_set_xtol_rel(opt, 1e-8);

	iseed = time(NULL);
	
	ActiveRun = 0;
	Chi_SQ_Min_Local[0] = 1.0E200;
	FailCount = Iteration = 0;

	Idx_Phi = IdxDihSelect[Idx_Soft_Tor];
	
	Para_Tor[10] = 0.0;
	
	for(i=0; i<N_TOR_PARA; i++)	{
		IsPara_Fixed[i] = 1;
	}
	IsPara_Fixed[N_TOR_PARA-1] = 0;	// only optimize the last parameter

	if (nlopt_optimize(opt, Para_Tor, &Chi_SQ) < 0) {
		printf("nlopt failed!\n");
	}
	else {
		printf("Chi_SQ_min = %lf  Chi_SQ = %lf\n", Chi_SQ_Min, Chi_SQ);
	}

	memcpy(Para_Tor, Para_Best, sizeof(double)*N_TOR_PARA);
	CalObjectiveFunction_Tor(Para_Tor);


	nlopt_destroy(opt);

	return Chi_SQ_Min;
}
示例#2
0
double Callback_Eval_Gradient(unsigned n, const double *x, double *grad, void *my_func_data)
{
	int n_Local;
	double Chi_SQ;

	n_Local = (int)n;


	if(grad)	{
		Chi_SQ = CalGradient_Tor((double*)x, grad);	//gradient will be assigned into objGrad automatically
	}
	else {
		Chi_SQ = CalObjectiveFunction_Tor((double*)x);
	}

		Iteration++;

		if(Chi_SQ < Chi_SQ_Min)	{
			Chi_SQ_Min = Chi_SQ;

			if(Chi_SQ + 1.0E-5 > Chi_SQ_Min)	{
				FailCount++;
			}
			else	{
				FailCount = 0;
			}

			memcpy(Para_Best, x, sizeof(double)*n);
		}
		else	{
			FailCount++;
		}
		if(Chi_SQ < Chi_SQ_Min_Local[ActiveRun])	{
			Chi_SQ_Min_Local[ActiveRun] = Chi_SQ;
			memcpy(All_Para_Save[ActiveRun], x, sizeof(double)*n);

			printf("Iter %6d :grad ? %d : ", Iteration, grad!=NULL );
			for(int i=0; i<n;i++ ) {printf("%8.3f ", x[i] ); }
			printf(" : %8.3f \n", Chi_SQ);

		}
	
   return Chi_SQ;
}
示例#3
0
double CalGradient_Tor(double x[], double grad[])	// x - Para_Tor
{
	int i;
	double f, Phi;

	f = CalObjectiveFunction_Tor(x);
	memset(grad, 0, sizeof(double)*N_TOR_PARA);

	for(i=0; i<nScan; i++)	{
		Phi = Phi_Scaned[i] * radianInv;

		if(!IsPara_Fixed[0])	{
			grad[0] += ( dE[i] * w_Point[i] * ( 1.0 + cos(1.0*Phi - x[1]) ) );
		}
		if(!IsPara_Fixed[2])	{
			grad[2] += ( dE[i] * w_Point[i] * ( 1.0 + cos(2.0*Phi - x[3]) ) );
		}
		if(!IsPara_Fixed[4])	{
			grad[4] += ( dE[i] * w_Point[i] * ( 1.0 + cos(3.0*Phi - x[5]) ) );
		}
		if(!IsPara_Fixed[6])	{
			grad[6] += ( dE[i] * w_Point[i] * ( 1.0 + cos(4.0*Phi - x[7]) ) );
		}
		if(!IsPara_Fixed[8])	{
			grad[8] += ( dE[i] * w_Point[i] * ( 1.0 + cos(6.0*Phi - x[9]) ) );
		}
		if(!IsPara_Fixed[10])	{
			grad[10] += (dE[i] * w_Point[i]);
		}

	}
	for(i=0; i<N_TOR_PARA; i++)	{
		grad[i] *= 2.0;
	}

	return f;
}
示例#4
0
double Callback_Eval_Gradient(unsigned n, const double *x, double *grad, void *my_func_data)
{
	int n_Local;
	double Chi_SQ;

	n_Local = (int)n;

	if(grad)	{
		Chi_SQ = CalGradient_Tor((double*)x, grad);	//gradient will be assigned into objGrad automatically
		Iteration++;

		if(Chi_SQ < Chi_SQ_Min)	{
			Chi_SQ_Min = Chi_SQ;

			if(Chi_SQ + 1.0E-5 > Chi_SQ_Min)	{
				FailCount++;
			}
			else	{
				FailCount = 0;
			}

			memcpy(Para_Best, x, sizeof(double)*n);
		}
		else	{
			FailCount++;
		}
		if(Chi_SQ < Chi_SQ_Min_Local[ActiveRun])	{
			Chi_SQ_Min_Local[ActiveRun] = Chi_SQ;
			memcpy(All_Para_Save[ActiveRun], x, sizeof(double)*n);
		}
	}
	else	{	// cal object function only
		Chi_SQ = CalObjectiveFunction_Tor((double*)x);
	}

    return Chi_SQ;
}
示例#5
0
double Optimize_Torsion_Parameters(void)
{
	double lb[N_TOR_PARA] = { 
		-20.0, -PI, 
		-20.0, -PI, 
		-20.0, -PI, 
		-20.0, -PI, 
		-20.0, -PI, 
    -100 };
	double ub[N_TOR_PARA] = { 
		+20.0, +PI, 
		+20.0, +PI, 
		+20.0, +PI, 
		+20.0, +PI, 
		+20.0, +PI, 
    +100 };



//	double ub[N_TOR_PARA] = { 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0,  100.0 }; /* lower bounds */
	nlopt_opt opt;
	double Chi_SQ;
	int i, j;

	Chi_SQ_Min = 1.0E100;

	for(i=0; i<NRUN; i++)	{ // was 32
		ActiveRun = i;
		Chi_SQ_Min_Local[i] = 1.0E200;
		FailCount = Iteration = 0;

//		for(j=0; j<5; j++)	{
//			Para_Tor[2*j] = 0.1+1.0*rand(iseed);
//		}

		for( i=0; i<11; i++ ) { 
			Para_Tor[i]     = 0.; 
			IsPara_Fixed[i] = 0.;
		} // inital values		
		
		//opt = nlopt_create(NLOPT_LD_LBFGS, N_TOR_PARA);

    printf("=== Fitting ===\n" );
		opt = nlopt_create(NLOPT_LN_COBYLA, N_TOR_PARA);

		nlopt_set_lower_bounds(opt, lb);
		nlopt_set_upper_bounds(opt, ub);
		nlopt_set_min_objective(opt, Callback_Eval_Gradient, NULL);
		nlopt_set_xtol_rel(opt, 1e-8);

		if (nlopt_optimize(opt, Para_Tor, &Chi_SQ) < 0) {
			printf("nlopt didn't converge %lf %lf\n Please check carefully the rotamer results\n",Chi_SQ_Min, Chi_SQ);
		}
		else {
			printf("Chi_SQ_min = %lf  Chi_SQ = %lf\n", Chi_SQ_Min, Chi_SQ);
		}
		nlopt_destroy(opt);
	}

	memcpy(Para_Tor, Para_Best, sizeof(double)*N_TOR_PARA);
	CalObjectiveFunction_Tor(Para_Tor);



	return Chi_SQ_Min;
}
示例#6
0
double Optimize_Torsion_Parameters(void)
{
	double lb[N_TOR_PARA] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -100.0 }; /* lower bounds */
	double ub[N_TOR_PARA] = { 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0,  100.0 }; /* lower bounds */

//	double ub[N_TOR_PARA] = { 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0,  100.0 }; /* lower bounds */
	double Phase[32][5]={{0, 0, 0, 0, 0}, {0, 0, 0, 0, PI}, {0, 0, 0, PI, 0}, {0, 0, 0, PI, PI}, {0, 0, PI, 0, 0}, {0, 0, PI, 0, PI}, {0, 0, PI, PI, 0}, {0, 0, PI, PI, PI}, {0, PI, 0, 0, 0}, {0, PI, 0, 0, PI}, 
						{0, PI, 0, PI, 0}, {0, PI, 0, PI, PI}, {0, PI, PI, 0, 0}, {0, PI, PI, 0, PI}, {0, PI, PI, PI, 0}, {0, PI, PI, PI, PI}, {PI, 0, 0, 0, 0}, {PI, 0, 0, 0, PI}, {PI, 0, 0, PI, 0}, {PI, 0, 0, PI, PI},
						{PI, 0, PI, 0, 0}, {PI, 0, PI, 0, PI}, {PI, 0, PI, PI, 0}, {PI, 0, PI, PI, PI}, {PI, PI, 0, 0, 0}, {PI, PI, 0, 0, PI}, {PI, PI, 0, PI, 0}, {PI, PI, 0, PI, PI}, {PI, PI, PI, 0, 0}, {PI, PI, PI, 0, PI}, 
						{PI, PI, PI, PI, 0}, {PI, PI, PI, PI, PI}};
	nlopt_opt opt;
	double Chi_SQ;
	int i, j;

	Chi_SQ_Min = 1.0E100;

	iseed = time(NULL);
	
	for(i=0; i<32; i++)	{
		ActiveRun = i;
		Chi_SQ_Min_Local[i] = 1.0E200;
		FailCount = Iteration = 0;

//		for(j=0; j<5; j++)	{
//			Para_Tor[2*j] = 0.1+1.0*rand(iseed);
//		}
		
		Para_Tor[0] = Para_Tor[2] = Para_Tor[4] = Para_Tor[6] = Para_Tor[8] = 1.0;


		for(j=0; j<5; j++)	{
			Para_Tor[2*j+1] = Phase[i][j];
			lb[2*j+1] = Para_Tor[2*j+1];
			ub[2*j+1] = Para_Tor[2*j+1];
		}
//		Para_Tor[1] = Para_Tor[3] = Para_Tor[5] = Para_Tor[7] = Para_Tor[9] = 0.0;
		Para_Tor[10] = 0.0;
		
		IsPara_Fixed[1] = IsPara_Fixed[3] = IsPara_Fixed[5] = IsPara_Fixed[7] = IsPara_Fixed[9] = 1;

		//for test
//		IsPara_Fixed[6] = 1;	Para_Tor[6] = 0.0;

		
		opt = nlopt_create(NLOPT_LD_LBFGS, N_TOR_PARA);

		nlopt_set_lower_bounds(opt, lb);
		nlopt_set_upper_bounds(opt, ub);
		nlopt_set_min_objective(opt, Callback_Eval_Gradient, NULL);
		nlopt_set_xtol_rel(opt, 1e-8);

		if (nlopt_optimize(opt, Para_Tor, &Chi_SQ) < 0) {
			printf("nlopt didn't converge %lf %lf\n Please check carefully the rotamer results\n",Chi_SQ_Min, Chi_SQ);
		}
		else {
			printf("Chi_SQ_min = %lf  Chi_SQ = %lf\n", Chi_SQ_Min, Chi_SQ);
		}
		nlopt_destroy(opt);
	}

	memcpy(Para_Tor, Para_Best, sizeof(double)*N_TOR_PARA);
	CalObjectiveFunction_Tor(Para_Tor);



	return Chi_SQ_Min;
}