From c0e15c0760d37975efcefed3fba4f3e2a9eb3be5 Mon Sep 17 00:00:00 2001
From: Maxim Gonchar <maxim.mg.gonchar@gmail.com>
Date: Wed, 26 Apr 2023 13:00:15 +0300
Subject: [PATCH] chore: move ParametersStorage (prev. ParametersWrapper) to a
 module

---
 model_tools/__init__.py           |   0
 model_tools/parameters_storage.py | 111 ++++++++++++++++++++++++++++++
 models/dayabay_v0.py              | 111 +-----------------------------
 models/dayabay_v1.py              | 111 +-----------------------------
 4 files changed, 115 insertions(+), 218 deletions(-)
 create mode 100644 model_tools/__init__.py
 create mode 100644 model_tools/parameters_storage.py

diff --git a/model_tools/__init__.py b/model_tools/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/model_tools/parameters_storage.py b/model_tools/parameters_storage.py
new file mode 100644
index 0000000..28a5e26
--- /dev/null
+++ b/model_tools/parameters_storage.py
@@ -0,0 +1,111 @@
+from multikeydict.nestedmkdict import NestedMKDict
+from multikeydict.visitor import NestedMKDictVisitor
+
+from typing import Union, Tuple, List, Optional
+
+from tabulate import tabulate
+from pandas import DataFrame
+
+import pandas as pd
+pd.set_option('display.max_rows', None)
+pd.set_option('display.max_colwidth', 100)
+
+class ParametersStorage(NestedMKDict):
+    def to_dict(self, **kwargs) -> list:
+        return self.visit(ParametersVisitor(kwargs)).data
+
+    def to_df(self, *, columns: Optional[List[str]]=None, **kwargs) -> DataFrame:
+        dct = self.to_dict(**kwargs)
+        if columns is None:
+            columns = ['path', 'value', 'central', 'sigma', 'label']
+        df = DataFrame(dct, columns=columns)
+        for key in ('central', 'sigma'):
+            if df[key].isna().all():
+                del df[key]
+            else:
+                df[key].fillna('-', inplace=True)
+
+        df['value'].fillna('-', inplace=True)
+        df['label'].fillna('', inplace=True)
+        return df
+
+    def to_string(self, **kwargs) -> str:
+        df = self.to_df()
+        return df.to_string(**kwargs)
+
+    def to_table(self, *, df_kwargs: dict={}, **kwargs) -> str:
+        df = self.to_df(**df_kwargs)
+        kwargs.setdefault('headers', df.columns)
+        ret = tabulate(df, **kwargs)
+
+        return ret
+
+    def to_latex(self, *, return_df: bool=False, **kwargs) -> Union[str, Tuple[str, DataFrame]]:
+        df = self.to_df(label_from='latex', **kwargs)
+        tex = df.to_latex(escape=False)
+
+        if return_df:
+            return tex, df
+
+        return tex
+
+class ParametersVisitor(NestedMKDictVisitor):
+    __slots__ = ('_kwargs', '_data', '_localdata', '_path')
+    _kwargs: dict
+    _data: List[dict]
+    _localdata: List[dict]
+    _paths: List[Tuple[str, ...]]
+    _path: Tuple[str, ...]
+    # _npars: List[int]
+
+    def __init__(self, kwargs: dict):
+        self._kwargs = kwargs
+        # self._npars = []
+
+    @property
+    def data(self):
+        return self._data
+
+    def start(self, dct):
+        self._data = []
+        self._path = ()
+        self._paths = []
+        self._localdata = []
+
+    def enterdict(self, k, v):
+        if self._localdata:
+            self.exitdict(self._path, None)
+        self._path = k
+        self._paths.append(self._path)
+        self._localdata = []
+
+    def visit(self, key, value):
+        try:
+            dct = value.to_dict(**self._kwargs)
+        except AttributeError:
+            return
+
+        subkey = key[len(self._path):]
+        subkeystr = '.'.join(subkey)
+
+        if self._path:
+            dct['path'] = f'.. {subkeystr}'
+        else:
+            dct['path'] = subkeystr
+
+        self._localdata.append(dct)
+
+    def exitdict(self, k, v):
+        if self._localdata:
+            self._data.append({
+                'path': f"group: {'.'.join(self._path)} [{len(self._localdata)}]"
+                })
+            self._data.extend(self._localdata)
+            self._localdata = []
+        if self._paths:
+            del self._paths[-1]
+
+            self._path = self._paths[-1] if self._paths else ()
+
+    def stop(self, dct):
+        pass
diff --git a/models/dayabay_v0.py b/models/dayabay_v0.py
index 84493f1..94097c4 100644
--- a/models/dayabay_v0.py
+++ b/models/dayabay_v0.py
@@ -1,14 +1,5 @@
 from dagflow.bundles.load_parameters import load_parameters
