diff options
| author | J08nY | 2024-04-08 14:24:16 +0200 |
|---|---|---|
| committer | J08nY | 2024-04-08 14:24:16 +0200 |
| commit | 372631bcd588c66b47746e138f8d4d08d9d71e29 (patch) | |
| tree | 39a0ecd8cdfe206992ffd557d29d34c146fbe7b7 /pyecsca | |
| parent | b6cedf2e68204a6b9e7988da10bb8cd81678b171 (diff) | |
| download | pyecsca-372631bcd588c66b47746e138f8d4d08d9d71e29.tar.gz pyecsca-372631bcd588c66b47746e138f8d4d08d9d71e29.tar.zst pyecsca-372631bcd588c66b47746e138f8d4d08d9d71e29.zip | |
Improve tree building with more quantities.
Diffstat (limited to 'pyecsca')
| -rw-r--r-- | pyecsca/misc/utils.py | 14 | ||||
| -rw-r--r-- | pyecsca/sca/re/tree.py | 9 |
2 files changed, 20 insertions, 3 deletions
diff --git a/pyecsca/misc/utils.py b/pyecsca/misc/utils.py index 8e313a3..e525fe0 100644 --- a/pyecsca/misc/utils.py +++ b/pyecsca/misc/utils.py @@ -1,9 +1,10 @@ """Just some utilities I promise.""" import sys from ast import parse +from contextlib import contextmanager from typing import List, Any, Generator -from ..misc.cfg import getconfig +from ..misc.cfg import getconfig, TemporaryConfig from concurrent.futures import ProcessPoolExecutor, as_completed, Future @@ -42,8 +43,17 @@ def warn(*args, **kwargs): print(*args, **kwargs, file=sys.stderr) +@contextmanager +def silent(): + """Temporarily disable output.""" + with TemporaryConfig() as cfg: + cfg.log.enabled = False + yield + + class TaskExecutor(ProcessPoolExecutor): """A simple ProcessPoolExecutor that keeps tracks of tasks that were submitted to it.""" + keys: List[Any] futures: List[Future] @@ -67,4 +77,4 @@ class TaskExecutor(ProcessPoolExecutor): i = self.futures.index(future) yield self.keys[i], future self.futures = [] - self.keys = []
\ No newline at end of file + self.keys = [] diff --git a/pyecsca/sca/re/tree.py b/pyecsca/sca/re/tree.py index 4e9cf3e..a274d09 100644 --- a/pyecsca/sca/re/tree.py +++ b/pyecsca/sca/re/tree.py @@ -282,19 +282,26 @@ class Tree: return RenderTree(self.root, style=style).by_attr(_str) + def render_basic(self) -> str: + """Render the tree in a basic form, with number of configs as nodes.""" + return RenderTree(self.root).by_attr(lambda node: str(len(node.cfgs))) + def describe(self) -> str: """Describe some important properties of the tree.""" leaf_sizes = [len(leaf.cfgs) for leaf in self.leaves] + leaf_depths = [leaf.depth for leaf in self.leaves] leafs: List[int] = sum(([size] * size for size in leaf_sizes), []) return "\n".join( ( f"Dmaps: {len(self.maps)}", f"Total cfgs: {len(self.root.cfgs)}", - f"Depth: {self.height}", + f"Height: {self.height}", f"Size: {self.size}", f"Leaves: {len(leaf_sizes)}", + f"Precise: {self.precise}", f"Leaf sizes: {sorted(leaf_sizes)}", f"Average leaf size: {np.mean(leaf_sizes):.3f}", + f"Mean result depth: {np.mean(leaf_depths):.3f}", f"Mean result size: {np.mean(leafs):.3f}", ) ) |
