sig
  type t = private { n : int; range : float array; bin : float array; }
  val check : Histo.t -> bool
  val make : int -> Histo.t
  val copy : Histo.t -> Histo.t
  external set_ranges : Histo.t -> float array -> unit
    = "ml_gsl_histogram_set_ranges"
  external set_ranges_uniform : Histo.t -> xmin:float -> xmax:float -> unit
    = "ml_gsl_histogram_set_ranges_uniform"
  external accumulate : Histo.t -> ?w:float -> float -> unit
    = "ml_gsl_histogram_accumulate"
  val get : Histo.t -> int -> float
  val get_range : Histo.t -> int -> float * float
  val h_max : Histo.t -> float
  val h_min : Histo.t -> float
  val bins : Histo.t -> int
  val reset : Histo.t -> unit
  external find : Histo.t -> float -> int = "ml_gsl_histogram_find"
  external max_val : Histo.t -> float = "ml_gsl_histogram_max_val"
  external max_bin : Histo.t -> int = "ml_gsl_histogram_max_bin"
  external min_val : Histo.t -> float = "ml_gsl_histogram_min_val"
  external min_bin : Histo.t -> int = "ml_gsl_histogram_min_bin"
  external mean : Histo.t -> float = "ml_gsl_histogram_mean"
  external sigma : Histo.t -> float = "ml_gsl_histogram_sigma"
  external sum : Histo.t -> float = "ml_gsl_histogram_sum"
  external equal_bins_p : Histo.t -> Histo.t -> bool
    = "ml_gsl_histogram_equal_bins_p"
  external add : Histo.t -> Histo.t -> unit = "ml_gsl_histogram_add"
  external sub : Histo.t -> Histo.t -> unit = "ml_gsl_histogram_sub"
  external mul : Histo.t -> Histo.t -> unit = "ml_gsl_histogram_mul"
  external div : Histo.t -> Histo.t -> unit = "ml_gsl_histogram_div"
  external scale : Histo.t -> float -> unit = "ml_gsl_histogram_scale"
  external shift : Histo.t -> float -> unit = "ml_gsl_histogram_shift"
  type histo_pdf = private {
    pdf_n : int;
    pdf_range : float array;
    pdf_sum : float array;
  }
  val init : Histo.t -> Histo.histo_pdf
  external sample : Histo.histo_pdf -> float -> float
    = "ml_gsl_histogram_pdf_sample"
end