-from multikeydict.nestedmkdict import NestedMKDict
-from multikeydict.visitor import NestedMKDictVisitor
 from pathlib import Path
-from tabulate import tabulate
-
-from typing import Union, Tuple, List, Optional
-import pandas as pd
-from pandas import DataFrame
-pd.set_option('display.max_rows', None)
-pd.set_option('display.max_colwidth', 100)
 
 from dagflow.graph import Graph
 from dagflow.graphviz import savegraph
@@ -16,108 +7,10 @@ from dagflow.lib.Sum import Sum
 
 from gindex import GNIndex
 
-class ParametersVisitor(NestedMKDictVisitor):
-    __slots__ = ('_kwargs', '_data', '_localdata', '_path')
-    _kwargs: dict
-    _data: List[dict]
-    _localdata: List[dict]
-    _paths: List[Tuple[str, ...]]
-    _path: Tuple[str, ...]
-    # _npars: List[int]
-
-    def __init__(self, kwargs: dict):
-        self._kwargs = kwargs
-        # self._npars = []
-
-    @property
-    def data(self):
-        return self._data
-
-    def start(self, dct):
-        self._data = []
-        self._path = ()
-        self._paths = []
-        self._localdata = []
-
-    def enterdict(self, k, v):
-        if self._localdata:
-            self.exitdict(self._path, None)
-        self._path = k
-        self._paths.append(self._path)
-        self._localdata = []
-
-    def visit(self, key, value):
-        try:
-            dct = value.to_dict(**self._kwargs)
-        except AttributeError:
-            return
-
-        subkey = key[len(self._path):]
-        subkeystr = '.'.join(subkey)
-
-        if self._path:
-            dct['path'] = f'.. {subkeystr}'
-        else:
-            dct['path'] = subkeystr
-
-        self._localdata.append(dct)
-
-    def exitdict(self, k, v):
-        if self._localdata:
-            self._data.append({
-                'path': f"group: {'.'.join(self._path)} [{len(self._localdata)}]"
-                })
-            self._data.extend(self._localdata)
-            self._localdata = []
-        if self._paths:
-            del self._paths[-1]
-
-            self._path = self._paths[-1] if self._paths else ()
-
-    def stop(self, dct):
-        pass
-
-class ParametersWrapper(NestedMKDict):
-    def to_dict(self, **kwargs) -> list:
-        return self.visit(ParametersVisitor(kwargs)).data
-
-    def to_df(self, *, columns: Optional[List[str]]=None, **kwargs) -> DataFrame:
-        dct = self.to_dict(**kwargs)
-        if columns is None:
-            columns = ['path', 'value', 'central', 'sigma', 'label']
-        df = DataFrame(dct, columns=columns)
-        for key in ('central', 'sigma'):
-            if df[key].isna().all():
-                del df[key]
-            else:
-                df[key].fillna('-', inplace=True)
-
-        df['value'].fillna('-', inplace=True)
-        df['label'].fillna('', inplace=True)
-        return df
-
-    def to_string(self, **kwargs) -> str:
-        df = self.to_df()
-        return df.to_string(**kwargs)
-
-    def to_table(self, *, df_kwargs: dict={}, **kwargs) -> str:
-        df = self.to_df(**df_kwargs)
-        kwargs.setdefault('headers', df.columns)
-        ret = tabulate(df, **kwargs)
-
-        return ret
-
-    def to_latex(self, *, return_df: bool=False, **kwargs) -> Union[str, Tuple[str, DataFrame]]:
-        df = self.to_df(label_from='latex', **kwargs)
-        tex = df.to_latex(escape=False)
-
-        if return_df:
-            return tex, df
-
-        return tex
+from model_tools.parameters_storage import ParametersStorage
 
 def model_dayabay_v0():
