Esempio n. 1
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;
}
Esempio n. 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
		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;
}