tenflowers_dataset/visualization/
formatting.rs1use super::types::*;
7
8impl SamplePreview {
9 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 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 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 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 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 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 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 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}