From 40eece7cdb14c6fd1968c2a4c2c119d6905bd0e0 Mon Sep 17 00:00:00 2001 From: Erwan Jahier <erwan.jahier@univ-grenoble-alpes.fr> Date: Thu, 8 Apr 2021 15:08:16 +0200 Subject: [PATCH] Chore: code refactoring --- lib/sasacore/register.ml | 248 ++++++++++++++++++--------------------- 1 file changed, 116 insertions(+), 132 deletions(-) diff --git a/lib/sasacore/register.ml b/lib/sasacore/register.ml index 2c646c47..e92a5b32 100644 --- a/lib/sasacore/register.ml +++ b/lib/sasacore/register.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 13/10/2020 (at 15:37) by Erwan Jahier> *) +(* Time-stamp: <modified the 07/04/2021 (at 10:16) by Erwan Jahier> *) type 's neighbor = { state: 's ; @@ -30,29 +30,22 @@ type 's internal_tables = { mutable legitimate: Obj.t; mutable fault: Obj.t; mutable actions:action list; - mutable card : int ; - mutable min_deg : int; - mutable mean_deg : float; - mutable max_deg : int; + mutable topology : Topology.t option; + mutable card : int option; + mutable min_deg : int option; + mutable mean_deg : float option; + mutable max_deg : int option; 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; + mutable height : (string -> int) option; + mutable sub_tree_size: (string -> int) option; + mutable parent : (string -> int option) option; + mutable links_number : int option; + mutable diameter : int option; } -type properties_functions = { - mutable card : unit -> int; - 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 -} - type node_id = string (* cf topology.mli *) let (tbls:'s internal_tables) = { @@ -67,27 +60,20 @@ let (tbls:'s internal_tables) = { legitimate = (Obj.repr None); fault = (Obj.repr None); actions = []; - card = (-1); - min_deg = (-1); - mean_deg = (-1.); - max_deg = (-1); + topology = None; + card = None; + min_deg = None; + mean_deg = None; + max_deg = None; is_cyclic = None; is_connected = None; is_tree = None; is_directed = None; - height = (fun _ -> -1); - links_number = (-1); - diameter = (-1) -} - -let (prop_funs:properties_functions) = { - card = (fun () -> -1); - 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) + height = None; + parent = None; + sub_tree_size =None; + links_number = None; + diameter = None } let verbose_level = ref 0 @@ -96,14 +82,13 @@ exception Unregistred of string * string let print_table lbl tbl = let keys = Hashtbl.fold (fun k _ acc -> Printf.sprintf "%s,%s" k acc) tbl "" in if !verbose_level > 0 then Printf.eprintf "Defined keys for %s: %s\n%!" lbl keys - let (reg_init_state : algo_id -> (int -> string -> 's) -> unit) = fun algo_id x -> - if !verbose_level > 0 then Printf.eprintf "Registering %s init_vars\n%!" algo_id; - Hashtbl.replace tbls.init_state algo_id (Obj.repr x) + if !verbose_level > 0 then + Printf.eprintf "Registering %s init_vars\n%!" algo_id; + Hashtbl.replace tbls.init_state algo_id (Obj.repr x) - let (get_init_state : algo_id -> int -> string -> 's) = fun algo_id -> try Obj.obj (Hashtbl.find tbls.init_state algo_id) @@ -111,7 +96,6 @@ let (get_init_state : algo_id -> int -> string -> 's) = print_table "init_state" tbls.init_state; raise (Unregistred ("init_state", algo_id)) - let (reg_enable : algo_id -> 's enable_fun -> unit) = fun algo_id x -> if !verbose_level > 0 then Printf.eprintf "Registering %s enable\n%!" algo_id; Hashtbl.replace tbls.enable algo_id (Obj.repr x) @@ -177,7 +161,6 @@ let (get_value_of_string : unit -> (string -> 's) option) = fun () -> try Some (Obj.obj (Hashtbl.find tbls.value_of_string "_global")) with Not_found -> None - let (reg_copy_value : ('s -> 's) -> unit) = fun f -> if !verbose_level > 0 then Printf.eprintf "Registering copy_value\n%!"; @@ -190,70 +173,71 @@ let (get_copy_value : unit -> ('s -> 's)) = fun () -> raise (Unregistred ("copy_value", "_global")) -let set_min_max : (unit -> unit) = - fun () -> - let (x,y) = prop_funs.min_max () in - tbls.min_deg <- x; - tbls.max_deg <- y - -let set_connec_cycl : (unit -> unit) = - fun () -> - let (x,y) = prop_funs.is_connected_cyclic () in - tbls.is_connected <- Some x; - tbls.is_cyclic <- Some y - +let set_topology g = tbls.topology <- Some g +let get_topology () = match tbls.topology with + | None -> assert false (* SNO if set_topology is called in Main *) + | Some g -> g + let (card : unit -> int) = fun () -> match tbls.card with - | -1 -> - let c = prop_funs.card () in - tbls.card <- c; - c - | c -> c + | None -> + let x = List.length (get_topology()).nodes in + tbls.card <- Some x; + x + | Some b -> b 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 x = (get_topology()).directed in + tbls.is_directed <- Some x; + x + | Some b -> b + 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 + | None -> + let x = Topology.get_mean_degree (get_topology()) in + tbls.mean_deg <- Some x; + x + | Some b -> b -let (max_degree : unit -> int) = - fun () -> match tbls.max_deg with - | -1 -> (set_min_max (); tbls.max_deg) - | m -> m +let (min_degree : unit -> int) = fun () -> + match tbls.min_deg with + | None -> + let mind,maxd = Topology.get_degree (get_topology()) in + tbls.max_deg <- Some maxd; + tbls.min_deg <- Some mind; + mind + | Some b -> b + +let (max_degree : unit -> int) = fun () -> + match tbls.max_deg with + | None -> + let mind,maxd = Topology.get_degree (get_topology()) in + tbls.max_deg <- Some maxd; + tbls.min_deg <- Some mind; + maxd + | Some b -> b 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 connect, cyclic = Topology.is_connected_and_cyclic (get_topology()) in + tbls.is_connected <- Some connect; + tbls.is_cyclic <- Some cyclic; + cyclic | 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) + | None -> + let connect, cyclic = Topology.is_connected_and_cyclic (get_topology()) in + tbls.is_connected <- Some connect; + tbls.is_cyclic <- Some cyclic; + connect | Some b -> b - + let (is_tree : unit -> bool) = fun () -> match tbls.is_tree with | None -> @@ -262,60 +246,60 @@ let (is_tree : unit -> bool) = fun () -> b | Some b -> b -(* Caution : this option is not the same as the option in the type tbls.height. - * If height () = None, then the graph doesn't have a height (because it isn't a tree)*) -let height : (unit -> (string -> int) option) = +exception Not_a_tree + +let height : (unit -> string -> int) = fun () -> - if is_tree () then - Some tbls.height - else None + if is_tree () then ( + match tbls.height with + | Some h -> h + | None -> + let h = Topology.get_height (get_topology ()) in + tbls.height <- Some h; h + ) + else raise Not_a_tree + +let sub_tree_size : (unit -> string -> int) = + fun () -> + if is_tree () then ( + match tbls.sub_tree_size with + | Some s -> s + | None -> + let s = Topology.get_sub_tree_size (get_topology ()) in + tbls.sub_tree_size <- Some s; s + ) + else raise Not_a_tree + +let parent : (unit -> string -> int option) = + fun () -> + if is_tree () then ( + match tbls.parent with + | Some p -> p + | None -> + let p = Topology.get_parent (get_topology ()) in + tbls.parent <- Some p; p + ) + else raise Not_a_tree let (links_number : unit -> int) = fun () -> - match tbls.links_number with - | -1 -> - let n = prop_funs.links_number () in - tbls.links_number <- n; - n - | n -> n + match tbls.links_number with + | Some x -> x + | None -> + let x = Topology.get_nb_link (get_topology ()) in + tbls.links_number <- Some x; + x let (diameter : unit -> int) = fun () -> match tbls.diameter with - | -1 -> - let d = (prop_funs.diameter ()) in - tbls.diameter <- d; - d - | d -> d - - - -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 - -let set_mean_deg : ((unit -> float) -> unit) = - fun f -> prop_funs.mean_deg <- f - -let set_is_connected_cyclic : ((unit -> bool*bool) -> unit) = - fun f -> prop_funs.is_connected_cyclic <- f - -let set_height : ((node_id -> int) -> unit) = - fun f -> tbls.height <- f - -let set_links_number : ((unit -> int) -> unit) = - fun f -> prop_funs.links_number <- f - -let set_diameter : ((unit -> int) -> unit) = - fun f -> prop_funs.diameter <- f - - + | Some x -> x + | None -> + let x = Topology.get_nb_link (get_topology ()) in + tbls.diameter <- Some x; + x + let (to_string : 's -> string) = fun v -> (get_value_to_string ()) v -- GitLab