mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-05 19:00:31 -05:00
examples graphs; small program that computes the collatz suite
This commit is contained in:
parent
e0b6b8be5b
commit
9cd07d3395
4 changed files with 55 additions and 2 deletions
5
Makefile
5
Makefile
|
|
@ -4,6 +4,7 @@ IMPLEMENTATION_FILES = $(shell find -name '*.ml')
|
|||
|
||||
TARGETS_LIB = containers.cmxa containers.cma
|
||||
TARGET_THREAD_LIB = thread_containers.cmxa thread_containers.cma
|
||||
EXAMPLES = examples/mem_size.native examples/collatz.native
|
||||
OPTIONS = -use-ocamlfind
|
||||
|
||||
all: lib lib_thread
|
||||
|
|
@ -14,8 +15,8 @@ lib:
|
|||
lib_thread:
|
||||
ocamlbuild $(OPTIONS) $(TARGETS_LIB) $(TARGET_THREAD_LIB)
|
||||
|
||||
examples:
|
||||
ocamlbuild $(OPTIONS) -I . examples/mem_size.native
|
||||
examples: all
|
||||
ocamlbuild $(OPTIONS) -I . $(EXAMPLES)
|
||||
|
||||
tests:
|
||||
ocamlbuild $(OPTIONS) -package oUnit -I . tests/run_tests.native
|
||||
|
|
|
|||
20
examples/collatz.ml
Normal file
20
examples/collatz.ml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
|
||||
(** 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 (Enum.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)
|
||||
26
lazyGraph.ml
26
lazyGraph.ml
|
|
@ -390,3 +390,29 @@ module Dot = struct
|
|||
let enum = Full.bfs_full graph vertices in
|
||||
pp_enum ~eq:graph.eq ~hash:graph.hash ~name formatter enum
|
||||
end
|
||||
|
||||
(** {2 Example of graphs} *)
|
||||
|
||||
let divisors_graph =
|
||||
let rec divisors acc j i =
|
||||
if j = i then acc
|
||||
else
|
||||
let acc' = if (i mod j = 0) then j :: acc else acc in
|
||||
divisors acc' (j+1) i
|
||||
in
|
||||
let force i =
|
||||
if i > 2
|
||||
then
|
||||
let l = divisors [] 2 i in
|
||||
let edges = Enum.map (fun i -> (), i) (Enum.of_list l) in
|
||||
Node (i, i, edges)
|
||||
else
|
||||
Node (i, i, Enum.empty)
|
||||
in make force
|
||||
|
||||
let collatz_graph =
|
||||
let force i =
|
||||
if i mod 2 = 0
|
||||
then Node (i, i, Enum.singleton ((), i / 2))
|
||||
else Node (i, i, Enum.singleton ((), i * 3 + 1))
|
||||
in make force
|
||||
|
|
|
|||
|
|
@ -207,3 +207,9 @@ module Dot : sig
|
|||
(** Pretty print the given graph (starting from the given set of vertices)
|
||||
to the channel in DOT format *)
|
||||
end
|
||||
|
||||
(** {2 Example of graphs} *)
|
||||
|
||||
val divisors_graph : (int, int, unit) t
|
||||
|
||||
val collatz_graph : (int, int, unit) t
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue