Skip to main content

tenflowers_dataset/visualization/
formatting.rs

1//! Display and formatting implementations for visualization types
2//!
3//! This module contains all the display methods and formatting logic
4//! for visualization data structures.
5
6use super::types::*;
7
8impl SamplePreview {
9    /// Display sample preview as formatted text
10    pub fn display(&self) -> String {
11        let mut output = String::new();
12        output.push_str("Dataset Sample Preview\n");
13        output.push_str(&format!("Total samples: {}\n", self.total_samples));
14        output.push_str(&format!("Samples shown: {}\n", self.samples_shown));
15        output.push_str(&"─".repeat(50));
16        output.push('\n');
17
18        for sample in &self.samples {
19            output.push_str(&format!(
20                "Sample {}: Features{:?}, Labels{:?}\n",
21                sample.index, sample.feature_shape, sample.label_shape
22            ));
23        }
24
25        output
26    }
27}
28
29impl<T: std::fmt::Display> DistributionInfo<T> {
30    /// Display distribution information as formatted text
31    pub fn display(&self) -> String {
32        let mut output = String::new();
33        output.push_str("Dataset Distribution Analysis\n");
34        output.push_str(&format!("Samples analyzed: {}\n", self.samples_analyzed));
35        output.push_str(&"─".repeat(50));
36        output.push('\n');
37
38        output.push_str("Feature Statistics:\n");
39        for stat in &self.feature_stats {
40            output.push_str(&format!(
41                "  Dim {}: mean={:.4}, std={:.4}\n",
42                stat.dimension, stat.mean, stat.std_dev
43            ));
44        }
45
46        output.push_str("\nLabel Statistics:\n");
47        for stat in &self.label_stats {
48            output.push_str(&format!(
49                "  Dim {}: mean={:.4}, std={:.4}\n",
50                stat.dimension, stat.mean, stat.std_dev
51            ));
52        }
53
54        output
55    }
56}
57
58impl ClassDistribution {
59    /// Display class distribution as formatted text
60    pub fn display(&self) -> String {
61        let mut output = String::new();
62        output.push_str("Class Distribution\n");
63        output.push_str(&format!("Total samples: {}\n", self.total_samples));
64        output.push_str(&"─".repeat(50));
65        output.push('\n');
66
67        for (class, count) in &self.class_counts {
68            let percentage = (*count as f64 / self.total_samples as f64) * 100.0;
69            output.push_str(&format!("  {class}: {count} ({percentage:.1}%)\n"));
70        }
71
72        output
73    }
74}
75
76impl<T: std::fmt::Display> FeatureHistogram<T> {
77    /// Display histogram as text-based bar chart
78    pub fn display(&self, max_bar_width: usize) -> String {
79        let mut output = String::new();
80        output.push_str(&format!("Feature {} Histogram\n", self.feature_index));
81        output.push_str(&format!(
82            "Range: {} to {}\n",
83            self.min_value, self.max_value
84        ));
85        output.push_str(&"─".repeat(50));
86        output.push('\n');
87
88        let max_count = *self.bin_counts.iter().max().unwrap_or(&1);
89
90        for (i, &count) in self.bin_counts.iter().enumerate() {
91            let bar_length = (count * max_bar_width).checked_div(max_count).unwrap_or(0);
92
93            let bar = "█".repeat(bar_length);
94            output.push_str(&format!("  Bin {i}: {bar:<max_bar_width$} {count}\n"));
95        }
96
97        output
98    }
99}
100
101impl<T: std::fmt::Display> AugmentationEffects<T> {
102    /// Display augmentation effects analysis as formatted text
103    pub fn display(&self) -> String {
104        let mut output = String::new();
105        output.push_str("Augmentation Effects Analysis\n");
106        output.push_str(&format!("Samples analyzed: {}\n", self.samples_analyzed));
107        output.push_str(&format!(
108            "Transform success rate: {:.1}%\n",
109            self.transform_success_rate * 100.0
110        ));
111        output.push_str(&"─".repeat(50));
112        output.push('\n');
113
114        output.push_str(&self.feature_changes.display());
115        output.push_str(&self.distribution_changes.display());
116
117        output
118    }
119}
120
121impl<T: std::fmt::Display> FeatureChangeAnalysis<T> {
122    /// Display feature change analysis as formatted text
123    pub fn display(&self) -> String {
124        let mut output = String::new();
125        output.push_str("Feature Change Analysis:\n");
126        output.push_str(&format!("  Features analyzed: {}\n", self.feature_count));
127        output.push_str(&format!(
128            "  Samples with changes: {}\n",
129            self.samples_with_changes
130        ));
131        output.push_str(&format!("  Average change: {:.6}\n", self.average_change));
132        output.push_str(&format!("  Max change: {:.6}\n", self.max_change));
133        output.push_str(&format!("  Min change: {:.6}\n", self.min_change));
134        output.push('\n');
135        output
136    }
137}
138
139impl<T: std::fmt::Display> DistributionChangeAnalysis<T> {
140    /// Display distribution change analysis as formatted text
141    pub fn display(&self) -> String {
142        let mut output = String::new();
143        output.push_str("Distribution Change Analysis:\n");
144        output.push_str(&format!(
145            "  Original mean: {:.6}, Transformed mean: {:.6}\n",
146            self.original_mean, self.transformed_mean
147        ));
148        output.push_str(&format!(
149            "  Original std: {:.6}, Transformed std: {:.6}\n",
150            self.original_std, self.transformed_std
151        ));
152        output.push_str(&format!("  Mean change: {:.6}\n", self.mean_change));
153        output.push_str(&format!("  Std change: {:.6}\n", self.std_change));
154        output.push('\n');
155        output
156    }
157}
158
159impl<T: std::fmt::Display> SampleComparison<T> {
160    /// Display sample comparison as formatted text
161    pub fn display(&self) -> String {
162        let mut output = String::new();
163        output.push_str(&format!("Sample {} Comparison:\n", self.sample_index));
164        output.push_str(&format!(
165            "  Original - Mean: {:.4}, Std: {:.4}, Min: {:.4}, Max: {:.4}\n",
166            self.original_stats.mean,
167            self.original_stats.std,
168            self.original_stats.min,
169            self.original_stats.max
170        ));
171        output.push_str(&format!(
172            "  Transformed - Mean: {:.4}, Std: {:.4}, Min: {:.4}, Max: {:.4}\n",
173            self.transformed_stats.mean,
174            self.transformed_stats.std,
175            self.transformed_stats.min,
176            self.transformed_stats.max
177        ));
178        output.push_str(&format!(
179            "  Change magnitude (RMS): {:.6}\n",
180            self.change_magnitude
181        ));
182        output.push('\n');
183        output
184    }
185}