summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/thibaut/simul.ml7
-rw-r--r--sources/thibaut/trace.ml118
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
+