From 552f226e76609f3c31766ba114f3d9254c8d947d Mon Sep 17 00:00:00 2001 From: schoeffelbe82781 Date: Thu, 24 Apr 2025 15:50:39 +0200 Subject: [PATCH] Implemented graphvizify --- schoeffelbe/pr05.py | 78 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 schoeffelbe/pr05.py diff --git a/schoeffelbe/pr05.py b/schoeffelbe/pr05.py new file mode 100644 index 0000000..4c8f201 --- /dev/null +++ b/schoeffelbe/pr05.py @@ -0,0 +1,78 @@ +import logging +logger = logging.getLogger(__name__) +# logging.basicConfig(level=logging.DEBUG) + +import time + +def timeMS(func, *args, **kwargs): + startTime = time.perf_counter() + result = func(*args, **kwargs) + endTime = time.perf_counter() + elapsedMS = (endTime - startTime) * 1000 # Convert to milliseconds + print(f"{func.__name__} took {elapsedMS:.2f} ms") + return result + + +from utils.memory_array import MemoryArray +from utils.memory_cell import MemoryCell +from utils.literal import Literal +from utils.constants import MAX_VALUE +from utils.memory_manager import MemoryManager +from utils.memory_range import mrange +from vorlesung.L05_binaere_baeume.bin_tree import BinaryTree +from vorlesung.L05_binaere_baeume.bin_tree_node import BinaryTreeNode + +def analyze_complexity(fn, sizes): + """ + Analysiert die Komplexität einer maximalen Teilfolgenfunktion. + + :param max_sequence_func: Die Funktion, die analysiert wird. + :param sizes: Eine Liste von Eingabegrößen für die Analyse. + """ + for size in sizes: + MemoryManager.purge() # Speicher zurücksetzen + random_array = MemoryArray.create_random_array(size, -100, 100) + fn(random_array, Literal(0), random_array.length().pred()) + MemoryManager.save_stats(size) + + MemoryManager.plot_stats(["cells", "adds", "compares", "reads", "writes"]) + +lineAccumulator = [] + +# its not getting forwarded so we can not work with return. I will try glob vars to append the string +# Signature: def print_node(node, indent=0, line=None): +def clbk_graphvizify(toDecorate : BinaryTreeNode, indent=0, line=None): + global lineAccumulator + + lineAccumulator.append(f"n_{id(toDecorate)} [label={toDecorate.value}]") + + # Create edges for nodes with Child (use l - r) + if toDecorate.left is not None: + lineAccumulator.append(f"n_{id(toDecorate)} -> n_{id(toDecorate.left)}") + + if toDecorate.right is not None: + lineAccumulator.append(f"n_{id(toDecorate)} -> n_{id(toDecorate.right)}") + +def graphvizify() -> str: + # Header + result = "digraph {\n\t" + # Body + result += ('\n\t'.join(str(item) for item in lineAccumulator)) + # Foot + result += "\n}" + return result + + +if __name__ == '__main__': + tree = BinaryTree() + values = [5, 3, 7, 2, 4, 6, 5, 8] + + binTreeData = MemoryArray.create_array_from_file("data/seq0.txt") + for value in binTreeData: + tree.insert(value) + + # for value in values: + # tree.insert(value) + + tree.in_order_traversal(clbk_graphvizify) + print(graphvizify())