diff options
| author | thibauth <thibauth@30fcff6e-8de6-41c7-acce-77ff6d1dd07b> | 2011-05-30 15:23:52 +0000 |
|---|---|---|
| committer | thibauth <thibauth@30fcff6e-8de6-41c7-acce-77ff6d1dd07b> | 2011-05-30 15:23:52 +0000 |
| commit | c75c054823b77a73b0fc4756b8fb7667a1f7e6dc (patch) | |
| tree | a0564dbdae229dd8077e93a503c4e317c2e6d4f2 | |
| parent | d72bae9b9ebcfa41a677bcf6f55e220b978bffe3 (diff) | |
| download | pacemaker-c75c054823b77a73b0fc4756b8fb7667a1f7e6dc.tar.gz | |
Add trace generation
git-svn-id: https://scm.gforge.inria.fr/svn/pacemaker@18 30fcff6e-8de6-41c7-acce-77ff6d1dd07b
| -rw-r--r-- | sources/thibaut/simul.ml | 7 | ||||
| -rw-r--r-- | sources/thibaut/trace.ml | 118 |
2 files changed, 122 insertions, 3 deletions
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, " <n> number of peers"; "--degree", Arg.Set_int degree, " <n> maximum number of neighbours"; - "--days", Arg.Set_int days, " <n> numbers of days"; "--tpm", Arg.Set_int tpm, " <n> number of ticks per minute"; "--accuracy", Arg.Set_int accuracy, " <n> number of ticks between rounds"; "--duration", Arg.Set_int duration, " <n> number of ticks during seeding"; "--seed", Arg.Set_int seed, " <n> random seed" ] +let usage = "simul [OPTIONS] <tracefile>" + + 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] <days> <peers> <filename>" +let arg_list = [ + "--seed", Arg.Set_int seed, " <n> 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 + |
