summaryrefslogtreecommitdiffstats
path: root/sources/fabrice/pacemaker/avt2trace.ml
diff options
context:
space:
mode:
Diffstat (limited to 'sources/fabrice/pacemaker/avt2trace.ml')
-rw-r--r--sources/fabrice/pacemaker/avt2trace.ml85
1 files changed, 85 insertions, 0 deletions
diff --git a/sources/fabrice/pacemaker/avt2trace.ml b/sources/fabrice/pacemaker/avt2trace.ml
new file mode 100644
index 0000000..e032acb
--- /dev/null
+++ b/sources/fabrice/pacemaker/avt2trace.ml
@@ -0,0 +1,85 @@
+open Sets
+
+open SimulTypes
+open SimulTrace
+
+let input_line ic =
+ let s = String.lowercase (input_line ic) in
+ for i = 0 to String.length s - 1 do
+ match s.[i] with
+ '\t' -> s.[i] <- ' '
+ | _ -> ()
+ done;
+ s
+
+
+let filename = Sys.argv.(1)
+
+let _ =
+ let events = ref [] in
+
+ let min_time = ref max_float in
+ let max_time = ref min_float in
+ let npeers = ref 0 in
+ let ic = open_in filename in
+ begin
+ try
+ while true do
+ let line = input_line ic in
+ match String2.split_simplify line ' ' with
+ id :: nsessions :: sessions ->
+ let id = !npeers in
+ let rec iter sessions =
+ match sessions with
+ | [] -> ()
+ | begin_time :: end_time :: sessions ->
+ let begin_time = float_of_string begin_time in
+ let end_time = float_of_string end_time in
+ min_time := min begin_time !min_time;
+ max_time := max end_time !max_time;
+ events := (begin_time, id, true) :: (end_time, id, false) :: !events;
+ iter sessions
+ | _ ->
+ Printf.printf "Unexpected line [%s]\n"
+ (String.escaped line);
+ assert false
+ in
+ iter sessions;
+ incr npeers;
+ | _ -> assert false
+ done;
+ with
+ End_of_file -> close_in ic;
+ end;
+
+ Printf.printf "Sorting...\n%!";
+ let events = List.sort compare !events in
+ let ndays = 1 + int_of_float ((!max_time -. !min_time) /. 86400.) in
+ let oc = open_out (filename ^ ".dat") in
+ trace_output oc (Peers !npeers);
+ trace_output oc (Days (ndays, 60 * 24));
+ for i = 0 to !npeers - 1 do
+ trace_output oc (Peer (i,0., "avt"));
+ done;
+ let rec iter round next_round events =
+ match events with
+ [] -> ()
+ | (time, p, status) :: tail ->
+
+ if time < next_round then begin
+ trace_output oc (if status then
+ On p
+ else
+ Off p);
+ iter round next_round tail
+
+ end else begin
+ trace_output oc (Round (round+1));
+ iter (round+1) (next_round +. 60.) events
+ end
+
+ in
+ trace_output oc (Round 0);
+ iter 0 (!min_time +. 60.) events;
+ trace_output oc End;
+ close_out oc \ No newline at end of file