diff --git a/tools/rdbg4sasa/gtkgui.ml b/tools/rdbg4sasa/gtkgui.ml index df2cccfb6084bc921d7ecd9c38628778cae416f1..28ab05ee13d1c2f4a6415d36acbf3f6047b71b6a 100644 --- a/tools/rdbg4sasa/gtkgui.ml +++ b/tools/rdbg4sasa/gtkgui.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 27/05/2021 (at 10:38) by Erwan Jahier> *) +(* Time-stamp: <modified the 27/05/2021 (at 17:23) by Erwan Jahier> *) #thread #require "lablgtk3" @@ -20,10 +20,10 @@ let rdbg_nodes_info e: (string * string * bool) list = let split_var (str, value) = let v = match value with B v -> v | _ -> assert false in let p, label = - match String.split_on_char '_' str with - | [] | [_] | [_;_] -> assert false - | [_; x; y] -> x, y - | [_; x; y; z] -> x^y,z + match args.salut_mode, String.split_on_char '_' str with + | _, [] | _, [_] | _, [_;_] -> assert false (* should not occur (naming conv) *) + | false, _::x::y -> x, String.concat "_" y + | true, _::x::y::z -> x^y, String.concat "_" z | _ -> assert false in p, label,v @@ -71,7 +71,6 @@ let refresh () = (** Met en place le hook *) let daemongui_activate = Hashtbl.create 1 - let (fake_val_of_type : Data.t -> Data.v) = function | Bool -> B false | Int -> I (Random.int 10) @@ -96,6 +95,7 @@ let create_tags (buffer:GText.buffer) = () let tags_created = ref false +let oracle_button_ref = ref None let write color b str = if not !tags_created then (create_tags b; tags_created := true); @@ -125,9 +125,11 @@ let display_event b = (* *) let goto_hook_call () = - e := next_cond !e (fun e -> e.name = "mv_hook" && e.kind = Call) + if custom_mode then + e := next_cond !e (fun e -> e.name = "mv_hook" && e.kind = Call) let goto_hook_exit () = + if custom_mode then e := next_cond !e (fun e -> e.name = "mv_hook" && e.kind = Exit) let init_rdbg_hook () = @@ -156,9 +158,9 @@ let init_rdbg_hook () = | None -> false | Some x -> x in - let activate = match enabled with + let activate = match enabled with (* activate the Enabled actions! *) | B true -> B to_activate - | _ -> B false + | B false -> B false in (str, activate) ) sl @@ -178,16 +180,16 @@ let init_rdbg_hook () = let set_tooltip b = b#misc#set_tooltip_text -let custom_daemon p gtext vbox step_button round_button = +let custom_daemon p gtext vbox step_button round_button legitimate_button = (* création du rdbg_mv_hook et de tout ce qu'il faut autour *) init_rdbg_hook (); let daemon_box = GPack.hbox ~packing:vbox#add () ~homogeneous:true ~height:15 in let dk_dd = GButton.radio_button ~active:(!daemon_kind=Distributed) - ~label:"Distributed" ~packing:daemon_box#add () + ~label:"Distributed" ~packing:daemon_box#add () in let make_but act lbl = GButton.radio_button ~active:act ~label:lbl - ~group:dk_dd#group ~packing:daemon_box#add () + ~group:dk_dd#group ~packing:daemon_box#add () in let dk_cd = make_but (!daemon_kind=Central) "Central" in let dk_lcd = make_but (!daemon_kind=LocCentral) "Locally Central" in @@ -214,19 +216,17 @@ let custom_daemon p gtext vbox step_button round_button = let update_rdbg_hook node activate = (match !daemon_kind with | Distributed | Synchronous | Central | LocCentral -> - assert false (* SNO *) + assert false (* SNO *) | ManualCentral -> ( - let txt = Printf.sprintf "ManualCentral step: %s\n\n%s" node (str_of_sasa_event false !e) in - (* gtext#buffer#set_text txt; *) - blue gtext#buffer txt; - Hashtbl.iter - (fun n status -> Hashtbl.replace daemongui_activate n (n = node && status)) - daemongui_activate; - ) - | Manual -> - let txt = Printf.sprintf "Manual step: \n\n%s" (str_of_sasa_event false !e) in + let txt = Printf.sprintf "ManualCentral step: %s\n\n%s" node (str_of_sasa_event false !e) in + (* gtext#buffer#set_text txt; *) blue gtext#buffer txt; - Hashtbl.replace daemongui_activate node activate + Hashtbl.filter_map_inplace (fun n status -> Some (n = node)) daemongui_activate; + ) + | Manual -> + let txt = Printf.sprintf "Manual step: \n\n%s" (str_of_sasa_event false !e) in + blue gtext#buffer txt; + Hashtbl.replace daemongui_activate node activate ); in @@ -241,9 +241,9 @@ let custom_daemon p gtext vbox step_button round_button = let i = ref 0 in let checkbox_grid = GPack.vbox ~packing:vbox#add () in let checkbox_scrolled_grid = GBin.scrolled_window ~border_width:10 ~hpolicy:`AUTOMATIC - ~vpolicy:`AUTOMATIC - ~height:300 - ~shadow_type:`OUT ~packing:checkbox_grid#add () + ~vpolicy:`AUTOMATIC + ~height:300 + ~shadow_type:`OUT ~packing:checkbox_grid#add () in let checkbox_scrolled_grid_box = GPack.vbox ~packing:checkbox_scrolled_grid#add () in let checkbox_line = GPack.hbox ~packing:checkbox_scrolled_grid_box#add () in @@ -272,9 +272,9 @@ let custom_daemon p gtext vbox step_button round_button = (* Des boutons pour le mode Manuel Central *) let pushbox_grid = GPack.vbox ~packing:vbox#add () ~homogeneous:true in let pushbox_scrolled_grid = GBin.scrolled_window ~border_width:10 ~hpolicy:`AUTOMATIC - ~vpolicy:`AUTOMATIC - ~height:300 - ~shadow_type:`OUT ~packing:pushbox_grid#add () + ~vpolicy:`AUTOMATIC + ~height:300 + ~shadow_type:`OUT ~packing:pushbox_grid#add () in let pushbox_scrolled_grid_box = GPack.vbox ~homogeneous:true ~packing:pushbox_scrolled_grid#add () @@ -296,12 +296,12 @@ let custom_daemon p gtext vbox step_button round_button = (* Quand on appuie, met à jour le rdbg_mv_hook *) ignore(pushbox#event#connect#button_press ~callback: (fun _ -> - update_rdbg_hook name true; - goto_hook_exit (); - goto_hook_call (); - display_event gtext; - refresh (); - false)); + update_rdbg_hook name true; + goto_hook_exit (); + goto_hook_call (); + display_event gtext; + refresh (); + false)); Hashtbl.add pushbox_map name pushbox ) nodes_enabled; @@ -309,8 +309,8 @@ let custom_daemon p gtext vbox step_button round_button = (* Des compteurs pour les modes automatiques *) let counter_grid = GPack.vbox ~packing:vbox#add () in let counter_scrolled_grid = GBin.scrolled_window ~border_width:10 ~hpolicy:`AUTOMATIC - ~vpolicy:`AUTOMATIC ~height:400 - ~shadow_type:`OUT ~packing:counter_grid#add () + ~vpolicy:`AUTOMATIC ~height:400 + ~shadow_type:`OUT ~packing:counter_grid#add () in let counter_scrolled_grid_box = GPack.vbox ~packing:counter_scrolled_grid#add () in let counter_line = GPack.hbox ~packing:counter_scrolled_grid_box#add () in @@ -352,25 +352,30 @@ let custom_daemon p gtext vbox step_button round_button = let update_checkbox node enabled = match !daemon_kind with | Manual -> - show step_button; show checkbox_grid; - hide round_button; hide pushbox_grid; hide counter_grid; - let checkbox = Hashtbl.find checkbox_map node in - if enabled then - show checkbox - else ( - checkbox#set_active false; (* on decoche *) - hide checkbox - ); - checkbox#set_sensitive enabled + show step_button; show checkbox_grid; + hide legitimate_button; + (match !oracle_button_ref with Some b -> hide b | None -> ()); + hide round_button; hide pushbox_grid; hide counter_grid; + let checkbox = Hashtbl.find checkbox_map node in + if enabled then + show checkbox + else ( + checkbox#set_active false; (* on decoche *) + hide checkbox + ); + checkbox#set_sensitive enabled | ManualCentral -> - hide step_button; hide round_button; hide checkbox_grid; hide counter_grid; - show pushbox_grid; - let pushbox = Hashtbl.find pushbox_map node in - if enabled then show pushbox else hide pushbox; - pushbox#set_sensitive enabled + hide legitimate_button; + (match !oracle_button_ref with Some b -> hide b | None -> ()); + hide step_button; hide round_button; hide checkbox_grid; hide counter_grid; + show pushbox_grid; + let pushbox = Hashtbl.find pushbox_map node in + if enabled then show pushbox else hide pushbox; + pushbox#set_sensitive enabled | Distributed | Synchronous | Central | LocCentral -> - show step_button; show round_button; show counter_grid; - hide checkbox_grid; hide pushbox_grid; + (match !oracle_button_ref with Some b -> show b | None -> ()); + show step_button; show round_button; show counter_grid; show legitimate_button; + hide checkbox_grid; hide pushbox_grid; in let update_all_checkboxes () = let nodes_enabled = rdbg_nodes_enabled !e in @@ -418,10 +423,10 @@ let custom_daemon p gtext vbox step_button round_button = | [] -> acc | (n, false)::t -> aux p acc t | (n, true)::t -> - let pn = prio n in - if p > pn then aux p acc t else - if p = pn then aux p (n::acc) t else - aux pn [n] t + let pn = prio n in + if p > pn then aux p acc t else + if p = pn then aux p (n::acc) t else + aux pn [n] t in aux 0 [] nl in @@ -432,53 +437,53 @@ let custom_daemon p gtext vbox step_button round_button = (* p ("==> gtkgui: CALL =" ^ (string_of_event !e)); *) match !daemon_kind with | Distributed -> ( - let nodes = List.map (fun x -> [x]) nodes in - let to_activate = Daemon.distributed nodes in - Hashtbl.clear daemongui_activate; - List.iter (fun n -> Hashtbl.replace daemongui_activate n true) to_activate; - goto_hook_exit (); - goto_hook_call (); - d () - ) + let nodes = List.map (fun x -> [x]) nodes in + let to_activate = Daemon.distributed nodes in + Hashtbl.clear daemongui_activate; + List.iter (fun n -> Hashtbl.replace daemongui_activate n true) to_activate; + goto_hook_exit (); + goto_hook_call (); + d () + ) | Synchronous -> ( - Hashtbl.clear daemongui_activate; - List.iter (fun n -> Hashtbl.replace daemongui_activate n true) nodes; - goto_hook_exit (); - goto_hook_call (); - d () - ) + Hashtbl.clear daemongui_activate; + List.iter (fun n -> Hashtbl.replace daemongui_activate n true) nodes; + goto_hook_exit (); + goto_hook_call (); + d () + ) | Central -> ( - let nodes = List.map (fun x -> [x]) nodes in - let to_activate = Daemon.central nodes in - Hashtbl.clear daemongui_activate; - List.iter (fun n -> - Printf.printf "Activating %s\n" n; - Hashtbl.replace daemongui_activate n true) to_activate; - goto_hook_exit (); - goto_hook_call (); - d () - ) + let nodes = List.map (fun x -> [x]) nodes in + let to_activate = Daemon.central nodes in + Hashtbl.clear daemongui_activate; + List.iter (fun n -> + Printf.printf "Activating %s\n" n; + Hashtbl.replace daemongui_activate n true) to_activate; + goto_hook_exit (); + goto_hook_call (); + d () + ) | LocCentral -> ( - let get_neigbors x = - let succ = snd (List.split (topology.succ x)) in - let pred = topology.pred x in - let res = List.fold_left (fun acc x -> if List.mem x acc then acc else x::acc) succ pred in - (* p (Printf.sprintf "voisins(%s)=%s\n" x (String.concat "," res)); *) - res - in - let nodes = List.map (fun x -> [x, get_neigbors x]) nodes in - let to_activate = Daemon.locally_central nodes in - Hashtbl.clear daemongui_activate; - List.iter (fun n -> Hashtbl.replace daemongui_activate n true) to_activate; - goto_hook_exit (); - goto_hook_call (); - d () - ) - | ManualCentral -> () (* SNO; the step is done in pushbox callbacks *) - | Manual -> + let get_neigbors x = + let succ = snd (List.split (topology.succ x)) in + let pred = topology.pred x in + let res = List.fold_left (fun acc x -> if List.mem x acc then acc else x::acc) succ pred in + (* p (Printf.sprintf "voisins(%s)=%s\n" x (String.concat "," res)); *) + res + in + let nodes = List.map (fun x -> [x, get_neigbors x]) nodes in + let to_activate = Daemon.locally_central nodes in + Hashtbl.clear daemongui_activate; + List.iter (fun n -> Hashtbl.replace daemongui_activate n true) to_activate; goto_hook_exit (); goto_hook_call (); d () + ) + | ManualCentral -> () (* SNO; the step is done in pushbox callbacks *) + | Manual -> + goto_hook_exit (); + goto_hook_call (); + d () in step @@ -557,11 +562,26 @@ let main () = let round_button = button ~use_mnemonic:true ~stock:`MEDIA_FORWARD ~packing:bbox#add ~label:"round" () in + let legitimate () = + let legitimate_button = button ~use_mnemonic:true ~packing:bbox#add () in + set_tooltip legitimate_button + "Move FORWARD until a legitimate configuration is reached (silence by default)"; + let image = GMisc.image ~file:(libui_prefix^"/chut_small.svg") () in + legitimate_button#set_image image#coerce; + (* change_label legitimate_button "Silen_t"; *) + ignore (legitimate_button#connect#clicked ~callback: + (button_cb true (fun () -> legitimate(); goto_hook_call ()))); + legitimate_button#misc#hide(); (* indeed, in the defaut mode (manual central), + it should be hided *) + legitimate_button + in + let legitimate_button = legitimate () in + let ze_step = if custom_mode then - custom_daemon p text_out w step_button round_button + custom_daemon p text_out w step_button round_button legitimate_button else - s + s (* cf sasa-rdbg-cmds.ml *) in let step () = ze_step(); @@ -581,23 +601,14 @@ let main () = ~callback:( button_cb true (fun () -> next_round_gui !roundnb; - if !e.name <> "mv_hook" && !e.kind <> Call then goto_hook_call ()))); + if custom_mode && !e.name <> "mv_hook" && !e.kind <> Call then + goto_hook_call ())) + ); set_tooltip back_round_button "Move BACKWARD to the previous ROUND"; change_label back_round_button "Roun_d"; ignore (back_round_button#connect#clicked ~callback:(button_cb true (fun () -> pr();pr(); goto_hook_call ()))); - let legitimate () = - let legitimate_button = button ~use_mnemonic:true ~packing:bbox#add () in - set_tooltip legitimate_button - "Move FORWARD until a legitimate configuration is reached (silence by default)"; - let image = GMisc.image ~file:(libui_prefix^"/chut_small.svg") () in - legitimate_button#set_image image#coerce; - (* change_label legitimate_button "Silen_t"; *) - ignore (legitimate_button#connect#clicked ~callback: - (button_cb true (fun () -> legitimate(); goto_hook_call ()))) - in - legitimate (); let graph () = let graph_button = button ~use_mnemonic:true ~packing:bbox#add () in @@ -617,11 +628,14 @@ let main () = butt in if args.oracles <> [] then ( - ignore (make_button `OK "_Oracle" "Move FORWARD until an oracle is violated" + let oracle_button = make_button `OK "_Oracle" "Move FORWARD until an oracle is violated" (* let image = GMisc.image ~file:"../rdbg-utils/oracle_small.jpg" () in *) (* viol_button#set_image image#coerce; *) (button_cb_string - (fun () -> let str = viol_string () in goto_hook_call (); d();str))) + (fun () -> let str = viol_string () in goto_hook_call (); d();str)) + in + oracle_button#misc#hide(); (* indeed, in the defaut mode (manual central), it should be hided *) + oracle_button_ref := Some oracle_button ); let _ = make_button `UNDO "_Undo" "Undo the last move" (button_cb true (fun ()->u();d())) in let _ = make_button `REFRESH "Restar_t" "Restart from the beginning" diff --git a/tools/rdbg4sasa/sasa-rdbg-cmds.ml b/tools/rdbg4sasa/sasa-rdbg-cmds.ml index 3ff960364de9727b911c5c79ed921e08fb3e781b..5143bc6fa63c444a405a0d8ea1ad0bcf617965e6 100644 --- a/tools/rdbg4sasa/sasa-rdbg-cmds.ml +++ b/tools/rdbg4sasa/sasa-rdbg-cmds.ml @@ -193,7 +193,7 @@ let str_of_sasa_event short e = Printf.sprintf "%s_%s=%s" pid n (Data.val_to_string string_of_float v) in let pot = match List.assoc_opt "potential" e.data with - | Some F f -> Printf.sprintf "potential = %.1f\n" f + | Some F f -> Printf.sprintf " => potential %.1f" f | _ -> "" in let leg = match List.assoc_opt "legitimate" e.data with @@ -209,12 +209,12 @@ let str_of_sasa_event short e = (if e.step <> e.nb then (":" ^ (string_of_int e.nb)) else "") (String.concat " " (List.map to_string_var vars)) else - Printf.sprintf "Round %i - Step %i%s\n%s%s\n%s%s%s" !roundnb e.step - (if e.step <> e.nb then (" - Event " ^ (string_of_int e.nb)) else "") + Printf.sprintf "Round %i - Step %i%s%s\n%s%s\n%s%s" !roundnb e.step + (if e.step <> e.nb then (" - Event " ^ (string_of_int e.nb)) else "") pot (RdbgStdLib.string_of_event e) (if vars = [] then "" else ("Active node states: "^(String.concat " " (List.map to_string_var vars)))) - pot leg silent + leg silent ) let print_sasa_event short e =