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}