use super::*;
fn resolve_continuous_column(
data: &Dataset,
col_map: &HashMap<String, usize>,
column_name: &str,
role: &str,
) -> Result<Array1<f64>, WorkflowError> {
let col_idx = resolve_role_col(col_map, column_name, role)?;
let values = data.values.column(col_idx).to_owned();
for (row_idx, value) in values.iter().enumerate() {
if !value.is_finite() {
return Err(WorkflowError::SchemaMismatch {
reason: format!(
"{role} column '{column_name}' contains non-finite value at row {row_idx}: {value}"
),
});
}
}
Ok(values)
}
pub fn resolve_offset_column(
data: &Dataset,
col_map: &HashMap<String, usize>,
column_name: Option<&str>,
) -> Result<Array1<f64>, WorkflowError> {
let Some(column_name) = column_name else {
return Ok(Array1::zeros(data.values.nrows()));
};
resolve_continuous_column(data, col_map, column_name, "offset")
}
pub fn resolve_weight_column(
data: &Dataset,
col_map: &HashMap<String, usize>,
column_name: Option<&str>,
) -> Result<Array1<f64>, WorkflowError> {
let Some(column_name) = column_name else {
return Ok(Array1::ones(data.values.nrows()));
};
let values = resolve_continuous_column(data, col_map, column_name, "weights")?;
for (row_idx, value) in values.iter().enumerate() {
if *value < 0.0 {
return Err(WorkflowError::SchemaMismatch {
reason: format!(
"weights column '{column_name}' must be non-negative; found {value} at row {row_idx}"
),
});
}
}
Ok(values)
}