Files
rose-ash/lib/ocaml/baseline/bs_bounds.ml
giles 7f310a4da7
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 22s
ocaml: phase 5.1 bs_bounds.ml baseline (lower/upper bound, fingerprint 3211)
C++-style lower_bound / upper_bound on a sorted array:

  lower_bound — first index >= x  (loop uses arr.(mid) < x)
  upper_bound — first index >  x  (loop uses arr.(mid) <= x)

  a = [|1; 2; 2; 3; 3; 3; 5; 7; 9|]

  upper(x) - lower(x) gives the count of x in a:
    cnt3 = 3   cnt2 = 2   cnt5 = 1   cnt9 = 1   cnt4 = 0

  fingerprint = 3*1000 + 2*100 + 1*10 + 1 + 0 = 3211

Tests parallel while loops with bisection on ref, mixed strict
and non-strict comparison branches, count-via-subtraction idiom.

176 baseline programs total.
2026-05-11 01:22:31 +00:00

28 lines
747 B
OCaml

let lower_bound arr x =
let lo = ref 0 and hi = ref (Array.length arr) in
while !lo < !hi do
let mid = (!lo + !hi) / 2 in
if arr.(mid) < x then lo := mid + 1
else hi := mid
done;
!lo
let upper_bound arr x =
let lo = ref 0 and hi = ref (Array.length arr) in
while !lo < !hi do
let mid = (!lo + !hi) / 2 in
if arr.(mid) <= x then lo := mid + 1
else hi := mid
done;
!lo
;;
let a = [| 1; 2; 2; 3; 3; 3; 5; 7; 9 |] in
let cnt3 = upper_bound a 3 - lower_bound a 3 in
let cnt2 = upper_bound a 2 - lower_bound a 2 in
let cnt5 = upper_bound a 5 - lower_bound a 5 in
let cnt9 = upper_bound a 9 - lower_bound a 9 in
let cnt4 = upper_bound a 4 - lower_bound a 4 in
cnt3 * 1000 + cnt2 * 100 + cnt5 * 10 + cnt9 + cnt4