# ASCII Graph Visualization Guide Terminal-based graph visualization for the RuVector Discovery Framework with ANSI colors, domain clustering, coherence heatmaps, and pattern timeline displays. ## Features ### 🎨 Graph Visualization - **ASCII art rendering** with box-drawing characters - **Domain-based coloring** using ANSI escape codes - 🔵 Climate (Blue) - 🟢 Finance (Green) - 🟡 Research (Yellow) - 🟣 Cross-domain (Magenta) - **Cluster structure** showing node groupings by domain - **Cross-domain bridges** displayed as connecting lines ### 📊 Domain Matrix - Shows connectivity strength between domains - Diagonal elements show node count per domain - Off-diagonal elements show cross-domain edge counts - Color-coded by domain ### 📈 Coherence Timeline - **ASCII sparkline** chart for temporal coherence values - **Adaptive scaling** based on value range - Duration display (days/hours/minutes) - Time range labels ### 🔍 Pattern Summary - Pattern count by type with visual bars - Statistical significance indicators - Top patterns ranked by confidence - P-values and effect sizes ### 🖥️ Complete Dashboard Combines all visualizations into a single comprehensive view. ## API Reference ### Core Functions #### `render_graph_ascii` ```rust pub fn render_graph_ascii( engine: &OptimizedDiscoveryEngine, width: usize, height: usize ) -> String ``` Renders the graph as ASCII art with colored domain nodes. **Parameters:** - `engine` - The discovery engine containing the graph - `width` - Canvas width in characters (recommended: 80) - `height` - Canvas height in characters (recommended: 20) **Returns:** String containing the ASCII art representation **Example:** ```rust use ruvector_data_framework::visualization::render_graph_ascii; let graph = render_graph_ascii(&engine, 80, 20); println!("{}", graph); ``` --- #### `render_domain_matrix` ```rust pub fn render_domain_matrix( engine: &OptimizedDiscoveryEngine ) -> String ``` Renders a domain connectivity matrix showing connections between domains. **Returns:** Formatted matrix string with domain statistics **Example:** ```rust let matrix = render_domain_matrix(&engine); println!("{}", matrix); ``` --- #### `render_coherence_timeline` ```rust pub fn render_coherence_timeline( history: &[(DateTime, f64)] ) -> String ``` Renders coherence timeline as ASCII sparkline/chart. **Parameters:** - `history` - Time series of (timestamp, coherence_value) pairs **Returns:** ASCII chart with sparkline visualization **Example:** ```rust let timeline = render_coherence_timeline(&coherence_history); println!("{}", timeline); ``` --- #### `render_pattern_summary` ```rust pub fn render_pattern_summary( patterns: &[SignificantPattern] ) -> String ``` Renders a summary of discovered patterns with statistics. **Parameters:** - `patterns` - List of significant patterns to summarize **Returns:** Formatted summary with pattern breakdown **Example:** ```rust let summary = render_pattern_summary(&patterns); println!("{}", summary); ``` --- #### `render_dashboard` ```rust pub fn render_dashboard( engine: &OptimizedDiscoveryEngine, patterns: &[SignificantPattern], coherence_history: &[(DateTime, f64)] ) -> String ``` Renders a complete dashboard combining all visualizations. **Parameters:** - `engine` - Discovery engine with graph data - `patterns` - Discovered patterns - `coherence_history` - Time series of coherence values **Returns:** Complete dashboard string **Example:** ```rust let dashboard = render_dashboard(&engine, &patterns, &coherence_history); println!("{}", dashboard); ``` ## Box-Drawing Characters The module uses Unicode box-drawing characters for structure: | Character | Unicode | Usage | |-----------|---------|-------| | `─` | U+2500 | Horizontal line | | `│` | U+2502 | Vertical line | | `┌` | U+250C | Top-left corner | | `┐` | U+2510 | Top-right corner | | `└` | U+2514 | Bottom-left corner | | `┘` | U+2518 | Bottom-right corner | | `┼` | U+253C | Cross | | `┬` | U+252C | T-down | | `┴` | U+2534 | T-up | | `├` | U+251C | T-right | | `┤` | U+2524 | T-left | ## ANSI Color Codes Domain colors are implemented using ANSI escape sequences: | Domain | Color | Code | |--------|-------|------| | Climate | Blue | `\x1b[34m` | | Finance | Green | `\x1b[32m` | | Research | Yellow | `\x1b[33m` | | Cross-domain | Magenta | `\x1b[35m` | | Reset | Default | `\x1b[0m` | | Bright | Bold | `\x1b[1m` | | Dim | Dimmed | `\x1b[2m` | ## Complete Example ```rust use chrono::{Duration, Utc}; use ruvector_data_framework::optimized::{OptimizedConfig, OptimizedDiscoveryEngine}; use ruvector_data_framework::ruvector_native::{Domain, SemanticVector}; use ruvector_data_framework::visualization::render_dashboard; use std::collections::HashMap; fn main() { // Create engine let config = OptimizedConfig::default(); let mut engine = OptimizedDiscoveryEngine::new(config); // Add vectors let now = Utc::now(); for i in 0..10 { let vector = SemanticVector { id: format!("climate_{}", i), embedding: vec![0.5 + i as f32 * 0.05; 128], domain: Domain::Climate, timestamp: now, metadata: HashMap::new(), }; engine.add_vector(vector); } // Compute coherence over time let mut coherence_history = Vec::new(); let mut all_patterns = Vec::new(); for step in 0..5 { let timestamp = now + Duration::hours(step); let coherence = engine.compute_coherence(); coherence_history.push((timestamp, coherence.mincut_value)); let patterns = engine.detect_patterns_with_significance(); all_patterns.extend(patterns); } // Display dashboard let dashboard = render_dashboard(&engine, &all_patterns, &coherence_history); println!("{}", dashboard); } ``` ## Terminal Compatibility The visualization module uses ANSI escape codes and Unicode box-drawing characters. For best results: ### ✅ Recommended Terminals - **Linux**: GNOME Terminal, Konsole, Alacritty, Kitty - **macOS**: Terminal.app, iTerm2 - **Windows**: Windows Terminal, ConEmu - **Cross-platform**: Alacritty, Kitty ### ⚠️ Limited Support - **Windows CMD**: No ANSI color support (use Windows Terminal instead) - **Old terminals**: May not support Unicode box-drawing ### 🔧 Environment Variables ```bash # Ensure Unicode support export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 # Force color output export FORCE_COLOR=1 ``` ## Performance Considerations ### Memory - Graph rendering: O(width × height) for canvas - Timeline rendering: O(history length) - Pattern summary: O(pattern count) ### Time Complexity - Graph layout: O(nodes + edges) - Timeline chart: O(history samples) - Pattern summary: O(patterns × log(patterns)) for sorting ### Optimization Tips 1. **Limit canvas size** - Use 80×20 for standard terminals 2. **Sample large datasets** - Timeline auto-samples if > 60 points 3. **Filter patterns** - Only display top N patterns for large lists ## Testing Run the visualization tests: ```bash # Run all visualization tests cargo test --lib visualization # Run specific test cargo test --lib test_render_graph_ascii # Run visualization demo cargo run --example visualization_demo ``` ## Integration with Discovery Pipeline ```rust use ruvector_data_framework::{DiscoveryPipeline, PipelineConfig}; use ruvector_data_framework::visualization::render_dashboard; // Create pipeline let config = PipelineConfig::default(); let mut pipeline = DiscoveryPipeline::new(config); // Run discovery let patterns = pipeline.run(data_source).await?; // Build coherence history from engine let coherence_history = pipeline.coherence.signals() .iter() .map(|s| (s.window.start, s.min_cut_value)) .collect(); // Visualize results let dashboard = render_dashboard( &pipeline.discovery_engine, &patterns, &coherence_history ); println!("{}", dashboard); ``` ## Customization ### Custom Color Schemes Modify the color constants in `visualization.rs`: ```rust const COLOR_CLIMATE: &str = "\x1b[34m"; // Change to your preference const COLOR_FINANCE: &str = "\x1b[32m"; const COLOR_RESEARCH: &str = "\x1b[33m"; ``` ### Custom Characters Replace box-drawing characters: ```rust const BOX_H: char = '-'; // Use ASCII alternative const BOX_V: char = '|'; const BOX_TL: char = '+'; ``` ### Layout Customization Modify domain positions in `render_graph_ascii`: ```rust let domain_regions = [ (Domain::Climate, 10, 2), // Top-left (Domain::Finance, mid_x + 10, 2), // Top-right (Domain::Research, 10, mid_y + 2), // Bottom-left ]; ``` ## Troubleshooting ### Colors not displaying ```bash # Check terminal color support echo -e "\x1b[34mBlue\x1b[0m" # Enable color in cargo output cargo run --color=always ``` ### Box characters appear as question marks ```bash # Verify UTF-8 encoding locale # Should show UTF-8 # Set UTF-8 locale export LANG=en_US.UTF-8 ``` ### Layout issues - Ensure terminal width ≥ 80 characters - Use monospace font (recommended: Cascadia Code, Fira Code) - Adjust canvas size parameters ## Future Enhancements Planned features for future versions: - [ ] Interactive terminal UI with cursive/tui-rs - [ ] Real-time streaming updates - [ ] Export to SVG/PNG - [ ] 3D graph visualization (ASCII isometric) - [ ] Animated transitions between states - [ ] Custom color themes - [ ] Responsive layout for different terminal sizes - [ ] Mouse interaction support ## See Also - [Optimized Discovery Engine](../src/optimized.rs) - [Pattern Detection](../src/discovery.rs) - [Coherence Computation](../src/coherence.rs) - [Cross-Domain Discovery Example](../examples/cross_domain_discovery.rs) ## License Part of the RuVector Discovery Framework. See main repository for license information.