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