void Minimiser::setup(Problem problem, Values values) { gslFunction.function = problem.function; gslFunction.params = 0; int retCode = gsl_min_fminimizer_set_with_values(s, &gslFunction, problem.x.minimum, values.f.minimum, problem.x.lower, values.f.lower, problem.x.upper, values.f.upper); if (retCode==GSL_EINVAL) { throw Exception("GSL Minimiser could not be set up"); } }
static VALUE rb_gsl_min_fminimizer_set_with_values(VALUE obj, VALUE ff, VALUE xmin, VALUE fmin, VALUE xl, VALUE fl, VALUE xu, VALUE fu) { gsl_min_fminimizer *gmf = NULL; gsl_function *f = NULL; Need_Float(xmin); Need_Float(xl); Need_Float(xu); Need_Float(fl); Need_Float(fu); CHECK_FUNCTION(ff); Data_Get_Struct(obj, gsl_min_fminimizer, gmf); Data_Get_Struct(ff, gsl_function, f); return INT2FIX(gsl_min_fminimizer_set_with_values(gmf, f, NUM2DBL(xmin), NUM2DBL(fmin), NUM2DBL(xl), NUM2DBL(fl), NUM2DBL(xu), NUM2DBL(fu))); }
int gsl_min_fminimizer_set (gsl_min_fminimizer * s, gsl_function * f, double x_minimum, double x_lower, double x_upper) { int status ; double f_minimum, f_lower, f_upper; status = compute_f_values (f, x_minimum, &f_minimum, x_lower, &f_lower, x_upper, &f_upper); if (status != GSL_SUCCESS) { return status ; } status = gsl_min_fminimizer_set_with_values (s, f, x_minimum, f_minimum, x_lower, f_lower, x_upper, f_upper); return status; }
REAL8 XLALMinimizeEThincaParameterOverTravelTime( REAL8 travelTime, EThincaMinimizer *minimizer, INT4 exttrig ) { REAL8 ethinca; /* If colocated detectors or known sky position, just return the e-thinca parameter */ if (travelTime == 0.0 || exttrig ) { ethinca = minimizeEThincaParameterOverTimeDiff( travelTime, minimizer ); if ( XLAL_IS_REAL8_FAIL_NAN(ethinca) ) { XLAL_ERROR_REAL8( XLAL_EFUNC ); } return ethinca; } else { gsl_function F; INT4 min_status; INT4 iter = 0; const INT4 max_iter = 100; REAL8 epsilon = 1.0 / 16384.0; REAL8 m = 0.0; REAL8 a = - travelTime, b = travelTime; /* Upper and lower bounds */ REAL8 minEThinca, maxEThinca; REAL8 midEThinca; gsl_min_fminimizer *s = gsl_min_fminimizer_alloc( minimizer->workSpace->T ); if ( !s ) { XLAL_ERROR_REAL8( XLAL_ENOMEM ); } F.function = &minimizeEThincaParameterOverTimeDiff; F.params = minimizer; /* Calculate e-thinca parameter at start, end and mid points */ minEThinca = minimizeEThincaParameterOverTimeDiff( a, minimizer ); maxEThinca = minimizeEThincaParameterOverTimeDiff( b, minimizer ); midEThinca = minimizeEThincaParameterOverTimeDiff( m, minimizer ); if ( XLAL_IS_REAL8_FAIL_NAN(minEThinca) || XLAL_IS_REAL8_FAIL_NAN(maxEThinca) || XLAL_IS_REAL8_FAIL_NAN(midEThinca) ) { gsl_min_fminimizer_free( s ); XLAL_ERROR_REAL8( XLAL_EFUNC ); } /* Check we have contained a minimum. Otherwise take appropriate action */ if ( midEThinca >= minEThinca || midEThinca >= maxEThinca ) { REAL8 testEThinca; /* To contain the lowest end-point */ if ( minEThinca < maxEThinca ) { testEThinca = minEThinca; m = a + 2.0 * epsilon; } else { testEThinca = maxEThinca; m = b - 2.0 * epsilon; } midEThinca = minimizeEThincaParameterOverTimeDiff( m, minimizer ); if ( XLAL_IS_REAL8_FAIL_NAN(midEThinca) ) { gsl_min_fminimizer_free( s ); XLAL_ERROR_REAL8( XLAL_EFUNC ); } /* If we still don't have the minimum return the lowest end-point */ if ( midEThinca >= testEThinca ) { gsl_min_fminimizer_free( s ); return testEThinca; } } /* Set up the GSL minimizer */ XLAL_CALLGSL( min_status = gsl_min_fminimizer_set_with_values(s, &F, m, midEThinca, a, minEThinca, b, maxEThinca) ); if ( min_status != GSL_SUCCESS ) { gsl_min_fminimizer_free( s ); XLAL_ERROR_REAL8( XLAL_EFUNC ); } /* Loop to perform the minimization */ do { iter++; XLAL_CALLGSL( min_status = gsl_min_fminimizer_iterate (s) ); if (min_status != GSL_SUCCESS ) { gsl_min_fminimizer_free( s ); XLAL_ERROR_REAL8( XLAL_EFUNC ); } m = gsl_min_fminimizer_x_minimum (s); a = gsl_min_fminimizer_x_lower (s); b = gsl_min_fminimizer_x_upper (s); XLAL_CALLGSL( min_status = gsl_min_test_interval (a, b, epsilon, 0.0) ); if (min_status != GSL_CONTINUE && min_status != GSL_SUCCESS ) { gsl_min_fminimizer_free( s ); XLAL_ERROR_REAL8( XLAL_EFUNC ); } } while ( min_status == GSL_CONTINUE && iter < max_iter ); /* End of minimization routine */ /* Throw an error if max iterations would have been exceeded */ if ( iter == max_iter && min_status == GSL_CONTINUE ) { gsl_min_fminimizer_free( s ); XLAL_ERROR_REAL8( XLAL_EMAXITER ); } /* Get the minimum e-thinca param, and free memory for minimizer */ ethinca = gsl_min_fminimizer_f_minimum( s ); gsl_min_fminimizer_free( s ); XLALPrintInfo( "%s: Number of iterations = %d\n", __func__, iter); } /* Return the required e-thinca value */ return ethinca; }