1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
/* ocamlgsl - OCaml interface to GSL */
/* Copyright () 2002 - Olivier Andrieu */
/* distributed under the terms of the GPL version 2 */
#include <gsl/gsl_min.h>
#include <caml/alloc.h>
#include <caml/memory.h>
#include <caml/fail.h>
#include "wrappers.h"
#include "mlgsl_fun.h"
static const gsl_min_fminimizer_type *Minimizertype_val(value mini_type)
{
const gsl_min_fminimizer_type *minimizer[] = {
gsl_min_fminimizer_goldensection,
gsl_min_fminimizer_brent };
return minimizer[Int_val(mini_type)];
}
value ml_gsl_min_fminimizer_alloc(value t)
{
CAMLparam0();
CAMLlocal1(res);
struct callback_params *params;
gsl_min_fminimizer *s;
s=gsl_min_fminimizer_alloc(Minimizertype_val(t));
params=stat_alloc(sizeof *params);
res=alloc_small(2, Abstract_tag);
Field(res, 0) = (value)s;
Field(res, 1) = (value)params;
params->gslfun.gf.function = &gslfun_callback ;
params->gslfun.gf.params = params;
params->closure = Val_unit;
params->dbl = Val_unit;
register_global_root(&(params->closure));
CAMLreturn(res);
}
#define Minimizer_val(v) ((gsl_min_fminimizer *)Field((v), 0))
#define Mparams_val(v) ((struct callback_params *)Field((v), 1))
value ml_gsl_min_fminimizer_set(value s, value f, value min, value lo, value up)
{
Mparams_val(s)->closure = f;
gsl_min_fminimizer_set(Minimizer_val(s), &(Mparams_val(s)->gslfun.gf),
Double_val(min), Double_val(lo), Double_val(up));
return Val_unit;
}
value ml_gsl_min_fminimizer_free(value s)
{
remove_global_root(&(Mparams_val(s)->closure));
stat_free(Mparams_val(s));
gsl_min_fminimizer_free(Minimizer_val(s));
return Val_unit;
}
ML1(gsl_min_fminimizer_name, Minimizer_val, copy_string)
ML1(gsl_min_fminimizer_iterate, Minimizer_val, Unit)
ML1(gsl_min_fminimizer_x_minimum, Minimizer_val, copy_double)
value ml_gsl_min_fminimizer_x_interv(value S)
{
return copy_two_double(gsl_min_fminimizer_x_lower(Minimizer_val(S)),
gsl_min_fminimizer_x_upper(Minimizer_val(S)));
}
ML4(gsl_min_test_interval, Double_val, Double_val,
Double_val, Double_val, Val_negbool)
|