mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
examples: clean up
This commit is contained in:
parent
8c43e345ad
commit
2689fb1a70
7 changed files with 10 additions and 223 deletions
|
|
@ -1,22 +0,0 @@
|
|||
|
||||
(** Write 10_000 Bencode values on the given file *)
|
||||
|
||||
(* write n times the same value in the file *)
|
||||
let write_values file n =
|
||||
let out = BencodeOnDisk.open_out file in
|
||||
Printf.printf "[%d] opened file\n" (Unix.getpid ());
|
||||
let v = Bencode.(L [I 0; I 1; S "foo"]) in
|
||||
for i = 0 to n-1 do
|
||||
Printf.printf "[%d] iteration %d\n" (Unix.getpid ()) i;
|
||||
flush stdout;
|
||||
BencodeOnDisk.write out v;
|
||||
done;
|
||||
BencodeOnDisk.close_out out;
|
||||
Printf.printf "done\n";
|
||||
()
|
||||
|
||||
let _ =
|
||||
let file = Sys.argv.(1) in
|
||||
Printf.printf "[%d] start: write to %s\n" (Unix.getpid ()) file;
|
||||
flush stdout;
|
||||
write_values file 100
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
|
||||
(** Export the list of files in a directory *)
|
||||
|
||||
let dir = "/tmp/"
|
||||
|
||||
(* list of files in a dir *)
|
||||
let lsdir dir =
|
||||
let d = Unix.opendir dir in
|
||||
let l = ref [] in
|
||||
begin try while true do
|
||||
l := Unix.readdir d :: !l
|
||||
done with End_of_file -> Unix.closedir d
|
||||
end;
|
||||
!l
|
||||
|
||||
let export dir =
|
||||
let l = lsdir dir in
|
||||
ToWeb.HTML.(concat
|
||||
[ h1 (str ("files in "^ dir))
|
||||
; list (List.map str l)
|
||||
])
|
||||
|
||||
let state = ToWeb.State.create dir ~export
|
||||
|
||||
let _ =
|
||||
ToWeb.serve_state ~sockfile:"/tmp/foo.sock" state
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
|
||||
(** Display the graph of the collatz conjecture, starting from the given int *)
|
||||
|
||||
let g = LazyGraph.map
|
||||
~edges:(fun () -> [])
|
||||
~vertices:(fun i -> [`Label (string_of_int i)])
|
||||
LazyGraph.collatz_graph
|
||||
|
||||
let collatz n filename =
|
||||
Format.printf "print graph to %s@." filename;
|
||||
let out = open_out filename in
|
||||
let fmt = Format.formatter_of_out_channel out in
|
||||
LazyGraph.Dot.pp ~name:"collatz" g fmt (Sequence.singleton n);
|
||||
Format.pp_print_flush fmt ();
|
||||
close_out out
|
||||
|
||||
let _ =
|
||||
if Array.length Sys.argv < 3
|
||||
then (Format.printf "use: collatz num file@."; exit 0)
|
||||
else collatz (int_of_string Sys.argv.(1)) Sys.argv.(2)
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
|
||||
(** Crawl the web to find shortest path between two urls *)
|
||||
|
||||
open Batteries
|
||||
|
||||
let pool = Future.Pool.create ~timeout:15. ~size:50
|
||||
|
||||
let split_lines s = String.nsplit s ~by:"\n"
|
||||
|
||||
let get_and_parse url =
|
||||
let cmd = Format.sprintf "wget -q '%s' -O - | grep -o 'http\\(s\\)\\?://[^ \"]\\+'" url in
|
||||
let content = Future.spawn_process ?stdin:None ~pool ~cmd in
|
||||
content
|
||||
|> Future.map (fun (_, stdout, _) -> stdout)
|
||||
|> Future.map split_lines
|
||||
|> Batteries.tap (fun lines ->
|
||||
Future.on_success lines (fun lines -> Format.printf "downloaded %s (%d urls)@." url (List.length lines)))
|
||||
|
||||
type page = string * (string list Future.t)
|
||||
|
||||
(** The web graph; its vertices are annotated by futures of the content *)
|
||||
let g : (page, string, unit) LazyGraph.t =
|
||||
let force (url, future) =
|
||||
Format.printf "force %s@." url;
|
||||
let urls =
|
||||
try Future.get future |> List.map (fun url -> (), (url, get_and_parse url))
|
||||
with e -> [] in
|
||||
let edges = Gen.of_list urls in
|
||||
(* need to parse the page to get the urls *)
|
||||
LazyGraph.Node ((url, future), url, edges)
|
||||
in LazyGraph.make
|
||||
~eq:(fun (url1,_) (url2,_) -> url1 = url2)
|
||||
~hash:(fun (url,_) -> Hashtbl.hash url)
|
||||
force
|
||||
|
||||
let pp_path fmt path =
|
||||
List.print ~sep:"\n"
|
||||
(fun fmt ((u1,_), (), (u2,_)) ->
|
||||
String.print fmt u1; String.print fmt " -> "; String.print fmt u2)
|
||||
fmt path
|
||||
|
||||
(* seek a path from the first url to the second *)
|
||||
let path_between from into =
|
||||
Format.printf "seek path from %s to %s@." from into;
|
||||
let on_explore (url,_) = Format.printf " explore %s...@." url in
|
||||
try
|
||||
let cost, path = LazyGraph.dijkstra ~on_explore g
|
||||
(from, get_and_parse from) (into, get_and_parse into) in
|
||||
Printf.printf "found path (cost %f):\n%a\n" cost pp_path path
|
||||
with Not_found ->
|
||||
Format.printf "no path could be found@."
|
||||
|
||||
let print_limit file start depth =
|
||||
Format.printf "print into %s webgraph starting from %s, up to depth %d@."
|
||||
file start depth;
|
||||
let start = start, get_and_parse start in
|
||||
let g' = LazyGraph.limit_depth g depth (Gen.singleton start) in
|
||||
let g'' = LazyGraph.map ~vertices:(fun v -> [`Label v]) ~edges:(fun _ -> []) g' in
|
||||
let out = Format.formatter_of_out_channel (open_out file) in
|
||||
LazyGraph.Dot.pp ~name:"web" g'' out (Gen.singleton start);
|
||||
Format.pp_print_flush out ();
|
||||
()
|
||||
|
||||
let _ =
|
||||
let timer = Future.Timer.create () in
|
||||
let rec ping () =
|
||||
Format.printf "*** ping! (size of pool: %d)@." (Future.Pool.size pool);
|
||||
Future.Timer.schedule_in timer 10. ping
|
||||
in ping ()
|
||||
|
||||
let print_usage () =
|
||||
Format.printf "usage: crawl path url1 url2@.";
|
||||
Format.printf "usage: crawl print file url depth@.";
|
||||
()
|
||||
|
||||
let _ =
|
||||
match Sys.argv with
|
||||
| [|_; "print"; file; url; depth|] ->
|
||||
print_limit file url (int_of_string depth)
|
||||
| [|_; "path"; from; into|] ->
|
||||
path_between from into
|
||||
| _ ->
|
||||
print_usage ()
|
||||
|
|
@ -1,10 +1,15 @@
|
|||
|
||||
(executables
|
||||
(names id_sexp)
|
||||
(executable
|
||||
(name id_sexp)
|
||||
(libraries containers.sexp)
|
||||
(modules id_sexp)
|
||||
(flags :standard -w +a-4-42-44-48-50-58-32-60@8 -safe-string -color always)
|
||||
(ocamlopt_flags :standard -O3 -color always
|
||||
-unbox-closures -unbox-closures-factor 20)
|
||||
)
|
||||
|
||||
|
||||
(executable
|
||||
(name lambda)
|
||||
(libraries printbox)
|
||||
(modules lambda)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ let rec fvars t = match t with
|
|||
let rec replace t ~var ~by = match t with
|
||||
| Var s -> if s=var then by else t
|
||||
| App (t1,t2) -> App (replace t1 ~var ~by, replace t2 ~var ~by)
|
||||
| Lambda (v, t') when v=var -> t (* no risk *)
|
||||
| Lambda (v, _t') when v=var -> t (* no risk *)
|
||||
| Lambda (v, t') -> Lambda (v, replace t' ~var ~by)
|
||||
|
||||
(* rename [t] so that [var] doesn't occur in it *)
|
||||
|
|
@ -109,4 +109,4 @@ let print_reduction t =
|
|||
let () =
|
||||
Random.self_init ();
|
||||
let t = _random_term (5 + Random.int 20) [] in
|
||||
PrintBox.output ~indent:2 stdout (print_reduction t)
|
||||
PrintBox_text.output ~indent:2 stdout (print_reduction t)
|
||||
|
|
|
|||
|
|
@ -1,67 +0,0 @@
|
|||
(** Compute the memory footprint of a value (and its subvalues). Reference is
|
||||
http://rwmj.wordpress.com/2009/08/05/ocaml-internals-part-2-strings-and-other-types/ *)
|
||||
|
||||
|
||||
|
||||
(** A graph vertex is an Obj.t value *)
|
||||
let graph =
|
||||
let force x =
|
||||
if Obj.is_block x
|
||||
then
|
||||
let children = Sequence.map (fun i -> i, Obj.field x i) (0--(Obj.size x - 1)) in
|
||||
LazyGraph.Node (x, Obj.tag x, children)
|
||||
else
|
||||
LazyGraph.Node (x, Obj.obj x, Sequence.empty)
|
||||
in LazyGraph.make ~eq:(==) force
|
||||
|
||||
let word_size = Sys.word_size / 8
|
||||
|
||||
let size x =
|
||||
if Obj.is_block x
|
||||
then (1+Obj.size x) * word_size
|
||||
else word_size
|
||||
|
||||
let compute_size x =
|
||||
let o = Obj.repr x in
|
||||
let vertices = LazyGraph.bfs graph o in
|
||||
Sequence.fold (fun sum (o',_,_) -> size o' + sum) 0 vertices
|
||||
|
||||
let print_val fmt x =
|
||||
let o = Obj.repr x in
|
||||
let graph' = LazyGraph.map ~edges:(fun i -> [`Label (string_of_int i)])
|
||||
~vertices:(fun v -> [`Label (string_of_int v); `Shape "box"]) graph in
|
||||
LazyGraph.Dot.pp ~name:"value" graph' fmt (Sequence.singleton o)
|
||||
|
||||
let print_val_file filename x =
|
||||
let out = open_out filename in
|
||||
let fmt = Format.formatter_of_out_channel out in
|
||||
print_val fmt x;
|
||||
Format.pp_print_flush fmt ();
|
||||
close_out out
|
||||
|
||||
let process_val ~name x =
|
||||
print_val_file (Format.sprintf "/tmp/%s.dot" name) x;
|
||||
Format.printf "size of val is %d@." (compute_size x)
|
||||
|
||||
module ISet = Set.Make(struct type t = int let compare = compare end)
|
||||
|
||||
let mk_circ n =
|
||||
let start = Sequence.to_list (1--n) in
|
||||
(* make the end of the list point to its beginning *)
|
||||
let rec cycle l = match l with
|
||||
| [] -> assert false
|
||||
| [_] -> Obj.set_field (Obj.repr l) 1 (Obj.repr start)
|
||||
| _::l' -> cycle l'
|
||||
in
|
||||
cycle start;
|
||||
start
|
||||
|
||||
let _ =
|
||||
let s = Sequence.fold (fun s x -> ISet.add x s) ISet.empty (1--100) in
|
||||
process_val ~name:"foo" s;
|
||||
let l = Sequence.to_list (Sequence.map (fun i -> Sequence.to_list (i--(i+42)))
|
||||
(Sequence.of_list [0;100;1000])) in
|
||||
process_val ~name:"bar" l;
|
||||
let l' = mk_circ 100 in
|
||||
process_val ~name:"baaz" l';
|
||||
()
|
||||
Loading…
Add table
Reference in a new issue