aboutsummaryrefslogtreecommitdiffhomepage
path: root/pyecsca
diff options
context:
space:
mode:
authorJ08nY2024-04-08 14:24:16 +0200
committerJ08nY2024-04-08 14:24:16 +0200
commit372631bcd588c66b47746e138f8d4d08d9d71e29 (patch)
tree39a0ecd8cdfe206992ffd557d29d34c146fbe7b7 /pyecsca
parentb6cedf2e68204a6b9e7988da10bb8cd81678b171 (diff)
downloadpyecsca-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.py14
-rw-r--r--pyecsca/sca/re/tree.py9
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}",
)
)