Skip to main content

shap_rs/plot/
force.rs

1use crate::{Explanation, Result, ShapError};
2#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
3pub struct ForceData {
4    pub base_value: f64,
5    pub output_value: f64,
6    pub contributions: Vec<f64>,
7}
8pub fn data(e: &Explanation, sample: usize, output: usize) -> Result<ForceData> {
9    if sample >= e.n_samples() {
10        return Err(ShapError::InvalidSampleIndex {
11            index: sample,
12            n_samples: e.n_samples(),
13        });
14    }
15    if output >= e.n_outputs() {
16        return Err(ShapError::InvalidOutputIndex {
17            index: output,
18            n_outputs: e.n_outputs(),
19        });
20    }
21    let contributions = (0..e.n_features())
22        .map(|j| e.values()[[sample, j, output]])
23        .collect::<Vec<_>>();
24    Ok(ForceData {
25        base_value: e.base_values()[[sample, output]],
26        output_value: e.base_values()[[sample, output]] + contributions.iter().sum::<f64>(),
27        contributions,
28    })
29}