diff --git a/ocaml/out/samples b/ocaml/out/samples index 68868270..725ba8d7 100755 Binary files a/ocaml/out/samples and b/ocaml/out/samples differ diff --git a/ocaml/out/samples.cmi b/ocaml/out/samples.cmi index 484674c5..8c33d943 100644 Binary files a/ocaml/out/samples.cmi and b/ocaml/out/samples.cmi differ diff --git a/ocaml/out/samples.cmx b/ocaml/out/samples.cmx index afdc5d87..537266d3 100644 Binary files a/ocaml/out/samples.cmx and b/ocaml/out/samples.cmx differ diff --git a/ocaml/out/samples.o b/ocaml/out/samples.o index 61a5f516..b6288153 100644 Binary files a/ocaml/out/samples.o and b/ocaml/out/samples.o differ diff --git a/ocaml/samples.ml b/ocaml/samples.ml index 15eef8ee..8230de07 100644 --- a/ocaml/samples.ml +++ b/ocaml/samples.ml @@ -13,6 +13,13 @@ let cumsumXs xs = new_sum, ys @ [new_sum] ) (0.0, []) xs in cum_sum +let findIndex xs test = + let rec recursiveHelper ys i = + match ys with + | [] -> None + | z :: zs -> if test z then Some i else recursiveHelper zs (i+1) + in + recursiveHelper xs 0 (* Basic samplers *) let sampleZeroToOne () : float = Random.float 1.0 @@ -40,8 +47,13 @@ let mixture (samplers: (unit -> float) array) (weights: float array) = | true -> let normalized_weights = normalizeXs weights in let cumsummed_normalized_weights = cumsumXs normalized_weights in - let answer = 1.1 in - Some(1.0) + let p = sampleZeroToOne () in + let chosenSamplerIndex = findIndex cumsummed_normalized_weights (fun x -> x < p) in + let sample = match chosenSamplerIndex with + | None -> None + | Some(i) -> Some(1.0) (* (samplers.(i) ()) |> Some *) + in + sample let () = Random.init 1;