[libcamera-devel,v3,03/12] utils: tuning: libtuning: Implement extensible components of libtuning
diff mbox series

Message ID 20221110173154.488445-4-paul.elder@ideasonboard.com
State Accepted
Headers show
Series
  • utils: tuning: Add a new tuning infrastructure
Related show

Commit Message

Paul Elder Nov. 10, 2022, 5:31 p.m. UTC
Implement the extensible components of libtuning. This includes:
- Parsers, for supporting different types of input config file formats
- Generators, for supporting different types of output tuning file
  formats
- Modules, for supporting different tuning modules for different
  algorithms and platforms

No parsers, generators, or modules are actually implemented. Only the
base classes are implemented.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>

---
Changes in v3:
- Newly split from the first patch "utils: tuning: libtuning: Implement
  the core of libtuning"
  - See changelog from that patch
---
 utils/tuning/libtuning/generators/__init__.py |  0
 .../tuning/libtuning/generators/generator.py  | 15 +++++++++
 utils/tuning/libtuning/modules/__init__.py    |  0
 utils/tuning/libtuning/modules/module.py      | 33 +++++++++++++++++++
 utils/tuning/libtuning/parsers/__init__.py    |  0
 utils/tuning/libtuning/parsers/parser.py      | 21 ++++++++++++
 6 files changed, 69 insertions(+)
 create mode 100644 utils/tuning/libtuning/generators/__init__.py
 create mode 100644 utils/tuning/libtuning/generators/generator.py
 create mode 100644 utils/tuning/libtuning/modules/__init__.py
 create mode 100644 utils/tuning/libtuning/modules/module.py
 create mode 100644 utils/tuning/libtuning/parsers/__init__.py
 create mode 100644 utils/tuning/libtuning/parsers/parser.py

Comments

Laurent Pinchart Nov. 23, 2022, 1:38 a.m. UTC | #1
Hi Paul,

Thank you for the patch.

On Fri, Nov 11, 2022 at 02:31:45AM +0900, Paul Elder via libcamera-devel wrote:
> Implement the extensible components of libtuning. This includes:
> - Parsers, for supporting different types of input config file formats
> - Generators, for supporting different types of output tuning file
>   formats
> - Modules, for supporting different tuning modules for different
>   algorithms and platforms
> 
> No parsers, generators, or modules are actually implemented. Only the
> base classes are implemented.
> 
> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
> 
> ---
> Changes in v3:
> - Newly split from the first patch "utils: tuning: libtuning: Implement
>   the core of libtuning"
>   - See changelog from that patch
> ---
>  utils/tuning/libtuning/generators/__init__.py |  0
>  .../tuning/libtuning/generators/generator.py  | 15 +++++++++
>  utils/tuning/libtuning/modules/__init__.py    |  0
>  utils/tuning/libtuning/modules/module.py      | 33 +++++++++++++++++++
>  utils/tuning/libtuning/parsers/__init__.py    |  0
>  utils/tuning/libtuning/parsers/parser.py      | 21 ++++++++++++
>  6 files changed, 69 insertions(+)
>  create mode 100644 utils/tuning/libtuning/generators/__init__.py
>  create mode 100644 utils/tuning/libtuning/generators/generator.py
>  create mode 100644 utils/tuning/libtuning/modules/__init__.py
>  create mode 100644 utils/tuning/libtuning/modules/module.py
>  create mode 100644 utils/tuning/libtuning/parsers/__init__.py
>  create mode 100644 utils/tuning/libtuning/parsers/parser.py
> 
> diff --git a/utils/tuning/libtuning/generators/__init__.py b/utils/tuning/libtuning/generators/__init__.py
> new file mode 100644
> index 00000000..e69de29b

