{"version":3,"file":"shap-explainers.mjs","sources":["../../../projects/shap-explainers/src/shap-additive-force-array/shap-additive-force-array.component.ts","../../../projects/shap-explainers/src/shap-additive-force-array/shap-additive-force-array.component.html","../../../projects/shap-explainers/src/shap-additive-force/shap-additive-force.component.ts","../../../projects/shap-explainers/src/shap-additive-force/shap-additive-force.component.html","../../../projects/shap-explainers/src/shap-influence/shap-influence.component.ts","../../../projects/shap-explainers/src/shap-influence/shap-influence.component.html","../../../projects/shap-explainers/src/shap-explainers.module.ts","../../../projects/shap-explainers/src/public-api.ts","../../../projects/shap-explainers/src/shap-explainers.ts"],"sourcesContent":["import {\n  AfterViewInit,\n  Component,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  Output,\n} from '@angular/core';\nimport { scaleLinear, scaleTime } from 'd3-scale';\nimport { format } from 'd3-format';\nimport { axisBottom, axisLeft } from 'd3-axis';\nimport { line } from 'd3-shape';\nimport { hsl, HSLColor } from 'd3-color';\nimport {\n  sortBy,\n  min,\n  max,\n  map,\n  each,\n  sum,\n  filter,\n  debounce,\n  keys,\n  range,\n  rangeRight,\n  cloneDeep,\n  findKey,\n} from 'lodash';\nimport * as d3 from 'd3';\n\nimport { AdditiveForceArrayData } from '../shap-data';\nimport { timeFormat, timeParse } from 'd3';\n\n@Component({\n  selector: 'shap-additive-force-array',\n  templateUrl: './shap-additive-force-array.component.html',\n  styleUrls: ['./shap-additive-force-array.component.scss'],\n})\nexport class ShapAdditiveForceArrayComponent\n  implements AfterViewInit, OnDestroy {\n  @Input() orderingKeys;\n  @Input() orderKeysTimeFormat;\n  @Input() topOffset: number = 28;\n  @Input() leftOffset: number = 80;\n  @Input() rightOffset: number = 10;\n  @Input() height: number = 350;\n\n  @Input() plotColors = ['rgb(222, 53, 13)', 'rgb(111, 207, 151)'];\n  @Input() link: 'logit' | 'identity' = 'identity';\n  @Input() baseValue: number = 0.0;\n  @Input() outNames: string[] = ['Color rating'];\n\n  @Input() data: AdditiveForceArrayData = {\n    featureNames: {\n      0: 'Blue',\n      1: 'Red',\n      2: 'Green',\n      3: 'Orange',\n    },\n    explanations: [\n      {\n        outValue: -1.5,\n        simIndex: 1,\n        features: {\n          0: { value: 1.0, effect: 1.0 },\n          1: { value: 0.0, effect: 0.5 },\n          2: { value: 2.0, effect: -2.5 },\n          3: { value: 2.0, effect: -0.5 },\n        },\n      },\n      {\n        outValue: -0.5,\n        simIndex: 0,\n        features: {\n          0: { value: 1.0, effect: 1.0 },\n          1: { value: 0.0, effect: 0.5 },\n          2: { value: 1.0, effect: -1.5 },\n          3: { value: 2.0, effect: -0.5 },\n        },\n      },\n      {\n        outValue: 0,\n        simIndex: 2,\n        features: {\n          0: { value: 1.5, effect: 1.5 },\n          1: { value: 0.0, effect: 0.5 },\n          2: { value: 1.0, effect: -1.5 },\n          3: { value: 2.0, effect: -0.5 },\n        },\n      },\n    ],\n  };\n  @Output() isLoaded = new EventEmitter();\n\n  private svg: d3.Selection<any, {}, HTMLElement, any>;\n  private wrapper: d3.Selection<any, {}, HTMLElement, any>;\n  private mainGroup: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private onTopGroup: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private colors: any[];\n  private brighterColors: HSLColor[];\n\n  private xaxisElement: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private yaxisElement: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private hoverGroup1: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private hoverGroup2: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private hoverLine: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private hoverxOutline: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private hoveryOutline: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private hoverx: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private hovery: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private hoverxTitle: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private hoveryTitle: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private baseValueTitle: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n\n  // TODO: Changed SVGElement to any\n  private xlabel: d3.Selection<any, {}, d3.BaseType, any>;\n\n  // TODO: Changed SVGElement to any\n  private ylabel: d3.Selection<any, {}, d3.BaseType, any>;\n\n  // TODO: Changed SVGElement to any\n  // private xscale: d3.ScaleLinear<number, number, never> | d3.ScaleTime<number, number, number>;\n  private xscale;\n  private xaxis: d3.Axis<d3.AxisDomain>;\n  private yscale: d3.ScaleLinear<number, number, never>;\n  private yaxis: d3.Axis<d3.AxisDomain>;\n  private currExplanations;\n  private usedFeatures;\n  private posOrderedFeatures;\n  private negOrderedFeatures;\n  private singleValueFeatures;\n  private currUsedFeatures;\n  private nearestExpIndex;\n  private currPosOrderedFeatures;\n  private currNegOrderedFeatures;\n  private predValues;\n  private explanations;\n\n  effectFormat: (n: number | { valueOf(): number }) => string;\n  redraw: any;\n  invLinkFunction: Function;\n  tickFormat: (\n    n:\n      | number\n      | {\n          valueOf(): number;\n        }\n  ) => string;\n  parseTime: (dateString: string) => Date;\n  formatTime: (dateString: Date) => string;\n  xtickFormat: (x: any) => any;\n  ytickFormat: (x: any) => any;\n\n  constructor() {\n    this.effectFormat = format('.2');\n    this.redraw = debounce(() => this.draw(null), 200);\n  }\n\n  ngAfterViewInit(): void {\n    this.svg = d3.select('#additiveForceArray');\n    this.wrapper = d3.select('#additiveForceArrayWrapper');\n\n    this.mainGroup = this.svg.append('g');\n    this.onTopGroup = this.svg.append('g');\n    this.xaxisElement = this.onTopGroup\n      .append('g')\n      .attr('transform', 'translate(0,35)')\n      .attr('class', 'force-bar-array-xaxis');\n    this.yaxisElement = this.onTopGroup\n      .append('g')\n      .attr('transform', 'translate(0,35)')\n      .attr('class', 'force-bar-array-yaxis');\n    this.hoverGroup1 = this.svg.append('g');\n    this.hoverGroup2 = this.svg.append('g');\n    this.baseValueTitle = this.svg.append('text');\n    this.hoverLine = this.svg.append('line');\n    this.hoverxOutline = this.svg\n      .append('text')\n      .attr('text-anchor', 'middle')\n      .attr('font-weight', 'bold')\n      .attr('fill', '#fff')\n      .attr('stroke', '#fff')\n      .attr('stroke-width', '6')\n      .attr('font-size', '12px');\n    this.hoverx = this.svg\n      .append('text')\n      .attr('text-anchor', 'middle')\n      .attr('font-weight', 'bold')\n      .attr('fill', '#000')\n      .attr('font-size', '12px');\n    this.hoverxTitle = this.svg\n      .append('text')\n      .attr('text-anchor', 'middle')\n      .attr('opacity', 0.6)\n      .attr('font-size', '12px');\n    this.hoveryOutline = this.svg\n      .append('text')\n      .attr('text-anchor', 'end')\n      .attr('font-weight', 'bold')\n      .attr('fill', '#fff')\n      .attr('stroke', '#fff')\n      .attr('stroke-width', '6')\n      .attr('font-size', '12px');\n    this.hovery = this.svg\n      .append('text')\n      .attr('text-anchor', 'end')\n      .attr('font-weight', 'bold')\n      .attr('fill', '#000')\n      .attr('font-size', '12px');\n\n    this.xlabel = this.wrapper\n      .select('.additive-force-array-xlabel')\n      .attr('font-size', '14px');\n    this.ylabel = this.wrapper.select('.additive-force-array-ylabel');\n\n    // Create our colors and color gradients\n    //Verify custom color map\n\n    this.colors = this.plotColors.map((x) => hsl(x));\n    this.brighterColors = [1.45, 1.6].map((v, i) => this.colors[i].brighter(v));\n\n    // create our axes\n    let defaultFormat = format(',.4');\n    if (this.orderingKeys != null && this.orderKeysTimeFormat != null) {\n      this.parseTime = timeParse(this.orderKeysTimeFormat);\n      this.formatTime = timeFormat(this.orderKeysTimeFormat);\n\n      function condFormat(x) {\n        if (typeof x == 'object') {\n          return this.formatTime(x);\n        } else {\n          return defaultFormat(x);\n        }\n      }\n\n      this.xtickFormat = condFormat;\n    } else {\n      this.parseTime = null;\n      this.formatTime = null;\n      this.xtickFormat = defaultFormat;\n    }\n    this.xscale = scaleLinear();\n    this.xaxis = axisBottom(this.xscale)\n      .tickSizeInner(4)\n      .tickSizeOuter(0)\n      .tickFormat((d) => this.xtickFormat(d))\n      .tickPadding(-18);\n\n    this.ytickFormat = defaultFormat;\n    this.yscale = scaleLinear();\n    this.yaxis = axisLeft(this.yscale)\n      .tickSizeInner(4)\n      .tickSizeOuter(0)\n      .tickFormat((d) => this.ytickFormat(this.invLinkFunction(d)))\n      .tickPadding(2);\n\n    this.xlabel.node().onchange = () => this.internalDraw();\n    this.ylabel.node().onchange = () => this.internalDraw();\n\n    this.svg.on('mousemove', (x) => this.mouseMoved(x));\n    this.svg.on('mouseout', (x) => this.mouseOut(x));\n\n    // draw and then listen for resize events\n    //this.draw();\n    window.addEventListener('resize', this.redraw);\n    window.setTimeout(this.redraw, 50); // re-draw after interface has updated\n  }\n\n  ngOnDestroy(): void {\n    window.removeEventListener('resize', this.redraw);\n  }\n\n  draw(explanations) {\n    if (!this.data.explanations || this.data.explanations.length === 0) return;\n\n    // record the order in which the explanations were given\n    each(this.data.explanations, (x, i) => (x.origInd = i));\n\n    // Find what features are actually used\n    let posDefinedFeatures = {};\n    let negDefinedFeatures = {};\n    let definedFeaturesValues = {};\n    for (let e of this.data.explanations) {\n      for (let k in e.features) {\n        if (posDefinedFeatures[k] === undefined) {\n          posDefinedFeatures[k] = 0;\n          negDefinedFeatures[k] = 0;\n          definedFeaturesValues[k] = 0;\n        }\n        if (e.features[k].effect > 0) {\n          posDefinedFeatures[k] += e.features[k].effect;\n        } else {\n          negDefinedFeatures[k] -= e.features[k].effect;\n        }\n        if (e.features[k].value !== null && e.features[k].value !== undefined) {\n          definedFeaturesValues[k] += 1;\n        }\n      }\n    }\n    this.usedFeatures = sortBy(\n      keys(posDefinedFeatures),\n      (i) => -(posDefinedFeatures[i] + negDefinedFeatures[i])\n    );\n\n    this.posOrderedFeatures = sortBy(\n      this.usedFeatures,\n      (i) => posDefinedFeatures[i]\n    );\n    this.negOrderedFeatures = sortBy(\n      this.usedFeatures,\n      (i) => -negDefinedFeatures[i]\n    );\n    this.singleValueFeatures = filter(\n      this.usedFeatures,\n      (i) => definedFeaturesValues[i] > 0\n    );\n\n    let options: any = [\n      'sample order by similarity',\n      'sample order by output value',\n      'original sample ordering',\n    ].concat(this.singleValueFeatures.map((i) => this.data.featureNames[i]));\n    if (this.orderingKeys != null) {\n      options.unshift('sample order by key');\n    }\n\n    let xLabelOptions: d3.Selection<\n      any,\n      any,\n      SVGGElement,\n      {}\n    > = this.xlabel.selectAll('option').data(options);\n    xLabelOptions\n      .enter()\n      .append('option')\n      .merge(xLabelOptions)\n      .attr('value', (d) => d)\n      .text((d) => d);\n    xLabelOptions.exit().remove();\n\n    let n = this.outNames[0] ? this.outNames[0] : 'model output value';\n    options = map(this.usedFeatures, (i) => [\n      this.data.featureNames[i],\n      this.data.featureNames[i] + ' effects',\n    ]);\n\n    // TODO: Changed array\n    options.unshift(['model output value', n]);\n    let yLabelOptions: d3.Selection<\n      any,\n      any,\n      SVGGElement,\n      {}\n    > = this.ylabel.selectAll('option').data(options);\n    yLabelOptions\n      .enter()\n      .append('option')\n      .merge(yLabelOptions)\n      .attr('value', (d) => d[0])\n      .text((d) => d[1]);\n    yLabelOptions.exit().remove();\n\n    this.ylabel\n      .style(\n        'top',\n        (this.height - 38 - this.topOffset) / 2 + this.topOffset + 'px'\n      )\n      .style('left', 10 - this.ylabel.node().offsetWidth / 2 + 'px');\n\n    this.xlabel\n      .style('position', 'absolute')\n      .style(\n        'left',\n        this.wrapper.node().offsetWidth / 2 -\n          this.xlabel.node().offsetWidth / 2 +\n          'px'\n      );\n\n    this.internalDraw();\n  }\n\n  internalDraw() {\n    // we fill in any implicit feature values and assume they have a zero effect and value\n    for (let e of this.data.explanations) {\n      for (let i of this.usedFeatures) {\n        if (!e.features.hasOwnProperty(i)) {\n          e.features[i] = { effect: 0, value: 0 };\n        }\n        e.features[i].ind = i;\n      }\n    }\n\n    let explanations: any;\n    let xsort = this.xlabel.node().value;\n\n    // Set scaleTime if time ticks provided for original ordering\n    let isTimeScale =\n      xsort === 'sample order by key' && this.orderKeysTimeFormat != null;\n    if (isTimeScale) {\n      this.xscale = scaleTime();\n    } else {\n      this.xscale = scaleLinear();\n    }\n    this.xaxis.scale(this.xscale);\n\n    if (xsort === 'sample order by similarity') {\n      explanations = sortBy(this.data.explanations, (x) => x.simIndex);\n      each(explanations, (e, i) => (e.xmap = i));\n    } else if (xsort === 'sample order by output value') {\n      explanations = sortBy(this.data.explanations, (x) => -x.outValue);\n      each(explanations, (e, i) => (e.xmap = i));\n    } else if (xsort === 'original sample ordering') {\n      explanations = sortBy(this.data.explanations, (x) => x.origInd);\n      each(explanations, (e, i) => (e.xmap = i));\n    } else if (xsort === 'sample order by key') {\n      explanations = this.data.explanations;\n      if (isTimeScale) {\n        each(\n          explanations,\n          (e, i) => (e.xmap = this.parseTime(this.orderingKeys[i]))\n        );\n      } else {\n        each(explanations, (e, i) => (e.xmap = this.orderingKeys[i]));\n      }\n      explanations = sortBy(explanations, (e) => e.xmap);\n    } else {\n      let ind = findKey(this.data.featureNames, (x) => x === xsort);\n\n      each(this.data.explanations, (e, i) => {\n        e.xmap = e.features[ind].value;\n      });\n      let explanations2 = sortBy(this.data.explanations, (x) => x.xmap);\n      let xvals = map(explanations2, (x) => x.xmap);\n      if (typeof xvals[0] == 'string') {\n        alert('Ordering by category names is not yet supported.');\n        return;\n      }\n      let xmin = min(xvals);\n      let xmax = max(xvals);\n      let binSize = (xmax - xmin) / 100;\n\n      // Build explanations where effects are averaged when the x values are identical\n      explanations = [];\n      let laste, copye;\n      for (let i = 0; i < explanations2.length; ++i) {\n        let e = explanations2[i];\n        if (\n          (laste && !copye && e.xmap - laste.xmap <= binSize) ||\n          (copye && e.xmap - copye.xmap <= binSize)\n        ) {\n          if (!copye) {\n            copye = cloneDeep(laste);\n            copye.count = 1;\n          }\n          for (let j of this.usedFeatures) {\n            copye.features[j].effect += e.features[j].effect;\n            copye.features[j].value += e.features[j].value;\n          }\n          copye.count += 1;\n        } else if (laste) {\n          if (copye) {\n            for (let j of this.usedFeatures) {\n              copye.features[j].effect /= copye.count;\n              copye.features[j].value /= copye.count;\n            }\n            explanations.push(copye);\n            copye = undefined;\n          } else {\n            explanations.push(laste);\n          }\n        }\n        laste = e;\n      }\n      if (laste.xmap - explanations[explanations.length - 1].xmap > binSize) {\n        explanations.push(laste);\n      }\n    }\n\n    // adjust for the correct y-value we are plotting\n    this.currUsedFeatures = this.usedFeatures;\n    this.currPosOrderedFeatures = this.posOrderedFeatures;\n    this.currNegOrderedFeatures = this.negOrderedFeatures;\n    //let filteredFeatureNames = this.data.featureNames;\n\n    let yvalue = this.ylabel.node().value;\n    if (yvalue !== 'model output value') {\n      let olde = explanations;\n      explanations = cloneDeep(explanations); // TODO: add pointer from old explanations which is prop.explanations to new ones\n      let ind = findKey(this.data.featureNames, (x) => x === yvalue);\n\n      for (let i = 0; i < explanations.length; ++i) {\n        let v = explanations[i].features[ind];\n        explanations[i].features = {};\n        explanations[i].features[ind] = v;\n        olde[i].remapped_version = explanations[i];\n      }\n      //filteredFeatureNames = [this.data.featureNames[ind]];\n      this.currUsedFeatures = [ind];\n      this.currPosOrderedFeatures = [ind];\n      this.currNegOrderedFeatures = [ind];\n    }\n    this.currExplanations = explanations;\n\n    // determine the link function\n    if (this.link === 'identity') {\n      // assume all links are the same\n      this.invLinkFunction = (x) => this.baseValue + x;\n    } else if (this.link === 'logit') {\n      this.invLinkFunction = (x) => 1 / (1 + Math.exp(-(this.baseValue + x))); // logistic is inverse of logit\n    } else {\n    }\n\n    this.predValues = map(explanations, (e) =>\n      sum(map(e.features, (x) => x.effect))\n    );\n\n    let width = this.wrapper.node().offsetWidth;\n    if (width == 0) return setTimeout(() => this.draw(explanations), 500);\n\n    this.svg.style('height', this.height + 'px');\n    this.svg.style('width', width + 'px');\n\n    let xvals = map(explanations, (x) => x.xmap);\n    this.xscale\n      .domain([min(xvals), max(xvals)])\n      .range([this.leftOffset, width - this.rightOffset])\n      .clamp(true);\n    this.xaxisElement\n      .attr('transform', 'translate(0,' + this.topOffset + ')')\n      .call(this.xaxis);\n\n    for (let i = 0; i < this.currExplanations.length; ++i) {\n      this.currExplanations[i].xmapScaled = this.xscale(\n        this.currExplanations[i].xmap\n      );\n    }\n\n    let N = explanations.length;\n    let domainSize = 0;\n    for (let ind = 0; ind < N; ++ind) {\n      let data2 = explanations[ind].features;\n      //if (data2.length !== P) error(\"Explanations have differing numbers of features!\");\n      let totalPosEffects =\n        sum(\n          map(\n            filter(data2, (x) => x.effect > 0),\n            (x) => x.effect\n          )\n        ) || 0;\n      let totalNegEffects =\n        sum(\n          map(\n            filter(data2, (x) => x.effect < 0),\n            (x) => -x.effect\n          )\n        ) || 0;\n      domainSize = Math.max(\n        domainSize,\n        Math.max(totalPosEffects, totalNegEffects) * 2.2\n      );\n    }\n    this.yscale\n      .domain([-domainSize / 2, domainSize / 2])\n      .range([this.height - 10, this.topOffset]);\n    this.yaxisElement\n      .attr('transform', 'translate(' + this.leftOffset + ',0)')\n      .call(this.yaxis);\n\n    for (let ind = 0; ind < N; ++ind) {\n      let data2 = explanations[ind].features;\n\n      let totalNegEffects =\n        sum(\n          map(\n            filter(data2, (x) => x.effect < 0),\n            (x) => -x.effect\n          )\n        ) || 0;\n\n      //let scaleOffset = height/2 - this.yscale(totalNegEffects);\n\n      // calculate the position of the join point between positive and negative effects\n      // and also the positions of each feature effect block\n      let pos = -totalNegEffects,\n        i;\n      for (i of this.currPosOrderedFeatures) {\n        data2[i].posyTop = this.yscale(pos);\n        if (data2[i].effect > 0) pos += data2[i].effect;\n        data2[i].posyBottom = this.yscale(pos);\n        data2[i].ind = i;\n      }\n      let joinPoint = pos;\n      for (i of this.currNegOrderedFeatures) {\n        data2[i].negyTop = this.yscale(pos);\n        if (data2[i].effect < 0) pos -= data2[i].effect;\n        data2[i].negyBottom = this.yscale(pos);\n      }\n      explanations[ind].joinPoint = joinPoint;\n      explanations[ind].joinPointy = this.yscale(joinPoint);\n    }\n\n    let lineFunction = line()\n      .x((d) => d[0])\n      .y((d) => d[1]);\n\n    let areasPos: d3.Selection<\n      any,\n      unknown,\n      SVGGElement,\n      {}\n    > = this.mainGroup\n      .selectAll('.force-bar-array-area-pos')\n      .data(this.currUsedFeatures);\n    areasPos\n      .enter()\n      .append('path')\n      .attr('class', 'force-bar-array-area-pos')\n      .merge(areasPos)\n      .attr('d', (i: number) => {\n        let topPoints = map(range(N), (j) => [\n          explanations[j].xmapScaled,\n          explanations[j].features[i].posyTop,\n        ]);\n        let bottomPoints = map(rangeRight(N), (j) => [\n          explanations[j].xmapScaled,\n          explanations[j].features[i].posyBottom,\n        ]);\n        return lineFunction(topPoints.concat(bottomPoints));\n      })\n      .attr('fill', this.colors[0]);\n    areasPos.exit().remove();\n\n    let areasNeg: d3.Selection<\n      any,\n      unknown,\n      SVGGElement,\n      {}\n    > = this.mainGroup\n      .selectAll('.force-bar-array-area-neg')\n      .data(this.currUsedFeatures);\n    areasNeg\n      .enter()\n      .append('path')\n      .attr('class', 'force-bar-array-area-neg')\n      .merge(areasNeg)\n      .attr('d', (i: number) => {\n        let topPoints = map(range(N), (j) => [\n          explanations[j].xmapScaled,\n          explanations[j].features[i].negyTop,\n        ]);\n        let bottomPoints = map(rangeRight(N), (j) => [\n          explanations[j].xmapScaled,\n          explanations[j].features[i].negyBottom,\n        ]);\n        return lineFunction(topPoints.concat(bottomPoints));\n      })\n      .attr('fill', this.colors[1]);\n    areasNeg.exit().remove();\n\n    let dividersPos: d3.Selection<\n      any,\n      unknown,\n      SVGGElement,\n      {}\n    > = this.mainGroup\n      .selectAll('.force-bar-array-divider-pos')\n      .data(this.currUsedFeatures);\n    dividersPos\n      .enter()\n      .append('path')\n      .attr('class', 'force-bar-array-divider-pos')\n      .merge(dividersPos)\n      .attr('d', (i: number) => {\n        let points = map(range(N), (j) => [\n          explanations[j].xmapScaled,\n          explanations[j].features[i].posyBottom,\n        ]);\n        return lineFunction(points);\n      })\n      .attr('fill', 'none')\n      .attr('stroke-width', 1)\n      .attr('stroke', () => this.colors[0].brighter(1.2));\n    dividersPos.exit().remove();\n\n    let dividersNeg: d3.Selection<\n      any,\n      unknown,\n      SVGGElement,\n      {}\n    > = this.mainGroup\n      .selectAll('.force-bar-array-divider-neg')\n      .data(this.currUsedFeatures);\n    dividersNeg\n      .enter()\n      .append('path')\n      .attr('class', 'force-bar-array-divider-neg')\n      .merge(dividersNeg)\n      .attr('d', (i: number) => {\n        let points = map(range(N), (j) => [\n          explanations[j].xmapScaled,\n          explanations[j].features[i].negyTop,\n        ]);\n        return lineFunction(points);\n      })\n      .attr('fill', 'none')\n      .attr('stroke-width', 1)\n      .attr('stroke', () => this.colors[1].brighter(1.5));\n    dividersNeg.exit().remove();\n\n    let boxBounds = function (es, ind, starti, endi, featType) {\n      let maxTop, minBottom;\n      if (featType === 'pos') {\n        maxTop = es[starti].features[ind].posyBottom;\n        minBottom = es[starti].features[ind].posyTop;\n      } else {\n        maxTop = es[starti].features[ind].negyBottom;\n        minBottom = es[starti].features[ind].negyTop;\n      }\n      let t, b;\n      for (let i = starti + 1; i <= endi; ++i) {\n        if (featType === 'pos') {\n          t = es[i].features[ind].posyBottom;\n          b = es[i].features[ind].posyTop;\n        } else {\n          t = es[i].features[ind].negyBottom;\n          b = es[i].features[ind].negyTop;\n        }\n        if (t > maxTop) maxTop = t;\n        if (b < minBottom) minBottom = b;\n      }\n      return { top: maxTop, bottom: minBottom };\n    };\n\n    let neededWidth = 100;\n    let neededHeight = 20;\n    let neededBuffer = 100;\n\n    // find areas on the plot big enough for feature labels\n    let featureLabels = [];\n    for (let featType of ['pos', 'neg']) {\n      for (let ind of this.currUsedFeatures) {\n        let starti = 0,\n          endi = 0,\n          boxWidth = 0,\n          hbounds = { top: 0, bottom: 0 };\n        let newHbounds;\n        while (endi < N - 1) {\n          // make sure our box is long enough\n          while (boxWidth < neededWidth && endi < N - 1) {\n            ++endi;\n            boxWidth =\n              explanations[endi].xmapScaled - explanations[starti].xmapScaled;\n          }\n\n          // and high enough\n          hbounds = boxBounds(explanations, ind, starti, endi, featType);\n          while (hbounds.bottom - hbounds.top < neededHeight && starti < endi) {\n            ++starti;\n            hbounds = boxBounds(explanations, ind, starti, endi, featType);\n          }\n          boxWidth =\n            explanations[endi].xmapScaled - explanations[starti].xmapScaled;\n\n          // we found a spot!\n          if (\n            hbounds.bottom - hbounds.top >= neededHeight &&\n            boxWidth >= neededWidth\n          ) {\n            // make our box as long as possible\n            while (endi < N - 1) {\n              ++endi;\n              newHbounds = boxBounds(explanations, ind, starti, endi, featType);\n              if (newHbounds.bottom - newHbounds.top > neededHeight) {\n                hbounds = newHbounds;\n              } else {\n                --endi;\n                break;\n              }\n            }\n            boxWidth =\n              explanations[endi].xmapScaled - explanations[starti].xmapScaled;\n\n            featureLabels.push([\n              (explanations[endi].xmapScaled +\n                explanations[starti].xmapScaled) /\n                2,\n              (hbounds.top + hbounds.bottom) / 2,\n              this.data.featureNames[ind],\n            ]);\n\n            let lastEnd = explanations[endi].xmapScaled;\n            starti = endi;\n            while (\n              lastEnd + neededBuffer > explanations[starti].xmapScaled &&\n              starti < N - 1\n            ) {\n              ++starti;\n            }\n            endi = starti;\n          }\n        }\n      }\n    }\n\n    let featureLabelText: d3.Selection<\n      any,\n      unknown,\n      SVGGElement,\n      {}\n    > = this.onTopGroup\n      .selectAll('.force-bar-array-flabels')\n      .data(featureLabels);\n    featureLabelText\n      .enter()\n      .append('text')\n      .attr('class', 'force-bar-array-flabels')\n      .merge(featureLabelText)\n      .attr('x', (d) => d[0])\n      .attr('y', (d) => d[1] + 4)\n      .text((d) => d[2]);\n    featureLabelText.exit().remove();\n  }\n\n  mouseOut(x) {\n    this.hoverLine.attr('display', 'none');\n    this.hoverx.attr('display', 'none');\n    this.hoverxOutline.attr('display', 'none');\n    this.hoverxTitle.attr('display', 'none');\n    this.hovery.attr('display', 'none');\n    this.hoveryOutline.attr('display', 'none');\n    this.hoverGroup1.attr('display', 'none');\n    this.hoverGroup2.attr('display', 'none');\n  }\n\n  mouseMoved(x) {\n    let i, nearestExp;\n\n    this.hoverLine.attr('display', '');\n    this.hoverx.attr('display', '');\n    this.hoverxOutline.attr('display', '');\n    this.hoverxTitle.attr('display', '');\n    this.hovery.attr('display', '');\n    this.hoveryOutline.attr('display', '');\n    this.hoverGroup1.attr('display', '');\n    this.hoverGroup2.attr('display', '');\n\n    // let x = mouse(this.svg.node())[0];\n\n    if (this.data.explanations) {\n      // Find the nearest explanation to the cursor position\n      for (i = 0; i < this.currExplanations.length; ++i) {\n        if (\n          !nearestExp ||\n          Math.abs(nearestExp.xmapScaled - x) >\n            Math.abs(this.currExplanations[i].xmapScaled - x)\n        ) {\n          nearestExp = this.currExplanations[i];\n        }\n      }\n      this.nearestExpIndex = nearestExp.origInd;\n\n      this.hoverLine\n        .attr('x1', nearestExp.xmapScaled)\n        .attr('x2', nearestExp.xmapScaled)\n        .attr('y1', 0 + this.topOffset)\n        .attr('y2', this.height);\n      this.hoverx\n        .attr('x', nearestExp.xmapScaled)\n        .attr('y', this.topOffset - 5)\n        .text(this.xtickFormat(nearestExp.xmap));\n      this.hoverxOutline\n        .attr('x', nearestExp.xmapScaled)\n        .attr('y', this.topOffset - 5)\n        .text(this.xtickFormat(nearestExp.xmap));\n      this.hoverxTitle\n        .attr('x', nearestExp.xmapScaled)\n        .attr('y', this.topOffset - 18)\n        .text(\n          nearestExp.count > 1 ? nearestExp.count + ' averaged samples' : ''\n        );\n      this.hovery\n        .attr('x', this.leftOffset - 6)\n        .attr('y', nearestExp.joinPointy)\n        .text(this.ytickFormat(this.invLinkFunction(nearestExp.joinPoint)));\n      this.hoveryOutline\n        .attr('x', this.leftOffset - 6)\n        .attr('y', nearestExp.joinPointy)\n        .text(this.ytickFormat(this.invLinkFunction(nearestExp.joinPoint)));\n\n      let posFeatures = [];\n      let lastPos, pos;\n      for (let j = this.currPosOrderedFeatures.length - 1; j >= 0; --j) {\n        let i = this.currPosOrderedFeatures[j];\n        let d = nearestExp.features[i];\n        pos = 5 + (d.posyTop + d.posyBottom) / 2;\n        if (\n          (!lastPos || pos - lastPos >= 15) &&\n          d.posyTop - d.posyBottom >= 6\n        ) {\n          posFeatures.push(d);\n          lastPos = pos;\n        }\n      }\n\n      let negFeatures = [];\n      lastPos = undefined;\n      for (let i of this.currNegOrderedFeatures) {\n        let d = nearestExp.features[i];\n        pos = 5 + (d.negyTop + d.negyBottom) / 2;\n        if (\n          (!lastPos || lastPos - pos >= 15) &&\n          d.negyTop - d.negyBottom >= 6\n        ) {\n          negFeatures.push(d);\n          lastPos = pos;\n        }\n      }\n\n      let labelFunc = (d) => {\n        let valString = '';\n        if (d.value !== null && d.value !== undefined) {\n          valString =\n            ' = ' + (isNaN(d.value) ? d.value : this.ytickFormat(d.value));\n        }\n        if (nearestExp.count > 1) {\n          return 'mean(' + this.data.featureNames[d.ind] + ')' + valString;\n        } else {\n          return this.data.featureNames[d.ind] + valString;\n        }\n      };\n\n      let featureHoverLabels1: d3.Selection<\n        any,\n        any,\n        SVGGElement,\n        {}\n      > = this.hoverGroup1.selectAll('.pos-values').data(posFeatures);\n      featureHoverLabels1\n        .enter()\n        .append('text')\n        .attr('class', 'pos-values')\n        .merge(featureHoverLabels1)\n        .attr('x', nearestExp.xmapScaled + 5)\n        .attr('y', (d) => 4 + (d.posyTop + d.posyBottom) / 2)\n        .attr('text-anchor', 'start')\n        .attr('font-size', 12)\n        .attr('stroke', '#fff')\n        .attr('fill', '#fff')\n        .attr('stroke-width', '4')\n        .attr('stroke-linejoin', 'round')\n        .attr('opacity', 1)\n        .text(labelFunc);\n      featureHoverLabels1.exit().remove();\n\n      let featureHoverLabels2: d3.Selection<\n        any,\n        any,\n        SVGGElement,\n        {}\n      > = this.hoverGroup2.selectAll('.pos-values').data(posFeatures);\n      featureHoverLabels2\n        .enter()\n        .append('text')\n        .attr('class', 'pos-values')\n        .merge(featureHoverLabels2)\n        .attr('x', nearestExp.xmapScaled + 5)\n        .attr('y', (d) => 4 + (d.posyTop + d.posyBottom) / 2)\n        .attr('text-anchor', 'start')\n        .attr('font-size', 12)\n        .attr('fill', this.colors[0])\n        .text(labelFunc);\n      featureHoverLabels2.exit().remove();\n\n      let featureHoverNegLabels1: d3.Selection<\n        any,\n        any,\n        SVGGElement,\n        {}\n      > = this.hoverGroup1.selectAll('.neg-values').data(negFeatures);\n      featureHoverNegLabels1\n        .enter()\n        .append('text')\n        .attr('class', 'neg-values')\n        .merge(featureHoverNegLabels1)\n        .attr('x', nearestExp.xmapScaled + 5)\n        .attr('y', (d) => 4 + (d.negyTop + d.negyBottom) / 2)\n        .attr('text-anchor', 'start')\n        .attr('font-size', 12)\n        .attr('stroke', '#fff')\n        .attr('fill', '#fff')\n        .attr('stroke-width', '4')\n        .attr('stroke-linejoin', 'round')\n        .attr('opacity', 1)\n        .text(labelFunc);\n      featureHoverNegLabels1.exit().remove();\n\n      let featureHoverNegLabels2: d3.Selection<\n        any,\n        any,\n        SVGGElement,\n        {}\n      > = this.hoverGroup2.selectAll('.neg-values').data(negFeatures);\n      featureHoverNegLabels2\n        .enter()\n        .append('text')\n        .attr('class', 'neg-values')\n        .merge(featureHoverNegLabels2)\n        .attr('x', nearestExp.xmapScaled + 5)\n        .attr('y', (d) => 4 + (d.negyTop + d.negyBottom) / 2)\n        .attr('text-anchor', 'start')\n        .attr('font-size', 12)\n        .attr('fill', this.colors[1])\n        .text(labelFunc);\n      featureHoverNegLabels2.exit().remove();\n    }\n    this.isLoaded.emit();\n  }\n}\n","<div id=\"additiveForceArrayWrapper\">\n  <select class=\"additive-force-array-xlabel\"></select>\n  <div>\n    <select class=\"additive-force-array-ylabel\"></select>\n  </div>\n  <svg id=\"additiveForceArray\"></svg>\n</div>\n","import {\n  AfterViewInit,\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n} from '@angular/core';\nimport { scaleLinear } from 'd3-scale';\nimport { format } from 'd3-format';\nimport { axisBottom } from 'd3-axis';\nimport { line } from 'd3-shape';\nimport { hsl, HSLColor } from 'd3-color';\nimport { sortBy, map, each, sum, filter, findIndex, debounce } from 'lodash';\nimport * as d3 from 'd3';\n\nimport { AdditiveForceData } from '../shap-data';\n\n@Component({\n  selector: 'shap-additive-force',\n  templateUrl: './shap-additive-force.component.html',\n  styleUrls: ['./shap-additive-force.component.scss'],\n})\nexport class ShapAdditiveForceComponent implements AfterViewInit {\n  @Input() plotColors: string[] = ['rgb(222, 53, 13)', 'rgb(111, 207, 151)'];\n  @Input() link: 'logit' | 'identity' = 'identity';\n  @Input() baseValue: number = 0.0;\n  @Input() outNames: string[] = ['Color rating'];\n  @Input() hideBars: boolean = false;\n  @Input() labelMargin: number = 0;\n  @Input() hideBaseValueLabel: boolean = false;\n\n  @Input() data: AdditiveForceData = {\n    featureNames: {\n      '0': 'Blue',\n      '1': 'Red',\n      '2': 'Green',\n      '3': 'Orange',\n    },\n    features: {\n      '0': { value: 1.0, effect: 1.0 },\n      '1': { value: 0.0, effect: 0.5 },\n      '2': { value: 2.0, effect: -2.5 },\n      '3': { value: 2.0, effect: -0.5 },\n    },\n  };\n\n  @Output() isLoaded = new EventEmitter();\n\n  private svg: d3.Selection<d3.BaseType, {}, HTMLElement, any>;\n  private wrapper: d3.Selection<any, {}, HTMLElement, any>;\n  private filteredData: d3.ScaleLinear<number, number, never>;\n  private filteredData2: d3.ScaleLinear<number, number, never>;\n  private mainGroup: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private axisElement: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private onTopGroup: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private baseValueTitle: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private joinPointLine: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private joinPointLabelOutline: d3.Selection<\n    SVGGElement,\n    {},\n    d3.BaseType,\n    any\n  >;\n  private joinPointLabel: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private joinPointTitleLeft: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private joinPointTitleLeftArrow: d3.Selection<\n    SVGGElement,\n    {},\n    d3.BaseType,\n    any\n  >;\n  private joinPointTitle: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private joinPointTitleRightArrow: d3.Selection<\n    SVGGElement,\n    {},\n    d3.BaseType,\n    any\n  >;\n  private joinPointTitleRight: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private hoverLabelBacking: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private hoverLabel: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private scaleCentered: d3.ScaleLinear<number, number, never>;\n  private axis: d3.Axis<d3.AxisDomain>;\n  private colors: any[];\n  private brighterColors: HSLColor[];\n  private domainSize: number;\n\n  effectFormat: (n: number | { valueOf(): number }) => string;\n  redraw: any;\n  invLinkFunction: Function;\n  tickFormat: (\n    n:\n      | number\n      | {\n          valueOf(): number;\n        }\n  ) => string;\n\n  constructor() {\n    this.effectFormat = format('.2');\n    this.redraw = debounce(() => this.draw(), 200);\n  }\n\n  ngAfterViewInit(): void {\n    this.svg = d3.select('#additiveForce');\n    this.wrapper = d3.select('#additiveForceWrapper');\n\n    this.mainGroup = this.svg.append('g');\n    this.axisElement = this.mainGroup\n      .append('g')\n      .attr('transform', 'translate(0,35)')\n      .attr('class', 'force-bar-axis');\n    this.onTopGroup = this.svg.append('g');\n    this.baseValueTitle = this.svg.append('text');\n    this.joinPointLine = this.svg.append('line');\n    this.joinPointLabelOutline = this.svg.append('text');\n    this.joinPointLabel = this.svg.append('text');\n    this.joinPointTitleLeft = this.svg.append('text');\n    this.joinPointTitleLeftArrow = this.svg.append('text');\n    this.joinPointTitle = this.svg.append('text');\n    this.joinPointTitleRightArrow = this.svg.append('text');\n    this.joinPointTitleRight = this.svg.append('text');\n\n    // Define the tooltip objects\n    this.hoverLabelBacking = this.svg\n      .append('text')\n      .attr('x', 10)\n      .attr('y', 20)\n      .attr('text-anchor', 'middle')\n      .attr('font-size', 12)\n      .attr('stroke', '#fff')\n      .attr('fill', '#fff')\n      .attr('stroke-width', '4')\n      .attr('stroke-linejoin', 'round')\n      .text('')\n      .on('mouseover', () => {\n        this.hoverLabel.attr('opacity', 1);\n        this.hoverLabelBacking.attr('opacity', 1);\n      })\n      .on('mouseout', () => {\n        this.hoverLabel.attr('opacity', 0);\n        this.hoverLabelBacking.attr('opacity', 0);\n      });\n\n    this.hoverLabel = this.svg\n      .append('text')\n      .attr('x', 10)\n      .attr('y', 20)\n      .attr('text-anchor', 'middle')\n      .attr('font-size', 12)\n      .attr('fill', '#0f0')\n      .text('')\n      .on('mouseover', () => {\n        this.hoverLabel.attr('opacity', 1);\n        this.hoverLabelBacking.attr('opacity', 1);\n      })\n      .on('mouseout', () => {\n        this.hoverLabel.attr('opacity', 0);\n        this.hoverLabelBacking.attr('opacity', 0);\n      });\n\n    // Create our colors and color gradients\n\n    this.colors = this.plotColors.map((x) => hsl(x));\n    this.brighterColors = [1.45, 1.6].map((v, i) => this.colors[i].brighter(v));\n    this.colors.map((c, i) => {\n      let grad = this.svg\n        .append('linearGradient')\n        .attr('id', 'linear-grad-' + i)\n        .attr('x1', '0%')\n        .attr('y1', '0%')\n        .attr('x2', '0%')\n        .attr('y2', '100%');\n      grad\n        .append('stop')\n        .attr('offset', '0%')\n        .attr('stop-color', c)\n        .attr('stop-opacity', 0.6);\n      grad\n        .append('stop')\n        .attr('offset', '100%')\n        .attr('stop-color', c)\n        .attr('stop-opacity', 0);\n      let grad2 = this.svg\n        .append('linearGradient')\n        .attr('id', 'linear-backgrad-' + i)\n        .attr('x1', '0%')\n        .attr('y1', '0%')\n        .attr('x2', '0%')\n        .attr('y2', '100%');\n      grad2\n        .append('stop')\n        .attr('offset', '0%')\n        .attr('stop-color', c)\n        .attr('stop-opacity', 0.5);\n      grad2\n        .append('stop')\n        .attr('offset', '100%')\n        .attr('stop-color', c)\n        .attr('stop-opacity', 0);\n    });\n\n    // create our x axis\n    this.tickFormat = format(',.4');\n    this.scaleCentered = scaleLinear();\n    this.axis = axisBottom(this.scaleCentered)\n      // .scale()\n      .tickSizeInner(4)\n      .tickSizeOuter(0)\n      .tickFormat((d) => this.tickFormat(this.invLinkFunction(d)))\n      .tickPadding(-18);\n\n    // draw and then listen for resize events\n    // this.draw();\n    window.addEventListener('resize', this.redraw);\n    window.setTimeout(this.redraw, 50); // re-draw after interface has updated\n  }\n\n  draw(): any {\n    // copy the feature names onto the features\n    each(this.data.featureNames, (n, i) => {\n      const result = n.replace(/([A-Z])/g, ' $1');\n      const name = result.charAt(0).toUpperCase() + result.slice(1);\n      if (this.data.features[i]) this.data.features[i].name = name;\n    });\n\n    // create our link function\n    if (this.link === 'identity') {\n      this.invLinkFunction = (x) => this.baseValue + x;\n    } else if (this.link === 'logit') {\n      this.invLinkFunction = (x) => 1 / (1 + Math.exp(-(this.baseValue + x))); // logistic is inverse of logit\n    } else {\n    }\n\n    // Set the dimensions of the plot\n    let width = this.wrapper.node().offsetWidth;\n\n    if (width == 0) return setTimeout(() => this.draw(), 500);\n    this.svg.style('height', 150 + 'px');\n    this.svg.style('width', width + 'px');\n    let topOffset = 50;\n\n    let data = sortBy(this.data.features, (x) => -1 / (x.effect + 1e-10));\n    let totalEffect = sum(map(data, (x) => Math.abs(x.effect)));\n    let totalPosEffects: number =\n      sum(\n        map(\n          filter(data, (x) => x.effect > 0),\n          (x) => x.effect\n        )\n      ) || 0;\n    let totalNegEffects: number =\n      sum(\n        map(\n          filter(data, (x) => x.effect < 0),\n          (x) => -x.effect\n        )\n      ) || 0;\n    this.domainSize = Math.max(totalPosEffects, totalNegEffects) * 3;\n    let scale = scaleLinear().domain([0, this.domainSize]).range([0, width]);\n    let scaleOffset = width / 2 - scale(totalNegEffects);\n\n    this.scaleCentered\n      .domain([-this.domainSize / 2, this.domainSize / 2])\n      .range([0, width])\n      .clamp(true);\n    this.axisElement\n      .attr('transform', 'translate(0,' + topOffset + ')')\n      .call(this.axis);\n\n    // calculate the position of the join point between positive and negative effects\n    // and also the positions of each feature effect block\n    let pos = 0,\n      i,\n      joinPoint,\n      joinPointIndex;\n    for (i = 0; i < data.length; ++i) {\n      data[i].x = pos;\n      if (data[i].effect < 0 && joinPoint === undefined) {\n        joinPoint = pos;\n        joinPointIndex = i;\n      }\n      pos += Math.abs(data[i].effect);\n    }\n    if (joinPoint === undefined) {\n      joinPoint = pos;\n      joinPointIndex = i;\n    }\n\n    let lineFunction = line()\n      .x((d) => d[0])\n      .y((d) => d[1]);\n\n    let getLabel = (d) => {\n      if (d.value !== undefined && d.value !== null && d.value !== '') {\n        return (\n          d.name + ' = ' + (isNaN(d.value) ? d.value : this.tickFormat(d.value))\n        );\n      } else return d.name;\n    };\n\n    data = this.hideBars ? [] : data;\n    let blocks: d3.Selection<\n      any,\n      any,\n      SVGGElement,\n      {}\n    > = this.mainGroup.selectAll('.force-bar-blocks').data(data);\n    blocks\n      .enter()\n      .append('path')\n      .attr('class', 'force-bar-blocks')\n      .merge(blocks)\n      .attr('d', (d, i) => {\n        let x = scale(d.x) + scaleOffset;\n        let w = scale(Math.abs(d.effect));\n        let pointShiftStart = d.effect < 0 ? -4 : 4;\n        let pointShiftEnd = pointShiftStart;\n        if (i === joinPointIndex) pointShiftStart = 0;\n        if (i === joinPointIndex - 1) pointShiftEnd = 0;\n        return lineFunction([\n          [x, 6 + topOffset],\n          [x + w, 6 + topOffset],\n          [x + w + pointShiftEnd, 14.5 + topOffset],\n          [x + w, 23 + topOffset],\n          [x, 23 + topOffset],\n          [x + pointShiftStart, 14.5 + topOffset],\n        ]);\n      })\n      .attr('fill', (d) => (d.effect > 0 ? this.colors[0] : this.colors[1]))\n      .on('mouseover', (e, d) => {\n        if (\n          scale(Math.abs(d.effect)) < scale(totalEffect) / 50 ||\n          scale(Math.abs(d.effect)) < 10\n        ) {\n          let x = scale(d.x) + scaleOffset;\n          let w = scale(Math.abs(d.effect));\n          this.hoverLabel\n            .attr('opacity', 1)\n            .attr('x', x + w / 2)\n            .attr('y', topOffset + 0.5)\n            .attr('fill', d.effect > 0 ? this.colors[0] : this.colors[1])\n            .text(getLabel(d));\n          this.hoverLabelBacking\n            .attr('opacity', 1)\n            .attr('x', x + w / 2)\n            .attr('y', topOffset + 0.5)\n            .text(getLabel(d));\n        }\n      })\n      .on('mouseout', () => {\n        this.hoverLabel.attr('opacity', 0);\n        this.hoverLabelBacking.attr('opacity', 0);\n      });\n    blocks.exit().remove();\n\n    let filteredData = filter(data, (d) => {\n      return (\n        scale(Math.abs(d.effect)) > scale(totalEffect) / 50 &&\n        scale(Math.abs(d.effect)) > 10\n      );\n    });\n\n    let labels: d3.Selection<\n      any,\n      any,\n      SVGGElement,\n      {}\n    > = this.onTopGroup.selectAll('.force-bar-labels').data(filteredData);\n    labels.exit().remove();\n    labels = labels\n      .enter()\n      .append('text')\n      .attr('class', 'force-bar-labels')\n      .attr('font-size', '12px')\n      .attr('y', 48 + topOffset)\n      .merge(labels)\n      .text((d) => {\n        if (d.value !== undefined && d.value !== null && d.value !== '') {\n          return (\n            d.name +\n            ' = ' +\n            (isNaN(d.value) ? d.value : this.tickFormat(d.value))\n          );\n        } else return d.name;\n      })\n      .attr('fill', (d) => (d.effect > 0 ? this.colors[0] : this.colors[1]))\n      .attr('stroke', function (d) {\n        d.textWidth = Math.max(\n          this.getComputedTextLength(),\n          scale(Math.abs(d.effect)) - 10\n        );\n        d.innerTextWidth = this.getComputedTextLength();\n        return 'none';\n      });\n    this.filteredData = filteredData;\n\n    // compute where the text labels should go\n    if (data.length > 0) {\n      pos = joinPoint + scale.invert(5);\n      for (let i = joinPointIndex; i < data.length; ++i) {\n        data[i].textx = pos;\n        pos += scale.invert(data[i].textWidth + 10);\n      }\n      pos = joinPoint - scale.invert(5);\n      for (let i = joinPointIndex - 1; i >= 0; --i) {\n        data[i].textx = pos;\n        pos -= scale.invert(data[i].textWidth + 10);\n      }\n    }\n\n    labels\n      .attr(\n        'x',\n        (d) =>\n          scale(d.textx) +\n          scaleOffset +\n          (d.effect > 0 ? -d.textWidth / 2 : d.textWidth / 2)\n      )\n      .attr('text-anchor', 'middle'); //d => d.effect > 0 ? 'end' : 'start');\n\n    // Now that we know the text widths we further filter by what fits on the screen\n    filteredData = filter(filteredData, (d) => {\n      return (\n        scale(d.textx) + scaleOffset > this.labelMargin &&\n        scale(d.textx) + scaleOffset < width - this.labelMargin\n      );\n    });\n    this.filteredData2 = filteredData;\n\n    // Build an array with one extra feature added\n    let filteredDataPlusOne = filteredData.slice();\n    let ind = findIndex(data, filteredData[0]) - 1;\n    if (ind >= 0) filteredDataPlusOne.unshift(data[ind]);\n\n    let labelBacking: d3.Selection<\n      any,\n      any,\n      SVGGElement,\n      {}\n    > = this.mainGroup.selectAll('.force-bar-labelBacking').data(filteredData);\n    labelBacking\n      .enter()\n      .append('path')\n      .attr('class', 'force-bar-labelBacking')\n      .attr('stroke', 'none')\n      .attr('opacity', 0.2)\n      .merge(labelBacking)\n      .attr('d', (d) => {\n        return lineFunction([\n          [\n            scale(d.x) + scale(Math.abs(d.effect)) + scaleOffset,\n            23 + topOffset,\n          ],\n          [\n            (d.effect > 0 ? scale(d.textx) : scale(d.textx) + d.textWidth) +\n              scaleOffset +\n              5,\n            33 + topOffset,\n          ],\n          [\n            (d.effect > 0 ? scale(d.textx) : scale(d.textx) + d.textWidth) +\n              scaleOffset +\n              5,\n            54 + topOffset,\n          ],\n          [\n            (d.effect > 0 ? scale(d.textx) - d.textWidth : scale(d.textx)) +\n              scaleOffset -\n              5,\n            54 + topOffset,\n          ],\n          [\n            (d.effect > 0 ? scale(d.textx) - d.textWidth : scale(d.textx)) +\n              scaleOffset -\n              5,\n            33 + topOffset,\n          ],\n          [scale(d.x) + scaleOffset, 23 + topOffset],\n        ]);\n      })\n      .attr('fill', (d) => `url(#linear-backgrad-${d.effect > 0 ? 0 : 1})`);\n    labelBacking.exit().remove();\n\n    let labelDividers: d3.Selection<\n      any,\n      any,\n      SVGGElement,\n      {}\n    > = this.mainGroup\n      .selectAll('.force-bar-labelDividers')\n      .data(filteredData.slice(0, -1));\n    labelDividers\n      .enter()\n      .append('rect')\n      .attr('class', 'force-bar-labelDividers')\n      .attr('height', '21px')\n      .attr('width', '1px')\n      .attr('y', 33 + topOffset)\n      .merge(labelDividers)\n      .attr(\n        'x',\n        (d) =>\n          (d.effect > 0 ? scale(d.textx) : scale(d.textx) + d.textWidth) +\n          scaleOffset +\n          4.5\n      )\n      .attr('fill', (d) => `url(#linear-grad-${d.effect > 0 ? 0 : 1})`);\n    labelDividers.exit().remove();\n\n    let labelLinks: d3.Selection<\n      any,\n      any,\n      SVGGElement,\n      {}\n    > = this.mainGroup\n      .selectAll('.force-bar-labelLinks')\n      .data(filteredData.slice(0, -1));\n    labelLinks\n      .enter()\n      .append('line')\n      .attr('class', 'force-bar-labelLinks')\n      .attr('y1', 23 + topOffset)\n      .attr('y2', 33 + topOffset)\n      .attr('stroke-opacity', 0.5)\n      .attr('stroke-width', 1)\n      .merge(labelLinks)\n      .attr('x1', (d) => scale(d.x) + scale(Math.abs(d.effect)) + scaleOffset)\n      .attr(\n        'x2',\n        (d) =>\n          (d.effect > 0 ? scale(d.textx) : scale(d.textx) + d.textWidth) +\n          scaleOffset +\n          5\n      )\n      .attr('stroke', (d) => (d.effect > 0 ? this.colors[0] : this.colors[1]));\n    labelLinks.exit().remove();\n\n    let blockDividers: any = this.mainGroup\n      .selectAll('.force-bar-blockDividers')\n      .data(data.slice(0, -1));\n    blockDividers\n      .enter()\n      .append('path')\n      .attr('class', 'force-bar-blockDividers')\n      .attr('stroke-width', 2)\n      .attr('fill', 'none')\n      .merge(blockDividers)\n      .attr('d', (d) => {\n        let pos = scale(d.x) + scale(Math.abs(d.effect)) + scaleOffset;\n        return lineFunction([\n          [pos, 6 + topOffset],\n          [pos + (d.effect < 0 ? -4 : 4), 14.5 + topOffset],\n          [pos, 23 + topOffset],\n        ]);\n      })\n      .attr('stroke', (d, i) => {\n        if (joinPointIndex === i + 1 || Math.abs(d.effect) < 1e-8)\n          return '#rgba(0,0,0,0)';\n        else if (d.effect > 0) return this.brighterColors[0];\n        else return this.brighterColors[1];\n      });\n    blockDividers.exit().remove();\n\n    this.joinPointLine\n      .attr('x1', scale(joinPoint) + scaleOffset)\n      .attr('x2', scale(joinPoint) + scaleOffset)\n      .attr('y1', 0 + topOffset)\n      .attr('y2', 6 + topOffset)\n      .attr('stroke', '#F2F2F2')\n      .attr('stroke-width', 1)\n      .attr('opacity', 1);\n\n    this.joinPointLabelOutline\n      .attr('x', scale(joinPoint) + scaleOffset)\n      .attr('y', -5 + topOffset)\n      .attr('color', '#fff')\n      .attr('text-anchor', 'middle')\n      .attr('font-weight', 'bold')\n      .attr('stroke', '#fff')\n      .attr('stroke-width', 6)\n      .text(format(',.2f')(this.invLinkFunction(joinPoint - totalNegEffects)))\n      .attr('opacity', 1);\n    this.joinPointLabel\n      .attr('x', scale(joinPoint) + scaleOffset)\n      .attr('y', -5 + topOffset)\n      .attr('text-anchor', 'middle')\n      .attr('font-weight', 'bold')\n      .attr('fill', '#000')\n      .text(format(',.2f')(this.invLinkFunction(joinPoint - totalNegEffects)))\n      .attr('opacity', 1);\n\n    this.joinPointTitle\n      .attr('x', scale(joinPoint) + scaleOffset)\n      .attr('y', -22 + topOffset)\n      .attr('text-anchor', 'middle')\n      .attr('font-size', '12')\n      .attr('fill', '#000')\n      .text(this.outNames[0])\n      .attr('opacity', 0.5);\n\n    if (!this.hideBars) {\n      this.joinPointTitleLeft\n        .attr('x', scale(joinPoint) + scaleOffset - 16)\n        .attr('y', -38 + topOffset)\n        .attr('text-anchor', 'end')\n        .attr('font-size', '13')\n        .attr('fill', this.colors[0])\n        .text('higher')\n        .attr('opacity', 1.0);\n      this.joinPointTitleRight\n        .attr('x', scale(joinPoint) + scaleOffset + 16)\n        .attr('y', -38 + topOffset)\n        .attr('text-anchor', 'start')\n        .attr('font-size', '13')\n        .attr('fill', this.colors[1])\n        .text('lower')\n        .attr('opacity', 1.0);\n\n      this.joinPointTitleLeftArrow\n        .attr('x', scale(joinPoint) + scaleOffset + 7)\n        .attr('y', -42 + topOffset)\n        .attr('text-anchor', 'end')\n        .attr('font-size', '13')\n        .attr('fill', this.colors[0])\n        .text('→')\n        .attr('opacity', 1.0);\n      this.joinPointTitleRightArrow\n        .attr('x', scale(joinPoint) + scaleOffset - 7)\n        .attr('y', -36 + topOffset)\n        .attr('text-anchor', 'start')\n        .attr('font-size', '13')\n        .attr('fill', this.colors[1])\n        .text('←')\n        .attr('opacity', 1.0);\n    }\n    if (!this.hideBaseValueLabel) {\n      this.baseValueTitle\n        .attr('x', this.scaleCentered(0))\n        .attr('y', -22 + topOffset)\n        .attr('text-anchor', 'middle')\n        .attr('font-size', '12')\n        .attr('fill', '#000')\n        .text('Base value')\n        .attr('opacity', 0.5);\n    }\n    this.isLoaded.emit();\n  }\n}\n","<div id=\"additiveForceWrapper\">\n  <svg id=\"additiveForce\"></svg>\n</div>\n","import {\n  AfterViewInit,\n  Component,\n  EventEmitter,\n  Input,\n  Output,\n} from '@angular/core';\nimport { each, debounce, sortBy } from 'lodash';\nimport * as d3 from 'd3';\n\nimport { InfluenceData } from '../shap-data';\n\n@Component({\n  selector: 'shap-influence',\n  templateUrl: './shap-influence.component.html',\n  styleUrls: ['./shap-influence.component.scss'],\n})\nexport class ShapInfluenceComponent implements AfterViewInit {\n  @Input() influenceColors: string[] = [\n    'rgb(222, 53, 13)',\n    'rgb(111, 207, 151)',\n  ];\n  @Input() predictions: number[] = [1];\n  @Input() predictionNames: string[] = ['Income'];\n  @Input() labelAmount: number = 7;\n\n  @Input() data: InfluenceData = {\n    featureNames: {\n      '0': 'age',\n      '1': 'workClass',\n      '2': 'education',\n      '3': 'maritualStatus',\n      '4': 'occupation',\n      '5': 'relationship',\n      '6': 'race',\n      '7': 'sex',\n      '8': 'capitalGain',\n      '9': 'capitalLoss',\n      '10': 'hoursPerWeek',\n      '11': 'nativeCountry',\n    },\n    valueNames: {\n      '0': '50',\n      '1': 'Middle',\n      '2': 'Bachelor of Science',\n      '3': 'Married',\n      '4': 'Engineer',\n      '5': 'Yes',\n      '6': 'Dutch',\n      '7': 'Female',\n      '8': '12250',\n      '9': '500',\n      '10': '50',\n      '11': 'Australia',\n    },\n    features: {\n      '0': { value: 50, effect: 0.009206349206349593 },\n      '1': { value: 0, effect: -0.03126984126984064 },\n      '2': { value: 13, effect: 0.024285714285714452 },\n      '3': { value: 2, effect: 0 },\n      '4': { value: 4, effect: 0.04214285714285741 },\n      '5': { value: 1, effect: -0.08801587301587223 },\n      '6': { value: 0, effect: -0.028888888888888298 },\n      '7': { value: 1, effect: 0 },\n      '8': { value: 12250, effect: 0.8580158730158687 },\n      '9': { value: 500, effect: -0.14198412698412655 },\n      '10': { value: 50, effect: 0.00047619047619129606 },\n      '11': { value: 40, effect: -0.04396825396825377 },\n    },\n  };\n\n  @Output() isLoaded = new EventEmitter();\n\n  private readonly PREDICTION_GROUP_HEIGHT = 35;\n  private readonly MARGIN = 20;\n  private readonly OFFSET_Y = 20;\n  private readonly LABEL_HEIGHT = 20;\n  private readonly BINS = 6;\n\n  private svg: d3.Selection<d3.BaseType, {}, HTMLElement, any>;\n  private labelGroup: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private influenceGroup: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private importantFactors: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n  private predictionGroup: d3.Selection<SVGGElement, {}, d3.BaseType, any>;\n\n  private labels: d3.Selection<SVGGElement, {}, d3.BaseType, any>[] = [];\n  private influences: d3.Selection<SVGGElement, {}, d3.BaseType, any>[] = [];\n  private predictionLabels: d3.Selection<SVGGElement, {}, d3.BaseType, any>[] =\n    [];\n  private predictionValues: d3.Selection<SVGGElement, {}, d3.BaseType, any>[] =\n    [];\n\n  private redraw: any;\n\n  constructor() {\n    this.redraw = debounce(() => this.draw(), 200);\n  }\n\n  ngAfterViewInit(): void {\n    this.svg = d3.select('#influence');\n\n    this.predictionGroup = this.svg.append('g');\n    this.importantFactors = this.svg.append('text');\n    this.labelGroup = this.svg.append('g');\n    this.influenceGroup = this.svg.append('g');\n\n    each(this.data.featureNames, () => {\n      this.labels.push(this.labelGroup.append('text'));\n      this.influences.push(this.influenceGroup.append('text'));\n    });\n\n    each(this.predictions, () => {\n      this.predictionLabels.push(this.predictionGroup.append('text'));\n      this.predictionValues.push(this.predictionGroup.append('text'));\n    });\n\n    window.addEventListener('resize', this.redraw);\n    window.setTimeout(this.redraw, 50);\n  }\n\n  public draw(): any {\n    const predictionHeight = this.PREDICTION_GROUP_HEIGHT + this.MARGIN;\n    const predictionAmount = this.predictions.length;\n    const featureLabelsOffset =\n      predictionHeight * predictionAmount + this.MARGIN;\n\n    this.calculatePlusMinus(this.BINS);\n\n    const data = sortBy(\n      this.data.features,\n      (feature) => 1 / Math.abs(feature.effect)\n    );\n\n    this.importantFactors\n      .attr('x', 0)\n      .attr('y', featureLabelsOffset)\n      .attr('font-size', '14')\n      .attr('font-weight', 'bold')\n      .attr('fill', '#000000')\n      .text('Important factors');\n\n    each(this.predictions, (prediction, i) => {\n      this.predictionLabels[i]\n        .attr('x', 0)\n        .attr('y', this.OFFSET_Y + i * predictionHeight)\n        .attr('font-size', '14')\n        .attr('font-weight', 'bold')\n        .attr('fill', '#000000')\n        .text(this.predictionNames[i]);\n\n      this.predictionValues[i]\n        .attr('x', 0)\n        .attr('y', this.OFFSET_Y + i * predictionHeight + this.LABEL_HEIGHT)\n        .attr('font-size', '14')\n        .attr('fill', '#000000')\n        .text(prediction);\n    });\n\n    each(data, (feature, i) => {\n      if (i < this.labelAmount) {\n        const result = feature.name.replace(/([A-Z])/g, ' $1');\n        const name = result.charAt(0).toUpperCase() + result.slice(1);\n\n        this.labels[i]\n          .attr('x', 0)\n          .attr('y', featureLabelsOffset + this.LABEL_HEIGHT * i + this.MARGIN)\n          .attr('font-size', '14')\n          .attr('fill', '#000000')\n          .text(`${name}: ${feature.valueName}`);\n\n        this.influences[i]\n          .attr('x', 200)\n          .attr('y', featureLabelsOffset + this.LABEL_HEIGHT * i + this.MARGIN)\n          .attr('font-size', '14')\n          .attr('font-weight', 'bold')\n          .attr(\n            'fill',\n            feature.binDistance < 0\n              ? this.influenceColors[0]\n              : this.influenceColors[1]\n          )\n          .text(this.plusMinusLabel(feature.binDistance));\n      }\n    });\n\n    this.setScaledDimentions();\n    this.isLoaded.emit();\n  }\n\n  private setScaledDimentions(): void {\n    const totalHeight =\n      this.predictionGroup.node().getBBox().height +\n      this.influenceGroup.node().getBBox().height +\n      this.importantFactors.node().getBBox().height +\n      this.MARGIN * 2;\n    const totalWidth =\n      this.getMaxSize('width', this.influences) +\n      this.getMaxSize('width', this.labels) +\n      this.MARGIN;\n\n    each(this.influences, (influence) => {\n      influence.attr('x', this.getMaxSize('width', this.labels) + this.MARGIN);\n    });\n\n    this.svg.attr('height', totalHeight).attr('width', totalWidth);\n\n    each(this.predictionLabels, (predictionLabel) => {\n      const leftOffset =\n        this.svg.node().getBBox().width / 2 -\n        predictionLabel.node().getBBox().width / 2;\n      predictionLabel.attr('x', leftOffset);\n    });\n\n    each(this.predictionValues, (predictionValue) => {\n      const leftOffset =\n        this.svg.node().getBBox().width / 2 -\n        predictionValue.node().getBBox().width / 2;\n      predictionValue.attr('x', leftOffset);\n    });\n  }\n\n  private calculatePlusMinus(amountOfBins: number): void {\n    each(this.data.featureNames, (name, i) => {\n      if (this.data.features[i]) this.data.features[i].name = name;\n    });\n\n    each(this.data.valueNames, (valueName, i) => {\n      if (this.data.features[i]) this.data.features[i].valueName = valueName;\n    });\n\n    const minEffect = Math.min(\n      ...Object.values(this.data.features).map((feature) => feature.effect)\n    );\n    const maxEffect = Math.max(\n      ...Object.values(this.data.features).map((feature) => feature.effect)\n    );\n    let binMin = minEffect;\n    let binMax: number;\n    let bins: { min: number; max: number; distance: number }[] = [];\n    let binFlipPoint = amountOfBins / 2;\n\n    for (let i = 0; i < amountOfBins; i++) {\n      let distance: number;\n\n      if (i < binFlipPoint) {\n        distance = i - binFlipPoint;\n        binMax = binMin + Math.abs(minEffect) / binFlipPoint;\n      } else {\n        distance = i - binFlipPoint + 1;\n        binMax = distance * (maxEffect / binFlipPoint);\n      }\n\n      bins.push({ min: binMin, max: binMax, distance: distance });\n      binMin = binMax;\n    }\n\n    each(this.data.features, (feature, i) => {\n      bins.forEach((bin) => {\n        if (feature.effect >= bin.min && feature.effect <= bin.max) {\n          this.data.features[i].binDistance = bin.distance;\n        }\n      });\n    });\n  }\n\n  private plusMinusLabel(binDistance: number): string {\n    if (binDistance >= 0) {\n      let plusses = [];\n      for (let i = 0; i < binDistance; i++) {\n        plusses.push('+');\n      }\n      return plusses.join(' ');\n    } else {\n      let minusses = [];\n      for (let i = 0; i < Math.abs(binDistance); i++) {\n        minusses.push('-');\n      }\n      return minusses.join(' ');\n    }\n  }\n\n  private getMaxSize(\n    size: 'width' | 'height',\n    array: d3.Selection<SVGGElement, {}, d3.BaseType, any>[]\n  ): number {\n    return Math.max(...array.map((object) => object.node().getBBox()[size]));\n  }\n}\n","<div id=\"influenceWrapper\">\n  <svg id=\"influence\"></svg>\n</div>\n","import { NgModule } from '@angular/core';\nimport { ShapAdditiveForceArrayComponent } from './shap-additive-force-array/shap-additive-force-array.component';\nimport { ShapAdditiveForceComponent } from './shap-additive-force/shap-additive-force.component';\nimport { ShapInfluenceComponent } from './shap-influence/shap-influence.component';\n\n@NgModule({\n  declarations: [\n    ShapAdditiveForceComponent,\n    ShapAdditiveForceArrayComponent,\n    ShapInfluenceComponent,\n  ],\n  imports: [],\n  exports: [\n    ShapAdditiveForceComponent,\n    ShapAdditiveForceArrayComponent,\n    ShapInfluenceComponent,\n  ],\n})\nexport class ShapExplainersModule {}\n","/*\n * Public API Surface of shap-explainers\n */\n\nexport * from './shap-explainers.module';\nexport * from './shap-additive-force/shap-additive-force.component';\nexport * from './shap-additive-force-array/shap-additive-force-array.component';\nexport * from './shap-influence/shap-influence.component';\nexport * from './shap-data';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}