From 1f16e7e2ea98e98421443163a7e7b2e496714823 Mon Sep 17 00:00:00 2001
From: STEVAN Antoine <antoine.stevan@isae-supaero.fr>
Date: Mon, 27 May 2024 10:55:08 +0000
Subject: [PATCH] add timestamp to measurements and delay start
 (dragoon/komodo!111)

- add a timestamp to all the measurements of the _diversity_ from `inbreeding/mod.rs`
- allow to delay the measurement starts with `--measurement-schedule-start`, to help completing already existing measurements

> :exclamation: **Important**
> existing measurement files will have to change shape from
> ```
> table<strategy: string, diversity: list<float>>
> ```
> to
> ```
> table<strategy: string, diversity: table<t: int, diversity: float>>
> ```
---
 examples/inbreeding/mod.rs | 11 ++++++++---
 scripts/inbreeding/plot.nu |  2 +-
 scripts/inbreeding/run.nu  | 18 ++++++++++++++----
 3 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/examples/inbreeding/mod.rs b/examples/inbreeding/mod.rs
index c01a0ece..cc2f524d 100644
--- a/examples/inbreeding/mod.rs
+++ b/examples/inbreeding/mod.rs
@@ -114,7 +114,7 @@ where
     for t in 0..=max_t {
         if measurement_schedule(t) {
             let inbreeding = measure_inbreeding(&shards, k, nb_measurements, &mp, &sty, rng);
-            println!("{}", inbreeding);
+            println!("{}, {}", t, inbreeding);
         }
 
         // decode the data
@@ -164,7 +164,7 @@ where
 
         if measurement_schedule(t) {
             let inbreeding = measure_inbreeding(&shards, k, nb_measurements, &mp, &sty, rng);
-            println!("{}", inbreeding);
+            println!("{}, {}", t, inbreeding);
         }
 
         // recode a new random shard
@@ -220,6 +220,8 @@ struct Cli {
 
     #[arg(long)]
     measurement_schedule: usize,
+    #[arg(long)]
+    measurement_schedule_start: usize,
 }
 
 fn main() {
@@ -241,7 +243,10 @@ fn main() {
         "diversity will be measured every {} steps",
         cli.measurement_schedule
     );
-    let measurement_schedule = |t| t % cli.measurement_schedule == 0;
+    let measurement_schedule = |t| {
+        t >= cli.measurement_schedule_start
+            && (t - cli.measurement_schedule_start) % cli.measurement_schedule == 0
+    };
 
     match cli.test_case {
         TestCase::EndToEnd => {
diff --git a/scripts/inbreeding/plot.nu b/scripts/inbreeding/plot.nu
index 3dc37dd7..17807e9f 100644
--- a/scripts/inbreeding/plot.nu
+++ b/scripts/inbreeding/plot.nu
@@ -54,7 +54,7 @@ export def main [data: path, --save: path, --options: record<k: int>] {
         }
         | update diversity {|it|
             let l = $it.diversity | length
-            $it.diversity | wrap y | merge (seq 0 $l | wrap x) | insert e 0
+            $it.diversity | insert e 0 | rename --column { t: "x", diversity: "y" }
         }
         | rename --column { diversity: "points" }
         | insert style {|it|
diff --git a/scripts/inbreeding/run.nu b/scripts/inbreeding/run.nu
index 1326a2d9..d6cdc509 100644
--- a/scripts/inbreeding/run.nu
+++ b/scripts/inbreeding/run.nu
@@ -10,6 +10,7 @@ export def main [
         nb_measurements: int,
         nb_scenarii: int,
         measurement_schedule: int,
+        measurement_schedule_start: int,
         max_t: int,
         strategies: list<string>,
         environment: string,
@@ -22,6 +23,7 @@ export def main [
             -n $options.n
             --nb-measurements $options.nb_measurements
             --measurement-schedule $options.measurement_schedule
+            --measurement-schedule-start $options.measurement_schedule_start
             -t $options.max_t
             --test-case end-to-end
         ] | lines | into float | save --force baseline.nuon
@@ -37,17 +39,25 @@ export def main [
                 -n $options.n
                 --nb-measurements $options.nb_measurements
                 --measurement-schedule $options.measurement_schedule
+                --measurement-schedule-start $options.measurement_schedule_start
                 -t $options.max_t
                 --test-case recoding
                 --strategy $s
                 --environment $options.environment
-            ] | lines | into float
+            ]
+                | lines
+                | parse "{t}, {diversity}"
+                | into float diversity
         }
 
         let diversity = $res
-            | skip 1
-            | reduce --fold $res.0 {|it, acc| $acc | zip $it | each { flatten }}
-            | each { math avg }
+            | flatten
+            | group-by t --to-table
+            | update items { get diversity | math avg }
+            | rename --column { group: "t", items: "diversity" }
+            | into int t # NOTE: $.t needs to be converted to int here because
+                         # `group-by --to-table` converts the grouping key to
+                         # string
 
         {
             strategy: $s,
-- 
GitLab