owlbarn / owl

Owl - OCaml Scientific Computing @ https://ocaml.xyz
MIT License
1.2k stars 120 forks source link

How do I use gaussian_pdf in Owl.Arr? #627

Open LongPham7 opened 1 year ago

LongPham7 commented 1 year ago

I'm struggling to figure out how to use the function gaussian_pdf : mu:arr -> sigma:arr -> arr -> arr in the Owl.Arr module. When I tried the following code in the top level (i.e. OCaml's REPL), it crashes due to a segmentation fault:

#require "owl";;
open Owl;;
let mu_arr = Arr.init [|2|] (fun _ -> 1.);;
Arr.set mu_arr [|1|] 4.;; (* Set the second element of mu_arr to 4. *)
let sigma_arr = Arr.init [|2|] (fun _ -> 0.1);;
let current_point = Arr.init [|2|] (fun _ -> 1.5);;
let result_arr = Arr.gaussian_pdf ~mu:mu_arr ~sigma:sigma_arr current_point;;

I managed to figure out how to use gaussian_rvs, but gaussian_pdf still eludes me. Thanks a lot in advance!

ghennequin commented 1 year ago

I don't get a segfault but I get nonsensical results (~1E-22). There must be a bug in Arr.gaussian_pdf. The scalar version Stats.gaussian_pdf works fine. I don't have time to chase this now but perhaps @jzstark can take a look?

LongPham7 commented 1 year ago

Hi @ghennequin. It's interesting that you didn't get a segmentation fault. I think the low value in your result (~1E-22) makes sense because I accidentally set sigma to a very low value (0.1) in the above example.

Nonetheless, even if I use a larger (and more reasonable) value for sigma, I still get a segmentation fault. Specifically, the following simpler code produces a segmentation fault:

#require "owl";;
open Owl;;
let mu_arr = Arr.zeros [|2|];;
let sigma_arr = Arr.ones [|2|];;
let current_point = Arr.ones [|2|];;
let result_arr = Arr.gaussian_pdf ~mu:mu_arr ~sigma:sigma_arr current_point;;

My OS is Ubuntu.