use ndarray::{Array1, Array2};
pub fn stackloss() -> (Array2<f64>, Array1<f64>) {
parse_csv(include_str!("datasets/data/stackloss.csv"), 3)
}
pub fn stars_cyg() -> (Array2<f64>, Array1<f64>) {
parse_csv(include_str!("datasets/data/starsCYG.csv"), 1)
}
fn parse_csv(text: &str, n_features: usize) -> (Array2<f64>, Array1<f64>) {
let rows: Vec<Vec<f64>> = text
.lines()
.skip(1)
.map(str::trim)
.filter(|l| !l.is_empty())
.map(|l| {
l.split(',')
.map(|f| {
f.trim()
.parse::<f64>()
.expect("dataset field is not numeric")
})
.collect()
})
.collect();
let n = rows.len();
let ncol = n_features + 1;
assert!(
rows.iter().all(|r| r.len() == ncol),
"dataset row width mismatch: expected {ncol} columns"
);
let mut x = Array2::zeros((n, n_features));
let mut y = Array1::zeros(n);
for (i, row) in rows.iter().enumerate() {
for j in 0..n_features {
x[[i, j]] = row[j];
}
y[i] = row[n_features];
}
(x, y)
}