From 5d23f59fa035e590140e35f6d60f297e572723fd Mon Sep 17 00:00:00 2001
From: "a.stevan" <antoine.stevan@isae-supaero.fr>
Date: Tue, 28 May 2024 15:35:29 +0200
Subject: [PATCH 1/3] slightly better API

---
 bins/inbreeding/plot.nu | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/bins/inbreeding/plot.nu b/bins/inbreeding/plot.nu
index ec82be62..bf573d14 100644
--- a/bins/inbreeding/plot.nu
+++ b/bins/inbreeding/plot.nu
@@ -3,6 +3,7 @@ use std repeat
 use consts.nu
 use ../../.nushell/plot.nu gplt
 use ../../.nushell/color.nu *
+use ../../.nushell/error.nu "error throw"
 
 def "parse strategy" []: string -> record<type: string> {
     let s = $in
@@ -46,18 +47,37 @@ def get-experiments []: nothing -> list<string> {
         | ls $in
         | get name
         | path split
-        | each { last 3 | str join "-" }
+        | each { last 3 | reject 1 | str join "-" }
+        | uniq
 }
 
 export def main [
-    experiment: string@get-experiments, # something of the form '<seed>-<timestamp>-<env>'
+    experiment: string@get-experiments, # something of the form '<seed>-<env>'
     --save: path,
     --options: record<k: int>
 ] {
-    let data = [$consts.CACHE, ($experiment | str replace --all '-' (char path_sep)), '*' ]
+    let exp = $experiment | parse "{seed}-{env}" | into record
+    if $exp == {} {
+        error throw {
+            err: "invalid experiment",
+            label: $"should have format '<seed>-<env>', found ($experiment)",
+            span: (metadata $experiment).span,
+        }
+    }
+
+    let experiment_path = [$consts.CACHE, $exp.seed, '*', $exp.env, '*' ]
         | path join
         | into glob
-        | ls $in
+    let experiment_files = try {
+        ls $experiment_path
+    } catch {
+        error throw {
+            err: "invalid experiment",
+            label: $"experiment '($experiment)' does not appear to have data files",
+            span: (metadata $experiment).span,
+        }
+    }
+    let data = $experiment_files
         | insert strategy { get name | path split | last }
         | select name strategy
         | insert diversity {
@@ -74,6 +94,12 @@ export def main [
                              # string
         }
         | reject name
+        | group-by strategy --to-table
+        | update items {|it|
+            let d = $it.items.diversity
+            $d | skip 1 | reduce --fold $d.0 {|it, acc| $acc | append $it}
+        }
+        | rename --column { group: "strategy", items: "diversity" }
     let l = $data.diversity.0 | length
 
     $data
-- 
GitLab


From b75d677673602aa86ae59c2074743875eaf2d4d8 Mon Sep 17 00:00:00 2001
From: "a.stevan" <antoine.stevan@isae-supaero.fr>
Date: Tue, 28 May 2024 15:40:16 +0200
Subject: [PATCH 2/3] split plotting inbreeding into `load` + `plot`

---
 bins/inbreeding/load.nu | 62 +++++++++++++++++++++++++++++++++++++++++
 bins/inbreeding/mod.nu  |  1 +
 bins/inbreeding/plot.nu | 59 ++-------------------------------------
 3 files changed, 65 insertions(+), 57 deletions(-)
 create mode 100644 bins/inbreeding/load.nu

diff --git a/bins/inbreeding/load.nu b/bins/inbreeding/load.nu
new file mode 100644
index 00000000..7f79a949
--- /dev/null
+++ b/bins/inbreeding/load.nu
@@ -0,0 +1,62 @@
+use consts.nu
+
+def get-experiments []: nothing -> list<string> {
+    $consts.CACHE
+        | path join '*' '*' '*'
+        | into glob
+        | ls $in
+        | get name
+        | path split
+        | each { last 3 | reject 1 | str join "-" }
+        | uniq
+}
+
+export def main [
+    experiment: string@get-experiments, # something of the form '<seed>-<env>'
+]: nothing -> table<strategy: string, diversity: table<x: int, y: float>> {
+    let exp = $experiment | parse "{seed}-{env}" | into record
+    if $exp == {} {
+        error throw {
+            err: "invalid experiment",
+            label: $"should have format '<seed>-<env>', found ($experiment)",
+            span: (metadata $experiment).span,
+        }
+    }
+
+    let experiment_path = [$consts.CACHE, $exp.seed, '*', $exp.env, '*' ]
+        | path join
+        | into glob
+    let experiment_files = try {
+        ls $experiment_path
+    } catch {
+        error throw {
+            err: "invalid experiment",
+            label: $"experiment '($experiment)' does not appear to have data files",
+            span: (metadata $experiment).span,
+        }
+    }
+
+    $experiment_files
+        | insert strategy { get name | path split | last }
+        | select name strategy
+        | insert diversity {
+            ls $in.name
+                | each { get name | open | lines }
+                | flatten
+                | parse "{x}, {y}"
+                | into float y
+                | group-by x --to-table
+                | update items { get y | math avg }
+                | rename --column { group: "x", items: "y" }
+                | into int x # NOTE: $.x needs to be converted to int here because
+                             # `group-by --to-table` converts the grouping key to
+                             # string
+        }
+        | reject name
+        | group-by strategy --to-table
+        | update items {|it|
+            let d = $it.items.diversity
+            $d | skip 1 | reduce --fold $d.0 {|it, acc| $acc | append $it}
+        }
+        | rename --column { group: "strategy", items: "diversity" }
+}
diff --git a/bins/inbreeding/mod.nu b/bins/inbreeding/mod.nu
index 658b9a08..6917cad3 100644
--- a/bins/inbreeding/mod.nu
+++ b/bins/inbreeding/mod.nu
@@ -1,3 +1,4 @@
 export use build.nu
 export use run.nu
+export use load.nu
 export use plot.nu
diff --git a/bins/inbreeding/plot.nu b/bins/inbreeding/plot.nu
index bf573d14..11ca0f71 100644
--- a/bins/inbreeding/plot.nu
+++ b/bins/inbreeding/plot.nu
@@ -40,66 +40,11 @@ def get-color []: int -> string {
     }
 }
 
-def get-experiments []: nothing -> list<string> {
-    $consts.CACHE
-        | path join '*' '*' '*'
-        | into glob
-        | ls $in
-        | get name
-        | path split
-        | each { last 3 | reject 1 | str join "-" }
-        | uniq
-}
-
 export def main [
-    experiment: string@get-experiments, # something of the form '<seed>-<env>'
     --save: path,
     --options: record<k: int>
-] {
-    let exp = $experiment | parse "{seed}-{env}" | into record
-    if $exp == {} {
-        error throw {
-            err: "invalid experiment",
-            label: $"should have format '<seed>-<env>', found ($experiment)",
-            span: (metadata $experiment).span,
-        }
-    }
-
-    let experiment_path = [$consts.CACHE, $exp.seed, '*', $exp.env, '*' ]
-        | path join
-        | into glob
-    let experiment_files = try {
-        ls $experiment_path
-    } catch {
-        error throw {
-            err: "invalid experiment",
-            label: $"experiment '($experiment)' does not appear to have data files",
-            span: (metadata $experiment).span,
-        }
-    }
-    let data = $experiment_files
-        | insert strategy { get name | path split | last }
-        | select name strategy
-        | insert diversity {
-            ls $in.name
-                | each { get name | open | lines }
-                | flatten
-                | parse "{x}, {y}"
-                | into float y
-                | group-by x --to-table
-                | update items { get y | math avg }
-                | rename --column { group: "x", items: "y" }
-                | into int x # NOTE: $.x needs to be converted to int here because
-                             # `group-by --to-table` converts the grouping key to
-                             # string
-        }
-        | reject name
-        | group-by strategy --to-table
-        | update items {|it|
-            let d = $it.items.diversity
-            $d | skip 1 | reduce --fold $d.0 {|it, acc| $acc | append $it}
-        }
-        | rename --column { group: "strategy", items: "diversity" }
+]: table<strategy: string, diversity: table<x: int, y: float>> -> nothing {
+    let data = $in
     let l = $data.diversity.0 | length
 
     $data
-- 
GitLab


From dea4d22634cc1aecc92821241f17b81e9eb05847 Mon Sep 17 00:00:00 2001
From: "a.stevan" <antoine.stevan@isae-supaero.fr>
Date: Tue, 28 May 2024 15:42:25 +0200
Subject: [PATCH 3/3] update the commands in the README

---
 bins/inbreeding/README.md | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/bins/inbreeding/README.md b/bins/inbreeding/README.md
index 08111b35..4519a70c 100644
--- a/bins/inbreeding/README.md
+++ b/bins/inbreeding/README.md
@@ -34,5 +34,8 @@ inbreeding build
 ```
 ```bash
 inbreeding run --options $OPTS --prng-seed $PRNG_SEED
-inbreeding plot ... --options { k: $OPTS.K }
+```
+```bash
+let experiment = $"($PRNG_SEED)-($OPTS.environment)"
+inbreeding load $experiment | inbreeding plot --options { k: $OPTS.k }
 ```
-- 
GitLab