From dfe87e9b31da8d3c78132728a49445a1cf19c09c Mon Sep 17 00:00:00 2001 From: pajjilykk Date: Sat, 25 Apr 2026 06:53:53 +0700 Subject: [PATCH] init gannt in 1 --- 1/Makefile | 39 ++++++++-- 1/export.py | 203 ------------------------------------------------- 1/exporter.py | 97 +++++++++++++++++++++++ 1/gantt.png | Bin 0 -> 43843 bytes 1/lab1 | Bin 30024 -> 29784 bytes 1/log.txt | 66 ++++++++-------- 1/main.cpp | 78 ++++++++----------- 1/processes.md | 17 +++++ 8 files changed, 208 insertions(+), 292 deletions(-) delete mode 100644 1/export.py create mode 100644 1/exporter.py create mode 100644 1/gantt.png create mode 100644 1/processes.md diff --git a/1/Makefile b/1/Makefile index 9115dc1..18172e3 100644 --- a/1/Makefile +++ b/1/Makefile @@ -7,29 +7,56 @@ LDFLAGS := -lrt TARGET := lab1 SRC := main.cpp + LOG_FILE := log.txt -XLSX_FILE:= process_log.xlsx -.PHONY: all run log excel export report deps clean rebuild +MD_FILE := processes.md +IMG_FILE := gantt.png +PY_EXPORT := exporter.py + +.PHONY: all run log export report deps clean rebuild + +# ------------------------- +# BUILD +# ------------------------- all: $(TARGET) $(TARGET): $(SRC) $(CXX) $(CXXFLAGS) $(SRC) -o $(TARGET) $(LDFLAGS) +# ------------------------- +# RUN ONLY +# ------------------------- run: $(TARGET) ./$(TARGET) +# ------------------------- +# LOG ONLY (C++ output) +# ------------------------- log: $(TARGET) ./$(TARGET) > $(LOG_FILE) -excel: log - $(PYTHON) export.py --input $(LOG_FILE) --output $(XLSX_FILE) +# ------------------------- +# EXPORT (C++ + Python pipeline) +# ------------------------- +export: $(TARGET) + ./$(TARGET) > $(LOG_FILE) + $(PYTHON) $(PY_EXPORT) $(LOG_FILE) +# ------------------------- +# DEPENDENCIES +# ------------------------- deps: - $(PIP) install -r req.txt + $(PIP) install matplotlib +# ------------------------- +# CLEAN +# ------------------------- clean: - rm -f $(TARGET) $(XLSX_FILE) + rm -f $(TARGET) $(LOG_FILE) $(MD_FILE) $(IMG_FILE) +# ------------------------- +# REBUILD +# ------------------------- rebuild: clean all diff --git a/1/export.py b/1/export.py deleted file mode 100644 index 5e7cb4a..0000000 --- a/1/export.py +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import re -import sys -from dataclasses import dataclass -from decimal import Decimal -from typing import Dict, Iterable, List, Tuple - -from openpyxl import Workbook -from openpyxl.chart import BarChart, Reference -from openpyxl.styles import Font - - -LINE_RE = re.compile( - r"^(START|END)\s+PID=(\d+)\s+PPID=(\d+)\s+depth=(\d+)\s+range=\[(\d+),(\d+)\]\s+time=([0-9.]+)$" -) - - -@dataclass -class ProcessLog: - pid: int - ppid: int - start: Decimal - start_text: str - finish: Decimal | None = None - finish_text: str | None = None - first_seen_order: int = 0 - - -def parse_args() -> argparse.Namespace: - parser = argparse.ArgumentParser( - description="Convert process START/END log to a ptree-like Excel report." - ) - parser.add_argument( - "-i", - "--input", - default="-", - help="Input log file path (default: stdin)", - ) - parser.add_argument( - "-o", - "--output", - default="process_log.xlsx", - help="Output Excel file path (default: process_log.xlsx)", - ) - return parser.parse_args() - - -def read_lines(input_path: str) -> Iterable[str]: - if input_path == "-": - for line in sys.stdin: - yield line.rstrip("\n") - return - - with open(input_path, "r", encoding="utf-8") as f: - for line in f: - yield line.rstrip("\n") - - -def parse_processes(lines: Iterable[str]) -> Dict[int, ProcessLog]: - processes: Dict[int, ProcessLog] = {} - order = 0 - - for raw in lines: - m = LINE_RE.match(raw.strip()) - if not m: - continue - - event, pid_s, ppid_s, _depth_s, _l_s, _r_s, ts_s = m.groups() - pid = int(pid_s) - ppid = int(ppid_s) - ts = Decimal(ts_s) - - if event == "START": - processes[pid] = ProcessLog( - pid=pid, - ppid=ppid, - start=ts, - start_text=ts_s, - finish=None, - finish_text=None, - first_seen_order=order, - ) - order += 1 - else: - if pid in processes: - processes[pid].finish = ts - processes[pid].finish_text = ts_s - - return processes - - -def tree_rows(processes: Dict[int, ProcessLog]) -> List[Tuple[int, ProcessLog]]: - complete = {pid: p for pid, p in processes.items() if p.finish is not None} - - children: Dict[int, List[int]] = {} - for pid in complete: - children[pid] = [] - for pid, node in complete.items(): - if node.ppid in complete: - children[node.ppid].append(pid) - - for pid in children: - children[pid].sort(key=lambda cpid: complete[cpid].start) - - roots = [pid for pid, node in complete.items() if node.ppid not in complete] - roots.sort(key=lambda pid: complete[pid].start) - - ordered: List[Tuple[int, ProcessLog]] = [] - - def dfs(pid: int, depth: int) -> None: - ordered.append((depth, complete[pid])) - for ch in children[pid]: - dfs(ch, depth + 1) - - for root_pid in roots: - dfs(root_pid, 0) - - remaining = [pid for pid in complete if pid not in {p.pid for _, p in ordered}] - remaining.sort(key=lambda pid: complete[pid].start) - for pid in remaining: - dfs(pid, 0) - - return ordered - - -def fmt6(value: Decimal) -> str: - return f"{value.quantize(Decimal('0.000001'))}" - - -def export_excel(rows: List[Tuple[int, ProcessLog]], output_path: str) -> None: - wb = Workbook() - ws = wb.active - ws.title = "process_logs" - - ws.append(["PPID", "PID", "START", "TIME_FROM_START", "FINISH", "DURATION"]) - for cell in ws[1]: - cell.font = Font(bold=True) - - base_start = min((node.start for _, node in rows), default=Decimal("0")) - - for depth, node in rows: - if node.finish is None: - continue - if node.finish_text is None: - continue - - time_from_start = node.start - base_start - duration = node.finish - node.start - pid_display = f"{' ' * depth}{node.pid}" - ws.append( - [ - node.ppid, - pid_display, - node.start_text, - fmt6(time_from_start), - node.finish_text, - fmt6(duration), - ] - ) - - ws.column_dimensions["A"].width = 12 - ws.column_dimensions["B"].width = 20 - ws.column_dimensions["C"].width = 18 - ws.column_dimensions["D"].width = 18 - ws.column_dimensions["E"].width = 18 - ws.column_dimensions["F"].width = 14 - ws.freeze_panes = "A2" - - last_row = ws.max_row - if last_row >= 2: - chart = BarChart() - chart.type = "bar" - chart.grouping = "stacked" - chart.overlap = 100 - chart.gapWidth = 150 - chart.legend.position = "b" - chart.width = 15 - chart.height = 7.5 - chart.x_axis.scaling.orientation = "maxMin" - - data = Reference(ws, min_col=4, max_col=4, min_row=2, max_row=last_row) - duration = Reference(ws, min_col=6, max_col=6, min_row=2, max_row=last_row) - chart.add_data(data, titles_from_data=False) - chart.add_data(duration, titles_from_data=False) - chart.series[0].graphicalProperties.noFill = True - - ws.add_chart(chart, "D21") - - wb.save(output_path) - - -def main() -> int: - args = parse_args() - processes = parse_processes(read_lines(args.input)) - rows = tree_rows(processes) - export_excel(rows, args.output) - print(f"Saved to {args.output}") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/1/exporter.py b/1/exporter.py new file mode 100644 index 0000000..ad7df1c --- /dev/null +++ b/1/exporter.py @@ -0,0 +1,97 @@ +import re +import sys + +import matplotlib.pyplot as plt + +LOG_RE = re.compile( + r"(PROC_START|PROC_END)\s+pid=(\d+)\s+ppid=(\d+)\s+depth=(\d+)\s+l=(\d+)\s+r=(\d+)\s+ts=([\d.]+)" +) + + +class Proc: + def __init__(self, pid, ppid): + self.pid = pid + self.ppid = ppid + self.start = None + self.end = None + self.children = [] + + @property + def duration(self): + return self.end - self.start + + +def parse_log(path): + procs = {} + for line in open(path): + m = LOG_RE.search(line) + if not m: + continue + typ, pid, ppid, depth, l, r, ts = m.groups() + pid, ppid, ts = int(pid), int(ppid), float(ts) + if pid not in procs: + procs[pid] = Proc(pid, ppid) + if typ == "PROC_START": + procs[pid].start = ts + else: + procs[pid].end = ts + return procs + + +def build_tree(procs): + root = None + for p in procs.values(): + if p.ppid in procs: + procs[p.ppid].children.append(p) + else: + root = p + return root + + +def dfs_order(root): + order = [] + + def dfs(p): + order.append(p) + for c in sorted(p.children, key=lambda x: x.start): + dfs(c) + + dfs(root) + return order + + +def write_md(procs, ordered): + first = min(p.start for p in procs.values()) + with open("processes.md", "w") as f: + f.write("| PID | PPID | Start | End | Offset | Duration |\n") + f.write("|---|---|---|---|---|---|\n") + for p in ordered: + f.write( + f"| {p.pid} | {p.ppid} | {p.start:.6f} | {p.end:.6f} | {p.start - first:.6f} | {p.duration:.6f} |\n" + ) + + +def draw_gantt(ordered): + first = min(p.start for p in ordered) + fig, ax = plt.subplots(figsize=(12, 6)) + for i, p in enumerate(ordered): + ax.barh(i, p.duration, left=p.start - first, height=0.6) + ax.text(p.start - first, i, f" PID {p.pid}", va="center") + ax.set_yticks(range(len(ordered))) + ax.set_yticklabels([p.pid for p in ordered]) + ax.set_xlabel("Seconds from first process start") + ax.set_title("Process Gantt") + plt.tight_layout() + plt.savefig("gantt.png") + + +def main(): + procs = parse_log(sys.argv[1]) + root = build_tree(procs) + ordered = dfs_order(root) + write_md(procs, ordered) + draw_gantt(ordered) + + +if __name__ == "__main__": + main() diff --git a/1/gantt.png b/1/gantt.png new file mode 100644 index 0000000000000000000000000000000000000000..e41b0c150b2bb3f5f571d5651320083f9e3712ad GIT binary patch literal 43843 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

xQsdTXDAcw(>QEhp}kcir- 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 literal 0 HcmV?d00001 diff --git a/1/lab1 b/1/lab1 index 3d2a863342d74b4b4b7756a6a9f438949a8e29e8..4b75181394ff8107f3509a28421d5684aaa54a6f 100755 GIT binary patch delta 6977 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 stE_9~B;?CiPKw<+L$lJ%x2-IWEzy@5=Vw