pub fn extract_selected_features(
raw_features: &[f32],
num_rows: usize,
num_raw_features: usize,
indices: Option<&[usize]>,
) -> Vec<f32> {
if let Some(indices) = indices {
let mut selected = Vec::with_capacity(num_rows * indices.len());
for row in 0..num_rows {
let row_offset = row * num_raw_features;
for &feat_idx in indices {
selected.push(raw_features[row_offset + feat_idx]);
}
}
selected
} else {
raw_features.to_vec()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_extract_all_features() {
let raw = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
let result = extract_selected_features(&raw, 2, 3, None);
assert_eq!(result, raw);
}
#[test]
fn test_extract_selected_features() {
let raw = vec![
1.0, 2.0, 3.0, 4.0, 5.0, 6.0, ];
let indices = vec![0, 2];
let result = extract_selected_features(&raw, 2, 3, Some(&indices));
assert_eq!(
result,
vec![
1.0, 3.0, 4.0, 6.0, ]
);
}
#[test]
fn test_extract_single_feature() {
let raw = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
let indices = vec![1];
let result = extract_selected_features(&raw, 2, 3, Some(&indices));
assert_eq!(result, vec![2.0, 5.0]); }
#[test]
fn test_extract_reordered_features() {
let raw = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
let indices = vec![2, 0]; let result = extract_selected_features(&raw, 2, 3, Some(&indices));
assert_eq!(result, vec![3.0, 1.0, 6.0, 4.0]);
}
}