File: mlgsl_min.c

package info (click to toggle)
ocamlgsl 0.3.5-3
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 3,444 kB
  • ctags: 2,901
  • sloc: ml: 7,956; ansic: 6,796; makefile: 303; sh: 87; awk: 13
file content (74 lines) | stat: -rw-r--r-- 2,141 bytes parent folder | download
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)