(* gsl-ocaml - OCaml interface to GSL                       *)
(* Copyright (©) 2002-2012 - Olivier Andrieu                *)
(* Distributed under the terms of the GPL version 3         *)

(** One dimensional Root-Finding *)

module Bracket : sig
  type kind = BISECTION | FALSEPOS | BRENT
  type t

  val make : kind -> Fun.gsl_fun -> float -> float -> t
  external name : t -> string = "ml_gsl_root_fsolver_name"
  external iterate : t -> unit = "ml_gsl_root_fsolver_iterate"
  external root : t -> float = "ml_gsl_root_fsolver_root"
  external interval : t -> float * float = "ml_gsl_root_fsolver_x_interv"
end

module Polish : sig
  type kind = NEWTON | SECANT | STEFFENSON
  type t

  val make : kind -> Fun.gsl_fun_fdf -> float -> t
  external name : t -> string = "ml_gsl_root_fdfsolver_name"
  external iterate : t -> unit = "ml_gsl_root_fdfsolver_iterate"
  external root : t -> float = "ml_gsl_root_fdfsolver_root"
end

external test_interval :
  lo:float -> up:float -> epsabs:float -> epsrel:float -> bool
  = "ml_gsl_root_test_interval"

external test_delta :
  x1:float -> x0:float -> epsabs:float -> epsrel:float -> bool
  = "ml_gsl_root_test_delta"

external test_residual : f:float -> epsabs:float -> bool
  = "ml_gsl_root_test_residual"
