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