From 4206cca1a7011512f84fe8e83c11069de51d6b29 Mon Sep 17 00:00:00 2001
From: Paul Andrey <paul.andrey@inria.fr>
Date: Thu, 30 Mar 2023 15:31:31 +0200
Subject: [PATCH] Improve quickrun metrics parsing.

---
 declearn/quickrun/_config.py | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/declearn/quickrun/_config.py b/declearn/quickrun/_config.py
index c2559da5..fc30685f 100644
--- a/declearn/quickrun/_config.py
+++ b/declearn/quickrun/_config.py
@@ -18,8 +18,9 @@
 """TOML-parsable container for quickrun configurations."""
 
 import dataclasses
-from typing import Dict, List, Optional, Union
+from typing import Any, Dict, List, Optional, Union
 
+from declearn.metrics import MetricInputType, MetricSet
 from declearn.utils import TomlConfig
 
 __all__ = [
@@ -108,5 +109,27 @@ class ExperimentConfig(TomlConfig):
         to be used so as to save round-wise model
     """
 
-    metrics: Optional[List[str]] = None
+    metrics: Optional[MetricSet] = None
     checkpoint: Optional[str] = None
+
+    def parse_metrics(
+        self,
+        inputs: Union[MetricSet, Dict[str, Any], List[MetricInputType], None],
+    ) -> Optional[MetricSet]:
+        """Parser for metrics."""
+        if inputs is None or isinstance(inputs, MetricSet):
+            return None
+        try:
+            # Case of a manual listing of metrics (most expected).
+            if isinstance(inputs, (tuple, list)):
+                return MetricSet.from_specs(inputs)
+            # Case of a MetricSet config dict (unexpected but supported).
+            if isinstance(inputs, dict):
+                return MetricSet.from_config(inputs)
+        except (TypeError, ValueError) as exc:
+            raise TypeError(
+                f"Failed to parse inputs for field 'metrics': {exc}."
+            ) from exc
+        raise TypeError(
+            "Failed to parse inputs for field 'metrics': unproper type."
+        )
-- 
GitLab