summaryrefslogtreecommitdiff
path: root/lib/cli.py
diff options
context:
space:
mode:
authorBirte Kristina Friesel <birte.friesel@uos.de>2024-02-09 09:41:26 +0100
committerBirte Kristina Friesel <birte.friesel@uos.de>2024-02-09 09:41:26 +0100
commitcfc77a403e9487580a966669cc4be0f90d464d62 (patch)
tree7134b0787808094d182ea3223c64a723517ff734 /lib/cli.py
parentc806d27c1d5d2495096be83911d84ea5ed43d0ee (diff)
filter-param: support basic numeric operations and ∈ conditions
Diffstat (limited to 'lib/cli.py')
-rw-r--r--lib/cli.py27
1 files changed, 23 insertions, 4 deletions
diff --git a/lib/cli.py b/lib/cli.py
index fb1e722..4fd292b 100644
--- a/lib/cli.py
+++ b/lib/cli.py
@@ -416,8 +416,8 @@ def boxplot_param(args, model):
title = None
param_is_filtered = dict()
if args.filter_param:
- title = "filter: " + ", ".join(
- map(lambda kv: f"{kv[0]}={kv[1]}", args.filter_param)
+ title = "filter: " + " && ".join(
+ map(lambda kv: f"{kv[0]} {kv[1]} {kv[2]}", args.filter_param)
)
for param_name, _ in args.filter_param:
param_is_filtered[param_name] = True
@@ -595,9 +595,11 @@ def add_standard_arguments(parser):
)
parser.add_argument(
"--filter-param",
- metavar="<parameter name>=<parameter value>[,<parameter name>=<parameter value>...]",
+ metavar="<parameter name><condition>[;<parameter name><condition>...]",
type=str,
- help="Only consider measurements where <parameter name> is <parameter value>. "
+ help="Only consider measurements where <parameter name> satisfies <condition>. "
+ "<condition> may be <operator><parameter value> with operator being < / <= / = / >= / >, "
+ "or ∈<parameter value>[,<parameter value>...]. "
"All other measurements (including those where it is None, that is, has not been set yet) are discarded. "
"Note that this may remove entire function calls from the model.",
)
@@ -668,6 +670,23 @@ def add_standard_arguments(parser):
)
+def parse_filter_string(filter_string):
+ if "<=" in filter_string:
+ p, v = filter_string.split("<=")
+ return (p, "≤", v)
+ if ">=" in filter_string:
+ p, v = filter_string.split(">=")
+ return (p, "≥", v)
+ if "!=" in filter_string:
+ p, v = filter_string.split("!=")
+ return (p, "≠", v)
+ for op in ("<", ">", "≤", "≥", "=", "∈", "≠"):
+ if op in filter_string:
+ p, v = filter_string.split(op)
+ return (p, op, v)
+ raise ValueError(f"Cannot parse '{filter_string}'")
+
+
def parse_shift_function(param_name, param_shift):
if param_shift.startswith("+"):
param_shift_value = float(param_shift[1:])