-
Notifications
You must be signed in to change notification settings - Fork 3
/
test_xyz.ml
127 lines (115 loc) · 2.89 KB
/
test_xyz.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
open Printf
let yn_of_bool = function
| true -> "Y"
| false -> "N"
let random_cat () =
match Random.int 3 with
| 0 -> "A"
| 1 -> "B"
| 2 -> "C"
| _ -> assert false
let logistic n error_rate with_cat =
print_endline "z,x,y,p";
for i = 0 to n-1 do
let x = (Random.float 4.0) -. 2.0 in
let y = (Random.float 4.0) -. 2.0 in
let r2 = x *. x +. y *. y in
let r = sqrt r2 in
let in_circle = r <= 1.0 in
let cat = random_cat () in
let z =
in_circle &&
(match cat with
| "A" | "C" -> true
| "B" -> false
| _ -> assert false
)
in
let is_error = (Random.float 1.0) <= error_rate in
let z_hat =
if is_error then
not z
else
z
in
printf "%s,%.5f,%.5f,%s\n"
(yn_of_bool z_hat) x y cat
done
let square n error with_cat =
let m_half_error = -0.5 *. error in
let header = "z,x,y" in
let header =
if with_cat then
header ^ ",p"
else
header
in
print_endline header;
for i = 0 to n-1 do
let x = (Random.float 4.0) -. 2.0 in
let y = (Random.float 4.0) -. 2.0 in
let r2 = x *. x +. y *. y in
let exp2 = exp (-.r2) in
if with_cat then
let cat = random_cat () in
let z =
match cat with
| "A" | "C" -> exp2
| "B" -> 3.0
| _ -> assert false
in
let err = m_half_error +. (Random.float error) in
let z_hat = z +. err in
printf "%.5f,%.5f,%.5f,%s\n" z_hat x y cat
else
let z = exp2 in
let err = m_half_error +. (Random.float error) in
let z_hat = z +. err in
printf "%.5f,%.5f,%.5f\n" z_hat x y
done
let square_sparse n error with_cat =
let m_half_error = -0.5 *. error in
print_endline "z,x,y,p";
for i = 0 to n-1 do
let x = (Random.float 4.0) -. 2.0 in
let y = (Random.float 4.0) -. 2.0 in
let r2 = x *. x +. y *. y in
let exp2 = exp (-.r2) in
let cat = random_cat () in
let z =
match cat with
| "A" | "C" -> exp2
| "B" -> 3.0
| _ -> assert false
in
let err = m_half_error +. (Random.float error) in
let z_hat = z +. err in
printf "{0 %.5f,1 %.5f,2 %.5f%s}\n" z_hat x y
(match cat with
| "B" -> "" (* implicit *)
| "A" -> ",3 A"
| "C" -> ",3 C"
| _ -> assert false
)
done
let _ =
let usage = sprintf "usage: %s (logistic|square|square-sparse) <n> <error>"
Sys.argv.(0) in
let n, error_rate =
match Sys.argv with
[| _; _; n_s; error_rate |] ->
let n = int_of_string n_s in
let error_rate = float_of_string error_rate in
n, error_rate
| _ ->
print_endline usage;
exit 1
in
let f =
match Sys.argv.(1) with
| "logistic" -> logistic
| "square" -> square
| "square-sparse" -> square_sparse
| _ -> print_endline usage; exit 1
in
f n error_rate false