From c75c054823b77a73b0fc4756b8fb7667a1f7e6dc Mon Sep 17 00:00:00 2001 From: thibauth Date: Mon, 30 May 2011 15:23:52 +0000 Subject: Add trace generation git-svn-id: https://scm.gforge.inria.fr/svn/pacemaker@18 30fcff6e-8de6-41c7-acce-77ff6d1dd07b --- sources/thibaut/simul.ml | 7 +-- sources/thibaut/trace.ml | 118 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 sources/thibaut/trace.ml diff --git a/sources/thibaut/simul.ml b/sources/thibaut/simul.ml index a542b4f..cd6ae54 100644 --- a/sources/thibaut/simul.ml +++ b/sources/thibaut/simul.ml @@ -188,17 +188,18 @@ let duration = ref 0 let seed = ref 0 let arg_list = [ - "--peers", Arg.Set_int npeers, " number of peers"; "--degree", Arg.Set_int degree, " maximum number of neighbours"; - "--days", Arg.Set_int days, " numbers of days"; "--tpm", Arg.Set_int tpm, " number of ticks per minute"; "--accuracy", Arg.Set_int accuracy, " number of ticks between rounds"; "--duration", Arg.Set_int duration, " number of ticks during seeding"; "--seed", Arg.Set_int seed, " random seed" ] +let usage = "simul [OPTIONS] " + + let _ = - Arg.parse (Arg.align arg_list) (fun s -> ()) "Pacemaker simulator"; + Arg.parse (Arg.align arg_list) (fun s -> ()) usage; Random.init !seed let peers = Array.init !npeers (fun i -> { diff --git a/sources/thibaut/trace.ml b/sources/thibaut/trace.ml new file mode 100644 index 0000000..3a3ac44 --- /dev/null +++ b/sources/thibaut/trace.ml @@ -0,0 +1,118 @@ +type peer_state = + | ON + | OFF + +type event = + | Peers of int + | Days of int + | Peer of int * float * peer_state + | Round of int + | On of int + | Off of int + | End + | Exponential + +type peer = { + id : int; + mutable state : peer_state; + avail : float; + lambda : float; + mu : float +} + +let string_of_state state = match state with + | ON -> "On" + | OFF -> "Off" + +let output oc trace_event = + let print s = Printf.fprintf oc s in + match trace_event with + | Peers npeers -> print "Peers %d\n" npeers + | Days ndays -> print "Days %d\n" ndays + | Peer (i,avail, state) -> print "Peer %d %.3f %s\n" i avail + (string_of_state state) + | Round round -> print "Round %d\n" round + | On i -> print "On %d\n" i + | Off i -> print "Off %d\n" i + | End -> print "End\n" + | Exponential -> print "Exponential\n" + +let input ic = + let line = input_line ic in + let space = Str.regexp " " in + match Str.split space line with + | ["Peers"; npeers] -> Peers (int_of_string npeers) + | ["Days"; ndays] -> Days (int_of_string ndays) + | ["End"] -> End + | ["Round"; round] -> Round (int_of_string round) + | ["On"; i] -> On (int_of_string i) + | ["Off"; i] -> Off (int_of_string i) + | _ -> failwith (Printf.sprintf "Bad line [%s]" (String.escaped line)) + +let ndays = ref 0 +let npeers = ref 0 +let filename = ref "" +let seed = ref 0 + +let anon = + let args = ref 0 in + fun s -> + incr args; + if !Arg.current = Array.length Sys.argv -1 && !args < 3 then + raise (Arg.Bad "Too few arguments"); + match !args with + | 1 -> ndays := int_of_string s + | 2 -> npeers := int_of_string s + | 3 -> filename := s + | _ -> raise (Arg.Bad "Too many arguments") + +let usage = "gentrace [OPTIONS] " +let arg_list = [ + "--seed", Arg.Set_int seed, " random seed" +] + +let _ = + Arg.parse (Arg.align arg_list) anon usage; + Random.init !seed + +let oc = open_out !filename + +let _ = + output oc (Peers !npeers); + output oc (Days !ndays) + +let peers = Array.init !npeers (fun i -> + let avail = Random.float 1. in + let init = Random.float 1. in + let state = if init < avail then ON else OFF in + let session_length = 10 + Random.int 90 in + let mu = 1./. (float_of_int session_length) in + let lambda = mu*.(1.-.avail)/.avail in + output oc (Peer (i, avail, state)); + { + id = i; + state = state; + avail = avail; + lambda = lambda; + mu = mu + } +) + +let nrounds = !ndays*24*60 +let _ = + for i = 0 to (nrounds-1) do + output oc (Round i); + let aux p = + let r = Random.float 1. in + if p.state = OFF && r < p.lambda then begin + p.state <- ON; + output oc (On p.id) + end else if p.state = ON && r < p.mu then begin + p.state <- OFF; + output oc (Off p.id) + end + in + Array.iter aux peers + done; + output oc End + -- cgit v1.2.3-70-g09d2