diff --git a/lib/algo/algo.ml b/lib/algo/algo.ml index f79c668e96d746397b784717128cf7907a69df49..995a0ff8136f84bf1153e220b4f59be66f27541e 100644 --- a/lib/algo/algo.ml +++ b/lib/algo/algo.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 07/10/2019 (at 15:02) by Erwan Jahier> *) +(* Time-stamp: <modified the 17/10/2019 (at 21:09) by Erwan Jahier> *) open Sasacore (* Process programmer API *) @@ -105,6 +105,7 @@ let mean_degree = Register.mean_degree let max_degree = Register.max_degree let is_cyclic = Register.is_cyclic let is_connected = Register.is_connected +let is_directed = Register.is_directed let is_tree = Register.is_tree let height = Register.height let links_number = Register.links_number diff --git a/lib/algo/algo.mli b/lib/algo/algo.mli index 01438a437167c4a6ee4c7fd88ffd61ef05a0338f..c1b8053fe6facd98bac653e139eaf8de4b9ac5de 100644 --- a/lib/algo/algo.mli +++ b/lib/algo/algo.mli @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 07/10/2019 (at 14:35) by Erwan Jahier> *) +(* Time-stamp: <modified the 17/10/2019 (at 21:08) by Erwan Jahier> *) (** The Algorithm programming Interface. A SASA process is an instance of an algorithm defined via this @@ -64,6 +64,7 @@ val card : unit -> int val min_degree : unit -> int val mean_degree : unit -> float val max_degree : unit -> int +val is_directed : unit -> bool val is_cyclic : unit -> bool val is_connected : unit -> bool val is_tree : unit -> bool diff --git a/lib/sasacore/register.ml b/lib/sasacore/register.ml index fcbdf4cedd669b85ea37bb9d7a9d0d1f1a871f44..5b33bb4e86fc8f6657cccdb2880f3f935ad8fe10 100644 --- a/lib/sasacore/register.ml +++ b/lib/sasacore/register.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 07/10/2019 (at 10:00) by Erwan Jahier> *) +(* Time-stamp: <modified the 17/10/2019 (at 21:08) by Erwan Jahier> *) type 's neighbor = { state: 's ; @@ -29,6 +29,7 @@ type 's internal_tables = { mutable is_cyclic : bool option; mutable is_connected : bool option; mutable is_tree : bool option; + mutable is_directed : bool option; mutable height : (string -> int); mutable links_number : int; mutable diameter : int; @@ -39,6 +40,7 @@ type properties_functions = { mutable min_max : unit -> int*int; mutable mean_deg : unit -> float; mutable is_connected_cyclic : unit -> bool*bool; + mutable is_directed : unit -> bool; mutable links_number : unit -> int; mutable diameter : unit -> int } @@ -61,6 +63,7 @@ let (tbls:'s internal_tables) = { is_cyclic = None; is_connected = None; is_tree = None; + is_directed = None; height = (fun _ -> -1); links_number = (-1); diameter = (-1) @@ -71,6 +74,7 @@ let (prop_funs:properties_functions) = { min_max = (fun () -> (-1,-1)); mean_deg = (fun () -> -1.); is_connected_cyclic = (fun () -> (false,false)); + is_directed = (fun () -> false); links_number = (fun () -> -1); diameter = (fun () -> -1) } @@ -177,20 +181,33 @@ let set_connec_cycl : (unit -> unit) = tbls.is_connected <- Some x; tbls.is_cyclic <- Some y - -let (card : unit -> int) = - fun () -> match tbls.card with - | -1 -> (let c = prop_funs.card () in tbls.card <- c; c) +let (card : unit -> int) = fun () -> + match tbls.card with + | -1 -> + let c = prop_funs.card () in + tbls.card <- c; + c | c -> c +let (is_directed : unit -> bool) = fun () -> + match tbls.is_directed with + | None -> + let c = prop_funs.is_directed () in + tbls.is_directed <- Some c; + c + | Some c -> c + let (min_degree : unit -> int) = fun () -> match tbls.min_deg with | -1 -> (set_min_max (); tbls.min_deg) | m -> m -let (mean_degree : unit -> float) = - fun () -> match tbls.mean_deg with - | -1. -> (let m = prop_funs.mean_deg () in tbls.mean_deg <- m; m) +let (mean_degree : unit -> float) = fun () -> + match tbls.mean_deg with + | -1. -> + let m = prop_funs.mean_deg () in + tbls.mean_deg <- m; + m | m -> m let (max_degree : unit -> int) = @@ -198,25 +215,30 @@ let (max_degree : unit -> int) = | -1 -> (set_min_max (); tbls.max_deg) | m -> m -let (is_cyclic : unit -> bool) = - fun () -> match tbls.is_cyclic with - | None -> (set_connec_cycl (); - match tbls.is_cyclic with - | Some b -> b - | _ -> assert false) +let (is_cyclic : unit -> bool) = fun () -> + match tbls.is_cyclic with + | None -> + set_connec_cycl (); + (match tbls.is_cyclic with + | Some b -> b + | _ -> assert false) | Some b -> b -let (is_connected : unit -> bool) = - fun () -> match tbls.is_connected with - | None -> (set_connec_cycl (); - match tbls.is_connected with - | Some b -> b - | _ -> assert false) +let (is_connected : unit -> bool) = fun () -> + match tbls.is_connected with + | None -> ( + set_connec_cycl (); + match tbls.is_connected with + | Some b -> b + | _ -> assert false) | Some b -> b -let (is_tree : unit -> bool) = - fun () -> match tbls.is_tree with - | None -> (let b = (not (is_cyclic ()) && (is_connected ())) in tbls.is_tree <- Some b; b) +let (is_tree : unit -> bool) = fun () -> + match tbls.is_tree with + | None -> + let b = (not (is_cyclic ()) && (is_connected ())) in + tbls.is_tree <- Some b; + b | Some b -> b (* Caution : this option is not the same as the option in the type tbls.height. @@ -229,14 +251,21 @@ let height : (unit -> (string -> int) option) = let (links_number : unit -> int) = - fun () -> match tbls.links_number with - | -1 -> (let n = prop_funs.links_number () in tbls.links_number <- n; n) + fun () -> + match tbls.links_number with + | -1 -> + let n = prop_funs.links_number () in + tbls.links_number <- n; + n | n -> n let (diameter : unit -> int) = fun () -> match tbls.diameter with - | -1 -> (let d = (prop_funs.diameter ()) in tbls.diameter <- d; d) + | -1 -> + let d = (prop_funs.diameter ()) in + tbls.diameter <- d; + d | d -> d @@ -244,6 +273,9 @@ let (diameter : unit -> int) = let set_card : ((unit -> int) -> unit) = fun f -> prop_funs.card <- f +let set_is_directed : ((unit -> bool) -> unit) = + fun f -> prop_funs.is_directed <- f + let set_degrees : ((unit -> int*int) -> unit) = fun f -> prop_funs.min_max <- f diff --git a/lib/sasacore/register.mli b/lib/sasacore/register.mli index c8dd828db5d1db0b1f735932b25759e59981dea5..9c349fe5c901aa3e3631fafdb235eafee30eb4fa 100644 --- a/lib/sasacore/register.mli +++ b/lib/sasacore/register.mli @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 07/10/2019 (at 10:00) by Erwan Jahier> *) +(* Time-stamp: <modified the 17/10/2019 (at 20:45) by Erwan Jahier> *) (** This module duplicates and extends the Algo module with get_* functions. @@ -37,6 +37,7 @@ val max_degree : unit -> int val is_cyclic : unit -> bool val is_connected : unit -> bool val is_tree : unit -> bool +val is_directed : unit -> bool (** If height () = None, then the graph doesn't have a height (because it isn't a tree) Otherwise, height () = Some h.*) @@ -67,6 +68,7 @@ val set_card : (unit -> int) -> unit val set_degrees : (unit -> int*int) -> unit val set_mean_deg : (unit -> float) -> unit val set_is_connected_cyclic : (unit -> bool*bool) -> unit +val set_is_directed : (unit -> bool) -> unit type node_id = string (* cf topology.mli *) val set_height : (node_id -> int) -> unit val set_links_number : (unit -> int) -> unit