143 fun write_file banner (xs, f) path = |
143 fun write_file banner (xs, f) path = |
144 (case banner of SOME s => File.write path s | NONE => (); |
144 (case banner of SOME s => File.write path s | NONE => (); |
145 xs |> chunk_list 500 |> List.app (File.append path o implode o map f)) |
145 xs |> chunk_list 500 |> List.app (File.append path o implode o map f)) |
146 handle IO.Io _ => () |
146 handle IO.Io _ => () |
147 |
147 |
148 fun run_mash_tool ctxt overlord save max_suggs write_cmds read_suggs = |
148 fun run_mash_tool ctxt overlord save write_cmds read_suggs = |
149 let |
149 let |
150 val (temp_dir, serial) = |
150 val (temp_dir, serial) = |
151 if overlord then (getenv "ISABELLE_HOME_USER", "") |
151 if overlord then (getenv "ISABELLE_HOME_USER", "") |
152 else (getenv "ISABELLE_TMP", serial_string ()) |
152 else (getenv "ISABELLE_TMP", serial_string ()) |
153 val log_file = if overlord then temp_dir ^ "/mash_log" else "/dev/null" |
153 val log_file = if overlord then temp_dir ^ "/mash_log" else "/dev/null" |
224 encode_features feats ^ "; " ^ encode_strs deps ^ "\n" |
224 encode_features feats ^ "; " ^ encode_strs deps ^ "\n" |
225 |
225 |
226 fun str_of_relearn (name, deps) = |
226 fun str_of_relearn (name, deps) = |
227 "p " ^ encode_str name ^ ": " ^ encode_strs deps ^ "\n" |
227 "p " ^ encode_str name ^ ": " ^ encode_strs deps ^ "\n" |
228 |
228 |
229 fun str_of_query (learns, hints, parents, feats) = |
229 fun str_of_query max_suggs (learns, hints, parents, feats) = |
230 implode (map str_of_learn learns) ^ |
230 implode (map str_of_learn learns) ^ |
231 "? " ^ encode_strs parents ^ "; " ^ encode_features feats ^ |
231 "? " ^ string_of_int max_suggs ^ " # " ^ encode_strs parents ^ "; " ^ |
|
232 encode_features feats ^ |
232 (if null hints then "" else "; " ^ encode_strs hints) ^ "\n" |
233 (if null hints then "" else "; " ^ encode_strs hints) ^ "\n" |
233 |
234 |
234 (* The suggested weights don't make much sense. *) |
235 (* The suggested weights don't make much sense. *) |
235 fun extract_suggestion sugg = |
236 fun extract_suggestion sugg = |
236 case space_explode "=" sugg of |
237 case space_explode "=" sugg of |
259 |
260 |
260 fun learn _ _ [] = () |
261 fun learn _ _ [] = () |
261 | learn ctxt overlord learns = |
262 | learn ctxt overlord learns = |
262 (trace_msg ctxt (fn () => "MaSh learn " ^ |
263 (trace_msg ctxt (fn () => "MaSh learn " ^ |
263 elide_string 1000 (space_implode " " (map #1 learns))); |
264 elide_string 1000 (space_implode " " (map #1 learns))); |
264 run_mash_tool ctxt overlord true 0 (learns, str_of_learn) (K ())) |
265 run_mash_tool ctxt overlord true (learns, str_of_learn) (K ())) |
265 |
266 |
266 fun relearn _ _ [] = () |
267 fun relearn _ _ [] = () |
267 | relearn ctxt overlord relearns = |
268 | relearn ctxt overlord relearns = |
268 (trace_msg ctxt (fn () => "MaSh relearn " ^ |
269 (trace_msg ctxt (fn () => "MaSh relearn " ^ |
269 elide_string 1000 (space_implode " " (map #1 relearns))); |
270 elide_string 1000 (space_implode " " (map #1 relearns))); |
270 run_mash_tool ctxt overlord true 0 (relearns, str_of_relearn) (K ())) |
271 run_mash_tool ctxt overlord true (relearns, str_of_relearn) (K ())) |
271 |
272 |
272 fun query ctxt overlord max_suggs (query as (learns, hints, _, feats)) = |
273 fun query ctxt overlord max_suggs (query as (learns, hints, _, feats)) = |
273 (trace_msg ctxt (fn () => "MaSh query " ^ encode_features feats); |
274 (trace_msg ctxt (fn () => "MaSh query " ^ encode_features feats); |
274 run_mash_tool ctxt overlord false max_suggs ([query], str_of_query) |
275 run_mash_tool ctxt overlord false ([query], str_of_query max_suggs) |
275 (fn suggs => |
276 (fn suggs => |
276 case suggs () of |
277 case suggs () of |
277 [] => [] |
278 [] => [] |
278 | suggs => snd (extract_suggestions (List.last suggs))) |
279 | suggs => snd (extract_suggestions (List.last suggs))) |
279 handle List.Empty => []) |
280 handle List.Empty => []) |