diff options
| author | lefessan <lefessan@30fcff6e-8de6-41c7-acce-77ff6d1dd07b> | 2011-04-11 15:24:45 +0000 |
|---|---|---|
| committer | lefessan <lefessan@30fcff6e-8de6-41c7-acce-77ff6d1dd07b> | 2011-04-11 15:24:45 +0000 |
| commit | 1b3bbda12e948e4d9fe34a4c59b9dac9e7b64e8f (patch) | |
| tree | b1e44c5b779b593f4065c28e790f15b2ac7b777d /sources/fabrice/simulator/simulTrace.ml | |
| parent | decfef69b25175e672a3216d85b9b4c7e1165b98 (diff) | |
| download | pacemaker-1b3bbda12e948e4d9fe34a4c59b9dac9e7b64e8f.tar.gz | |
Added sources of simulator and emulator
git-svn-id: https://scm.gforge.inria.fr/svn/pacemaker@2 30fcff6e-8de6-41c7-acce-77ff6d1dd07b
Diffstat (limited to 'sources/fabrice/simulator/simulTrace.ml')
| -rw-r--r-- | sources/fabrice/simulator/simulTrace.ml | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/sources/fabrice/simulator/simulTrace.ml b/sources/fabrice/simulator/simulTrace.ml new file mode 100644 index 0000000..b58bf41 --- /dev/null +++ b/sources/fabrice/simulator/simulTrace.ml @@ -0,0 +1,162 @@ +open SimulTypes +open SimulGraphes + +type trace_event = + Peers of int +| Days of int * int +| Peer of int * float * string +| Round of int +| On of int +| Off of int +| Dead of int +| End +| Exponential + +let trace_output oc trace_event = + output_string oc (match trace_event with + Peers npeers -> Printf.sprintf "Peers %d\n" npeers + | Days (ndays, day) -> Printf.sprintf "Days %d %d\n" ndays day + | Peer (i,avail,s) -> + Printf.sprintf "Peer %d %.3f %s\n" i avail s + | Round round -> Printf.sprintf "Round %d\n" round + | On i -> Printf.sprintf "On %d\n" i + | Off i -> Printf.sprintf "Off %d\n" i + | Dead i -> Printf.sprintf "Dead %d\n" i + | End -> "End\n" + | Exponential -> "Exponential\n" + ) + +let trace_input ic = + let line = input_line ic in + match String2.split line ' ' with + ["Peers"; npeers] -> Peers (int_of_string npeers) + | ["Days"; ndays] -> Days (int_of_string ndays, 24 * 60) + | ["Days"; ndays; day] -> Days (int_of_string ndays, int_of_string day) + | "Peer" :: i :: avail :: tail -> + Peer (int_of_string i, float_of_string avail, String2.unsplit tail ' ') + | ["End"] -> End + | ["Exponential"] -> Exponential + | ["Round"; round] -> Round (int_of_string round) + | ["On"; i] -> On (int_of_string i) + | ["Dead"; i] -> Dead (int_of_string i) + | ["Off"; i] -> Off (int_of_string i) + + | _ -> failwith (Printf.sprintf "Bad line [%s]" (String.escaped line)) + +let print_distribution = ref false +(* gnuplot> plot exp(1-log(2+65*x)), 1.0/12 *) + +let exponential = ref false +let distribution = ref [] +let availability = ref [] + +let trace_read filename = + let ic = open_in filename in + let npeers = match trace_input ic with + Peers npeers -> npeers + | _ -> assert false + in + let (ndays, day) = match trace_input ic with + Days (ndays, day) -> ndays, day + | _ -> assert false + in + + let rec read_peer ii = + match trace_input ic with + Exponential -> exponential := true; + read_peer ii + | Peer (i, avail, s) -> + assert (i=ii); +(* + let x = float_of_int avail /. 900000. in + + let avail = (if !exponential then + max 0.02 (min 1. (exp(1. -. log(2. +. 65. *. x)))) + else + 0.02 +. 0.98 *. x + ) + in + if !print_distribution then begin + distribution := x :: !distribution; + availability := avail :: !availability; + end; + let lambda = float_of_int decs /. (60. *. 24.) in + let mu = avail *. lambda /. (1. -. avail) in + *) + let p = { + i = i; + avail = avail; + descr = s; + session = 0; + day = true; + state = OFF; + real_avail = 0; + real_decs = 0; + } in + p + | _ -> assert false + in + let peers = Array.init npeers read_peer in + let event = ref None in + let get_event () = + let ev = trace_input ic in + event := Some ev + in + + let next_day = ref 0 in + let begin_time = (Int64.of_float (Unix.gettimeofday ())) in + let rec iter_round round = + match !event with + None -> + next_event round + | Some ev -> + match ev with + Round rr -> + if rr = round then begin + if !next_day = round then begin + let time = Unix.gettimeofday () in + let time = Int64.of_float time in + Printf.printf "Day %d (%Ld)\n%!" (round / day) + (Int64.sub time begin_time); + next_day := !next_day + day + end; + next_event round + end else + assert (rr > round) + | On i -> + event := None; + let p = peers.(i) in + p.state <- ON; + next_event round + | Off i -> + event := None; + let p = peers.(i) in + p.state <- OFF; + p.real_decs <- p.real_decs + 1; + next_event round + | Dead i -> + event := None; + let p = peers.(i) in + p.state <- DEAD; + peers.(i) <- { + p with state = OFF; + }; + next_event round + | End -> () + | _ -> assert false + + and next_event round = + get_event (); + iter_round round + in + if !print_distribution then begin + cdf_of_list string_of_float "dist_random" !distribution + "set yrange [0:1]" "CDF of peers" "Distribution" + " title 'random'"; + cdf_of_list string_of_float "dist_availability" !availability + "set yrange [0:1]" "CDF of peers" "Distribution" + " title 'avail'"; + distribution := []; + availability := []; + end; + peers, ndays * day, iter_round |