Even empty files should have a license, otherwise the reuse tool will
complain.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> diff --git a/utils/tuning/libtuning/generators/generator.py b/utils/tuning/libtuning/generators/generator.py
> new file mode 100644
> index 00000000..7c8c9b99
> --- /dev/null
> +++ b/utils/tuning/libtuning/generators/generator.py
> @@ -0,0 +1,15 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +#
> +# Copyright (C) 2022, Paul Elder <paul.elder@ideasonboard.com>
> +#
> +# generator.py - Base class for a generator to convert dict to tuning file
> +
> +from pathlib import Path
> +
> +
> +class Generator(object):
> +    def __init__(self):
> +        pass
> +
> +    def write(self, output_path: Path, output_dict: dict, output_order: list):
> +        raise NotImplementedError
> diff --git a/utils/tuning/libtuning/modules/__init__.py b/utils/tuning/libtuning/modules/__init__.py
> new file mode 100644
> index 00000000..e69de29b
> diff --git a/utils/tuning/libtuning/modules/module.py b/utils/tuning/libtuning/modules/module.py
> new file mode 100644
> index 00000000..cb213154
> --- /dev/null
> +++ b/utils/tuning/libtuning/modules/module.py
> @@ -0,0 +1,33 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +#
> +# Copyright (C) 2022, Paul Elder <paul.elder@ideasonboard.com>
> +#
> +# module.py - Base class for algorithm-specific tuning modules
> +
> +
> +# @var type Type of the module. Defined in the base module.
> +# @var out_name The key that will be used for the algorithm in the algorithms
> +#               dictionary in the tuning output file
> +# @var hr_name Human-readable module name, mostly for debugging
> +class Module(object):
> +    type = 'base'
> +    hr_name = 'Base Module'
> +    out_name = 'GenericAlgorithm'
> +
> +    def __init__(self):
> +        pass
> +
> +    def validate_config(self, config: dict) -> bool:
> +        raise NotImplementedError
> +
> +    # @brief Do the module's processing
> +    # @param args argparse arguments
> +    # @param config Full configuration from the input configuration file
> +    # @param images List of images to process
> +    # @param outputs The outputs of all modules that were executed before this
> +    #                module. Note that this is an input parameter, and the
> +    #                output of this module should be returned directly
> +    # @return Result of the module's processing. It may be empty. None
> +    #         indicates failure and that the result should not be used.
> +    def process(self, args, config: dict, images: list, outputs: dict) -> dict:
> +        raise NotImplementedError
> diff --git a/utils/tuning/libtuning/parsers/__init__.py b/utils/tuning/libtuning/parsers/__init__.py
> new file mode 100644
> index 00000000..e69de29b
> diff --git a/utils/tuning/libtuning/parsers/parser.py b/utils/tuning/libtuning/parsers/parser.py
> new file mode 100644
> index 00000000..a17d8d71
> --- /dev/null
> +++ b/utils/tuning/libtuning/parsers/parser.py
> @@ -0,0 +1,21 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +#
> +# Copyright (C) 2022, Paul Elder <paul.elder@ideasonboard.com>
> +#
> +# parser.py - Base class for a parser for a specific format of config file
> +
> +class Parser(object):
> +    def __init__(self):
> +        pass
> +
> +    # @brief Parse a config file into a config dict
> +    # @details The config dict shall have one key 'general' with a dict value
> +    #          for general configuration options, and all other entries shall
> +    #          have the module as the key with its configuration options (as a
> +    #          dict) as the value. The config dict shall prune entries that are
> +    #          for modules that are not in @a modules.
> +    # @param config (str) Path to config file
> +    # @param modules (list) List of modules
> +    # @return (dict, list) Configuration and list of modules to disable
> +    def parse(self, config_file: str, modules: list) -> (dict, list):
> +        raise NotImplementedError

Patch
diff mbox series

diff --git a/utils/tuning/libtuning/generators/__init__.py b/utils/tuning/libtuning/generators/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/utils/tuning/libtuning/generators/generator.py b/utils/tuning/libtuning/generators/generator.py
new file mode 100644
index 00000000..7c8c9b99
--- /dev/null
+++ b/utils/tuning/libtuning/generators/generator.py
@@ -0,0 +1,15 @@ 
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Copyright (C) 2022, Paul Elder <paul.elder@ideasonboard.com>
+#
+# generator.py - Base class for a generator to convert dict to tuning file
+
+from pathlib import Path
+
+
+class Generator(object):
+    def __init__(self):
+        pass
+
+    def write(self, output_path: Path, output_dict: dict, output_order: list):
+        raise NotImplementedError
diff --git a/utils/tuning/libtuning/modules/__init__.py b/utils/tuning/libtuning/modules/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/utils/tuning/libtuning/modules/module.py b/utils/tuning/libtuning/modules/module.py
new file mode 100644
index 00000000..cb213154
--- /dev/null
+++ b/utils/tuning/libtuning/modules/module.py
@@ -0,0 +1,33 @@ 
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Copyright (C) 2022, Paul Elder <paul.elder@ideasonboard.com>
+#
+# module.py - Base class for algorithm-specific tuning modules
+
+
+# @var type Type of the module. Defined in the base module.
+# @var out_name The key that will be used for the algorithm in the algorithms
+#               dictionary in the tuning output file
+# @var hr_name Human-readable module name, mostly for debugging
+class Module(object):
+    type = 'base'
+    hr_name = 'Base Module'
+    out_name = 'GenericAlgorithm'
+
+    def __init__(self):
+        pass
+
+    def validate_config(self, config: dict) -> bool:
+        raise NotImplementedError
+
+    # @brief Do the module's processing
+    # @param args argparse arguments
+    # @param config Full configuration from the input configuration file
+    # @param images List of images to process
+    # @param outputs The outputs of all modules that were executed before this
+    #                module. Note that this is an input parameter, and the
+    #                output of this module should be returned directly
+    # @return Result of the module's processing. It may be empty. None
+    #         indicates failure and that the result should not be used.
+    def process(self, args, config: dict, images: list, outputs: dict) -> dict:
+        raise NotImplementedError
diff --git a/utils/tuning/libtuning/parsers/__init__.py b/utils/tuning/libtuning/parsers/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/utils/tuning/libtuning/parsers/parser.py b/utils/tuning/libtuning/parsers/parser.py
new file mode 100644
index 00000000..a17d8d71
--- /dev/null
+++ b/utils/tuning/libtuning/parsers/parser.py
@@ -0,0 +1,21 @@ 
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Copyright (C) 2022, Paul Elder <paul.elder@ideasonboard.com>
+#
+# parser.py - Base class for a parser for a specific format of config file
+
+class Parser(object):
+    def __init__(self):
+        pass
+
+    # @brief Parse a config file into a config dict
+    # @details The config dict shall have one key 'general' with a dict value
+    #          for general configuration options, and all other entries shall
+    #          have the module as the key with its configuration options (as a
+    #          dict) as the value. The config dict shall prune entries that are
+    #          for modules that are not in @a modules.
+    # @param config (str) Path to config file
+    # @param modules (list) List of modules
+    # @return (dict, list) Configuration and list of modules to disable
+    def parse(self, config_file: str, modules: list) -> (dict, list):
+        raise NotImplementedError