-
Notifications
You must be signed in to change notification settings - Fork 137
/
Helmholtz.ml
73 lines (62 loc) · 1.96 KB
/
Helmholtz.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
open Core
open Dreaming
open Pregex
open Program
open Enumeration
open Grammar
open Utils
open Timeout
open Type
open Tower
open Yojson.Basic
let run_job channel =
let open Yojson.Basic.Util in
let j = Yojson.Basic.from_channel channel in
let request = j |> member "request" |> deserialize_type in
let timeout = j |> member "timeout" |> to_number in
let evaluationTimeout =
try j |> member "evaluationTimeout" |> to_number
with _ -> 0.001
in
let nc =
try j |> member "CPUs" |> to_int
with _ -> 1
in
let maximumSize =
try j |> member "maximumSize" |> to_int
with _ -> Int.max_value
in
let g = j |> member "DSL" in
let g =
try deserialize_grammar g |> make_dummy_contextual
with _ -> deserialize_contextual_grammar g
in
let k =
try Some(j |> member "special" |> to_string)
with _ -> None
in
let k = match k with
| None -> default_hash
| Some(name) -> match Hashtbl.find special_helmholtz name with
| Some(special) -> special
| None -> (Printf.eprintf "Could not find special Helmholtz enumerator: %s\n" name; assert (false))
in
helmholtz_enumeration ~nc:nc (k ~timeout:evaluationTimeout request (j |> member "extras")) g request ~timeout ~maximumSize
let output_job ?maxExamples:(maxExamples=50000) result =
let open Yojson.Basic.Util in
(* let result = Hashtbl.to_alist result in *)
let results =
let l = List.length result in
if l < maxExamples then result else
let p = (maxExamples |> Float.of_int)/.(l |> Float.of_int) in
result |> List.filter ~f:(fun _ -> Random.float 1. < p)
in
let message : json =
`List(results |> List.map ~f:(fun (behavior, (l,ps)) ->
`Assoc([(* "behavior", behavior; *)
"ll", `Float(l);
"programs", `List(ps |> List.map ~f:(fun p -> `String(p |> string_of_program)))])))
in
message
let _ =
run_job Pervasives.stdin |> remove_bad_dreams |> output_job |> to_channel Pervasives.stdout