import os
import pandas as pd
import pm4py
from typing import Union
from langgraph.graph.state import CompiledStateGraph
from .analyze import get_mean_act_times
from .experiment import ExperimentPaths
def _validate_directory(directory_path: str) -> None:
"""
Validate that the specified directory exists.
:param directory_path: Path to the directory
:type directory_path: str
:raises FileNotFoundError: If the directory does not exist
"""
if not os.path.exists(directory_path):
raise FileNotFoundError(f"Directory does not exist: {directory_path}")
[docs]
def generate_mermaid(graph: CompiledStateGraph, output_dir: Union[ExperimentPaths, str]) -> None:
"""
Generate and save a mermaid graph visualization.
:param graph: Compiled state graph
:type graph: CompiledStateGraph
:param output_dir: ExperimentPaths instance or directory path where visualization will be saved
:type output_dir: Union[ExperimentPaths, str]
:raises FileNotFoundError: If the output directory does not exist
**Examples:**
>>> # Using ExperimentPaths:
>>> exp = create_experiment("my_experiment")
>>> generate_mermaid(graph, exp)
Mermaid saved as: experiments/my_experiment/img/mermaid.png
>>> # Using direct path:
>>> generate_mermaid(graph, "output/visualizations") # Directory must exist
Mermaid saved as: output/visualizations/mermaid.png
"""
if isinstance(output_dir, ExperimentPaths):
img_dir = output_dir.img_dir
else:
img_dir = output_dir
_validate_directory(img_dir)
# Create the full file path
output_path = os.path.join(img_dir, 'mermaid.png')
with open(output_path, 'wb') as file:
file.write(graph.get_graph().draw_mermaid_png())
print("Mermaid saved as:", output_path)
[docs]
def generate_prefix_tree(event_log: pd.DataFrame, output_dir: Union[ExperimentPaths, str]) -> None:
"""
Generate and save a prefix tree visualization.
:param event_log: Event log data
:type event_log: pd.DataFrame
:param output_dir: ExperimentPaths instance or directory path where visualization will be saved
:type output_dir: Union[ExperimentPaths, str]
:raises FileNotFoundError: If the output directory does not exist
**Examples:**
>>> # Using ExperimentPaths:
>>> exp = create_experiment("my_experiment")
>>> generate_prefix_tree(event_log, exp)
Prefix Tree saved as: experiments/my_experiment/img/prefix_tree.png
>>> # Using direct path:
>>> generate_prefix_tree(event_log, "output/visualizations") # Directory must exist
Prefix Tree saved as: output/visualizations/prefix_tree.png
"""
if isinstance(output_dir, ExperimentPaths):
img_dir = output_dir.img_dir
else:
img_dir = output_dir
_validate_directory(img_dir)
output_path = os.path.join(img_dir, 'prefix_tree.png')
# Generate prefix tree
prefix_tree = pm4py.discover_prefix_tree(
event_log, activity_key='concept:name', case_id_key='case:concept:name', timestamp_key='time:timestamp'
)
# Save prefix tree visualization
pm4py.save_vis_prefix_tree(prefix_tree, output_path)
print("Prefix Tree saved as:", output_path)
[docs]
def generate_visualizations(event_log: pd.DataFrame, graph: CompiledStateGraph,
output_dir: Union[ExperimentPaths, str]) -> None:
"""
Generate and save all process visualizations.
:param event_log: Event log data
:type event_log: pd.DataFrame
:param graph: Compiled state graph
:type graph: CompiledStateGraph
:param output_dir: ExperimentPaths instance or directory path where visualizations will be saved
:type output_dir: Union[ExperimentPaths, str]
:raises FileNotFoundError: If the output directory does not exist
**Examples:**
>>> # Using ExperimentPaths:
>>> exp = create_experiment("my_experiment")
>>> generate_visualizations(event_log, graph, exp)
Generating all visualizations...
Mermaid saved as: experiments/my_experiment/img/mermaid.png
Prefix Tree saved as: experiments/my_experiment/img/prefix_tree.png
Performance DFG saved as: experiments/my_experiment/img/dfg_performance.png
All visualizations generated successfully!
>>> # Using direct path:
>>> generate_visualizations(event_log, graph, "output/visualizations") # Directory must exist
Generating all visualizations...
Mermaid saved as: output/visualizations/mermaid.png
Prefix Tree saved as: output/visualizations/prefix_tree.png
Performance DFG saved as: output/visualizations/dfg_performance.png
All visualizations generated successfully!
"""
print("Generating all visualizations...")
generate_mermaid(graph, output_dir)
generate_prefix_tree(event_log, output_dir)
generate_performance_dfg(event_log, output_dir)
print("All visualizations generated successfully!")