From 8a53f2f9856964f90d6ad7caca6bcca344d03209 Mon Sep 17 00:00:00 2001 From: Tormod Gjeitnes Hellen Date: Sun, 7 Feb 2021 00:50:21 +0100 Subject: [PATCH] Implement Display for Dataset. --- src/dataset/mod.rs | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/dataset/mod.rs b/src/dataset/mod.rs index da790b43..463c61f8 100644 --- a/src/dataset/mod.rs +++ b/src/dataset/mod.rs @@ -111,6 +111,69 @@ pub(crate) fn deserialize_data( Ok((x, y, num_samples, num_features)) } +impl std::fmt::Display for Dataset { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if self.num_features == self.feature_names.len() { + struct Target { + name: String, + value: Y, + } + struct Feature { + name: String, + value: X, + } + struct DataPoint { + labels: Vec>, + features: Vec>, + } + impl std::fmt::Display for DataPoint { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{} : {}", + self.labels + .iter() + .map(|target| format!("{}:{:?}, ", target.name, target.value)) + .collect::(), + self.features + .iter() + .map(|feature| format!("{}:{:?}, ", feature.name, feature.value)) + .collect::() + ) + } + } + let mut datapoints = Vec::new(); + for sample_index in 0..self.num_samples { + let mut features = Vec::new(); + for feature_index in 0..self.feature_names.len() { + features.push(Feature { + name: self.feature_names[feature_index].to_owned(), + value: self.data[sample_index * self.num_features + feature_index], + }); + } + let mut targets = Vec::new(); + for target_index in 0..self.target_names.len() { + targets.push(Target { + name: self.target_names[target_index].to_owned(), + value: self.target[sample_index * self.target_names.len() + target_index], + }); + } + datapoints.push(DataPoint { + labels: targets, + features, + }) + } + let mut out = format!("{}\n", self.description); + for point in datapoints { + out.push_str(&format!("{}\n", point)); + } + write!(f, "{}", out) + } else { + write!(f, "{:?}", self) + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -133,4 +196,10 @@ mod tests { assert_eq!(m[0].len(), 5); assert_eq!(*m[1][3], 9); } + + #[test] + fn display() { + let dataset = iris::load_dataset(); + println!("{}", dataset); + } }