-    storage = ParametersWrapper({}, sep='.')
+    storage = ParametersStorage({}, sep='.')
     datasource = Path('data/dayabay-v0')
 
     index = GNIndex.from_dict({
diff --git a/models/dayabay_v1.py b/models/dayabay_v1.py
index 266db4f..bbe1a97 100644
--- a/models/dayabay_v1.py
+++ b/models/dayabay_v1.py
@@ -1,14 +1,5 @@
 from dagflow.bundles.load_parameters import load_parameters
-from multikeydict.nestedmkdict import NestedMKDict
-from multikeydict.visitor import NestedMKDictVisitor
 from pathlib import Path
-from tabulate import tabulate
-
-from typing import Union, Tuple, List, Optional
-import pandas as pd
-from pandas import DataFrame
-pd.set_option('display.max_rows', None)
-pd.set_option('display.max_colwidth', 100)
 
 from dagflow.graph import Graph
 from dagflow.graphviz import savegraph
@@ -16,108 +7,10 @@ from dagflow.lib.Sum import Sum
 
 from gindex import GNIndex
 
-class ParametersVisitor(NestedMKDictVisitor):
-    __slots__ = ('_kwargs', '_data', '_localdata', '_path')
-    _kwargs: dict
-    _data: List[dict]
-    _localdata: List[dict]
-    _paths: List[Tuple[str, ...]]
-    _path: Tuple[str, ...]
-    # _npars: List[int]
-
-    def __init__(self, kwargs: dict):
-        self._kwargs = kwargs
-        # self._npars = []
-
-    @property
-    def data(self):
-        return self._data
-
-    def start(self, dct):
-        self._data = []
-        self._path = ()
-        self._paths = []
-        self._localdata = []
-
-    def enterdict(self, k, v):
-        if self._localdata:
-            self.exitdict(self._path, None)
-        self._path = k
-        self._paths.append(self._path)
-        self._localdata = []
-
-    def visit(self, key, value):
-        try:
-            dct = value.to_dict(**self._kwargs)
-        except AttributeError:
-            return
-
-        subkey = key[len(self._path):]
-        subkeystr = '.'.join(subkey)
-
-        if self._path:
-            dct['path'] = f'.. {subkeystr}'
-        else:
-            dct['path'] = subkeystr
-
-        self._localdata.append(dct)
-
-    def exitdict(self, k, v):
-        if self._localdata:
-            self._data.append({
-                'path': f"group: {'.'.join(self._path)} [{len(self._localdata)}]"
-                })
-            self._data.extend(self._localdata)
-            self._localdata = []
-        if self._paths:
-            del self._paths[-1]
-
-            self._path = self._paths[-1] if self._paths else ()
-
-    def stop(self, dct):
-        pass
-
-class ParametersWrapper(NestedMKDict):
-    def to_dict(self, **kwargs) -> list:
-        return self.visit(ParametersVisitor(kwargs)).data
-
-    def to_df(self, *, columns: Optional[List[str]]=None, **kwargs) -> DataFrame:
-        dct = self.to_dict(**kwargs)
-        if columns is None:
-            columns = ['path', 'value', 'central', 'sigma', 'label']
-        df = DataFrame(dct, columns=columns)
-        for key in ('central', 'sigma'):
-            if df[key].isna().all():
-                del df[key]
-            else:
-                df[key].fillna('-', inplace=True)
-
-        df['value'].fillna('-', inplace=True)
-        df['label'].fillna('', inplace=True)
-        return df
-
-    def to_string(self, **kwargs) -> str:
-        df = self.to_df()
-        return df.to_string(**kwargs)
-
-    def to_table(self, *, df_kwargs: dict={}, **kwargs) -> str:
-        df = self.to_df(**df_kwargs)
-        kwargs.setdefault('headers', df.columns)
-        ret = tabulate(df, **kwargs)
-
-        return ret
-
-    def to_latex(self, *, return_df: bool=False, **kwargs) -> Union[str, Tuple[str, DataFrame]]:
-        df = self.to_df(label_from='latex', **kwargs)
-        tex = df.to_latex(escape=False)
-
-        if return_df:
-            return tex, df
-
-        return tex
+from model_tools.parameters_storage import ParametersStorage
 
 def model_dayabay_v1():
-    storage = ParametersWrapper({}, sep='.')
+    storage = ParametersStorage({}, sep='.')
     datasource = Path('data/dayabay-v1')
 
     index = GNIndex.from_dict({
-- 
GitLab