Skip to content

plot

ipw.cli.plot

Plot profiling results.

plot(results_dir, visualization_id, output_dir, options)

Generate visualizations from profiling results.

Source code in intelligence-per-watt/src/ipw/cli/plot.py
@click.command(help="Generate plots from profiling results.")
@click.argument("results_dir", type=click.Path(exists=True, path_type=Path))
@click.option(
    "--visualization",
    "-v",
    "visualization_id",
    type=str,
    default="regression",
    help="Visualization provider to use (default: regression).",
)
@click.option(
    "--output",
    "-o",
    "output_dir",
    type=click.Path(path_type=Path),
    help="Directory to save plots (default: <results_dir>/plots).",
)
@click.option(
    "--option",
    "options",
    multiple=True,
    callback=_collect_options,
    help="Visualization-specific options (e.g., --option model=llama3.2:1b).",
)
def plot(
    results_dir: Path,
    visualization_id: str,
    output_dir: Path | None,
    options: Dict[str, Any],
) -> None:
    """Generate visualizations from profiling results."""

    import ipw.visualization

    ipw.visualization.ensure_registered()
    # Get visualization provider
    try:
        provider_cls = VisualizationRegistry.get(visualization_id)
    except KeyError:
        available = [key for key, _ in VisualizationRegistry.items()]
        error(f"Visualization '{visualization_id}' not found.")
        if available:
            info(f"Available visualizations: {', '.join(available)}")
        raise click.Abort()

    # Determine output directory
    if output_dir is None:
        output_dir = results_dir / "plots"

    # Create context and run visualization
    context = VisualizationContext(
        results_dir=results_dir,
        output_dir=output_dir,
        options=options,
    )

    provider = provider_cls()
    result = provider.render(context)

    # Display results
    info(f"Visualization: {result.visualization}")

    if result.artifacts:
        info("\nGenerated artifacts:")
        for name, path in result.artifacts.items():
            info(f"  {name}: {path}")
    else:
        warning("No artifacts generated")

    if result.warnings:
        info("\nWarnings:")
        for warn in result.warnings:
            warning(f"  {warn}")

    if result.metadata:
        info("\nMetadata:")
        for key, value in result.metadata.items():
            info(f"  {key}: {value}")