use scirs2_core::ndarray::{Array1, Array2};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Dataset {
pub data: Array2<f64>,
pub target: Array1<i32>,
pub feature_names: Option<Vec<String>>,
pub target_names: Option<Vec<String>>,
pub description: String,
}
impl Dataset {
pub fn new(
data: Array2<f64>,
target: Array1<i32>,
feature_names: Option<Vec<String>>,
target_names: Option<Vec<String>>,
description: String,
) -> Self {
Self {
data,
target,
feature_names,
target_names,
description,
}
}
pub fn n_samples(&self) -> usize {
self.data.nrows()
}
pub fn n_features(&self) -> usize {
self.data.ncols()
}
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_iris() -> Dataset {
use crate::generators::basic::make_classification;
let (data, target) = make_classification(150, 4, 3, 0, 3, Some(42))
.expect("Failed to generate iris-like dataset");
Dataset::new(
data,
target,
Some(vec![
"sepal_length".to_string(),
"sepal_width".to_string(),
"petal_length".to_string(),
"petal_width".to_string(),
]),
Some(vec![
"setosa".to_string(),
"versicolor".to_string(),
"virginica".to_string(),
]),
"Iris flower classification dataset".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_wine() -> Dataset {
use crate::generators::basic::make_classification;
let (data, target) = make_classification(178, 13, 3, 0, 3, Some(123))
.expect("Failed to generate wine-like dataset");
Dataset::new(
data,
target,
None,
Some(vec![
"class_0".to_string(),
"class_1".to_string(),
"class_2".to_string(),
]),
"Wine recognition dataset".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_breast_cancer() -> Dataset {
use crate::generators::basic::make_classification;
let (data, target) = make_classification(569, 30, 2, 0, 2, Some(456))
.expect("Failed to generate breast cancer-like dataset");
Dataset::new(
data,
target,
None,
Some(vec!["malignant".to_string(), "benign".to_string()]),
"Breast Cancer Wisconsin dataset".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_digits() -> Dataset {
use crate::generators::basic::make_classification;
let (data, target) = make_classification(1797, 64, 10, 0, 10, Some(789))
.expect("Failed to generate digits-like dataset");
Dataset::new(
data,
target,
None,
Some((0..10).map(|i| i.to_string()).collect()),
"Optical recognition of handwritten digits dataset".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_diabetes() -> Dataset {
use crate::generators::basic::make_regression;
let (data, target_f64) = make_regression(442, 10, 1, 0.1, Some(101112))
.expect("Failed to generate diabetes-like dataset");
let target = target_f64.mapv(|x| if x > 0.0 { 1 } else { 0 });
Dataset::new(
data,
target,
None,
Some(vec!["low".to_string(), "high".to_string()]),
"Diabetes progression dataset".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_boston() -> Dataset {
use crate::generators::basic::make_regression;
let (data, target_f64) = make_regression(506, 13, 1, 0.1, Some(131415))
.expect("Failed to generate boston-like dataset");
let target = target_f64.mapv(|x| if x > 0.0 { 1 } else { 0 });
Dataset::new(
data,
target,
None,
Some(vec!["low_price".to_string(), "high_price".to_string()]),
"Boston Housing dataset (Note: This dataset has ethical concerns and is included for historical/compatibility purposes only)".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_california_housing() -> Dataset {
use crate::generators::basic::make_regression;
let (data, target_f64) = make_regression(20640, 8, 1, 0.1, Some(161718))
.expect("Failed to generate california housing-like dataset");
let target = target_f64.mapv(|x| if x > 0.0 { 1 } else { 0 });
Dataset::new(
data,
target,
None,
Some(vec!["affordable".to_string(), "expensive".to_string()]),
"California Housing dataset".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_linnerud() -> Dataset {
use crate::generators::basic::make_classification;
let (data, target) = make_classification(20, 3, 3, 0, 3, Some(192021))
.expect("Failed to generate linnerud-like dataset");
Dataset::new(
data,
target,
Some(vec![
"chins".to_string(),
"situps".to_string(),
"jumps".to_string(),
]),
Some(vec![
"weight".to_string(),
"waist".to_string(),
"pulse".to_string(),
]),
"Linnerud physiological dataset".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_mnist() -> Dataset {
use crate::generators::basic::make_classification;
let (data, target) = make_classification(1000, 784, 10, 0, 10, Some(222324))
.expect("Failed to generate mnist-like dataset");
Dataset::new(
data,
target,
None,
Some((0..10).map(|i| i.to_string()).collect()),
"MNIST handwritten digit recognition dataset (subset)".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_fashion_mnist() -> Dataset {
use crate::generators::basic::make_classification;
let (data, target) = make_classification(1000, 784, 10, 0, 10, Some(252627))
.expect("Failed to generate fashion-mnist-like dataset");
Dataset::new(
data,
target,
None,
Some(vec![
"T-shirt/top".to_string(),
"Trouser".to_string(),
"Pullover".to_string(),
"Dress".to_string(),
"Coat".to_string(),
"Sandal".to_string(),
"Shirt".to_string(),
"Sneaker".to_string(),
"Bag".to_string(),
"Ankle boot".to_string(),
]),
"Fashion-MNIST clothing classification dataset (subset)".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_cifar10() -> Dataset {
use crate::generators::basic::make_classification;
let (data, target) = make_classification(1000, 3072, 10, 0, 10, Some(282930))
.expect("Failed to generate cifar10-like dataset");
Dataset::new(
data,
target,
None,
Some(vec![
"airplane".to_string(),
"automobile".to_string(),
"bird".to_string(),
"cat".to_string(),
"deer".to_string(),
"dog".to_string(),
"frog".to_string(),
"horse".to_string(),
"ship".to_string(),
"truck".to_string(),
]),
"CIFAR-10 object recognition dataset (subset)".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_newsgroups() -> Dataset {
use crate::generators::basic::make_classification;
let (data, target) = make_classification(1000, 1000, 20, 0, 20, Some(313233))
.expect("Failed to generate newsgroups-like dataset");
Dataset::new(
data,
target,
None,
Some((0..20).map(|i| format!("topic_{}", i)).collect()),
"20 Newsgroups text classification dataset (subset)".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_reuters() -> Dataset {
use crate::generators::basic::make_classification;
let (data, target) = make_classification(1000, 500, 8, 0, 8, Some(343536))
.expect("Failed to generate reuters-like dataset");
Dataset::new(
data,
target,
None,
Some((0..8).map(|i| format!("category_{}", i)).collect()),
"Reuters news categorization dataset (subset)".to_string(),
)
}
#[deprecated(note = "Returns synthetic data, not real dataset. Full implementation planned for v0.2.0.")]
pub fn load_olivetti_faces() -> Dataset {
use crate::generators::basic::make_classification;
let (data, target) = make_classification(400, 4096, 40, 0, 40, Some(373839))
.expect("Failed to generate olivetti-like dataset");
Dataset::new(
data,
target,
None,
Some((0..40).map(|i| format!("person_{}", i)).collect()),
"Olivetti faces recognition dataset".to_string(),
)
}
#[allow(non_snake_case)]
#[allow(deprecated)]
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_load_iris() {
let dataset = load_iris();
assert_eq!(dataset.n_samples(), 150);
assert_eq!(dataset.n_features(), 4);
assert!(dataset.feature_names.is_some());
assert!(dataset.target_names.is_some());
}
#[test]
fn test_load_wine() {
let dataset = load_wine();
assert_eq!(dataset.n_samples(), 178);
assert_eq!(dataset.n_features(), 13);
assert!(dataset.target_names.is_some());
}
#[test]
fn test_load_breast_cancer() {
let dataset = load_breast_cancer();
assert_eq!(dataset.n_samples(), 569);
assert_eq!(dataset.n_features(), 30);
assert!(dataset.target_names.is_some());
assert_eq!(dataset.target_names.as_ref().expect("operation should succeed").len(), 2);
}
#[test]
fn test_load_digits() {
let dataset = load_digits();
assert_eq!(dataset.n_samples(), 1797);
assert_eq!(dataset.n_features(), 64);
assert!(dataset.target_names.is_some());
assert_eq!(dataset.target_names.as_ref().expect("operation should succeed").len(), 10);
}
#[test]
fn test_dataset_new() {
use crate::generators::basic::make_classification;
use scirs2_core::ndarray::Array1;
let (data, target) = make_classification(100, 4, 3, 0, 3, Some(42)).expect("operation should succeed");
let dataset = Dataset::new(
data,
target,
Some(vec![
"f1".to_string(),
"f2".to_string(),
"f3".to_string(),
"f4".to_string(),
]),
Some(vec!["c1".to_string(), "c2".to_string(), "c3".to_string()]),
"Test dataset".to_string(),
);
assert_eq!(dataset.n_samples(), 100);
assert_eq!(dataset.n_features(), 4);
assert!(dataset.feature_names.is_some());
assert!(dataset.target_names.is_some());
assert_eq!(dataset.description, "Test dataset");
}
}