pmat 3.15.0

PMAT - Zero-config AI context generation and code quality toolkit (CLI, MCP, HTTP)
#![allow(unused)]
#![cfg_attr(coverage_nightly, coverage(off))]
//! Deterministic Mermaid Generation Engine
//!
//! This module implements PageRank-based layout and deterministic Mermaid
//! diagram generation as specified in deterministic-graphs-mmd-spec.md
//!
//! Uses a local SimpleStableGraph implementation (no petgraph dependency)

use crate::models::dag::EdgeType;
use crate::services::unified_ast_engine::{ModuleNode, ProjectMetrics};
use std::collections::BTreeMap;
use std::fmt::Write;

// ============================================================================
// Local SimpleStableGraph implementation (replaces petgraph::StableGraph)
// ============================================================================

/// Node index for the stable graph
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NodeIndex(usize);

/// Edge representation
struct Edge<E> {
    source: NodeIndex,
    target: NodeIndex,
    weight: E,
}

/// Edge reference for iteration
struct EdgeRef<'a, E> {
    source: NodeIndex,
    target: NodeIndex,
    weight: &'a E,
}

impl<'a, E> EdgeRef<'a, E> {
    fn source(&self) -> NodeIndex {
        self.source
    }

    fn target(&self) -> NodeIndex {
        self.target
    }

    fn weight(&self) -> &E {
        self.weight
    }
}

/// A simple stable graph implementation
/// Nodes maintain their indices even when other nodes are removed
pub struct SimpleStableGraph<N, E> {
    nodes: Vec<Option<N>>,
    edges: Vec<Edge<E>>,
}

impl<N: Clone, E: Clone> Default for SimpleStableGraph<N, E> {
    fn default() -> Self {
        Self::new()
    }
}

impl<N, E> std::ops::Index<NodeIndex> for SimpleStableGraph<N, E> {
    type Output = N;

    fn index(&self, idx: NodeIndex) -> &Self::Output {
        self.nodes[idx.0]
            .as_ref()
            .expect("node exists at index (stable graph invariant)")
    }
}

// ============================================================================
// Public API
// ============================================================================

/// Deterministic Mermaid engine with PageRank-based layout
pub struct DeterministicMermaidEngine {
    /// Number of `PageRank` iterations for stable results
    pagerank_iterations: usize,
    /// Quantization factor to avoid floating-point drift
    quantization_factor: u32,
}

impl Default for DeterministicMermaidEngine {
    fn default() -> Self {
        Self::new()
    }
}

impl DeterministicMermaidEngine {
    #[must_use]
    #[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
    /// Create a new instance.
    pub fn new() -> Self {
        Self {
            pagerank_iterations: 100,
            quantization_factor: 10000,
        }
    }
}

/// Complexity buckets for styling
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum ComplexityBucket {
    Low,
    Medium,
    High,
}

// ============================================================================
// Implementation split across include files
// ============================================================================

include!("deterministic_mermaid_engine_graph.rs");
include!("deterministic_mermaid_engine_rendering.rs");
include!("deterministic_mermaid_engine_algorithms.rs");
include!("deterministic_mermaid_engine_utils.rs");
include!("deterministic_mermaid_engine_tests.rs");