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; }
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; }
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; }
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; }
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; }
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; }