-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patharrays.ml
64 lines (57 loc) · 1.68 KB
/
arrays.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
open Genlib.Genarray
open Sorting_array
let test_gen ~prep ~cmp ~sort ~gen ~nb ~len =
let rec aux = function
| 0 -> ()
| n ->
let t = prep (gen len) in
let t' = Array.copy t in
Array.stable_sort cmp t';
sort cmp t;
if t <> t' then failwith "test_gen";
aux (n-1)
in
aux nb
let test ~sort ~gen ~nb ~len =
test_gen ~prep:Fun.id ~cmp:Int.compare ~sort ~gen ~nb ~len
let test_stable ~sort ~gen ~nb ~len =
let prep = Array.mapi (fun i x -> (i, x)) in
let cmp = fun (_, x) (_, y) -> Int.compare x y in
test_gen ~prep ~cmp ~sort ~gen ~nb ~len
let failure = ref false
let test_one sorter =
Format.printf "Checking that %s sorts correctly... @?" sorter.name;
try
let nb = 100 in
Format.printf "[0] @?";
test ~sort:sorter.sorter ~gen:gen_unif ~nb ~len:0;
for log2_len = 0 to 5 do
let len = 1 lsl (3 * log2_len) in
Format.printf "[%d] @?" len;
test ~sort:sorter.sorter ~gen:gen_unif ~nb ~len;
test ~sort:sorter.sorter ~gen:(gen_k_runs 5) ~nb ~len
done;
Format.printf "done.@."
with
Failure _ ->
Format.printf "it does NOT!@.";
failure := true
let test_one_stable sorter =
Format.printf "Checking that %s sorts in a stable way... @?" sorter.name;
try
let nb = 20 in
for log2_len = 1 to 5 do
let len = 1 lsl (3 * log2_len) in
Format.printf "[%d] @?" len;
test_stable ~sort:sorter.sorter ~gen:(gen_unif ~limit:(len / 4)) ~nb ~len;
done;
Format.printf "done.@."
with
Failure _ ->
Format.printf "it does NOT!@.";
failure := true
let () =
all_sorters |> List.iter @@ fun sorter ->
test_one sorter;
if sorter.stable then
test_one_stable sorter